Skip to content

Commit 32f5dd1

Browse files
committed
refactor(signal): extract withParameterizedSelectors SignalStore feature
1 parent ea6ff13 commit 32f5dd1

File tree

3 files changed

+53
-52
lines changed

3 files changed

+53
-52
lines changed

packages/router-signal-store/src/lib/global-router-signal-store/global-router-signal-store.ts

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
1-
import { InjectionToken, Signal, Type, computed, inject } from '@angular/core';
1+
import { InjectionToken, Type, computed, inject } from '@angular/core';
22
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
33
import {
44
NavigationCancel,
55
NavigationEnd,
66
NavigationError,
77
NavigationStart,
88
Router,
9-
Event as RouterEvent,
10-
RoutesRecognized,
9+
RoutesRecognized
1110
} from '@angular/router';
1211
import {
1312
patchState,
1413
signalStore,
1514
withComputed,
1615
withHooks,
17-
withMethods,
18-
withState,
16+
withState
1917
} from '@ngrx/signals';
20-
import { Observable, map } from 'rxjs';
18+
import { map } from 'rxjs';
2119
import { MinimalActivatedRouteSnapshot } from '../@ngrx/router-store/minimal-activated-route-state-snapshot';
2220
import { MinimalRouterStateSnapshot } from '../@ngrx/router-store/minimal-router-state-snapshot';
2321
import { MinimalRouterStateSerializer } from '../@ngrx/router-store/minimal_serializer';
24-
import { filterRouterEvents } from '../filter-router-event.operator';
2522
import { InternalStrictQueryParams } from '../internal-strict-query-params';
2623
import { InternalStrictRouteData } from '../internal-strict-route-data';
2724
import { InternalStrictRouteParams } from '../internal-strict-route-params';
2825
import { RouterSignalStore } from '../router-signal-store';
26+
import { withParameterizedSelectors } from '../with-parameterized-selectors';
2927

