Skip to content

Commit edf9c11

Browse files
committed
Add second parameter to getInitialState to prefill entities
1 parent fd24f6f commit edf9c11

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

packages/toolkit/src/entities/create_adapter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ export function createEntityAdapter<T>(
4242
...options,
4343
}
4444

45-
const stateFactory = createInitialStateFactory<T, EntityId>()
46-
const selectorsFactory = createSelectorsFactory<T, EntityId>()
4745
const stateAdapter = sortComparer
4846
? createSortedStateAdapter(selectId, sortComparer)
4947
: createUnsortedStateAdapter(selectId)
48+
const stateFactory = createInitialStateFactory({ stateAdapter })
49+
const selectorsFactory = createSelectorsFactory<T, EntityId>()
5050

5151
return {
5252
selectId,

packages/toolkit/src/entities/entity_state.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import type { EntityId, EntityState } from './models'
1+
import type {
2+
EntityId,
3+
EntityState,
4+
EntityStateAdapter,
5+
EntityStateFactory,
6+
} from './models'
27

38
export function getInitialEntityState<T, Id extends EntityId>(): EntityState<
49
T,
@@ -10,13 +15,25 @@ export function getInitialEntityState<T, Id extends EntityId>(): EntityState<
1015
}
1116
}
1217

13-
export function createInitialStateFactory<T, Id extends EntityId>() {
14-
function getInitialState(): EntityState<T, Id>
18+
export function createInitialStateFactory<T, Id extends EntityId>({
19+
stateAdapter,
20+
}: {
21+
stateAdapter: EntityStateAdapter<T, Id>
22+
}): EntityStateFactory<T, Id> {
23+
function getInitialState(
24+
state?: undefined,
25+
entities?: readonly T[] | Record<Id, T>,
26+
): EntityState<T, Id>
1527
function getInitialState<S extends object>(
1628
additionalState: S,
29+
entities?: readonly T[] | Record<Id, T>,
1730
): EntityState<T, Id> & S
18-
function getInitialState(additionalState: any = {}): any {
19-
return Object.assign(getInitialEntityState(), additionalState)
31+
function getInitialState(
32+
additionalState: any = {},
33+
entities?: readonly T[] | Record<Id, T>,
34+
): any {
35+
const state = Object.assign(getInitialEntityState(), additionalState)
36+
return entities ? stateAdapter.setAll(state, entities) : state
2037
}
2138

2239
return { getInitialState }

packages/toolkit/src/entities/models.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,25 @@ export interface EntitySelectors<T, V, Id extends EntityId> {
166166
selectById: (state: V, id: Id) => Compute<UncheckedIndexedAccess<T>>
167167
}
168168

169+
export interface EntityStateFactory<T, Id extends EntityId> {
170+
getInitialState(
171+
state?: undefined,
172+
entities?: Record<Id, T> | readonly T[],
173+
): EntityState<T, Id>
174+
getInitialState<S extends object>(
175+
state: S,
176+
entities?: Record<Id, T> | readonly T[],
177+
): EntityState<T, Id> & S
178+
}
179+
169180
/**
170181
* @public
171182
*/
172183
export interface EntityAdapter<T, Id extends EntityId>
173-
extends EntityStateAdapter<T, Id> {
184+
extends EntityStateAdapter<T, Id>,
185+
EntityStateFactory<T, Id> {
174186
selectId: IdSelector<T, Id>
175187
sortComparer: false | Comparer<T>
176-
getInitialState(): EntityState<T, Id>
177-
getInitialState<S extends object>(state: S): EntityState<T, Id> & S
178188
getSelectors(
179189
selectState?: undefined,
180190
options?: GetSelectorsOptions,

0 commit comments

Comments
 (0)