UNPKG

react-native-global-modal-2

Version:

🌍 Global modal and callable from anywhere on the app for React Native

85 lines 2.74 kB
import React, { forwardRef, useImperativeHandle, useLayoutEffect, useCallback, } from "react"; import { StyleSheet, View, Dimensions, } from "react-native"; import Modal from "react-native-modal"; import ModalController from "./ModalController"; import useStateWithCallback from "./helpers/useStateWithCallback"; const { width, height } = Dimensions.get("window"); const GlobalModal = forwardRef(({ defaultStyle, ...rest }, ref) => { const [modalVisible, setModalVisible] = useStateWithCallback(false); const [data, setData] = useStateWithCallback({ content: null, isFullScreen: false, }); const show = useCallback((modalData) => { setData(modalData); setModalVisible(true, () => { modalData.onShow?.(); }); }, []); const hide = useCallback(() => { setModalVisible(false, () => { data.onHide?.(); }); }, [data]); useImperativeHandle(ref, () => ({ show, hide, }), [show, hide]); useLayoutEffect(() => { if (ref) { ModalController.setModalRef(ref); } }, [ref]); const containerStyle = [ styles.baseContainer, data.isFullScreen ? styles.fullScreenContainer : styles.defaultContainer, defaultStyle, data.containerStyle, ]; return (<Modal {...rest} isVisible={modalVisible} animationIn={data.isFullScreen ? "fadeIn" : "slideInDown"} animationOut={data.isFullScreen ? "fadeOut" : "slideOutUp"} backdropTransitionOutTiming={0} hideModalContentWhileAnimating useNativeDriver style={[ styles.modal, data.isFullScreen ? styles.fullScreenModal : styles.centeredModal, ]} coverScreen backdropColor="rgba(0, 0, 0, 0.5)" statusBarTranslucent propagateSwipe> <View style={containerStyle}>{data.content}</View> </Modal>); }); GlobalModal.displayName = "GlobalModal"; export default GlobalModal; const styles = StyleSheet.create({ modal: { margin: 0, padding: 0, }, fullScreenModal: { margin: 0, padding: 0, width: "100%", height: "100%", }, centeredModal: { justifyContent: "center", alignItems: "center", }, baseContainer: { backgroundColor: "transparent", }, fullScreenContainer: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0, alignItems: "stretch", justifyContent: "flex-start", margin: 0, padding: 0, }, defaultContainer: { width: "90%", maxWidth: 400, minHeight: 100, alignItems: "center", justifyContent: "center", }, }); //# sourceMappingURL=GlobalModal.js.map