forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {createContext, useContext, useMemo} from 'react'
2import {type PropsWithChildren} from 'react'
3import {BskyAgent, type ModerationOpts} from '@atproto/api'
4
5import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences'
6import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation'
7import {useSession} from '#/state/session'
8import {usePreferencesQuery} from '../queries/preferences'
9
10export const moderationOptsContext = createContext<ModerationOpts | undefined>(
11 undefined,
12)
13moderationOptsContext.displayName = 'ModerationOptsContext'
14
15// used in the moderation state devtool
16export const moderationOptsOverrideContext = createContext<
17 ModerationOpts | undefined
18>(undefined)
19moderationOptsOverrideContext.displayName = 'ModerationOptsOverrideContext'
20
21export function useModerationOpts() {
22 return useContext(moderationOptsContext)
23}
24
25export function Provider({children}: PropsWithChildren<{}>) {
26 const override = useContext(moderationOptsOverrideContext)
27 const {currentAccount} = useSession()
28 const prefs = usePreferencesQuery()
29 const {labelDefs} = useLabelDefinitions()
30 const hiddenPosts = useHiddenPosts() // TODO move this into pds-stored prefs
31
32 const userDid = currentAccount?.did
33 const moderationPrefs = prefs.data?.moderationPrefs
34 const value = useMemo<ModerationOpts | undefined>(() => {
35 if (override) {
36 return override
37 }
38 if (!moderationPrefs) {
39 return undefined
40 }
41 return {
42 userDid,
43 prefs: {
44 ...moderationPrefs,
45 labelers: moderationPrefs.labelers.length
46 ? moderationPrefs.labelers
47 : BskyAgent.appLabelers.map(did => ({
48 did,
49 labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES,
50 })),
51 hiddenPosts: hiddenPosts || [],
52 },
53 labelDefs,
54 }
55 }, [override, userDid, labelDefs, moderationPrefs, hiddenPosts])
56
57 return (
58 <moderationOptsContext.Provider value={value}>
59 {children}
60 </moderationOptsContext.Provider>
61 )
62}