@@ -17,14 +17,14 @@ import {
17
17
import { selectActiveCanvasId } from './selectors' ;
18
18
19
19
const zCanvasSessionState = z . object ( {
20
- canvasId : z . string ( ) ,
20
+ canvasId : z . string ( ) . min ( 1 ) ,
21
21
canvasSessionId : z . string ( ) ,
22
22
canvasDiscardedQueueItems : z . array ( z . number ( ) . int ( ) ) ,
23
23
} ) ;
24
24
type CanvasSessionState = z . infer < typeof zCanvasSessionState > ;
25
25
const zCanvasStagingAreaState = z . object ( {
26
26
_version : z . literal ( 2 ) ,
27
- sessions : z . array ( zCanvasSessionState ) ,
27
+ sessions : z . record ( z . string ( ) , zCanvasSessionState ) ,
28
28
} ) ;
29
29
type CanvasStagingAreaState = z . infer < typeof zCanvasStagingAreaState > ;
30
30
@@ -39,17 +39,17 @@ const getInitialCanvasSessionState = (canvasId: string): CanvasSessionState => (
39
39
40
40
const getInitialState = ( ) : CanvasStagingAreaState => ( {
41
41
_version : 2 ,
42
- sessions : [ ] ,
42
+ sessions : { } ,
43
43
} ) ;
44
44
45
- const slice = createSlice ( {
45
+ const canvasStagingAreaSlice = createSlice ( {
46
46
name : 'canvasSession' ,
47
47
initialState : getInitialState ( ) ,
48
48
reducers : {
49
49
canvasQueueItemDiscarded : ( state , action : CanvasPayloadAction < { itemId : number } > ) => {
50
50
const { canvasId, itemId } = action . payload ;
51
51
52
- const session = state . sessions . find ( ( session ) => session . canvasId === canvasId ) ;
52
+ const session = state . sessions [ canvasId ] ;
53
53
if ( ! session ) {
54
54
return ;
55
55
}
@@ -62,7 +62,7 @@ const slice = createSlice({
62
62
reducer : ( state , action : CanvasPayloadAction < { canvasSessionId : string } > ) => {
63
63
const { canvasId, canvasSessionId } = action . payload ;
64
64
65
- const session = state . sessions . find ( ( session ) => session . canvasId === canvasId ) ;
65
+ const session = state . sessions [ canvasId ] ;
66
66
if ( ! session ) {
67
67
return ;
68
68
}
@@ -83,25 +83,27 @@ const slice = createSlice({
83
83
extraReducers ( builder ) {
84
84
builder . addCase ( canvasCreated , ( state , action ) => {
85
85
const session = getInitialCanvasSessionState ( action . payload . canvasId ) ;
86
- state . sessions . push ( session ) ;
86
+ state . sessions [ session . canvasId ] = session ;
87
87
} ) ;
88
88
builder . addCase ( canvasRemoved , ( state , action ) => {
89
- state . sessions = state . sessions . filter ( ( session ) => session . canvasId !== action . payload . canvasId ) ;
89
+ delete state . sessions [ action . payload . canvasId ] ;
90
90
} ) ;
91
91
builder . addCase ( canvasMultiCanvasMigrated , ( state , action ) => {
92
- const session = state . sessions . find ( ( session ) => session . canvasId === MIGRATION_MULTI_CANVAS_ID_PLACEHOLDER ) ;
92
+ const session = state . sessions [ MIGRATION_MULTI_CANVAS_ID_PLACEHOLDER ] ;
93
93
if ( ! session ) {
94
94
return ;
95
95
}
96
96
session . canvasId = action . payload . canvasId ;
97
+ state . sessions [ session . canvasId ] = session ;
98
+ delete state . sessions [ MIGRATION_MULTI_CANVAS_ID_PLACEHOLDER ] ;
97
99
} ) ;
98
100
} ,
99
101
} ) ;
100
102
101
- export const { canvasSessionReset, canvasQueueItemDiscarded } = slice . actions ;
103
+ export const { canvasSessionReset, canvasQueueItemDiscarded } = canvasStagingAreaSlice . actions ;
102
104
103
- export const canvasSessionSliceConfig : SliceConfig < typeof slice > = {
104
- slice,
105
+ export const canvasSessionSliceConfig : SliceConfig < typeof canvasStagingAreaSlice > = {
106
+ slice : canvasStagingAreaSlice ,
105
107
schema : zCanvasStagingAreaState ,
106
108
getInitialState,
107
109
persistConfig : {
@@ -119,7 +121,7 @@ export const canvasSessionSliceConfig: SliceConfig<typeof slice> = {
119
121
120
122
state = {
121
123
_version : 2 ,
122
- sessions : [ session ] ,
124
+ sessions : { [ session . canvasId ] : session } ,
123
125
} ;
124
126
}
125
127
@@ -128,28 +130,32 @@ export const canvasSessionSliceConfig: SliceConfig<typeof slice> = {
128
130
} ,
129
131
} ;
130
132
131
- const findSessionByCanvasId = ( sessions : CanvasSessionState [ ] , canvasId : string ) => {
132
- const session = sessions . find ( ( s ) => s . canvasId === canvasId ) ;
133
+ const findSessionByCanvasId = ( sessions : Record < string , CanvasSessionState > , canvasId : string ) => {
134
+ const session = sessions [ canvasId ] ;
133
135
assert ( session , 'Session must exist for a canvas once the canvas has been created' ) ;
134
136
return session ;
135
137
} ;
136
138
export const selectCanvasSessionByCanvasId = ( state : RootState , canvasId : string ) =>
137
139
findSessionByCanvasId ( state . canvasSession . sessions , canvasId ) ;
138
- const selectSelectedCanvasSession = ( state : RootState ) => {
140
+ const selectActiveCanvasSession = ( state : RootState ) => {
139
141
const canvasId = selectActiveCanvasId ( state ) ;
140
142
return findSessionByCanvasId ( state . canvasSession . sessions , canvasId ) ;
141
143
} ;
144
+ export const selectCanvasSessionBySessionId = ( state : RootState , sessionId : string ) => {
145
+ const session = Object . values ( state . canvasSession . sessions ) . find ( ( s ) => s . canvasSessionId === sessionId ) ;
146
+ assert ( session , 'Session does not exist' ) ;
147
+ return session ;
148
+ } ;
142
149
export const selectCanvasSessionId = ( state : RootState , canvasId : string ) => {
143
150
const session = selectCanvasSessionByCanvasId ( state , canvasId ) ;
144
151
return session . canvasSessionId ;
145
152
} ;
146
- export const selectSelectedCanvasSessionId = ( state : RootState ) => {
147
- const session = selectSelectedCanvasSession ( state ) ;
153
+ export const selectActiveCanvasSessionId = ( state : RootState ) => {
154
+ const session = selectActiveCanvasSession ( state ) ;
148
155
return session . canvasSessionId ;
149
156
} ;
150
157
const selectCanvasSessionDiscardedItemsBySessionId = ( state : RootState , sessionId : string ) => {
151
- const session = state . canvasSession . sessions . find ( ( s ) => s . canvasSessionId === sessionId ) ;
152
- assert ( session , 'Session does not exist' ) ;
158
+ const session = selectCanvasSessionBySessionId ( state , sessionId ) ;
153
159
return session . canvasDiscardedQueueItems ;
154
160
} ;
155
161
export const buildSelectCanvasQueueItemsBySessionId = ( sessionId : string ) =>
0 commit comments