UNPKG

zmp-react

Version:

Build full featured iOS & Android apps using ZMP & React

165 lines (149 loc) 5.45 kB
import _extends from "@babel/runtime/helpers/extends"; import React, { forwardRef, useRef, useImperativeHandle } from 'react'; import { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect'; import CardHeader from './card-header'; import CardContent from './card-content'; import CardFooter from './card-footer'; import { classNames, getExtraAttrs, getSlots, emit } from '../shared/utils'; import { colorClasses } from '../shared/mixins'; import { zmp, zmpready } from '../shared/zmp'; import { watchProp } from '../shared/watch-prop'; var Card = /*#__PURE__*/forwardRef(function (props, ref) { var className = props.className, id = props.id, style = props.style, title = props.title, content = props.content, footer = props.footer, padding = props.padding, outline = props.outline, expandable = props.expandable, expandableAnimateWidth = props.expandableAnimateWidth, expandableOpened = props.expandableOpened, animate = props.animate, hideNavbarOnOpen = props.hideNavbarOnOpen, hideToolbarOnOpen = props.hideToolbarOnOpen, hideStatusbarOnOpen = props.hideStatusbarOnOpen, scrollableEl = props.scrollableEl, swipeToClose = props.swipeToClose, closeByBackdropClick = props.closeByBackdropClick, backdrop = props.backdrop, backdropEl = props.backdropEl, noShadow = props.noShadow, noBorder = props.noBorder; var extraAttrs = getExtraAttrs(props); var elRef = useRef(null); var open = function open() { if (!elRef.current) return; zmp.card.open(elRef.current); }; var close = function close() { if (!elRef.current) return; zmp.card.close(elRef.current); }; var onBeforeOpen = function onBeforeOpen(el, prevent) { if (elRef.current !== el) return; emit(props, 'cardBeforeOpen', el, prevent); }; var onOpen = function onOpen(el) { if (elRef.current !== el) return; emit(props, 'cardOpen', el); }; var onOpened = function onOpened(el, pageEl) { if (elRef.current !== el) return; emit(props, 'cardOpened', el, pageEl); }; var onClose = function onClose(el) { if (elRef.current !== el) return; emit(props, 'cardClose', el); }; var onClosed = function onClosed(el, pageEl) { if (elRef.current !== el) return; emit(props, 'cardClosed', el, pageEl); }; var attachEvents = function attachEvents() { if (!expandable || !elRef.current) return; zmpready(function () { zmp.on('cardBeforeOpen', onBeforeOpen); zmp.on('cardOpen', onOpen); zmp.on('cardOpened', onOpened); zmp.on('cardClose', onClose); zmp.on('cardClosed', onClosed); }); }; var detachEvents = function detachEvents() { zmp.off('cardBeforeOpen', onBeforeOpen); zmp.off('cardOpen', onOpen); zmp.off('cardOpened', onOpened); zmp.off('cardClose', onClose); zmp.off('cardClosed', onClosed); }; var onMount = function onMount() { if (!expandable || !elRef.current) return; zmpready(function () { if (expandable && expandableOpened) { zmp.card.open(elRef.current, false); } }); }; useIsomorphicLayoutEffect(function () { onMount(); }, []); useIsomorphicLayoutEffect(function () { attachEvents(); return detachEvents; }); watchProp(expandableOpened, function (value) { if (value) { open(); } else { close(); } }); useImperativeHandle(ref, function () { return { el: elRef.current, open: open, close: close }; }); var headerEl; var contentEl; var footerEl; var classes = classNames(className, 'card', { 'card-outline': outline, 'card-expandable': expandable, 'card-expandable-animate-width': expandableAnimateWidth, 'no-shadow': noShadow, 'no-border': noBorder }, colorClasses(props)); var slots = getSlots(props); if (title || slots.header) { headerEl = /*#__PURE__*/React.createElement(CardHeader, null, title, slots.header); } if (content || slots.content) { contentEl = /*#__PURE__*/React.createElement(CardContent, { padding: padding }, content, slots.content); } if (footer || slots.footer) { footerEl = /*#__PURE__*/React.createElement(CardFooter, null, footer, slots.footer); } return /*#__PURE__*/React.createElement("div", _extends({ id: id, style: style, className: classes, "data-animate": typeof animate === 'undefined' ? animate : animate.toString(), "data-hide-navbar-on-open": typeof hideNavbarOnOpen === 'undefined' ? hideNavbarOnOpen : hideNavbarOnOpen.toString(), "data-hide-toolbar-on-open": typeof hideToolbarOnOpen === 'undefined' ? hideToolbarOnOpen : hideToolbarOnOpen.toString(), "data-hide-statusbar-on-open": typeof hideStatusbarOnOpen === 'undefined' ? hideStatusbarOnOpen : hideStatusbarOnOpen.toString(), "data-scrollable-el": scrollableEl, "data-swipe-to-close": typeof swipeToClose === 'undefined' ? swipeToClose : swipeToClose.toString(), "data-close-by-backdrop-click": typeof closeByBackdropClick === 'undefined' ? closeByBackdropClick : closeByBackdropClick.toString(), "data-backdrop": typeof backdrop === 'undefined' ? backdrop : backdrop.toString(), "data-backdrop-el": backdropEl, ref: elRef }, extraAttrs), headerEl, contentEl, footerEl, slots.default); }); Card.displayName = 'zmp-card'; export default Card;