diff options
author | Eric Bailey <git@esb.lol> | 2024-08-21 21:20:45 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-21 19:20:45 -0700 |
commit | 6616a6467ec53aa71e5f823c2d8c46dc01442703 (patch) | |
tree | 5e49d6916bc9b9fc71a475cf0d02f169c744bf59 /src/state/threadgate-hidden-replies.tsx | |
parent | 56ab5e177fa2b24d0e5d9d969aa37532b96128da (diff) | |
download | voidsky-6616a6467ec53aa71e5f823c2d8c46dc01442703.tar.zst |
Detached QPs and hidden replies (#4878)
Co-authored-by: Hailey <me@haileyok.com>
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) +} |