Bluesky app fork with some witchin' additions 馃挮
at main 79 lines 1.7 kB view raw
1import React from 'react' 2import { 3 type SharedValue, 4 useSharedValue, 5 withSpring, 6} from 'react-native-reanimated' 7 8type StateContext = { 9 headerMode: SharedValue<number> 10 footerMode: SharedValue<number> 11} 12type SetContext = (v: boolean) => void 13 14const stateContext = React.createContext<StateContext>({ 15 headerMode: { 16 value: 0, 17 addListener() {}, 18 removeListener() {}, 19 modify() {}, 20 get() { 21 return 0 22 }, 23 set() {}, 24 }, 25 footerMode: { 26 value: 0, 27 addListener() {}, 28 removeListener() {}, 29 modify() {}, 30 get() { 31 return 0 32 }, 33 set() {}, 34 }, 35}) 36stateContext.displayName = 'MinimalModeStateContext' 37const setContext = React.createContext<SetContext>((_: boolean) => {}) 38setContext.displayName = 'MinimalModeSetContext' 39 40export function Provider({children}: React.PropsWithChildren<{}>) { 41 const headerMode = useSharedValue(0) 42 const footerMode = useSharedValue(0) 43 const setMode = React.useCallback( 44 (v: boolean) => { 45 'worklet' 46 headerMode.set(() => 47 withSpring(v ? 1 : 0, { 48 overshootClamping: true, 49 }), 50 ) 51 footerMode.set(() => 52 withSpring(v ? 1 : 0, { 53 overshootClamping: true, 54 }), 55 ) 56 }, 57 [headerMode, footerMode], 58 ) 59 const value = React.useMemo( 60 () => ({ 61 headerMode, 62 footerMode, 63 }), 64 [headerMode, footerMode], 65 ) 66 return ( 67 <stateContext.Provider value={value}> 68 <setContext.Provider value={setMode}>{children}</setContext.Provider> 69 </stateContext.Provider> 70 ) 71} 72 73export function useMinimalShellMode() { 74 return React.useContext(stateContext) 75} 76 77export function useSetMinimalShellMode() { 78 return React.useContext(setContext) 79}