Skip to content

Commit bcc94c1

Browse files
committed
feat: 🎸 add new getCurrentContext method
1 parent ae67dbb commit bcc94c1

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

Diff for: packages/plugin-router/src/__tests__/indexSpec.js

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ describe('createWidget method with router plugin', () => {
4444
"event": {},
4545
},
4646
"router": {
47+
"context": null,
4748
"isBootstrapCalled": false,
4849
"isMounting": false,
4950
"isRouteActivated": false,
@@ -86,6 +87,7 @@ describe('createWidget method with router plugin', () => {
8687
"pathname": "/my-route",
8788
},
8889
"router": {
90+
"getCurrentContext": [Function],
8991
"getCurrentRoute": [Function],
9092
"link": [Function],
9193
"redirect": [Function],

Diff for: packages/plugin-router/src/index.js

+53-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,27 @@ const ENV =
2121
: DEV;
2222

2323
export function createRouter(widget, routes, options) {
24-
widget.$dependencies.router = new UniversalRouter(routes, options);
24+
let wrappedRoutes = routes.reduce((result, route) => {
25+
const clonedRoute = { ...route };
26+
27+
if (isFunction(clonedRoute.action)) {
28+
const originAction = clonedRoute.action;
29+
clonedRoute.action = (...rest) => {
30+
// @TODO UniversalRouter don't parse query from url so context.params are only named route parameters
31+
// For some application can be helpful to have named route parameters and query parameters merged
32+
// because link method support both named parameters and query parameters
33+
widget.$in.router.context = rest[0];
34+
35+
return originAction(...rest);
36+
};
37+
}
38+
39+
result.push(clonedRoute);
40+
41+
return result;
42+
}, []);
43+
44+
widget.$dependencies.router = new UniversalRouter(wrappedRoutes, options);
2545
widget.$dependencies.link = generateUrls(widget.$dependencies.router, {
2646
stringifyQueryParams: (params) => new URLSearchParams(params).toString(),
2747
});
@@ -35,6 +55,7 @@ export function routerPlugin() {
3555

3656
widget.$in.router = {
3757
route: null,
58+
context: null,
3859
options: {},
3960
pathname: null,
4061
isMounting: false,
@@ -110,6 +131,9 @@ function routerAPI() {
110131
getCurrentRoute(widget) {
111132
return widget.$in.router.route;
112133
},
134+
getCurrentContext(widget) {
135+
return widget.$in.router.context;
136+
},
113137
},
114138
};
115139
}
@@ -143,6 +167,7 @@ async function loadHook(widget, originalLoad, ...rest) {
143167
: Promise.resolve({});
144168
const routeStatePromise = plugin.route.load(widget, {
145169
route: plugin.route,
170+
context: plugin.context,
146171
args: rest,
147172
globalState: globalStatePromise,
148173
});
@@ -168,7 +193,11 @@ async function mountHook(widget, originalMount, ...rest) {
168193
const result = await originalMount(...rest);
169194

170195
if (plugin.isMounting && isFunction(plugin.route.init)) {
171-
await plugin.route.init(widget, { route: plugin.route, args: rest });
196+
await plugin.route.init(widget, {
197+
route: plugin.route,
198+
context: plugin.context,
199+
args: rest,
200+
});
172201
}
173202

174203
if (
@@ -177,7 +206,11 @@ async function mountHook(widget, originalMount, ...rest) {
177206
!plugin.isRouteActivated
178207
) {
179208
plugin.isRouteActivated = true;
180-
plugin.route.activate(widget, { route: plugin.route, args: rest });
209+
plugin.route.activate(widget, {
210+
route: plugin.route,
211+
context: plugin.context,
212+
args: rest,
213+
});
181214
}
182215

183216
plugin.isMounting = false;
@@ -197,7 +230,11 @@ async function updateHook(widget, originalUpdate, ...rest) {
197230
!plugin.isRouteActivated
198231
) {
199232
plugin.isRouteActivated = true;
200-
plugin.route.activate(widget, { route: plugin.route, args: rest });
233+
plugin.route.activate(widget, {
234+
route: plugin.route,
235+
context: plugin.context,
236+
args: rest,
237+
});
201238
}
202239

203240
return result;
@@ -238,9 +275,10 @@ async function resolveRoute(widget) {
238275

239276
async function setupRouterCycle(widget, ...rest) {
240277
const route = await resolveRoute(widget);
278+
const plugin = widget.$in.router;
241279

242280
if (isFunction(route.init)) {
243-
await route.init(widget, { route, args: rest });
281+
await route.init(widget, { route, context: plugin.context, args: rest });
244282
}
245283
}
246284

@@ -251,11 +289,19 @@ async function tearDownRouterCycle(widget, ...rest) {
251289

252290
if (route) {
253291
if (isFunction(route.deactivate) && isRouteActivated === true) {
254-
await route.deactivate(widget, { route, args: rest });
292+
await route.deactivate(widget, {
293+
route,
294+
context: plugin.context,
295+
args: rest,
296+
});
255297
}
256298

257299
if (isFunction(route.destroy)) {
258-
await route.destroy(widget, { route, args: rest });
300+
await route.destroy(widget, {
301+
route,
302+
context: plugin.context,
303+
args: rest,
304+
});
259305
}
260306
}
261307

0 commit comments

Comments
 (0)