react-native-keyboard-controller
Version:
Keyboard manager which works in identical way on both iOS and Android
83 lines (62 loc) • 1.99 kB
text/typescript
import { useEffect, useLayoutEffect } from "react";
import { AndroidSoftInputModes } from "../constants";
import { useKeyboardContext } from "../context";
import { KeyboardController } from "../module";
import type { AnimatedContext, ReanimatedContext } from "../context";
import type { FocusedInputHandler, KeyboardHandler } from "../types";
import type { DependencyList } from "react";
export const useResizeMode = () => {
useEffect(() => {
KeyboardController.setInputMode(
AndroidSoftInputModes.SOFT_INPUT_ADJUST_RESIZE,
);
return () => KeyboardController.setDefaultMode();
}, []);
};
export const useKeyboardAnimation = (): AnimatedContext => {
useResizeMode();
const context = useKeyboardContext();
return context.animated;
};
export const useReanimatedKeyboardAnimation = (): ReanimatedContext => {
useResizeMode();
const context = useKeyboardContext();
return context.reanimated;
};
export function useGenericKeyboardHandler(
handler: KeyboardHandler,
deps?: DependencyList,
) {
const context = useKeyboardContext();
useLayoutEffect(() => {
const cleanup = context.setKeyboardHandlers(handler);
return () => cleanup();
}, deps);
}
export function useKeyboardHandler(
handler: KeyboardHandler,
deps?: DependencyList,
) {
useResizeMode();
useGenericKeyboardHandler(handler, deps);
}
export function useKeyboardController() {
const context = useKeyboardContext();
return { setEnabled: context.setEnabled, enabled: context.enabled };
}
export function useReanimatedFocusedInput() {
const context = useKeyboardContext();
return { input: context.layout };
}
export function useFocusedInputHandler(
handler: FocusedInputHandler,
deps?: DependencyList,
) {
const context = useKeyboardContext();
useLayoutEffect(() => {
const cleanup = context.setInputHandlers(handler);
return () => cleanup();
}, deps);
}
export * from "./useWindowDimensions";
export * from "./useKeyboardState";