UNPKG

@moxb/stellar-router-react

Version:

Stellar router: React widgets

110 lines (109 loc) 5.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.rootOrDetails = void 0; var tslib_1 = require("tslib"); var mobx_react_lite_1 = require("mobx-react-lite"); var uuid_1 = require("uuid"); var stellar_router_core_1 = require("@moxb/stellar-router-core"); var rendering_1 = require("./rendering"); var routingProviders_1 = require("./routingProviders"); function rootOrDetails(ownProps) { var nodeId = (0, uuid_1.v4)(); return (0, mobx_react_lite_1.observer)(function (props) { var locationManager = (0, routingProviders_1.useLocationManager)('root or details internal'); var navControl = props.navControl; // console.log('root-or-details navControl is', navControl); var rootHooks = new stellar_router_core_1.HookMap(); var detailHooks = new stellar_router_core_1.HookMap(); var isRootActive = function () { return navControl.isActive() && (0, stellar_router_core_1.isTokenEmpty)((0, stellar_router_core_1.getNextPathToken)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, props), { locationManager: locationManager }))); }; var isDetailActive = function () { return navControl.isActive() && !isRootActive(); }; /** * We register ourselves as a change interceptor, * because we might have to hide some content * on location changes, and we want to know about that * in advance, so that we can suggest some questions to ask * from the user. */ locationManager._registerChangeInterceptor({ getId: function () { return nodeId; }, /** * This is our "change interceptor" hook, that will be called by the * `LocationManager`. */ // eslint-disable-next-line complexity anyQuestionsFor: function (location) { var oldToken = (0, stellar_router_core_1.getNextPathToken)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, props), { locationManager: locationManager })); var oldRoot = (0, stellar_router_core_1.isTokenEmpty)(oldToken); var newToken = location.pathTokens[props.parsedTokens]; var newRoot = (0, stellar_router_core_1.isTokenEmpty)(newToken); if (newRoot) { if (oldRoot) { // Staying at root, nothing to do. } else { // Going from detail to root. // We would hide the detail, so check with it. return detailHooks .getAll() .map(function (h) { return (h.getLeaveQuestion ? h.getLeaveQuestion() : undefined); }) .filter(function (q) { return !!q; }); } } else { if (oldRoot) { // Going from root to detail. // We would hide the root, so check with it. return rootHooks .getAll() .map(function (h) { return (h.getLeaveQuestion ? h.getLeaveQuestion() : undefined); }) .filter(function (q) { return !!q; }); } else { // Staying ad detail, nothing to do } } return []; }, }); var ifRoot = ownProps.ifRoot, ifDetails = ownProps.ifDetails; var token = (0, stellar_router_core_1.getNextPathToken)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, props), { locationManager: locationManager })); if ((0, stellar_router_core_1.isTokenEmpty)(token)) { return (0, rendering_1.renderSubStateCore)({ state: ifRoot, navigationContext: props, checkCondition: true, navControl: { getParentName: function () { return 'rootOrDetail:root'; }, getAncestorNames: function () { return (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], navControl.getAncestorNames(), true), ['rootOrDetail:root'], false); }, isActive: isRootActive, registerStateHooks: rootHooks.set, unregisterStateHooks: rootHooks.reset, }, }); } else { var detailProps = { token: token, }; return (0, rendering_1.renderSubStateCore)({ state: ifDetails, navigationContext: props, tokenIncrease: 1, extraProps: detailProps, checkCondition: true, navControl: { getParentName: function () { return 'rootOrDetail:detail'; }, getAncestorNames: function () { return (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], navControl.getAncestorNames(), true), ['rootOrDetail:detail'], false); }, isActive: isDetailActive, registerStateHooks: detailHooks.set, unregisterStateHooks: detailHooks.reset, }, }); } }); } exports.rootOrDetails = rootOrDetails;