mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at session-alignment 64 lines 1.6 kB view raw
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}