UNPKG

zmp-react

Version:

Build full featured iOS & Android apps using ZMP & React

116 lines (102 loc) 3.67 kB
import _extends from "@babel/runtime/helpers/extends"; import React, { forwardRef, useRef, useImperativeHandle, useState, useContext } from 'react'; import { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect'; import { classNames, getExtraAttrs, getComponentId } from '../shared/utils'; import { colorClasses } from '../shared/mixins'; import { zmpready, zmprouters, zmp, zmpevents } from '../shared/zmp'; import { useTab } from '../shared/use-tab'; import { RouterContext } from '../shared/router-context'; import { useAsyncComponent } from '../shared/use-async-component'; var Tab = /*#__PURE__*/forwardRef(function (props, ref) { var className = props.className, id = props.id, style = props.style, children = props.children, tabActive = props.tabActive; var extraAttrs = getExtraAttrs(props); var elRef = useRef(null); var routerData = useRef(null); var routerContext = useContext(RouterContext); var initialTabContent = null; if (!routerData.current && routerContext && routerContext.route && routerContext.route.route && routerContext.route.route.tab && routerContext.route.route.tab.id === id) { var _routerContext$route$ = routerContext.route.route.tab, component = _routerContext$route$.component, asyncComponent = _routerContext$route$.asyncComponent; if (component || asyncComponent) { initialTabContent = { id: getComponentId(), component: component || asyncComponent, isAsync: !!asyncComponent, props: _extends({ zmprouter: routerContext.router, zmproute: routerContext.route }, routerContext.route.params) }; } } var _useState = useState(initialTabContent || null), tabContent = _useState[0], setTabContent = _useState[1]; useImperativeHandle(ref, function () { return { el: elRef.current }; }); if (zmp && !routerData.current) { routerData.current = { setTabContent: setTabContent }; zmprouters.tabs.push(routerData.current); } var onMount = function onMount() { if (elRef.current && initialTabContent) { elRef.current.zmpRouterTabLoaded = true; } zmpready(function () { if (!routerData.current) { routerData.current = { el: elRef.current, setTabContent: setTabContent }; zmprouters.tabs.push(routerData.current); } else { routerData.current.el = elRef.current; } }); }; var onDestroy = function onDestroy() { if (!routerData.current) return; zmprouters.tabs.splice(zmprouters.tabs.indexOf(routerData.current), 1); routerData.current = null; }; useIsomorphicLayoutEffect(function () { onMount(); return onDestroy; }, []); useIsomorphicLayoutEffect(function () { if (!routerData.current || !zmp) return; zmpevents.emit('tabRouterDidUpdate', routerData.current); }); useTab(elRef, props); var classes = classNames(className, 'tab', { 'tab-active': tabActive }, colorClasses(props)); var renderChildren = function renderChildren() { if (!tabContent) return children; if (tabContent.isAsync) { return useAsyncComponent(tabContent.component, tabContent.props, tabContent.id); } var TabContent = tabContent.component; return /*#__PURE__*/React.createElement(TabContent, _extends({ key: tabContent.id }, tabContent.props)); }; return /*#__PURE__*/React.createElement("div", _extends({ id: id, style: style, className: classes, ref: elRef }, extraAttrs), renderChildren()); }); Tab.displayName = 'zmp-tab'; export default Tab;