UNPKG

1.83 kBJavaScriptView Raw
1var debug = require('debug')('navigateAction');
2var queryString = require('query-string');
3var searchPattern = /\?([^\#]*)/;
4
5function parseQueryString(url) {
6 var search;
7 var matches = url.match(searchPattern);
8 if (matches) {
9 search = matches[1];
10 }
11 return (search && queryString.parse(search)) || {};
12}
13
14module.exports = function (context, payload, done) {
15 if (!context.router || !context.router.getRoute) {
16 debug('no router available for navigate handling');
17 done(new Error('missing router'));
18 return;
19 }
20 debug('executing', payload);
21
22 var options = {
23 navigate: payload,
24 method: payload.method
25 };
26
27 var route = context.router.getRoute(payload.url, options);
28
29 if (!route) {
30 var err = new Error('Url does not exist');
31 err.status = 404;
32 done(err);
33 return;
34 }
35
36 // add parsed query parameter object to route object,
37 // and make it part of CHANGE_ROUTE_XXX action payload.
38 route.query = parseQueryString(route.url);
39
40 debug('dispatching CHANGE_ROUTE', route);
41 context.dispatch('CHANGE_ROUTE_START', route);
42 var action = route.config && route.config.action;
43
44 if ('string' === typeof action && context.getAction) {
45 action = context.getAction(action);
46 }
47
48 if (!action || 'function' !== typeof action) {
49 debug('route has no action, dispatching without calling action');
50 context.dispatch('CHANGE_ROUTE_SUCCESS', route);
51 done();
52 return;
53 }
54
55 debug('executing route action');
56 context.executeAction(action, route, function (err) {
57 if (err) {
58 context.dispatch('CHANGE_ROUTE_FAILURE', route);
59 } else {
60 context.dispatch('CHANGE_ROUTE_SUCCESS', route);
61 }
62 done(err);
63 });
64};