UNPKG

@wordpress/components

Version:
118 lines (110 loc) 4.1 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { createElement } from "@wordpress/element"; /** * External dependencies */ import { KeyboardAvoidingView as IOSKeyboardAvoidingView, Animated, Keyboard, Dimensions, View } from 'react-native'; import SafeArea from 'react-native-safe-area'; /** * WordPress dependencies */ import { useEffect, useRef, useState } from '@wordpress/element'; import { useResizeObserver } from '@wordpress/compose'; /** * Internal dependencies */ import useIsFloatingKeyboard from '../utils/use-is-floating-keyboard'; import styles from './styles.scss'; const AnimatedKeyboardAvoidingView = Animated.createAnimatedComponent(IOSKeyboardAvoidingView); const MIN_HEIGHT = 44; export const KeyboardAvoidingView = _ref => { let { parentHeight, style, withAnimatedHeight = false, ...otherProps } = _ref; const [resizeObserver, sizes] = useResizeObserver(); const [isKeyboardOpen, setIsKeyboardOpen] = useState(false); const [safeAreaBottomInset, setSafeAreaBottomInset] = useState(0); const { height = 0 } = sizes || {}; const floatingKeyboard = useIsFloatingKeyboard(); const animatedHeight = useRef(new Animated.Value(MIN_HEIGHT)).current; const { height: fullHeight } = Dimensions.get('screen'); const keyboardVerticalOffset = fullHeight - parentHeight; useEffect(() => { SafeArea.getSafeAreaInsetsForRootView().then(_ref2 => { let { safeAreaInsets } = _ref2; setSafeAreaBottomInset(safeAreaInsets.bottom); }); const safeAreaSubscription = SafeArea.addEventListener('safeAreaInsetsForRootViewDidChange', onSafeAreaInsetsUpdate); const keyboardShowSubscription = Keyboard.addListener('keyboardWillShow', onKeyboardWillShow); const keyboardHideSubscription = Keyboard.addListener('keyboardWillHide', onKeyboardWillHide); return () => { safeAreaSubscription.remove(); keyboardShowSubscription.remove(); keyboardHideSubscription.remove(); }; // Disable reason: deferring this refactor to the native team. // see https://github.com/WordPress/gutenberg/pull/41166 // eslint-disable-next-line react-hooks/exhaustive-deps }, []); function onSafeAreaInsetsUpdate(_ref3) { let { safeAreaInsets } = _ref3; setSafeAreaBottomInset(safeAreaInsets.bottom); } function onKeyboardWillShow(_ref4) { let { endCoordinates } = _ref4; setIsKeyboardOpen(true); animatedHeight.setValue(endCoordinates.height + MIN_HEIGHT); } function onKeyboardWillHide(_ref5) { let { duration, startCoordinates } = _ref5; // The startCoordinates.height is set to wrong value when we use cmd + k for hide the keyboard (Have no idea why). // Because of that the `setIsKeyboardOpened` is not invoked and the state of keyboard is wrong. // The keyboardIsOpenBreakpoint use 100 as a fallback if the startCoordinates.height is too small (cmd + k case) const keyboardIsOpenBreakpoint = startCoordinates.height > 100 ? startCoordinates.height / 3 : 100; const animatedListenerId = animatedHeight.addListener(_ref6 => { let { value } = _ref6; if (value < keyboardIsOpenBreakpoint) { setIsKeyboardOpen(false); } }); Animated.timing(animatedHeight, { toValue: MIN_HEIGHT, duration, useNativeDriver: false }).start(() => { animatedHeight.removeListener(animatedListenerId); }); } return createElement(AnimatedKeyboardAvoidingView, _extends({}, otherProps, { enabled: !floatingKeyboard, behavior: "padding", keyboardVerticalOffset: keyboardVerticalOffset, style: withAnimatedHeight ? [style, { height: animatedHeight, marginBottom: isKeyboardOpen ? -safeAreaBottomInset : 0 }] : style }), createElement(View, { style: [{ top: -height + MIN_HEIGHT }, styles.animatedChildStyle, !withAnimatedHeight && styles.defaultChildStyle] }, resizeObserver, otherProps.children)); }; export default KeyboardAvoidingView; //# sourceMappingURL=index.ios.js.map