import { useMemo } from 'react' import { IUserState } from 'store/reducers/user' import { FilterOptions, ModDetails, ModeratedFilter, MuteLists, NSFWFilter, SortBy, WOTFilterOptions } from 'types' import { npubToHex } from 'utils' import { useAppSelector } from './redux' export const useFilteredMods = ( mods: ModDetails[], userState: IUserState, filterOptions: FilterOptions, nsfwList: string[], muteLists: { admin: MuteLists user: MuteLists }, author?: string | undefined ) => { const { siteWot, userWot } = useAppSelector((state) => state.wot) return useMemo(() => { const nsfwFilter = (mods: ModDetails[]) => { // Add nsfw tag to mods included in nsfwList if (filterOptions.nsfw !== NSFWFilter.Hide_NSFW) { mods = mods.map((mod) => { return !mod.nsfw && nsfwList.includes(mod.aTag) ? { ...mod, nsfw: true } : mod }) } // Determine the filtering logic based on the NSFW filter option switch (filterOptions.nsfw) { case NSFWFilter.Hide_NSFW: // If 'Hide_NSFW' is selected, filter out NSFW mods return mods.filter((mod) => !mod.nsfw && !nsfwList.includes(mod.aTag)) case NSFWFilter.Show_NSFW: // If 'Show_NSFW' is selected, return all mods (no filtering) return mods case NSFWFilter.Only_NSFW: // If 'Only_NSFW' is selected, filter to show only NSFW mods return mods.filter((mod) => mod.nsfw || nsfwList.includes(mod.aTag)) } } const wotFilter = (mods: ModDetails[]) => { // Determine the filtering logic based on the WOT filter option switch (filterOptions.wot) { case WOTFilterOptions.None: return mods case WOTFilterOptions.Site_Only: return mods.filter((mod) => siteWot.includes(mod.author)) case WOTFilterOptions.Mine_Only: return mods.filter((mod) => userWot.includes(mod.author)) case WOTFilterOptions.Site_And_Mine: return mods.filter( (mod) => siteWot.includes(mod.author) || userWot.includes(mod.author) ) } } let filtered = nsfwFilter(mods) filtered = wotFilter(filtered) const isAdmin = userState.user?.npub === import.meta.env.VITE_REPORTING_NPUB const isOwner = userState.user?.npub && npubToHex(userState.user.npub as string) === author const isUnmoderatedFully = filterOptions.moderated === ModeratedFilter.Unmoderated_Fully // Only apply filtering if the user is not an admin or the admin has not selected "Unmoderated Fully" // Allow "Unmoderated Fully" when author visits own profile if (!((isAdmin || isOwner) && isUnmoderatedFully)) { filtered = filtered.filter( (mod) => !muteLists.admin.authors.includes(mod.author) && !muteLists.admin.replaceableEvents.includes(mod.aTag) ) } if (filterOptions.moderated === ModeratedFilter.Moderated) { filtered = filtered.filter( (mod) => !muteLists.user.authors.includes(mod.author) && !muteLists.user.replaceableEvents.includes(mod.aTag) ) } if (filterOptions.sort === SortBy.Latest) { filtered.sort((a, b) => b.published_at - a.published_at) } else if (filterOptions.sort === SortBy.Oldest) { filtered.sort((a, b) => a.published_at - b.published_at) } return filtered }, [ userState.user?.npub, filterOptions.sort, filterOptions.moderated, filterOptions.wot, filterOptions.nsfw, author, mods, muteLists, nsfwList, siteWot, userWot ]) }