78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
|
import { useMemo } from 'react'
|
||
|
import { IUserState } from 'store/reducers/user'
|
||
|
import {
|
||
|
FilterOptions,
|
||
|
ModDetails,
|
||
|
ModeratedFilter,
|
||
|
MuteLists,
|
||
|
NSFWFilter,
|
||
|
SortBy
|
||
|
} from 'types'
|
||
|
|
||
|
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 isUnmoderatedFully =
|
||
|
filterOptions.moderated === ModeratedFilter.Unmoderated_Fully
|
||
|
|
||
|
// Only apply filtering if the user is not an admin or the admin has not selected "Unmoderated Fully"
|
||
|
if (!(isAdmin && 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,
|
||
|
mods,
|
||
|
muteLists,
|
||
|
nsfwList
|
||
|
])
|
||
|
}
|