@@ -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