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