From 0faaa4982a632a1dc4a56ff5714ef2ff8cac06a2 Mon Sep 17 00:00:00 2001 From: "Tom (plebeius.eth)" Date: Thu, 6 Mar 2025 17:24:56 +0100 Subject: [PATCH] fix catalog filter count per subplebbit address --- .../catalog-filters/catalog-filters.tsx | 6 +- src/stores/use-catalog-filters-store.ts | 63 ++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/components/catalog-filters/catalog-filters.tsx b/src/components/catalog-filters/catalog-filters.tsx index 188ec343..d64e69d3 100644 --- a/src/components/catalog-filters/catalog-filters.tsx +++ b/src/components/catalog-filters/catalog-filters.tsx @@ -5,7 +5,7 @@ import styles from './catalog-filters.module.css'; const FiltersTable = ({ onSave }: { onSave: () => void }) => { const { t } = useTranslation(); - const { filterItems, saveAndApplyFilters } = useCatalogFiltersStore(); + const { filterItems, saveAndApplyFilters, currentSubplebbitAddress } = useCatalogFiltersStore(); const [localFilterItems, setLocalFilterItems] = useState( filterItems.map((item) => ({ @@ -127,7 +127,9 @@ const FiltersTable = ({ onSave }: { onSave: () => void }) => { × - {item.count > 0 && `x${item.count}`} + + {currentSubplebbitAddress && (item.subplebbitCounts?.get(currentSubplebbitAddress) ?? 0) > 0 && `x${item.subplebbitCounts?.get(currentSubplebbitAddress)}`} + ))} diff --git a/src/stores/use-catalog-filters-store.ts b/src/stores/use-catalog-filters-store.ts index edb50748..c736b3b8 100644 --- a/src/stores/use-catalog-filters-store.ts +++ b/src/stores/use-catalog-filters-store.ts @@ -50,7 +50,50 @@ const useCatalogFiltersStore = create( filteredCount: 0, filteredCids: new Set(), currentSubplebbitAddress: null, - setCurrentSubplebbitAddress: (address: string | null) => set({ currentSubplebbitAddress: address }), + setCurrentSubplebbitAddress: (address: string | null) => { + const prevAddress = get().currentSubplebbitAddress; + + if (address !== prevAddress) { + set((state) => { + if (address) { + const updatedFilterItems = state.filterItems.map((item) => { + const newItem = { ...item }; + + // Ensure subplebbitCounts is a Map + if (!newItem.subplebbitCounts || !(newItem.subplebbitCounts instanceof Map)) { + newItem.subplebbitCounts = new Map(Array.isArray(newItem.subplebbitCounts) ? newItem.subplebbitCounts : []); + } + + // Ensure subplebbitFilteredCids is a Map + if (!newItem.subplebbitFilteredCids || !(newItem.subplebbitFilteredCids instanceof Map)) { + newItem.subplebbitFilteredCids = new Map(); + } + + // Now safely check if the address exists in the map + if (!newItem.subplebbitCounts.has(address)) { + newItem.subplebbitFilteredCids.set(address, new Set()); + newItem.subplebbitCounts.set(address, 0); + } + + return newItem; + }); + + return { + currentSubplebbitAddress: address, + filterItems: updatedFilterItems, + filteredCount: 0, + }; + } + + return { currentSubplebbitAddress: address }; + }); + + get().recalcFilteredCount(); + get().updateFilter(); + } else { + set({ currentSubplebbitAddress: address }); + } + }, searchText: '', setSearchFilter: (text: string) => { set({ searchText: text }); @@ -100,6 +143,9 @@ const useCatalogFiltersStore = create( filter: (comment: Comment) => { if (!comment?.cid) return true; + const currentSubplebbit = state.currentSubplebbitAddress; + + // Apply search filter if (state.searchText.trim() !== '') { const searchPattern = state.searchText.toLowerCase(); const title = comment?.title?.toLowerCase() || ''; @@ -110,21 +156,36 @@ const useCatalogFiltersStore = create( } } + // Apply content filters const { filterItems } = state; let shouldHide = false; + for (let i = 0; i < filterItems.length; i++) { const item = filterItems[i]; if (item.enabled && item.text.trim() !== '') { const pattern = item.text.toLowerCase(); const title = comment?.title?.toLowerCase() || ''; const content = comment?.content?.toLowerCase() || ''; + if (title.includes(pattern) || content.includes(pattern)) { + // If we have a current subplebbit and this is a match, increment the count + if (currentSubplebbit && comment.subplebbitAddress === currentSubplebbit) { + // We need to use a timeout to avoid modifying state during a state update + setTimeout(() => { + const filterIndex = filterItems.findIndex((f) => f.text === item.text && f.enabled); + if (filterIndex !== -1) { + get().incrementFilterCount(filterIndex, comment.cid, comment.subplebbitAddress); + } + }, 0); + } + if (item.hide) { shouldHide = true; } } } } + return !shouldHide; }, }));