forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}