import React, { useMemo } from "react";
import { Platform, StyleSheet, View } from "react-native";
import { RCTOverKeyboardView } from "../../bindings";
import { useWindowDimensions } from "../../hooks";
import type { OverKeyboardViewProps } from "../../types";
import type { PropsWithChildren } from "react";
/**
* A view component that renders its children over the keyboard without closing the keyboard.
* Acts similar to modal, but doesn't close the keyboard when it's visible.
*
* @param props - Component props.
* @returns A view component that renders over the keyboard.
* @example
* ```tsx
*
* This will appear over the keyboard
*
* ```
*/
const OverKeyboardView = (props: PropsWithChildren) => {
const { children, visible } = props;
const { height, width } = useWindowDimensions();
const inner = useMemo(() => ({ height, width }), [height, width]);
const style = useMemo(
() => [
styles.absolute,
// On iOS - stretch view to full window dimensions to make yoga work
Platform.OS === "ios" ? inner : undefined,
// On Android - we are laid out by ShadowNode, so just stretch to full container
Platform.OS === "android" ? styles.stretch : undefined,
],
[inner],
);
return (
{/* `OverKeyboardView` should always have a single child */}
{/* Match RN behavior and trigger mount/unmount when visibility changes */}
{visible && children}
);
};
const styles = StyleSheet.create({
absolute: {
position: "absolute",
},
stretch: {
top: 0,
bottom: 0,
left: 0,
right: 0,
},
});
export default OverKeyboardView;