mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {
2 createContext,
3 useCallback,
4 useContext,
5 useEffect,
6 useMemo,
7 useRef,
8} from 'react'
9import {
10 KeyboardProvider,
11 useKeyboardController,
12} from 'react-native-keyboard-controller'
13import {useFocusEffect} from '@react-navigation/native'
14
15const KeyboardControllerRefCountContext = createContext<{
16 incrementRefCount: () => void
17 decrementRefCount: () => void
18}>({
19 incrementRefCount: () => {},
20 decrementRefCount: () => {},
21})
22
23export function KeyboardControllerProvider({
24 children,
25}: {
26 children: React.ReactNode
27}) {
28 return (
29 <KeyboardProvider enabled={false}>
30 <KeyboardControllerProviderInner>
31 {children}
32 </KeyboardControllerProviderInner>
33 </KeyboardProvider>
34 )
35}
36
37function KeyboardControllerProviderInner({
38 children,
39}: {
40 children: React.ReactNode
41}) {
42 const {setEnabled} = useKeyboardController()
43 const refCount = useRef(0)
44
45 const value = useMemo(
46 () => ({
47 incrementRefCount: () => {
48 refCount.current++
49 setEnabled(refCount.current > 0)
50 },
51 decrementRefCount: () => {
52 refCount.current--
53 setEnabled(refCount.current > 0)
54
55 if (__DEV__ && refCount.current < 0) {
56 console.error('KeyboardController ref count < 0')
57 }
58 },
59 }),
60 [setEnabled],
61 )
62
63 return (
64 <KeyboardControllerRefCountContext.Provider value={value}>
65 {children}
66 </KeyboardControllerRefCountContext.Provider>
67 )
68}
69
70export function useEnableKeyboardController(shouldEnable: boolean) {
71 const {incrementRefCount, decrementRefCount} = useContext(
72 KeyboardControllerRefCountContext,
73 )
74
75 useEffect(() => {
76 if (!shouldEnable) {
77 return
78 }
79 incrementRefCount()
80 return () => {
81 decrementRefCount()
82 }
83 }, [shouldEnable, incrementRefCount, decrementRefCount])
84}
85
86/**
87 * Like `useEnableKeyboardController`, but using `useFocusEffect`
88 */
89export function useEnableKeyboardControllerScreen(shouldEnable: boolean) {
90 const {incrementRefCount, decrementRefCount} = useContext(
91 KeyboardControllerRefCountContext,
92 )
93
94 useFocusEffect(
95 useCallback(() => {
96 if (!shouldEnable) {
97 return
98 }
99 incrementRefCount()
100 return () => {
101 decrementRefCount()
102 }
103 }, [shouldEnable, incrementRefCount, decrementRefCount]),
104 )
105}