forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import React from 'react'
2
3import * as persisted from '#/state/persisted'
4
5type SetStateCb = (
6 s: persisted.Schema['hiddenPosts'],
7) => persisted.Schema['hiddenPosts']
8type StateContext = persisted.Schema['hiddenPosts']
9type ApiContext = {
10 hidePost: ({uri}: {uri: string}) => void
11 unhidePost: ({uri}: {uri: string}) => void
12}
13
14const stateContext = React.createContext<StateContext>(
15 persisted.defaults.hiddenPosts,
16)
17stateContext.displayName = 'HiddenPostsStateContext'
18const apiContext = React.createContext<ApiContext>({
19 hidePost: () => {},
20 unhidePost: () => {},
21})
22apiContext.displayName = 'HiddenPostsApiContext'
23
24export function Provider({children}: React.PropsWithChildren<{}>) {
25 const [state, setState] = React.useState(persisted.get('hiddenPosts'))
26
27 const setStateWrapped = React.useCallback(
28 (fn: SetStateCb) => {
29 const s = fn(persisted.get('hiddenPosts'))
30 setState(s)
31 persisted.write('hiddenPosts', s)
32 },
33 [setState],
34 )
35
36 const api = React.useMemo(
37 () => ({
38 hidePost: ({uri}: {uri: string}) => {
39 setStateWrapped(s => [...(s || []), uri])
40 },
41 unhidePost: ({uri}: {uri: string}) => {
42 setStateWrapped(s => (s || []).filter(u => u !== uri))
43 },
44 }),
45 [setStateWrapped],
46 )
47
48 React.useEffect(() => {
49 return persisted.onUpdate('hiddenPosts', nextHiddenPosts => {
50 setState(nextHiddenPosts)
51 })
52 }, [setStateWrapped])
53
54 return (
55 <stateContext.Provider value={state}>
56 <apiContext.Provider value={api}>{children}</apiContext.Provider>
57 </stateContext.Provider>
58 )
59}
60
61export function useHiddenPosts() {
62 return React.useContext(stateContext)
63}
64
65export function useHiddenPostsApi() {
66 return React.useContext(apiContext)
67}