mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at tooltip 105 lines 2.3 kB view raw
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}