@@ -10,6 +10,7 @@ interface Input {
10
10
11
11
type Output = {
12
12
level : T . LevelUI
13
+ levels : T . LevelUI [ ]
13
14
stepIndex : number
14
15
}
15
16
@@ -22,16 +23,18 @@ type Output = {
22
23
const formatLevels = ( { progress, position, levels, testStatus } : Input ) : Output => {
23
24
// clone levels
24
25
25
- const level : TT . Level | undefined = levels . find ( ( l : TT . Level ) => l . id === position . levelId )
26
+ const levelIndex : number = levels . findIndex ( ( l : TT . Level ) => l . id === position . levelId )
26
27
27
- if ( ! level ) {
28
+ if ( levelIndex === - 1 ) {
28
29
throw new Error ( `Level ${ position . levelId } not found` )
29
30
}
30
31
32
+ const currentLevel = levels [ levelIndex ]
33
+
31
34
const levelUI : T . LevelUI = {
32
- ...level ,
35
+ ...currentLevel ,
33
36
status : progress . levels [ position . levelId ] ? 'COMPLETE' : 'ACTIVE' ,
34
- steps : level . steps . map ( ( step : TT . Step ) => {
37
+ steps : currentLevel . steps . map ( ( step : TT . Step ) => {
35
38
// label step status for step component
36
39
let status : T . ProgressStatus = 'INCOMPLETE'
37
40
let subtasks
@@ -59,11 +62,34 @@ const formatLevels = ({ progress, position, levels, testStatus }: Input): Output
59
62
return { ...step , status, subtasks }
60
63
} ) ,
61
64
}
65
+
66
+ const completed : T . LevelUI [ ] = levels . slice ( 0 , levelIndex ) . map ( ( level : TT . Level ) => ( {
67
+ ...level ,
68
+ status : 'COMPLETE' ,
69
+ steps : level . steps . map ( ( step : TT . Step ) => ( {
70
+ ...step ,
71
+ status : 'COMPLETE' ,
72
+ subtasks : step . subtasks ? step . subtasks . map ( ( st ) => ( { name : st , status : 'COMPLETE' } ) ) : undefined ,
73
+ } ) ) ,
74
+ } ) )
75
+
76
+ const incompleted : T . LevelUI [ ] = levels . slice ( levelIndex + 1 , levels . length ) . map ( ( level : TT . Level ) => ( {
77
+ ...level ,
78
+ status : 'INCOMPLETE' ,
79
+ steps : level . steps . map ( ( step : TT . Step ) => ( {
80
+ ...step ,
81
+ status : 'INCOMPLETE' ,
82
+ subtasks : step . subtasks ? step . subtasks . map ( ( st ) => ( { name : st , status : 'INCOMPLETE' } ) ) : undefined ,
83
+ } ) ) ,
84
+ } ) )
85
+
86
+ const levelsUI : T . LevelUI [ ] = [ ...completed , levelUI , ...incompleted ]
87
+
62
88
let stepIndex = levelUI . steps . findIndex ( ( s : T . StepUI ) => s . status === 'ACTIVE' )
63
89
if ( stepIndex === - 1 ) {
64
- stepIndex = level . steps . length
90
+ stepIndex = levels [ levelIndex ] . steps . length
65
91
}
66
- return { level : levelUI , stepIndex }
92
+ return { level : levelUI , levels : levelsUI , stepIndex }
67
93
}
68
94
69
95
export default formatLevels
0 commit comments