Skip to content

Commit 3bc9ea6

Browse files
committed
feat(filter): add status filter pills to URL params
Resolves #265
1 parent 96e4f8b commit 3bc9ea6

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

frontend/src/components/CampaignsTable.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,11 @@ export function CampaignsTable({
7676
const [searchParams, setSearchParams] = useSearchParams();
7777
const urlSort = (searchParams.get('sort') as SortOption | null) ?? 'newest';
7878
const urlOrder = (searchParams.get('order') as 'asc' | 'desc' | null) ?? 'desc';
79+
const urlStatus = (searchParams.get('status') as StatusFilterValue | null) ?? '';
7980
const VALID_SORTS: SortOption[] = ['newest', 'deadline', 'percentFunded', 'totalPledged'];
8081
const sortBy: SortOption = VALID_SORTS.includes(urlSort) ? urlSort : 'newest';
8182
const [assetCode, setAssetCode] = useState("");
82-
const [statusFilter, setStatusFilter] = useState<StatusFilterValue>("");
83+
const [statusFilter, setStatusFilter] = useState<StatusFilterValue>(urlStatus);
8384
const [searchQuery, setSearchQuery] = useState("");
8485
const loadMoreRef = useRef<HTMLDivElement | null>(null);
8586
const debouncedSearchQuery = useDebounce(searchQuery, 300);
@@ -96,6 +97,19 @@ export function CampaignsTable({
9697
onSortChange?.(newSort, newOrder);
9798
}
9899

100+
function handleStatusFilterChange(value: StatusFilterValue) {
101+
setStatusFilter(value);
102+
setSearchParams((prev) => {
103+
const next = new URLSearchParams(prev);
104+
if (value === '') {
105+
next.delete('status');
106+
} else {
107+
next.set('status', value);
108+
}
109+
return next;
110+
}, { replace: true });
111+
}
112+
99113
function handleSearchChange(value: string) {
100114
setSearchQuery(value);
101115
if (value === '') {
@@ -109,6 +123,10 @@ export function CampaignsTable({
109123
}
110124
}, [debouncedSearchQuery, onSearchChange]);
111125

126+
useEffect(() => {
127+
setStatusFilter(urlStatus);
128+
}, [urlStatus]);
129+
112130
useEffect(() => {
113131
const sentinel = loadMoreRef.current;
114132
if (!sentinel || !onLoadMore || !hasMore) {
@@ -243,7 +261,7 @@ export function CampaignsTable({
243261
key={filter.label}
244262
type="button"
245263
className={`status-filter-tab ${isActive ? "status-filter-tab-active" : ""}`}
246-
onClick={() => setStatusFilter(filter.value)}
264+
onClick={() => handleStatusFilterChange(filter.value)}
247265
aria-pressed={isActive}
248266
disabled={isLoading}
249267
>

0 commit comments

Comments
 (0)