Skip to content

Commit 46562cc

Browse files
committed
Core: Router - preRoute support for routes
1 parent 72a9718 commit 46562cc

3 files changed

Lines changed: 150 additions & 47 deletions

File tree

src/core/modules/router/back.js

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { document } from 'ssr-window';
33
import Utils from '../../utils/utils';
44
import History from '../../utils/history';
55
import redirect from './redirect';
6+
import preRoute from './pre-route';
67

78
function backward(el, backwardOptions) {
89
const router = this;
@@ -492,37 +493,69 @@ function back(...args) {
492493
options.route.context = options.context;
493494
}
494495

496+
let backForceLoaded;
495497
if (options.force && router.params.stackPages) {
496498
router.$el.children('.page-previous.stacked').each((index, pageEl) => {
497499
if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
500+
backForceLoaded = true;
498501
router.loadBack({ el: pageEl }, options);
499502
}
500503
});
504+
if (backForceLoaded) {
505+
return router;
506+
}
501507
}
502-
503-
('url content component pageName el componentUrl template templateUrl').split(' ').forEach((pageLoadProp) => {
504-
if (route.route[pageLoadProp]) {
505-
router.loadBack({ [pageLoadProp]: route.route[pageLoadProp] }, options);
508+
function resolve() {
509+
let routerLoaded = false;
510+
('url content component pageName el componentUrl template templateUrl').split(' ').forEach((pageLoadProp) => {
511+
if (route.route[pageLoadProp] && !routerLoaded) {
512+
routerLoaded = true;
513+
router.loadBack({ [pageLoadProp]: route.route[pageLoadProp] }, options);
514+
}
515+
});
516+
if (routerLoaded) return;
517+
// Async
518+
function asyncResolve(resolveParams, resolveOptions) {
519+
router.allowPageChange = false;
520+
if (resolveOptions && resolveOptions.context) {
521+
if (!route.context) route.context = resolveOptions.context;
522+
else route.context = Utils.extend({}, route.context, resolveOptions.context);
523+
options.route.context = route.context;
524+
}
525+
router.loadBack(resolveParams, Utils.extend(options, resolveOptions), true);
506526
}
507-
});
508-
// Async
509-
function asyncResolve(resolveParams, resolveOptions) {
510-
router.allowPageChange = false;
511-
if (resolveOptions && resolveOptions.context) {
512-
if (!route.context) route.context = resolveOptions.context;
513-
else route.context = Utils.extend({}, route.context, resolveOptions.context);
514-
options.route.context = route.context;
527+
function asyncReject() {
528+
router.allowPageChange = true;
529+
}
530+
if (route.route.async) {
531+
router.allowPageChange = false;
532+
533+
route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
515534
}
516-
router.loadBack(resolveParams, Utils.extend(options, resolveOptions), true);
517535
}
518-
function asyncReject() {
536+
function reject() {
519537
router.allowPageChange = true;
520538
}
521-
if (route.route.async) {
522-
router.allowPageChange = false;
523539

524-
route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
540+
if (router.params.preRoute || route.route.preRoute) {
541+
router.allowPageChange = false;
542+
preRoute.call(
543+
router,
544+
route.route.preRoute,
545+
route,
546+
router.currentRoute,
547+
() => {
548+
router.allowPageChange = true;
549+
resolve();
550+
},
551+
() => {
552+
reject();
553+
},
554+
);
555+
} else {
556+
resolve();
525557
}
558+
526559
// Return Router
527560
return router;
528561
}

src/core/modules/router/navigate.js

Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { document } from 'ssr-window';
33
import Utils from '../../utils/utils';
44
import History from '../../utils/history';
55
import redirect from './redirect';
6+
import preRoute from './pre-route';
67

78
function refreshPage() {
89
const router = this;
@@ -539,54 +540,86 @@ function navigate(navigateParams, navigateOptions = {}) {
539540
return redirect.call(router, 'navigate', route, navigateOptions);
540541
}
541542

543+
542544
const options = {};
543545
if (route.route.options) {
544546
Utils.extend(options, route.route.options, navigateOptions, { route });
545547
} else {
546548
Utils.extend(options, navigateOptions, { route });
547549
}
550+
548551
if (options && options.context) {
549552
route.context = options.context;
550553
options.route.context = options.context;
551554
}
552-
('popup popover sheet loginScreen actions customModal').split(' ').forEach((modalLoadProp) => {
553-
if (route.route[modalLoadProp]) {
554-
router.modalLoad(modalLoadProp, route, options);
555-
}
556-
});
557-
('url content component pageName el componentUrl template templateUrl').split(' ').forEach((pageLoadProp) => {
558-
if (route.route[pageLoadProp]) {
559-
router.load({ [pageLoadProp]: route.route[pageLoadProp] }, options);
560-
}
561-
});
562-
// Async
563-
function asyncResolve(resolveParams, resolveOptions) {
564-
router.allowPageChange = false;
565-
let resolvedAsModal = false;
566-
if (resolveOptions && resolveOptions.context) {
567-
if (!route.context) route.context = resolveOptions.context;
568-
else route.context = Utils.extend({}, route.context, resolveOptions.context);
569-
options.route.context = route.context;
570-
}
555+
556+
function resolve() {
557+
let routerLoaded = false;
571558
('popup popover sheet loginScreen actions customModal').split(' ').forEach((modalLoadProp) => {
572-
if (resolveParams[modalLoadProp]) {
573-
resolvedAsModal = true;
574-
const modalRoute = Utils.extend({}, route, { route: resolveParams });
575-
router.allowPageChange = true;
576-
router.modalLoad(modalLoadProp, modalRoute, Utils.extend(options, resolveOptions));
559+
if (route.route[modalLoadProp] && !routerLoaded) {
560+
routerLoaded = true;
561+
router.modalLoad(modalLoadProp, route, options);
562+
}
563+
});
564+
('url content component pageName el componentUrl template templateUrl').split(' ').forEach((pageLoadProp) => {
565+
if (route.route[pageLoadProp] && !routerLoaded) {
566+
routerLoaded = true;
567+
router.load({ [pageLoadProp]: route.route[pageLoadProp] }, options);
577568
}
578569
});
579-
if (resolvedAsModal) return;
580-
router.load(resolveParams, Utils.extend(options, resolveOptions), true);
570+
if (routerLoaded) return;
571+
// Async
572+
function asyncResolve(resolveParams, resolveOptions) {
573+
router.allowPageChange = false;
574+
let resolvedAsModal = false;
575+
if (resolveOptions && resolveOptions.context) {
576+
if (!route.context) route.context = resolveOptions.context;
577+
else route.context = Utils.extend({}, route.context, resolveOptions.context);
578+
options.route.context = route.context;
579+
}
580+
('popup popover sheet loginScreen actions customModal').split(' ').forEach((modalLoadProp) => {
581+
if (resolveParams[modalLoadProp]) {
582+
resolvedAsModal = true;
583+
const modalRoute = Utils.extend({}, route, { route: resolveParams });
584+
router.allowPageChange = true;
585+
router.modalLoad(modalLoadProp, modalRoute, Utils.extend(options, resolveOptions));
586+
}
587+
});
588+
if (resolvedAsModal) return;
589+
router.load(resolveParams, Utils.extend(options, resolveOptions), true);
590+
}
591+
function asyncReject() {
592+
router.allowPageChange = true;
593+
}
594+
if (route.route.async) {
595+
router.allowPageChange = false;
596+
597+
route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
598+
}
581599
}
582-
function asyncReject() {
600+
function reject() {
583601
router.allowPageChange = true;
584602
}
585-
if (route.route.async) {
586-
router.allowPageChange = false;
587603

588-
route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
604+
if (router.params.preRoute || route.route.preRoute) {
605+
router.allowPageChange = false;
606+
preRoute.call(
607+
router,
608+
route.route.preRoute,
609+
route,
610+
router.currentRoute,
611+
() => {
612+
router.allowPageChange = true;
613+
resolve();
614+
},
615+
() => {
616+
reject();
617+
},
618+
);
619+
} else {
620+
resolve();
589621
}
622+
590623
// Return Router
591624
return router;
592625
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
export default function (routePreRoute, to, from, resolve, reject) {
2+
const router = this;
3+
const preRoutes = [];
4+
if (Array.isArray(routePreRoute)) {
5+
preRoutes.push(...routePreRoute);
6+
} else if (routePreRoute && typeof routePreRoute === 'function') {
7+
preRoutes.push(routePreRoute);
8+
}
9+
if (router.params.preRoute) {
10+
if (Array.isArray(router.params.preRoute)) {
11+
preRoutes.push(...router.params.preRoute);
12+
} else {
13+
preRoutes.push(router.params.preRoute);
14+
}
15+
}
16+
17+
function next() {
18+
if (preRoutes.length === 0) {
19+
resolve();
20+
return;
21+
}
22+
const preRoute = preRoutes.shift();
23+
24+
preRoute.call(
25+
router,
26+
to,
27+
from,
28+
() => {
29+
next();
30+
},
31+
() => {
32+
reject();
33+
}
34+
);
35+
}
36+
next();
37+
}

0 commit comments

Comments
 (0)