UNPKG

@gluestack-ui/core

Version:

Universal UI components for React Native, Expo, and Next.js

68 lines 3.94 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import React, { forwardRef } from 'react'; import { ModalContext } from './Context'; import { Platform, AccessibilityInfo, Keyboard } from 'react-native'; import { FocusScope } from '@gluestack-ui/utils/aria'; import { OverlayAnimatePresence } from './OverlayAnimatePresence'; import { useDialog } from '@gluestack-ui/utils/aria'; import { mergeRefs, findNodeHandle } from '@gluestack-ui/utils/common'; const ModalContent = (StyledModalContent, AnimatePresence) => forwardRef((_a, ref) => { var { children, focusScope = true } = _a, props = __rest(_a, ["children", "focusScope"]); const { initialFocusRef, finalFocusRef, handleClose, visible } = React.useContext(ModalContext); const contentRef = React.useRef(null); const mergedRef = mergeRefs([contentRef, ref]); const { dialogProps } = useDialog(Object.assign({}, props), mergedRef); React.useEffect(() => { if (contentRef) { const reactTag = findNodeHandle(contentRef.current); if (reactTag) { AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); AccessibilityInfo.setAccessibilityFocus(reactTag); } } }, [visible, contentRef]); React.useEffect(() => { var _a, _b, _c, _d; if (visible) { Keyboard.dismiss(); if (initialFocusRef && (initialFocusRef === null || initialFocusRef === void 0 ? void 0 : initialFocusRef.current) && ((_a = initialFocusRef === null || initialFocusRef === void 0 ? void 0 : initialFocusRef.current) === null || _a === void 0 ? void 0 : _a.focus)) { (_b = initialFocusRef === null || initialFocusRef === void 0 ? void 0 : initialFocusRef.current) === null || _b === void 0 ? void 0 : _b.focus(); } } else { if (finalFocusRef && (finalFocusRef === null || finalFocusRef === void 0 ? void 0 : finalFocusRef.current) && ((_c = finalFocusRef === null || finalFocusRef === void 0 ? void 0 : finalFocusRef.current) === null || _c === void 0 ? void 0 : _c.focus)) { (_d = finalFocusRef === null || finalFocusRef === void 0 ? void 0 : finalFocusRef.current) === null || _d === void 0 ? void 0 : _d.focus(); } } }, [initialFocusRef, finalFocusRef, visible]); const content = (<OverlayAnimatePresence visible={visible} AnimatePresence={AnimatePresence}> <StyledModalContent {...props} ref={mergedRef} onAccessibilityEscape={handleClose} aria-modal="true" role={Platform.OS === 'web' ? 'dialog' : undefined} accessibilityViewIsModal tabIndex={Platform.OS === 'web' ? -1 : undefined} {...dialogProps}> {children} </StyledModalContent> </OverlayAnimatePresence>); return focusScope ? (<FocusScope contain={visible} autoFocus={visible && !initialFocusRef} restoreFocus={visible && !finalFocusRef}> {content} </FocusScope>) : (<>{content}</>); }); export default ModalContent; //# sourceMappingURL=ModalContent.jsx.map