UNPKG

react-native-keyboard-controller

Version:

Keyboard manager which works in identical way on both iOS and Android

71 lines (65 loc) 2.06 kB
import { createContext, useContext } from "react"; import { Animated } from "react-native"; import type { FocusedInputHandler, FocusedInputLayoutChangedEvent, KeyboardHandler, } from "./types"; import type React from "react"; import type { SharedValue } from "react-native-reanimated"; export type AnimatedContext = { progress: Animated.Value; height: Animated.AnimatedMultiplication<number>; }; export type ReanimatedContext = { progress: SharedValue<number>; height: SharedValue<number>; }; export type KeyboardAnimationContext = { enabled: boolean; animated: AnimatedContext; reanimated: ReanimatedContext; layout: SharedValue<FocusedInputLayoutChangedEvent | null>; setKeyboardHandlers: (handlers: KeyboardHandler) => () => void; setInputHandlers: (handlers: FocusedInputHandler) => () => void; setEnabled: React.Dispatch<React.SetStateAction<boolean>>; }; const NOOP = () => {}; const NESTED_NOOP = () => NOOP; const withSharedValue = <T>(value: T): SharedValue<T> => ({ value, addListener: NOOP, removeListener: NOOP, modify: NOOP, get: () => value, set: NOOP, }); const DEFAULT_SHARED_VALUE = withSharedValue(0); const DEFAULT_LAYOUT = withSharedValue<FocusedInputLayoutChangedEvent | null>( null, ); const defaultContext: KeyboardAnimationContext = { enabled: true, animated: { progress: new Animated.Value(0), height: new Animated.Value(0), }, reanimated: { progress: DEFAULT_SHARED_VALUE, height: DEFAULT_SHARED_VALUE, }, layout: DEFAULT_LAYOUT, setKeyboardHandlers: NESTED_NOOP, setInputHandlers: NESTED_NOOP, setEnabled: NOOP, }; export const KeyboardContext = createContext(defaultContext); export const useKeyboardContext = () => { const context = useContext(KeyboardContext); if (__DEV__ && context === defaultContext) { console.warn( "Couldn't find real values for `KeyboardContext`. Please make sure you're inside of `KeyboardProvider` - otherwise functionality of `react-native-keyboard-controller` will not work.", ); } return context; };