(
@@ -175,18 +208,20 @@ export function FilteredHouseList({
return dir === "desc" ? arr.reverse() : arr;
}, [items, dir]);
- const statusFiltered = useMemo(
- () =>
+ const facetFiltered = useMemo(() => {
+ const byStatus =
status === "all"
? sorted
: sorted.filter((item) =>
status === "extinct" ? !!item.extinct : !item.extinct,
- ),
- [sorted, status],
- );
-
- const filtered = filterByName(statusFiltered, debounced);
- const total = statusFiltered.length;
+ );
+ return rank === "all"
+ ? byStatus
+ : byStatus.filter((item) => item.rank === rank);
+ }, [sorted, status, rank]);
+
+ const filtered = filterByName(facetFiltered, debounced);
+ const total = facetFiltered.length;
const matching = filtered.length;
const hasQuery = debounced.trim().length > 0;
const noun = total === 1 ? "house" : "houses";
@@ -205,13 +240,13 @@ export function FilteredHouseList({
const known = REGION_SLUGS.map((slug) => ({
slug,
label: regionLabel(slug) ?? slug,
- items: statusFiltered.filter((item) => item.region === slug),
+ items: facetFiltered.filter((item) => item.region === slug),
})).filter((group) => group.items.length > 0);
- const other = statusFiltered.filter((item) => item.region === null);
+ const other = facetFiltered.filter((item) => item.region === null);
return other.length > 0
? [...known, { slug: "other", label: "Other Houses", items: other }]
: known;
- }, [statusFiltered]);
+ }, [facetFiltered]);
const writePage = (next: number) => {
setParams({ page: next });
@@ -231,6 +266,12 @@ export function FilteredHouseList({
setParams({ page: 1 });
};
+ const handleRankChange = (next: string) => {
+ if (!isRankFilter(next)) return;
+ setRank(next === "all" ? null : next);
+ setParams({ page: 1 });
+ };
+
const listClass = cx(styles.list, view === "list" && styles.listView);
const renderCard = ({
@@ -335,6 +376,21 @@ export function FilteredHouseList({
/>
)}
+
+ Rank
+ handleRankChange(e.target.value)}
+ aria-label="House rank"
+ >
+ {RANK_OPTIONS.map((opt) => (
+
+ {opt.label}
+
+ ))}
+
+
;
export type Landmass = z.infer;
export type Castle = z.infer;
export type House = z.infer;
+export type HouseRank = z.infer;
export type HouseInfoEntry = z.infer;
export type Character = z.infer;
export type Event = z.infer;