my fork of the bluesky client
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}