1
1
import { ComponentType , FC , ReactNode , createContext , useContext , useEffect , useState } from 'react' ;
2
2
import type { RouteProps } from 'react-router' ;
3
3
4
+ import { UIMode } from '../enums' ;
5
+
4
6
export interface RouterEntry {
5
7
props : Omit < RouteProps , 'path' | 'children' > ;
6
8
component : ComponentType ;
@@ -10,12 +12,16 @@ export type RoutePatch = (route: RouteProps) => RouteProps;
10
12
11
13
interface PublicDeckyRouterState {
12
14
routes : Map < string , RouterEntry > ;
13
- routePatches : Map < string , Set < RoutePatch > > ;
15
+ routePatches : Map < UIMode , Map < string , Set < RoutePatch > > > ;
14
16
}
15
17
16
18
export class DeckyRouterState {
17
19
private _routes = new Map < string , RouterEntry > ( ) ;
18
- private _routePatches = new Map < string , Set < RoutePatch > > ( ) ;
20
+ // Update when support for new UIModes is added
21
+ private _routePatches = new Map < UIMode , Map < string , Set < RoutePatch > > > ( [
22
+ [ UIMode . BigPicture , new Map ( ) ] ,
23
+ [ UIMode . Desktop , new Map ( ) ] ,
24
+ ] ) ;
19
25
20
26
public eventBus = new EventTarget ( ) ;
21
27
@@ -28,22 +34,26 @@ export class DeckyRouterState {
28
34
this . notifyUpdate ( ) ;
29
35
}
30
36
31
- addPatch ( path : string , patch : RoutePatch ) {
32
- let patchList = this . _routePatches . get ( path ) ;
37
+ addPatch ( path : string , patch : RoutePatch , uiMode : UIMode ) {
38
+ const patchesForMode = this . _routePatches . get ( uiMode ) ;
39
+ if ( ! patchesForMode ) throw new Error ( `UI mode ${ uiMode } not supported.` ) ;
40
+ let patchList = patchesForMode . get ( path ) ;
33
41
if ( ! patchList ) {
34
42
patchList = new Set ( ) ;
35
- this . _routePatches . set ( path , patchList ) ;
43
+ patchesForMode . set ( path , patchList ) ;
36
44
}
37
45
patchList . add ( patch ) ;
38
46
this . notifyUpdate ( ) ;
39
47
return patch ;
40
48
}
41
49
42
- removePatch ( path : string , patch : RoutePatch ) {
43
- const patchList = this . _routePatches . get ( path ) ;
50
+ removePatch ( path : string , patch : RoutePatch , uiMode : UIMode ) {
51
+ const patchesForMode = this . _routePatches . get ( uiMode ) ;
52
+ if ( ! patchesForMode ) throw new Error ( `UI mode ${ uiMode } not supported.` ) ;
53
+ const patchList = patchesForMode . get ( path ) ;
44
54
patchList ?. delete ( patch ) ;
45
55
if ( patchList ?. size == 0 ) {
46
- this . _routePatches . delete ( path ) ;
56
+ patchesForMode . delete ( path ) ;
47
57
}
48
58
this . notifyUpdate ( ) ;
49
59
}
@@ -60,8 +70,8 @@ export class DeckyRouterState {
60
70
61
71
interface DeckyRouterStateContext extends PublicDeckyRouterState {
62
72
addRoute ( path : string , component : RouterEntry [ 'component' ] , props : RouterEntry [ 'props' ] ) : void ;
63
- addPatch ( path : string , patch : RoutePatch ) : RoutePatch ;
64
- removePatch ( path : string , patch : RoutePatch ) : void ;
73
+ addPatch ( path : string , patch : RoutePatch , uiMode ?: UIMode ) : RoutePatch ;
74
+ removePatch ( path : string , patch : RoutePatch , uiMode ?: UIMode ) : void ;
65
75
removeRoute ( path : string ) : void ;
66
76
}
67
77
0 commit comments