|
1 |
| -import Route from '@ember/routing/route'; |
2 |
| -import { inject as service } from '@ember/service'; |
| 1 | +import ErrorRoute from 'ember-error-route'; |
3 | 2 |
|
4 |
| -/** |
5 |
| - * This is a weird route... but let me explain. |
6 |
| - * |
7 |
| - * This is the default route that gets used if no other matching route is found. |
8 |
| - * |
9 |
| - * This route is *also* used as a generic error page via: |
10 |
| - * |
11 |
| - * ```js |
12 |
| - * this.router.replaceWith('catch-all', { transition, title: 'Something failed' }); |
13 |
| - * ``` |
14 |
| - * |
15 |
| - * Ideally we would use the `error` substate/routes of Ember.js, but those don't |
16 |
| - * update the URL when an error happens. This causes the native back button of the |
17 |
| - * browser to behave in strange way, so we avoid using the broken built-in error |
18 |
| - * routes. |
19 |
| - */ |
20 |
| -export default class CatchAllRoute extends Route { |
21 |
| - @service router; |
22 |
| - |
23 |
| - /** |
24 |
| - * If `transitionTo('catch-all', 'foo')` is used, this hook will not get called. |
25 |
| - * If the second argument is an object, then the second object will be the `model` |
26 |
| - * of this route, and the `serialize()` hook gets called to figure out what the |
27 |
| - * URL of this route should be. The URL is automatically assembled from the passed-in |
28 |
| - * transition object. |
29 |
| - */ |
30 |
| - serialize({ transition }) { |
31 |
| - return { path: this.pathForRouteInfo(transition.to) }; |
32 |
| - } |
33 |
| - |
34 |
| - /** |
35 |
| - * This internal method takes a `RouteInfo` object from Ember.js (e.g. `transition.to`) |
36 |
| - * and returns the corresponding `:path` route parameter for this `catch-all` route. |
37 |
| - * @return {string} |
38 |
| - */ |
39 |
| - pathForRouteInfo(routeInfo) { |
40 |
| - let routeName = routeInfo.name; |
41 |
| - let params = paramsForRouteInfo(routeInfo); |
42 |
| - let queryParams = routeInfo.queryParams; |
43 |
| - return this.router.urlFor(routeName, ...params, { queryParams }).slice(1); |
44 |
| - } |
45 |
| -} |
46 |
| - |
47 |
| -/** |
48 |
| - * Returns all route parameters for the passed-in `RouteInfo` object. |
49 |
| - * |
50 |
| - * These can be used in `router.urlFor(...)` calls. |
51 |
| - */ |
52 |
| -function paramsForRouteInfo(routeInfo) { |
53 |
| - let routeInfos = [...allRouteInfos(routeInfo)].reverse(); |
54 |
| - |
55 |
| - let params = []; |
56 |
| - for (let routeInfo of routeInfos) { |
57 |
| - for (let paramName of routeInfo.paramNames) { |
58 |
| - params.push(routeInfo.params[paramName]); |
59 |
| - } |
60 |
| - } |
61 |
| - return params; |
62 |
| -} |
63 |
| - |
64 |
| -/** |
65 |
| - * Iterates upwards through the `RouteInfo` "family tree" until the top-most |
66 |
| - * `RouteInfo` is reached. |
67 |
| - */ |
68 |
| -function* allRouteInfos(routeInfo) { |
69 |
| - yield routeInfo; |
70 |
| - while ((routeInfo = routeInfo.parent)) { |
71 |
| - yield routeInfo; |
72 |
| - } |
73 |
| -} |
| 3 | +export default class CatchAllRoute extends ErrorRoute {} |
0 commit comments