1import * as React from 'react'; 2 3import { 4 DevMenuPreferencesType, 5 getMenuPreferencesAsync, 6 setMenuPreferencesAsync, 7} from '../native-modules/DevMenuPreferences'; 8 9export type DevMenuPreferencesContext = { 10 motionGestureEnabled: boolean; 11 setMotionGestureEnabled: (enabled: boolean) => void; 12 touchGestureEnabled: boolean; 13 setTouchGestureEnabled: (enabled: boolean) => void; 14 showsAtLaunch: boolean; 15 setShowsAtLaunch: (enabled: boolean) => void; 16}; 17 18const Context = React.createContext<DevMenuPreferencesContext | null>(null); 19export const useDevMenuPreferences = () => React.useContext(Context); 20 21type DevMenuPreferencesProviderProps = { 22 children: React.ReactNode; 23 initialSettings?: DevMenuPreferencesType; 24}; 25 26export function DevMenuPreferencesProvider({ 27 children, 28 initialSettings, 29}: DevMenuPreferencesProviderProps) { 30 const [motionGestureEnabled, setMotionGestureEnabled] = React.useState( 31 initialSettings?.motionGestureEnabled 32 ); 33 const [touchGestureEnabled, setTouchGestureEnabled] = React.useState( 34 initialSettings?.touchGestureEnabled 35 ); 36 const [showsAtLaunch, setShowsAtLaunch] = React.useState(initialSettings?.showsAtLaunch); 37 38 React.useEffect(() => { 39 getMenuPreferencesAsync().then((settings) => { 40 if (settings.motionGestureEnabled) { 41 setMotionGestureEnabled(true); 42 } 43 44 if (settings.touchGestureEnabled) { 45 setTouchGestureEnabled(true); 46 } 47 48 if (settings.showsAtLaunch) { 49 setShowsAtLaunch(true); 50 } 51 }); 52 }, []); 53 54 const onShowsAtLaunchChange = (enabled: boolean) => { 55 setMenuPreferencesAsync({ 56 showsAtLaunch: enabled, 57 }).catch(() => { 58 // restore to previous value in case of error 59 setShowsAtLaunch(showsAtLaunch); 60 }); 61 62 setShowsAtLaunch(enabled); 63 }; 64 65 const onMotionGestureChange = (enabled: boolean) => { 66 setMenuPreferencesAsync({ 67 motionGestureEnabled: enabled, 68 }).catch(() => { 69 // restore to previous value in case of error 70 setMotionGestureEnabled(motionGestureEnabled); 71 }); 72 73 setMotionGestureEnabled(enabled); 74 }; 75 76 const onTouchGestureChange = (enabled: boolean) => { 77 setMenuPreferencesAsync({ 78 touchGestureEnabled: enabled, 79 }).catch(() => { 80 // restore to previous value in case of error 81 setTouchGestureEnabled(touchGestureEnabled); 82 }); 83 84 setTouchGestureEnabled(enabled); 85 }; 86 87 return ( 88 <Context.Provider 89 value={{ 90 motionGestureEnabled, 91 setMotionGestureEnabled: onMotionGestureChange, 92 touchGestureEnabled, 93 setTouchGestureEnabled: onTouchGestureChange, 94 showsAtLaunch, 95 setShowsAtLaunch: onShowsAtLaunchChange, 96 }}> 97 {children} 98 </Context.Provider> 99 ); 100} 101