Skip to content

Commit f88d780

Browse files
authored
Merge branch 'dev' into README-update
2 parents 927826c + 4583635 commit f88d780

File tree

5 files changed

+92
-85
lines changed

5 files changed

+92
-85
lines changed

components/report-details/report-support-feed.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ const MobileFeed = ({ contributions }: { contributions: Contribution[] }) => {
168168
const DesktopFeed = ({ contributions }: { contributions: Contribution[] }) => {
169169
return (
170170
<ol
171-
className="border-l border-neutral-300 dark:border-neutral-500 hidden md:block"
171+
className="border-l border-stone-300 dark:border-stone-500 hidden md:block"
172172
aria-label="Contributions list"
173173
>
174174
{contributions.map((contribution) => (
@@ -182,7 +182,7 @@ const DesktopFeed = ({ contributions }: { contributions: Contribution[] }) => {
182182
aria-labelledby="contributor-info"
183183
>
184184
<span
185-
className="-ml-[5px] mr-3 h-[9px] w-[9px] rounded-full bg-neutral-300 dark:bg-neutral-500"
185+
className="-ml-[5px] mr-3 h-[9px] w-[9px] rounded-full bg-stone-300 dark:bg-stone-500"
186186
aria-hidden="true"
187187
/>
188188
<div className="flex items-center gap-2" id="contributor-info">
@@ -202,7 +202,7 @@ const DesktopFeed = ({ contributions }: { contributions: Contribution[] }) => {
202202
)}
203203
<DotIcon className="text-stone-400" aria-hidden="true" />
204204
<p
205-
className="text-sm text-neutral-500 dark:text-neutral-300"
205+
className="text-sm text-stone-500 dark:text-stone-300"
206206
aria-label={`Contribution date: ${transformDate(
207207
contribution.date_created,
208208
)}`}
@@ -214,7 +214,7 @@ const DesktopFeed = ({ contributions }: { contributions: Contribution[] }) => {
214214
{contribution.comment && (
215215
<div className="mb-6 ml-4 mt-2">
216216
<p
217-
className="mb-3 text-neutral-500 dark:text-neutral-300"
217+
className="mb-3 text-stone-500 dark:text-stone-300"
218218
role="article"
219219
aria-label="Contribution comment"
220220
>
@@ -251,7 +251,7 @@ const ReportSupportFeed = ({
251251
<h3 className="text-2xl font-semibold py-4" id="support-feed-title">
252252
Support Feed
253253
</h3>
254-
<p className="text-neutral-500 dark:text-neutral-300">
254+
<p className="text-stone-500 dark:text-stone-300">
255255
Nothing to show yet. Be the first to support this cause!
256256
</p>
257257
</section>

components/reports/reports-filters.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export const FilterItems: React.FC<FilterItemsProps> = ({
159159
{uniqueCategories.map(({ label, value }) => (
160160
<Badge
161161
key={value}
162-
className={`border-vd-blue-500 rounded-full flex flex-auto flex-col md:flex-row items-center gap-1 px-2 py-1 cursor-pointer ${
162+
className={`border-vd-blue-500 rounded-2xl flex flex-auto flex-col items-center gap-1 px-2 py-3 cursor-pointer ${
163163
selectedCategory === value
164164
? "bg-vd-blue-900 text-vd-beige-100 hover:bg-vd-blue-700"
165165
: ""

hooks/use-buy-fraction.ts

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import { useGetCurrentERC20Allowance } from "@/hooks/use-get-current-erc20-allowance";
21
import type { HypercertExchangeClient } from "@hypercerts-org/marketplace-sdk";
32
import { useState } from "react";
43
import type { Address } from "viem";
54
import { waitForTransactionReceipt } from "viem/actions";
65
import type { UsePublicClientReturnType } from "wagmi";
76

87
export enum TransactionStatuses {
9-
PreparingOrder = "preparingOrder",
10-
Approval = "approval",
11-
SignForBuy = "signForBuy",
12-
Pending = "pending",
13-
Confirmed = "confirmed",
14-
Failed = "failed",
8+
PreparingOrder = 0,
9+
Approval = 1,
10+
SignForBuy = 2,
11+
Pending = 3,
12+
Confirmed = 4,
13+
Failed = 5,
1514
}
1615

1716
const useHandleBuyFraction = (
@@ -21,7 +20,6 @@ const useHandleBuyFraction = (
2120
const [transactionStatus, setTransactionStatus] =
2221
useState<keyof typeof TransactionStatuses>("Pending");
2322
const [transactionHash, setTransactionHash] = useState<Address | null>(null);
24-
const currentAllowance = useGetCurrentERC20Allowance();
2523

2624
const handleBuyFraction = async (
2725
// biome-ignore lint/suspicious/noExplicitAny: <explanation>

lib/directus.ts

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export async function processNewContribution(
7474
hypercert_id: hypercertId,
7575
amount: amount,
7676
txid: txId,
77+
date_created: new Date().toISOString(),
7778
comment: comment,
7879
} as Contribution;
7980
// create a contribution record in Directus

lib/search-filter-utils.ts

+79-71
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,98 @@
11
import type { ISortingOption, Report } from "@/types";
22
import type Fuse from "fuse.js";
3+
34
export const filterReports = (
45
reports: Report[],
56
filters: [string, string][],
67
fuse: Fuse<Report>
78
) => {
8-
return filters.reduce((filteredReports, [key, value]) => {
9-
switch (key) {
10-
case "q": {
11-
const searchResults = fuse.search(value);
12-
return searchResults.map((result) => result.item);
13-
}
14-
case "state": {
15-
const states = filters
16-
.filter(([filterKey]) => filterKey === "state")
17-
.map(([, filterValue]) => filterValue);
18-
return filteredReports.filter((report) =>
19-
states.includes(report.state)
20-
);
21-
}
22-
case "min":
23-
return filteredReports.filter(
24-
(report) =>
25-
report.totalCost - report.fundedSoFar >= Number.parseInt(value, 10)
26-
);
27-
case "max":
28-
return filteredReports.filter(
29-
(report) =>
30-
report.totalCost - report.fundedSoFar <= Number.parseInt(value, 10)
31-
);
32-
case "category":
33-
return filteredReports.filter((report) => report.category === value);
34-
case "outlet": {
35-
const outlets = filters
36-
.filter(([filterKey]) => filterKey === "outlet")
37-
.map(([, filterValue]) =>
38-
decodeURIComponent(filterValue).toLowerCase()
39-
);
40-
return filteredReports.filter((report) => {
41-
if (!report.contributors.length) return false;
42-
const outletName = report.contributors[0].toLowerCase();
43-
return outlets.includes(outletName);
44-
});
45-
}
46-
default:
47-
return filteredReports;
9+
// search first
10+
let searchedReports = reports;
11+
const searchQuery = filters.find(([filterKey]) => filterKey === "q")?.[1];
12+
if (searchQuery) {
13+
const searchResults = fuse.search(searchQuery);
14+
searchedReports = searchResults.map((result) => result.item);
15+
}
16+
17+
// pre-process filters
18+
const statesSet = new Set(
19+
filters
20+
.filter(([filterKey]) => filterKey === "state")
21+
.map(([, filterValue]) => filterValue)
22+
);
23+
const outletsSet = new Set(
24+
filters
25+
.filter(([filterKey]) => filterKey === "outlet")
26+
.map(([, filterValue]) => decodeURIComponent(filterValue).toLowerCase())
27+
);
28+
29+
const minAmountFromFilter = filters.find(
30+
([filterKey]) => filterKey === "min"
31+
)?.[1];
32+
const maxAmountFromFilter = filters.find(
33+
([filterKey]) => filterKey === "max"
34+
)?.[1];
35+
const minAmount = minAmountFromFilter
36+
? Number.parseInt(minAmountFromFilter, 10)
37+
: null;
38+
const maxAmount = maxAmountFromFilter
39+
? Number.parseInt(maxAmountFromFilter, 10)
40+
: null;
41+
42+
return searchedReports.filter((report) => {
43+
const remainingCost = report.totalCost - report.fundedSoFar;
44+
// check state filter
45+
if (statesSet.size > 0 && !statesSet.has(report.state)) return false;
46+
// check outlet filter
47+
if (outletsSet.size > 0 && report.contributors.length) {
48+
const outletName = report.contributors[0].toLowerCase();
49+
if (!outletName || !outletsSet.has(outletName)) return false;
50+
}
51+
// check category
52+
if (
53+
filters.some(
54+
([key, value]) => key === "category" && report.category !== value
55+
)
56+
) {
57+
return false;
4858
}
49-
}, reports);
59+
60+
// check min and max amount filter
61+
if (minAmount !== null && remainingCost < minAmount) return false;
62+
if (maxAmount !== null && remainingCost > maxAmount) return false;
63+
64+
return true;
65+
});
5066
};
5167

5268
export const createFilterOptions = (reports: Report[]) => {
53-
const uniqueCategories = reports
54-
.map((report: Report, index: number) => ({
69+
const uniqueCategoriesMap = new Map();
70+
const uniqueOutletsMap = new Map();
71+
const uniqueStatesMap = new Map();
72+
const amountsNeeded = [];
73+
74+
for (let i = 0; i < reports.length; i++) {
75+
const report = reports[i];
76+
uniqueCategoriesMap.set(report.category, {
5577
label: report.category,
5678
value: report.category,
57-
}))
58-
.filter(
59-
({ value }, index, self) =>
60-
index === self.findIndex((obj) => obj.value === value)
61-
);
62-
63-
const uniqueOutlets = reports
64-
.map((report: Report) => report.contributors[0])
65-
.filter((outlet) => outlet && outlet.length > 0)
66-
.map((outlet: string) => ({
67-
label: outlet,
68-
value: encodeURIComponent(outlet).toLowerCase(),
69-
}))
70-
.filter(
71-
({ value }, index, self) =>
72-
index === self.findIndex((obj) => obj.value === value)
73-
);
74-
75-
const uniqueStates = reports
76-
.map((report: Report, index: number) => ({
79+
});
80+
if (report.contributors[0] && report.contributors[0].length > 0) {
81+
uniqueOutletsMap.set(report.contributors[0].toLowerCase(), {
82+
label: report.contributors[0],
83+
value: encodeURIComponent(report.contributors[0]).toLowerCase(),
84+
});
85+
}
86+
uniqueStatesMap.set(report.state, {
7787
label: report.state,
7888
value: report.state,
79-
}))
80-
.filter(
81-
({ value }, index, self) =>
82-
index === self.findIndex((obj) => obj.value === value)
83-
);
89+
});
90+
amountsNeeded.push(report.totalCost - report.fundedSoFar || 0);
91+
}
8492

85-
const amountsNeeded = reports.map(
86-
(report: Report) => report.totalCost - report.fundedSoFar || 0
87-
);
93+
const uniqueCategories = Array.from(uniqueCategoriesMap.values());
94+
const uniqueOutlets = Array.from(uniqueOutletsMap.values());
95+
const uniqueStates = Array.from(uniqueStatesMap.values());
8896
const minAmountNeeded = Math.min(...amountsNeeded);
8997
const maxAmountNeeded = Math.max(...amountsNeeded);
9098

0 commit comments

Comments
 (0)