zmp-react
Version:
Build full featured iOS & Android apps using ZMP & React
208 lines (178 loc) • 6.6 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import React, { forwardRef, useRef, useImperativeHandle, useMemo } from 'react';
import { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect';
import { classNames, getExtraAttrs, emit, getSlots } from '../shared/utils';
import { colorClasses } from '../shared/mixins';
import { zmpready, zmp } from '../shared/zmp';
import { watchProp } from '../shared/watch-prop';
import { modalStateClasses } from '../shared/modal-state-classes';
var Sheet = /*#__PURE__*/forwardRef(function (props, ref) {
var _zmpSheet = useRef(null);
var className = props.className,
id = props.id,
style = props.style,
top = props.top,
bottom = props.bottom,
position = props.position,
push = props.push,
opened = props.opened,
animate = props.animate,
backdrop = props.backdrop,
backdropEl = props.backdropEl,
closeByBackdropClick = props.closeByBackdropClick,
closeByOutsideClick = props.closeByOutsideClick,
closeOnEscape = props.closeOnEscape,
swipeToClose = props.swipeToClose,
swipeToStep = props.swipeToStep,
swipeHandler = props.swipeHandler,
containerEl = props.containerEl,
color = props.color,
colorTheme = props.colorTheme,
textColor = props.textColor,
bgColor = props.bgColor,
borderColor = props.borderColor,
rippleColor = props.rippleColor,
themeDark = props.themeDark;
var extraAttrs = getExtraAttrs(props);
var elRef = useRef(null);
var isOpened = useRef(opened);
var isClosing = useRef(false);
var onStepProgress = function onStepProgress(instance, progress) {
emit(props, 'sheetStepProgress', instance, progress);
};
var onStepOpen = function onStepOpen(instance) {
emit(props, 'sheetStepOpen', instance);
};
var onStepClose = function onStepClose(instance) {
emit(props, 'sheetStepClose', instance);
};
var onOpen = function onOpen(instance) {
isOpened.current = true;
isClosing.current = false;
emit(props, 'sheetOpen', instance);
};
var onOpened = function onOpened(instance) {
emit(props, 'sheetOpened', instance);
};
var onClose = function onClose(instance) {
isOpened.current = false;
isClosing.current = true;
emit(props, 'sheetClose', instance);
};
var onClosed = function onClosed(instance) {
isClosing.current = false;
emit(props, 'sheetClosed', instance);
};
useImperativeHandle(ref, function () {
return {
el: elRef.current,
zmpSheet: function zmpSheet() {
return _zmpSheet.current;
}
};
});
var modalEvents = function modalEvents(method) {
if (!_zmpSheet.current) return;
_zmpSheet.current[method]('open', onOpen);
_zmpSheet.current[method]('opened', onOpened);
_zmpSheet.current[method]('close', onClose);
_zmpSheet.current[method]('closed', onClosed);
_zmpSheet.current[method]('stepOpen', onStepOpen);
_zmpSheet.current[method]('stepClose', onStepClose);
_zmpSheet.current[method]('stepProgress', onStepProgress);
};
var onMount = function onMount() {
if (!elRef.current) return;
var sheetParams = {
el: elRef.current
};
if ('animate' in props && typeof animate !== 'undefined') sheetParams.animate = animate;
if ('backdrop' in props && typeof backdrop !== 'undefined') sheetParams.backdrop = backdrop;
if ('backdropEl' in props) sheetParams.backdropEl = backdropEl;
if ('closeByBackdropClick' in props) sheetParams.closeByBackdropClick = closeByBackdropClick;
if ('closeByOutsideClick' in props) sheetParams.closeByOutsideClick = closeByOutsideClick;
if ('closeOnEscape' in props) sheetParams.closeOnEscape = closeOnEscape;
if ('swipeToClose' in props) sheetParams.swipeToClose = swipeToClose;
if ('swipeToStep' in props) sheetParams.swipeToStep = swipeToStep;
if ('swipeHandler' in props) sheetParams.swipeHandler = swipeHandler;
if ('containerEl' in props) sheetParams.containerEl = containerEl;
zmpready(function () {
_zmpSheet.current = zmp.sheet.create(sheetParams);
modalEvents('on');
if (opened) {
_zmpSheet.current.open(false);
}
});
};
var onDestroy = function onDestroy() {
if (_zmpSheet.current) {
if (_zmpSheet.current.opened) {
_zmpSheet.current.close();
} else {
_zmpSheet.current.destroy();
}
_zmpSheet.current = null;
}
};
useIsomorphicLayoutEffect(function () {
modalEvents('on');
return function () {
modalEvents('off');
};
});
useIsomorphicLayoutEffect(function () {
onMount();
return onDestroy;
}, []);
watchProp(opened, function (value) {
if (!_zmpSheet.current) return;
if (value) {
_zmpSheet.current.open();
} else {
_zmpSheet.current.close();
}
});
var slots = getSlots(props);
var fixedList = [];
var staticList = [];
var fixedTags = 'navbar toolbar tabbar subnavbar searchbar messagebar fab list-index panel'.split(' ').map(function (tagName) {
return "zmp-" + tagName;
});
var slotsDefault = slots.default;
if (slotsDefault && slotsDefault.length) {
slotsDefault.forEach(function (child) {
if (typeof child === 'undefined') return;
var isFixedTag = false;
var tag = child.type && (child.type.displayName || child.type.name);
if (!tag) {
staticList.push(child);
return;
}
if (fixedTags.indexOf(tag) >= 0) {
isFixedTag = true;
}
if (isFixedTag) fixedList.push(child);else staticList.push(child);
});
}
var innerEl = /*#__PURE__*/React.createElement("div", {
className: "sheet-modal-inner"
}, staticList, slots.static);
var positionComputed = 'bottom';
if (position) positionComputed = position;else if (top) positionComputed = 'top';else if (bottom) positionComputed = 'bottom';
var classes = useMemo(function () {
return classNames(className, 'sheet-modal', "sheet-modal-" + positionComputed, {
'sheet-modal-push': push
}, modalStateClasses({
isOpened: isOpened,
isClosing: isClosing
}), colorClasses(props));
}, [isOpened, isClosing, className, push, positionComputed, color, colorTheme, textColor, bgColor, borderColor, rippleColor, themeDark]);
return /*#__PURE__*/React.createElement("div", _extends({
id: id,
style: style,
className: classes,
ref: elRef
}, extraAttrs), fixedList, slots.fixed, innerEl);
});
Sheet.displayName = 'zmp-sheet';
export default Sheet;