UNPKG

modal-sheet

Version:
245 lines (223 loc) 7.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function getHeight(size, H) { let height = H * 0.3; switch (size) { case 'xs': height = H * 0.25; break; case 's': height = H * 0.36; break; case 'm': height = H * 0.5; break; case 'l': height = H * 0.6; break; case 'xl': height = H * 0.7; break; case 'full': height = H - 20; break; default: height = H * 0.36; break; } return height; } const ModalComponent = (props, ref) => { const { backDropColor = '', disableDrag = false, onClosed, size, dragShadowColor, dragColor, children, innerKey } = props; const panAnimated = (0, _react.useRef)(new _reactNative.Animated.ValueXY()).current; const backgroundColor = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current; const { height: H, width } = (0, _reactNative.useWindowDimensions)(); const height = (0, _react.useMemo)(() => getHeight(size, H), [H, size]); const [visible, setVisible] = _react.default.useState(false); const onClose = (0, _react.useCallback)(() => { _reactNative.Animated.timing(backgroundColor, { toValue: 0, duration: 300, useNativeDriver: false }).start(() => { onClosed === null || onClosed === void 0 ? void 0 : onClosed(); setVisible(() => false); }); }, [backgroundColor, onClosed]); const onOpen = (0, _react.useCallback)(() => { setVisible(() => true); }, []); const onShow = (0, _react.useCallback)(() => { _reactNative.Animated.timing(backgroundColor, { toValue: 1, useNativeDriver: false, duration: 300, delay: 200 }).start(); }, [backgroundColor]); const panrespon = (0, _react.useRef)(_reactNative.PanResponder.create({ onMoveShouldSetPanResponder: () => true, onPanResponderMove: (e, g) => { if (g.dy > 0) { _reactNative.Animated.event([null, { dy: panAnimated.y }], { useNativeDriver: false })(e, g); } }, onPanResponderRelease: (_e, gesture) => { if (gesture.dy > height / 2.5) { onClose(); } else { _reactNative.Animated.spring(panAnimated, { toValue: { x: 0, y: 0 }, useNativeDriver: false, speed: 30 }).start(); } } })).current; const bgColorMemo = (0, _react.useMemo)(() => backgroundColor.interpolate({ inputRange: [0, 1], outputRange: ['transparent', backDropColor || 'rgba(0,0,0,0.7)'] }), [backDropColor, backgroundColor]); (0, _react.useEffect)(() => { if (visible === true) { _reactNative.Animated.spring(panAnimated, { toValue: { x: 0, y: 0 }, useNativeDriver: false, speed: 3 }).start(); } }, [panAnimated, visible]); (0, _react.useImperativeHandle)(ref, () => ({ open: onOpen, close: onClose }), [onClose, onOpen]); return /*#__PURE__*/_react.default.createElement(_reactNative.Modal, { key: innerKey, pointerEvents: "none", collapsable: true, statusBarTranslucent: true, needsOffscreenAlphaCompositing: true, transparent: true, animationType: "slide", onShow: onShow, visible: visible, onRequestClose: onClose }, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, { style: [_reactNative.StyleSheet.absoluteFill, { backgroundColor: bgColorMemo }] }), /*#__PURE__*/_react.default.createElement(_reactNative.KeyboardAvoidingView, { removeClippedSubviews: true, renderToHardwareTextureAndroid: true, enabled: true, behavior: "padding", style: { flex: 1 }, pointerEvents: "auto" }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, { touchSoundDisabled: true, disabled: disableDrag, activeOpacity: 1, style: styles.content }, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, { pointerEvents: "auto", collapsable: true, needsOffscreenAlphaCompositing: true, style: [styles.modal, { height, width, transform: [{ translateY: panAnimated.y }] }], renderToHardwareTextureAndroid: true, removeClippedSubviews: true }, /*#__PURE__*/_react.default.createElement(_reactNative.View, _extends({ pointerEvents: "auto" }, panrespon.panHandlers), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, { activeOpacity: 1, disabled: disableDrag }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { pointerEvents: "auto", style: [styles.drag, { shadowColor: dragShadowColor ? dragShadowColor : '#000' }] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.dgragIcon, { backgroundColor: dragColor }] })))), /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: { flex: 1 }, pointerEvents: "auto", collapsable: true, needsOffscreenAlphaCompositing: true }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children)))))); }; const ComponentRef = /*#__PURE__*/(0, _react.forwardRef)(ModalComponent); const Modal = /*#__PURE__*/_react.default.memo(ComponentRef); var _default = Modal; exports.default = _default; const styles = _reactNative.StyleSheet.create({ modal: { backgroundColor: 'white', borderTopEndRadius: 15, borderTopStartRadius: 15, overflow: 'hidden' }, content: { flex: 1, justifyContent: 'flex-end' }, drag: { backgroundColor: 'transparent', width: '100%', justifyContent: 'center', alignItems: 'center', padding: 10, shadowOffset: { width: 1, height: 2 }, shadowRadius: 2.4, shadowOpacity: 0.2 }, dgragIcon: { width: 50, height: 5, borderRadius: 8 } }); //# sourceMappingURL=Modal.js.map