@audira/carbon-react-native
Version:
Build React Native apps with component and shared patterns using Carbon
127 lines (126 loc) • 4.04 kB
JavaScript
;
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