@@ -11,12 +11,16 @@ import config from 'config';
11
11
import {
12
12
ADD_MODULE ,
13
13
CHANGE_LESSON ,
14
+ ADD_LESSON ,
15
+ REMOVE_LESSON ,
14
16
HIDE_LESSON_IN_TIMETABLE ,
15
17
REMOVE_MODULE ,
16
18
SELECT_MODULE_COLOR ,
17
19
SET_LESSON_CONFIG ,
18
20
SET_TIMETABLE ,
19
21
SHOW_LESSON_IN_TIMETABLE ,
22
+ ADD_CUSTOM_MODULE ,
23
+ REMOVE_CUSTOM_MODULE ,
20
24
} from 'actions/timetables' ;
21
25
import { getNewColor } from 'utils/colors' ;
22
26
import { SET_EXPORTED_DATA } from 'actions/constants' ;
@@ -42,7 +46,6 @@ export function migrateV1toV2(
42
46
const lessonArray = [ lessonValue ] ;
43
47
newSemester [ moduleCode ] [ lessonType ] = lessonArray ;
44
48
} ) ;
45
-
46
49
if ( ! newLessons [ semester ] ) {
47
50
newLessons [ semester ] = { } ;
48
51
}
@@ -119,12 +122,30 @@ function moduleLessonConfig(
119
122
if ( ! ( classNo && lessonType ) ) return state ;
120
123
return {
121
124
...state ,
122
- [ lessonType ] : [ classNo ] ,
125
+ [ lessonType ] : [
126
+ ...state [ lessonType ] . filter ( ( lesson ) => lesson !== action . payload . activeLesson ) ,
127
+ action . payload . classNo ,
128
+ ] ,
123
129
} ;
124
130
}
125
131
case SET_LESSON_CONFIG :
126
132
return action . payload . lessonConfig ;
127
-
133
+ case ADD_LESSON : {
134
+ const { classNo, lessonType } = action . payload ;
135
+ if ( ! ( classNo && lessonType ) ) return state ;
136
+ return {
137
+ ...state ,
138
+ [ lessonType ] : [ ...state [ lessonType ] , classNo ] ,
139
+ } ;
140
+ }
141
+ case REMOVE_LESSON : {
142
+ const { classNo, lessonType } = action . payload ;
143
+ if ( ! ( classNo && lessonType ) ) return state ;
144
+ return {
145
+ ...state ,
146
+ [ lessonType ] : state [ lessonType ] . filter ( ( lesson ) => lesson !== classNo ) ,
147
+ } ;
148
+ }
128
149
default :
129
150
return state ;
130
151
}
@@ -148,6 +169,8 @@ function semTimetable(
148
169
case REMOVE_MODULE :
149
170
return omit ( state , [ moduleCode ] ) ;
150
171
case CHANGE_LESSON :
172
+ case ADD_LESSON :
173
+ case REMOVE_LESSON :
151
174
case SET_LESSON_CONFIG :
152
175
return {
153
176
...state ,
@@ -203,12 +226,31 @@ function semHiddenModules(state = defaultHiddenState, action: Actions) {
203
226
}
204
227
}
205
228
229
+ // Map of CustomisedModules
230
+ const defaultCustomisedModulesState : ModuleCode [ ] = [ ] ;
231
+ function customisedModules ( state = defaultCustomisedModulesState , action : Actions ) {
232
+ if ( ! action . payload ) {
233
+ return state ;
234
+ }
235
+
236
+ switch ( action . type ) {
237
+ case ADD_CUSTOM_MODULE :
238
+ if ( state . includes ( action . payload . moduleCode ) ) return state ;
239
+ return [ ...state , action . payload . moduleCode ] ;
240
+ case REMOVE_CUSTOM_MODULE :
241
+ return state . filter ( ( c ) => c !== action . payload . moduleCode ) ;
242
+ default :
243
+ return state ;
244
+ }
245
+ }
246
+
206
247
export const defaultTimetableState : TimetablesState = {
207
248
lessons : { } ,
208
249
colors : { } ,
209
250
hidden : { } ,
210
251
academicYear : config . academicYear ,
211
252
archive : { } ,
253
+ customisedModules : { } ,
212
254
} ;
213
255
214
256
function timetables (
@@ -234,15 +276,23 @@ function timetables(
234
276
case REMOVE_MODULE :
235
277
case SELECT_MODULE_COLOR :
236
278
case CHANGE_LESSON :
279
+ case ADD_LESSON :
280
+ case REMOVE_LESSON :
237
281
case SET_LESSON_CONFIG :
238
282
case HIDE_LESSON_IN_TIMETABLE :
239
- case SHOW_LESSON_IN_TIMETABLE : {
283
+ case SHOW_LESSON_IN_TIMETABLE :
284
+ case ADD_CUSTOM_MODULE :
285
+ case REMOVE_CUSTOM_MODULE : {
240
286
const { semester } = action . payload ;
241
287
242
288
return produce ( state , ( draft ) => {
243
289
draft . lessons [ semester ] = semTimetable ( draft . lessons [ semester ] , action ) ;
244
290
draft . colors [ semester ] = semColors ( state . colors [ semester ] , action ) ;
245
291
draft . hidden [ semester ] = semHiddenModules ( state . hidden [ semester ] , action ) ;
292
+ draft . customisedModules [ semester ] = customisedModules (
293
+ state . customisedModules [ semester ] ,
294
+ action ,
295
+ ) ;
246
296
} ) ;
247
297
}
248
298
0 commit comments