diff options
Diffstat (limited to 'src/state/threadgate-hidden-replies.tsx')
-rw-r--r-- | src/state/threadgate-hidden-replies.tsx | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/state/threadgate-hidden-replies.tsx b/src/state/threadgate-hidden-replies.tsx new file mode 100644 index 000000000..06fc22366 --- /dev/null +++ b/src/state/threadgate-hidden-replies.tsx @@ -0,0 +1,69 @@ +import React from 'react' + +type StateContext = { + uris: Set<string> + recentlyUnhiddenUris: Set<string> +} +type ApiContext = { + addHiddenReplyUri: (uri: string) => void + removeHiddenReplyUri: (uri: string) => void +} + +const StateContext = React.createContext<StateContext>({ + uris: new Set(), + recentlyUnhiddenUris: new Set(), +}) + +const ApiContext = React.createContext<ApiContext>({ + addHiddenReplyUri: () => {}, + removeHiddenReplyUri: () => {}, +}) + +export function Provider({children}: {children: React.ReactNode}) { + const [uris, setHiddenReplyUris] = React.useState<Set<string>>(new Set()) + const [recentlyUnhiddenUris, setRecentlyUnhiddenUris] = React.useState< + Set<string> + >(new Set()) + + const stateCtx = React.useMemo( + () => ({ + uris, + recentlyUnhiddenUris, + }), + [uris, recentlyUnhiddenUris], + ) + + const apiCtx = React.useMemo( + () => ({ + addHiddenReplyUri(uri: string) { + setHiddenReplyUris(prev => new Set(prev.add(uri))) + setRecentlyUnhiddenUris(prev => { + prev.delete(uri) + return new Set(prev) + }) + }, + removeHiddenReplyUri(uri: string) { + setHiddenReplyUris(prev => { + prev.delete(uri) + return new Set(prev) + }) + setRecentlyUnhiddenUris(prev => new Set(prev.add(uri))) + }, + }), + [setHiddenReplyUris], + ) + + return ( + <ApiContext.Provider value={apiCtx}> + <StateContext.Provider value={stateCtx}>{children}</StateContext.Provider> + </ApiContext.Provider> + ) +} + +export function useThreadgateHiddenReplyUris() { + return React.useContext(StateContext) +} + +export function useThreadgateHiddenReplyUrisAPI() { + return React.useContext(ApiContext) +} |