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