import { useMemo } from 'react' import { IUserState } from 'store/reducers/user' import { FilterOptions, ModDetails, ModeratedFilter, MuteLists, NSFWFilter, SortBy } from 'types' import { npubToHex } from 'utils' export const useFilteredMods = ( mods: ModDetails[], userState: IUserState, filterOptions: FilterOptions, nsfwList: string[], muteLists: { admin: MuteLists user: MuteLists } ) => { return useMemo(() => { const nsfwFilter = (mods: ModDetails[]) => { // 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)) } } let filtered = nsfwFilter(mods) const isAdmin = userState.user?.npub === import.meta.env.VITE_REPORTING_NPUB const isOwner = userState.user?.npub && npubToHex(userState.user.npub as string) === filterOptions.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.nsfw, filterOptions.author, mods, muteLists, nsfwList ]) }