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