@moxb/stellar-router-react
Version:
Stellar router: React widgets
110 lines (109 loc) • 5.42 kB
JavaScript
;
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;