UNPKG

zmp-react

Version:

Build full featured iOS & Android apps using ZMP & React

363 lines (317 loc) 12.7 kB
import _extends from "@babel/runtime/helpers/extends"; import React, { forwardRef, useRef, useImperativeHandle } from 'react'; import { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect'; import { classNames, getExtraAttrs, getSlots, emit } from '../shared/utils'; import { colorClasses } from '../shared/mixins'; import { zmpready, zmp } from '../shared/zmp'; import PageContent from './page-content'; var Page = /*#__PURE__*/forwardRef(function (props, ref) { var className = props.className, id = props.id, style = props.style, name = props.name, stacked = props.stacked, withSubnavbar = props.withSubnavbar, subnavbar = props.subnavbar, withNavbarLarge = props.withNavbarLarge, navbarLarge = props.navbarLarge, noNavbar = props.noNavbar, noToolbar = props.noToolbar, tabs = props.tabs, _props$pageContent = props.pageContent, pageContent = _props$pageContent === void 0 ? true : _props$pageContent, noSwipeback = props.noSwipeback, ptr = props.ptr, ptrDistance = props.ptrDistance, _props$ptrPreloader = props.ptrPreloader, ptrPreloader = _props$ptrPreloader === void 0 ? true : _props$ptrPreloader, ptrBottom = props.ptrBottom, ptrMousewheel = props.ptrMousewheel, infinite = props.infinite, infiniteTop = props.infiniteTop, infiniteDistance = props.infiniteDistance, _props$infinitePreloa = props.infinitePreloader, infinitePreloader = _props$infinitePreloa === void 0 ? true : _props$infinitePreloa, hideBarsOnScroll = props.hideBarsOnScroll, hideNavbarOnScroll = props.hideNavbarOnScroll, hideToolbarOnScroll = props.hideToolbarOnScroll, messagesContent = props.messagesContent, loginScreen = props.loginScreen, onPtrPullStart = props.onPtrPullStart, onPtrPullMove = props.onPtrPullMove, onPtrPullEnd = props.onPtrPullEnd, onPtrRefresh = props.onPtrRefresh, onPtrDone = props.onPtrDone, onInfinite = props.onInfinite; var hasSubnavbar = useRef(false); var hasNavbarLarge = useRef(false); var hasNavbarLargeCollapsed = useRef(false); var hasCardExpandableOpened = useRef(false); var routerPositionClass = useRef(''); var routerForceUnstack = useRef(false); var routerPageRole = useRef(null); var routerPageRoleDetailRoot = useRef(false); var routerPageMasterStack = useRef(false); var extraAttrs = getExtraAttrs(props); var elRef = useRef(null); // Main Page Events var onPageMounted = function onPageMounted(page) { if (elRef.current !== page.el) return; emit(props, 'pageMounted', page); }; var onPageInit = function onPageInit(page) { if (elRef.current !== page.el) return; if (typeof withSubnavbar === 'undefined' && typeof subnavbar === 'undefined') { if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length || page.$el.children('.navbar').find('.subnavbar').length) { hasSubnavbar.current = true; } } if (typeof withNavbarLarge === 'undefined' && typeof navbarLarge === 'undefined') { if (page.$navbarEl && page.$navbarEl.hasClass('navbar-large')) { hasNavbarLarge.current = true; } } emit(props, 'pageInit', page); }; var onPageReinit = function onPageReinit(page) { if (elRef.current !== page.el) return; emit(props, 'pageReinit', page); }; var onPageBeforeIn = function onPageBeforeIn(page) { if (elRef.current !== page.el) return; if (!page.swipeBack) { if (page.from === 'next') { routerPositionClass.current = 'page-next'; } if (page.from === 'previous') { routerPositionClass.current = 'page-previous'; } } emit(props, 'pageBeforeIn', page); }; var onPageBeforeOut = function onPageBeforeOut(page) { if (elRef.current !== page.el) return; emit(props, 'pageBeforeOut', page); }; var onPageAfterOut = function onPageAfterOut(page) { if (elRef.current !== page.el) return; if (page.to === 'next') { routerPositionClass.current = 'page-next'; } if (page.to === 'previous') { routerPositionClass.current = 'page-previous'; } emit(props, 'pageAfterOut', page); }; var onPageAfterIn = function onPageAfterIn(page) { if (elRef.current !== page.el) return; routerPositionClass.current = 'page-current'; emit(props, 'pageAfterIn', page); }; var onPageBeforeRemove = function onPageBeforeRemove(page) { if (elRef.current !== page.el) return; emit(props, 'pageBeforeRemove', page); }; var onPageBeforeUnmount = function onPageBeforeUnmount(page) { if (elRef.current !== page.el) return; emit(props, 'pageBeforeUnmount', page); }; // Helper events var onPageStack = function onPageStack(pageEl) { if (elRef.current !== pageEl) return; routerForceUnstack.current = false; }; var onPageUnstack = function onPageUnstack(pageEl) { if (elRef.current !== pageEl) return; routerForceUnstack.current = true; }; var onPagePosition = function onPagePosition(pageEl, position) { if (elRef.current !== pageEl) return; routerPositionClass.current = "page-" + position; }; var onPageRole = function onPageRole(pageEl, rolesData) { if (elRef.current !== pageEl) return; routerPageRole.current = rolesData.role; routerPageRoleDetailRoot.current = rolesData.detailRoot; }; var onPageMasterStack = function onPageMasterStack(pageEl) { if (elRef.current !== pageEl) return; routerPageMasterStack.current = true; }; var onPageMasterUnstack = function onPageMasterUnstack(pageEl) { if (elRef.current !== pageEl) return; routerPageMasterStack.current = false; }; var onPageNavbarLargeCollapsed = function onPageNavbarLargeCollapsed(pageEl) { if (elRef.current !== pageEl) return; hasNavbarLargeCollapsed.current = true; }; var onPageNavbarLargeExpanded = function onPageNavbarLargeExpanded(pageEl) { if (elRef.current !== pageEl) return; hasNavbarLargeCollapsed.current = false; }; var onCardOpened = function onCardOpened(cardEl, pageEl) { if (elRef.current !== pageEl) return; hasCardExpandableOpened.current = true; }; var onCardClose = function onCardClose(cardEl, pageEl) { if (elRef.current !== pageEl) return; hasCardExpandableOpened.current = false; }; var onPageTabShow = function onPageTabShow(pageEl) { if (elRef.current !== pageEl) return; emit(props, 'pageTabShow'); }; var onPageTabHide = function onPageTabHide(pageEl) { if (elRef.current !== pageEl) return; emit(props, 'pageTabHide'); }; useImperativeHandle(ref, function () { return { el: elRef.current }; }); var attachEvents = function attachEvents() { zmpready(function () { zmp.on('pageMounted', onPageMounted); zmp.on('pageInit', onPageInit); zmp.on('pageReinit', onPageReinit); zmp.on('pageBeforeIn', onPageBeforeIn); zmp.on('pageBeforeOut', onPageBeforeOut); zmp.on('pageAfterOut', onPageAfterOut); zmp.on('pageAfterIn', onPageAfterIn); zmp.on('pageBeforeRemove', onPageBeforeRemove); zmp.on('pageBeforeUnmount', onPageBeforeUnmount); zmp.on('pageStack', onPageStack); zmp.on('pageUnstack', onPageUnstack); zmp.on('pagePosition', onPagePosition); zmp.on('pageRole', onPageRole); zmp.on('pageMasterStack', onPageMasterStack); zmp.on('pageMasterUnstack', onPageMasterUnstack); zmp.on('pageNavbarLargeCollapsed', onPageNavbarLargeCollapsed); zmp.on('pageNavbarLargeExpanded', onPageNavbarLargeExpanded); zmp.on('cardOpened', onCardOpened); zmp.on('cardClose', onCardClose); zmp.on('pageTabShow', onPageTabShow); zmp.on('pageTabHide', onPageTabHide); }); }; var detachEvents = function detachEvents() { if (!zmp) return; zmp.off('pageMounted', onPageMounted); zmp.off('pageInit', onPageInit); zmp.off('pageReinit', onPageReinit); zmp.off('pageBeforeIn', onPageBeforeIn); zmp.off('pageBeforeOut', onPageBeforeOut); zmp.off('pageAfterOut', onPageAfterOut); zmp.off('pageAfterIn', onPageAfterIn); zmp.off('pageBeforeRemove', onPageBeforeRemove); zmp.off('pageBeforeUnmount', onPageBeforeUnmount); zmp.off('pageStack', onPageStack); zmp.off('pageUnstack', onPageUnstack); zmp.off('pagePosition', onPagePosition); zmp.off('pageRole', onPageRole); zmp.off('pageMasterStack', onPageMasterStack); zmp.off('pageMasterUnstack', onPageMasterUnstack); zmp.off('pageNavbarLargeCollapsed', onPageNavbarLargeCollapsed); zmp.off('pageNavbarLargeExpanded', onPageNavbarLargeExpanded); zmp.off('cardOpened', onCardOpened); zmp.off('cardClose', onCardClose); zmp.off('pageTabShow', onPageTabShow); zmp.off('pageTabHide', onPageTabHide); }; useIsomorphicLayoutEffect(function () { attachEvents(); return detachEvents; }); var slots = getSlots(props); var fixedList = []; var staticList = []; var slotsStatic = slots.static, slotsFixed = slots.fixed, slotsDefault = slots.default; var fixedTags = 'navbar toolbar tabbar subnavbar searchbar messagebar fab list-index panel'.split(' ').map(function (tagName) { return "zmp-" + tagName; }); var hasSubnavbarComputed; var hasNavbarLargeComputed; var hasMessages = messagesContent; if (slotsDefault) { slotsDefault.forEach(function (child) { if (typeof child === 'undefined') return; var isFixedTag = false; var tag = child.type && (child.type.displayName || child.type.name); if (!tag) { if (pageContent) staticList.push(child); return; } if (tag === 'zmp-subnavbar') hasSubnavbarComputed = true; if (tag === 'zmp-navbar') { if (child.props && child.props.large) hasNavbarLargeComputed = true; } if (typeof hasMessages === 'undefined' && tag === 'zmp-messages') hasMessages = true; if (fixedTags.indexOf(tag) >= 0) { isFixedTag = true; } if (pageContent) { if (isFixedTag) fixedList.push(child);else staticList.push(child); } }); } var forceSubnavbar = typeof subnavbar === 'undefined' && typeof withSubnavbar === 'undefined' ? hasSubnavbarComputed || hasSubnavbar.current : false; var forceNavbarLarge = typeof navbarLarge === 'undefined' && typeof withNavbarLarge === 'undefined' ? hasNavbarLargeComputed || hasNavbarLarge.current : false; var classes = classNames(className, 'page', routerPositionClass.current, { stacked: stacked && !routerForceUnstack.current, tabs: tabs, 'page-with-subnavbar': subnavbar || withSubnavbar || forceSubnavbar, 'page-with-navbar-large': navbarLarge || withNavbarLarge || forceNavbarLarge, 'no-navbar': noNavbar, 'no-toolbar': noToolbar, 'no-swipeback': noSwipeback, 'page-master': routerPageRole.current === 'master', 'page-master-detail': routerPageRole.current === 'detail', 'page-master-detail-root': routerPageRoleDetailRoot.current === true, 'page-master-stacked': routerPageMasterStack.current === true, 'page-with-navbar-large-collapsed': hasNavbarLargeCollapsed.current === true, 'page-with-card-opened': hasCardExpandableOpened.current === true, 'login-screen-page': loginScreen }, colorClasses(props)); if (!pageContent) { return /*#__PURE__*/React.createElement("div", _extends({ id: id, style: style, className: classes, "data-name": name, ref: elRef }, extraAttrs), slotsFixed, slotsStatic, slotsDefault); } var pageContentEl = /*#__PURE__*/React.createElement(PageContent, { ptr: ptr, ptrDistance: ptrDistance, ptrPreloader: ptrPreloader, ptrBottom: ptrBottom, ptrMousewheel: ptrMousewheel, infinite: infinite, infiniteTop: infiniteTop, infiniteDistance: infiniteDistance, infinitePreloader: infinitePreloader, hideBarsOnScroll: hideBarsOnScroll, hideNavbarOnScroll: hideNavbarOnScroll, hideToolbarOnScroll: hideToolbarOnScroll, messagesContent: messagesContent || hasMessages, loginScreen: loginScreen, onPtrPullStart: onPtrPullStart, onPtrPullMove: onPtrPullMove, onPtrPullEnd: onPtrPullEnd, onPtrRefresh: onPtrRefresh, onPtrDone: onPtrDone, onInfinite: onInfinite }, slotsStatic, staticList); return /*#__PURE__*/React.createElement("div", _extends({ id: id, style: style, className: classes, "data-name": name, ref: elRef }, extraAttrs), fixedList, slotsFixed, pageContentEl); }); Page.displayName = 'zmp-page'; export default Page;