react-native-keyboard-controller
Version:
Keyboard manager which works in identical way on both iOS and Android
108 lines (95 loc) • 3.09 kB
text/typescript
import {
useEvent,
useAnimatedProps as useReanimatedAnimatedProps,
useAnimatedReaction as useReanimatedAnimatedReaction,
useAnimatedStyle as useReanimatedAnimatedStyle,
useDerivedValue as useReanimatedDerivedValue,
useHandler as useReanimatedHandler,
} from "react-native-reanimated";
import type {
EventWithName,
FocusedInputLayoutChangedEvent,
FocusedInputLayoutHandlerHook,
KeyboardHandlerHook,
NativeEvent,
} from "./types";
type EventContext = Record<string, unknown>;
// Dependencies are only needed on Web when the Babel plugin is unavailable.
export const useAnimatedProps: typeof useReanimatedAnimatedProps = (
updater,
_dependencies,
adapters,
isAnimatedProps,
) => useReanimatedAnimatedProps(updater, undefined, adapters, isAnimatedProps);
export const useAnimatedReaction: typeof useReanimatedAnimatedReaction = (
prepare,
react,
) => useReanimatedAnimatedReaction(prepare, react);
export const useAnimatedStyle: typeof useReanimatedAnimatedStyle = (updater) =>
useReanimatedAnimatedStyle(updater);
export const useDerivedValue: typeof useReanimatedDerivedValue = (updater) =>
useReanimatedDerivedValue(updater);
export const useHandler: typeof useReanimatedHandler = (handlers) =>
useReanimatedHandler(handlers);
export const useAnimatedKeyboardHandler: KeyboardHandlerHook<
EventContext,
EventWithName<NativeEvent>
> = (handlers, dependencies) => {
const { context, doDependenciesDiffer } = useHandler(handlers, dependencies);
return useEvent(
(event) => {
"worklet";
const {
onKeyboardMoveStart,
onKeyboardMove,
onKeyboardMoveEnd,
onKeyboardMoveInteractive,
} = handlers;
if (
onKeyboardMoveStart &&
event.eventName.endsWith("onKeyboardMoveStart")
) {
onKeyboardMoveStart(event, context);
}
if (onKeyboardMove && event.eventName.endsWith("onKeyboardMove")) {
onKeyboardMove(event, context);
}
if (onKeyboardMoveEnd && event.eventName.endsWith("onKeyboardMoveEnd")) {
onKeyboardMoveEnd(event, context);
}
if (
onKeyboardMoveInteractive &&
event.eventName.endsWith("onKeyboardMoveInteractive")
) {
onKeyboardMoveInteractive(event, context);
}
},
[
"onKeyboardMoveStart",
"onKeyboardMove",
"onKeyboardMoveEnd",
"onKeyboardMoveInteractive",
],
doDependenciesDiffer,
);
};
export const useFocusedInputLayoutHandler: FocusedInputLayoutHandlerHook<
EventContext,
EventWithName<FocusedInputLayoutChangedEvent>
> = (handlers, dependencies) => {
const { context, doDependenciesDiffer } = useHandler(handlers, dependencies);
return useEvent(
(event) => {
"worklet";
const { onFocusedInputLayoutChanged } = handlers;
if (
onFocusedInputLayoutChanged &&
event.eventName.endsWith("onFocusedInputLayoutChanged")
) {
onFocusedInputLayoutChanged(event, context);
}
},
["onFocusedInputLayoutChanged"],
doDependenciesDiffer,
);
};