Bluesky app fork with some witchin' additions 馃挮
at feat/tealfm 67 lines 1.8 kB view raw
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}