3028
interface GlobalRouterSignalState {
3129
readonly _routerState: MinimalRouterStateSnapshot;
@@ -80,26 +78,7 @@ export const GlobalRouterSignalStore: Type<RouterSignalStore> = signalStore(
8078
title: computed((): string | undefined => currentRoute().title),
8179
url: computed((): string => _routerState().url),
8280
})),
83-
withMethods((store, router = inject(Router)) => ({
84-
selectQueryParam(
85-
param: string
86-
): Signal<string | readonly string[] | undefined> {
87-
return computed(() => store.queryParams()[param]);
88-
},
89-
selectRouteDataParam(key: string): Signal<unknown> {
90-
return computed(() => store.routeData()[key]);
91-
},
92-
selectRouteParam(param: string): Signal<string | undefined> {
93-
return computed(() => store.routeParams()[param]);
94-
},
95-
selectRouterEvents<TAcceptedRouterEvents extends Type<RouterEvent>[]>(
96-
...acceptedEventTypes: [...TAcceptedRouterEvents]
97-
): Observable<InstanceType<TAcceptedRouterEvents[number]>> {
98-
return router.events.pipe(
99-
filterRouterEvents(...acceptedEventTypes)
100-
) as Observable<InstanceType<TAcceptedRouterEvents[number]>>;
101-
},
102-
})),
81+
withParameterizedSelectors(),
10382
withHooks({
10483
onInit(
10584
store,

packages/router-signal-store/src/lib/local-router-signal-store/local-router-signal-store.ts

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import {
77
NavigationError,
88
NavigationStart,
99
Router,
10-
Event as RouterEvent,
1110
RouterStateSnapshot,
1211
RoutesRecognized,
1312
createUrlTreeFromSnapshot,
1413
} from '@angular/router';
14+
import { MinimalActivatedRouteSnapshot } from '@ngrx/router-store';
1515
import {
1616
patchState,
1717
signalStore,
@@ -20,15 +20,14 @@ import {
2020
withMethods,
2121
withState,
2222
} from '@ngrx/signals';
23-
import { Observable, map } from 'rxjs';
23+
import { map } from 'rxjs';
2424
import { MinimalRouterStateSnapshot } from '../@ngrx/router-store/minimal-router-state-snapshot';
2525
import { MinimalRouterStateSerializer } from '../@ngrx/router-store/minimal_serializer';
26-
import { filterRouterEvents } from '../filter-router-event.operator';
27-
import { RouterSignalStore } from '../router-signal-store';
28-
import { MinimalActivatedRouteSnapshot } from '@ngrx/router-store';
2926
import { InternalStrictQueryParams } from '../internal-strict-query-params';
3027
import { InternalStrictRouteData } from '../internal-strict-route-data';
3128
import { InternalStrictRouteParams } from '../internal-strict-route-params';
29+
import { RouterSignalStore } from '../router-signal-store';
30+
import { withParameterizedSelectors } from '../with-parameterized-selectors';
3231

3332
interface LocalRouterSignalState {
3433
readonly _routerState: MinimalRouterStateSnapshot;
@@ -117,26 +116,7 @@ export const LocalRouterSignalStore: Type<RouterSignalStore> = signalStore(
117116
},
118117
})
119118
),
120-
withMethods((store, router = inject(Router)) => ({
121-
selectQueryParam(
122-
param: string
123-
): Signal<string | readonly string[] | undefined> {
124-
return computed(() => store.queryParams()[param]);
125-
},
126-
selectRouteDataParam(key: string): Signal<unknown> {
127-
return computed(() => store.routeData()[key]);
128-
},
129-
selectRouteParam(param: string): Signal<string | undefined> {
130-
return computed(() => store.routeParams()[param]);
131-
},
132-
selectRouterEvents<TAcceptedRouterEvents extends Type<RouterEvent>[]>(
133-
...acceptedEventTypes: [...TAcceptedRouterEvents]
134-
): Observable<InstanceType<TAcceptedRouterEvents[number]>> {
135-
return router.events.pipe(
136-
filterRouterEvents(...acceptedEventTypes)
137-
) as Observable<InstanceType<TAcceptedRouterEvents[number]>>;
138-
},
139-
})),
119+
withParameterizedSelectors(),
140120
withHooks({
141121
onInit(store, route = inject(ActivatedRoute)): void {
142122
store
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { Signal, computed, inject, Type } from '@angular/core';
2+
import { Event as RouterEvent, Router } from '@angular/router';
3+
import { signalStoreFeature, withMethods, type } from '@ngrx/signals';
4+
import { InternalStrictQueryParams } from './internal-strict-query-params';
5+
import { Observable } from 'rxjs';
6+
import { InternalStrictRouteData } from './internal-strict-route-data';
7+
import { InternalStrictRouteParams } from './internal-strict-route-params';
8+
import { filterRouterEvents } from './filter-router-event.operator';
9+
10+
export function withParameterizedSelectors() {
11+
return signalStoreFeature(
12+
{
13+
signals: type<{
14+
queryParams: Signal<InternalStrictQueryParams>;
15+
routeData: Signal<InternalStrictRouteData>;
16+
routeParams: Signal<InternalStrictRouteParams>;
17+
}>(),
18+
},
19+
withMethods(
20+
({ queryParams, routeData, routeParams }, router = inject(Router)) => ({
21+
selectQueryParam(
22+
param: string
23+
): Signal<string | readonly string[] | undefined> {
24+
return computed(() => queryParams()[param]);
25+
},
26+
selectRouteDataParam(key: string): Signal<unknown> {
27+
return computed(() => routeData()[key]);
28+
},
29+
selectRouteParam(param: string): Signal<string | undefined> {
30+
return computed(() => routeParams()[param]);
31+
},
32+
selectRouterEvents<TAcceptedRouterEvents extends Type<RouterEvent>[]>(
33+
...acceptedEventTypes: [...TAcceptedRouterEvents]
34+
): Observable<InstanceType<TAcceptedRouterEvents[number]>> {
35+
return router.events.pipe(
36+
filterRouterEvents(...acceptedEventTypes)
37+
) as Observable<InstanceType<TAcceptedRouterEvents[number]>>;
38+
},
39+
})
40+
)
41+
);
42+
}

0 commit comments

Comments
 (0)