/
DefaultResolver.ts
49 lines (43 loc) · 1.5 KB
/
DefaultResolver.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import type Mithril from 'mithril';
import type { RouteResolver } from '../Application';
import type { default as Component, ComponentAttrs } from '../Component';
/**
* Generates a route resolver for a given component.
*
* In addition to regular route resolver functionality:
* - It provide the current route name as an attr
* - It sets a key on the component so a rerender will be triggered on route change.
*/
export default class DefaultResolver<
Attrs extends ComponentAttrs,
Comp extends Component<Attrs & { routeName: string }>,
RouteArgs extends Record<string, unknown> = {}
> implements RouteResolver<Attrs, Comp, RouteArgs>
{
component: new () => Comp;
routeName: string;
constructor(component: new () => Comp, routeName: string) {
this.component = component;
this.routeName = routeName;
}
/**
* When a route change results in a changed key, a full page
* rerender occurs. This method can be overriden in subclasses
* to prevent rerenders on some route changes.
*/
makeKey(): string {
return this.routeName + JSON.stringify(m.route.param());
}
makeAttrs(vnode: Mithril.Vnode<Attrs, Comp>): Attrs & { routeName: string } {
return {
...vnode.attrs,
routeName: this.routeName,
};
}
onmatch(args: RouteArgs, requestedPath: string, route: string): { new (): Comp } {
return this.component;
}
render(vnode: Mithril.Vnode<Attrs, Comp>): Mithril.Children {
return [{ ...vnode, attrs: this.makeAttrs(vnode), key: this.makeKey() }];
}
}