diff options
author | Paul Frazee <pfrazee@gmail.com> | 2024-04-30 21:06:51 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-30 21:06:51 -0700 |
commit | 31cb3e54222afc0b56e9d3e7997e2229797ff11e (patch) | |
tree | d837a8d0f7e08b1d97e22b77c69bdc93bad2554c /src/state/preferences/moderation-opts.tsx | |
parent | 39807a86309ccfeeffbd054808c0e78e42ff940e (diff) | |
download | voidsky-31cb3e54222afc0b56e9d3e7997e2229797ff11e.tar.zst |
Performance improvements: structural sharing & moderation opts context (#3785)
* Fix: correctly apply structural sharing to preferences object * Move moderation opts into a context * Fix import * Remove log * Pass userdid directly * Pass moderationPrefs directly
Diffstat (limited to 'src/state/preferences/moderation-opts.tsx')
-rw-r--r-- | src/state/preferences/moderation-opts.tsx | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/state/preferences/moderation-opts.tsx b/src/state/preferences/moderation-opts.tsx new file mode 100644 index 000000000..b0278d5e8 --- /dev/null +++ b/src/state/preferences/moderation-opts.tsx @@ -0,0 +1,61 @@ +import React, {createContext, useContext, useMemo} from 'react' +import {BSKY_LABELER_DID, ModerationOpts} from '@atproto/api' + +import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' +import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' +import {useSession} from '#/state/session' +import {usePreferencesQuery} from '../queries/preferences' + +export const moderationOptsContext = createContext<ModerationOpts | undefined>( + undefined, +) + +// used in the moderation state devtool +export const moderationOptsOverrideContext = createContext< + ModerationOpts | undefined +>(undefined) + +export function useModerationOpts() { + return useContext(moderationOptsContext) +} + +export function Provider({children}: React.PropsWithChildren<{}>) { + const override = useContext(moderationOptsOverrideContext) + const {currentAccount} = useSession() + const prefs = usePreferencesQuery() + const {labelDefs} = useLabelDefinitions() + const hiddenPosts = useHiddenPosts() // TODO move this into pds-stored prefs + + const userDid = currentAccount?.did + const moderationPrefs = prefs.data?.moderationPrefs + const value = useMemo<ModerationOpts | undefined>(() => { + if (override) { + return override + } + if (!moderationPrefs) { + return undefined + } + return { + userDid, + prefs: { + ...moderationPrefs, + labelers: moderationPrefs.labelers.length + ? moderationPrefs.labelers + : [ + { + did: BSKY_LABELER_DID, + labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES, + }, + ], + hiddenPosts: hiddenPosts || [], + }, + labelDefs, + } + }, [override, userDid, labelDefs, moderationPrefs, hiddenPosts]) + + return ( + <moderationOptsContext.Provider value={value}> + {children} + </moderationOptsContext.Provider> + ) +} |