refactor(filters): compose the storefront from dimensions and delete the old components (#188)
Replaces App.tsx's hand-written Segmented/Filters-button/ActiveFilterChips region with a single FilterBar composed from five dimensions, and removes the FilterDrawer and ActiveFilterChips components along with the activeFilterCount and hasActiveFilters helpers they were the only callers of. Catalogue now receives a filtered boolean computed the same way FilterBar computes its own chip tally, rather than the ItemFilters object it only ever used for that one check.
This commit is contained in:
@@ -150,13 +150,6 @@ export function filtersFromSearchParams(params: URLSearchParams): ItemFilters {
|
||||
};
|
||||
}
|
||||
|
||||
// One count for the "Filters (N)" button. A price range counts once however
|
||||
// many ends are set, since it reads as a single filter to the user.
|
||||
//
|
||||
// Status is deliberately not counted. It has its own always-visible control
|
||||
// beside this button rather than living in the drawer, so counting it would put
|
||||
// a number on a button whose drawer shows nothing set — and the control already
|
||||
// displays its own position.
|
||||
// Named individually rather than grouped, because grouping is what the preset
|
||||
// this replaced did. Pending is listed first: "what is waiting to be published"
|
||||
// is the question that prompted #132.
|
||||
@@ -175,24 +168,6 @@ export function statusLabel(status: ItemStatus): string {
|
||||
return STATUS_OPTIONS.find((option) => option.value === status)?.label ?? status;
|
||||
}
|
||||
|
||||
export function activeFilterCount(filters: ItemFilters): number {
|
||||
let count = 0;
|
||||
count += filters.categoryIds.length;
|
||||
count += filters.tagIds.length;
|
||||
if (filters.minPriceCents !== null || filters.maxPriceCents !== null) count++;
|
||||
if (filters.favoritesOnly) count++;
|
||||
return count;
|
||||
}
|
||||
|
||||
// Broader than the count above, and intentionally so: this decides whether an
|
||||
// empty result reads as "no items match these filters" with a way out, or as an
|
||||
// empty shop. A status filter that matched nothing is exactly the case where
|
||||
// that distinction matters, so it counts here even though it is not in the
|
||||
// drawer's tally.
|
||||
export function hasActiveFilters(filters: ItemFilters): boolean {
|
||||
return activeFilterCount(filters) > 0 || filters.status !== null;
|
||||
}
|
||||
|
||||
export interface CategoryNode extends Category {
|
||||
children: CategoryNode[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user