UNPKG

@audira/carbon-react-native

Version:

Build React Native apps with component and shared patterns using Carbon

127 lines (126 loc) 4.04 kB
"use strict"; import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, createElement as _createElement } from 'react'; import { Pressable, StyleSheet } from 'react-native'; import { DialogAnimationConfigs } from "../../../const/index.js"; import { Modal } from "./_modal/index.js"; import { Overlay } from "./_overlay/index.js"; import { jsx as _jsx } from "react/jsx-runtime"; export const Controller = /*#__PURE__*/forwardRef(function Controller({ animationConfig, modalProps, overlayProps, overlayTouchDismiss, onEmpty }, ref) { const [data, setData] = useState([]), modalRefs = useRef([]), overlayRef = useRef(null), initialRender = useRef(false), setModalRef = useCallback((modalRef, index) => { if (modalRef && !modalRefs.current[index]) { modalRefs.current[index] = modalRef; } }, []), dismissAllHandler = useCallback(() => { if (modalRefs.current.length) { return new Promise(resolve => { Promise.all([overlayRef.current?.animateUnmount() ?? Promise.resolve(), modalRefs.current[modalRefs.current.length - 1]?.toState(2) ?? Promise.resolve()]).then(() => { setData([]); // modalRefs.current = [] resolve(); }); }); } return Promise.resolve(); }, []), dismissHandler = useCallback(() => { if (modalRefs.current.length) { return new Promise(resolve => { if (modalRefs.current.length == 1) { dismissAllHandler(); } else { modalRefs.current[modalRefs.current.length - 1]?.toState(2).then(() => { modalRefs.current.splice(modalRefs.current.length - 1, 1); modalRefs.current[modalRefs.current.length - 1]?.fromToState(0, 1).then(() => { setData(curr => { const nextData = curr.slice(); nextData.splice(nextData.length - 1, 1); return nextData; }); resolve(); }); }); } }); } return Promise.resolve(); }, [dismissAllHandler]); useEffect(() => { if (!initialRender.current) { initialRender.current = true; } else { if (!data.length) { onEmpty(); } } }, [onEmpty, data.length]); useImperativeHandle(ref, () => { return { show({ stack, ...restData }) { if (!modalRefs.current.length) { setData([{ ...restData }]); } else { modalRefs.current[modalRefs.current.length - 1]?.toState(2).then(() => { if (stack) { setData(curr => { return [...curr, { ...restData }]; }); } else { modalRefs.current.splice(modalRefs.current.length - 1, 1); setData([{ ...restData }]); } }); } }, dismiss: dismissHandler, dismissAll: dismissAllHandler }; }, [dismissHandler, dismissAllHandler]); return /*#__PURE__*/_jsx(Overlay, { ref: overlayRef, ...overlayProps, animationConfig: { duration: getSingleAnimationConfigDuration(animationConfig?.duration) ?? DialogAnimationConfigs.CarbonReact.duration }, children: data.map((item, index) => { return /*#__PURE__*/_createElement(Modal, { ...modalProps, key: index, animationConfig: animationConfig, ref: modalRef => setModalRef(modalRef, index) }, (item.overlayTouchDismiss ?? overlayTouchDismiss) && /*#__PURE__*/_jsx(Pressable, { onPress: dismissHandler, style: StyleSheet.absoluteFill }), item.component); }) }); }); function getSingleAnimationConfigDuration(duration) { if (typeof duration === 'number') { return duration; } if (duration) { return duration[0]; } return undefined; } //# sourceMappingURL=Controller.js.map