zmp-react
Version:
Build full featured iOS & Android apps using ZMP & React
165 lines (149 loc) • 5.45 kB
JavaScript
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;