@@ -10,6 +10,7 @@ interface Input {
1010
1111type Output = {
1212 level : T . LevelUI
13+ levels : T . LevelUI [ ]
1314 stepIndex : number
1415}
1516
@@ -22,16 +23,18 @@ type Output = {
2223const formatLevels = ( { progress, position, levels, testStatus } : Input ) : Output => {
2324 // clone levels
2425
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 )
2627
27- if ( ! level ) {
28+ if ( levelIndex === - 1 ) {
2829 throw new Error ( `Level ${ position . levelId } not found` )
2930 }
3031
32+ const currentLevel = levels [ levelIndex ]
33+
3134 const levelUI : T . LevelUI = {
32- ...level ,
35+ ...currentLevel ,
3336 status : progress . levels [ position . levelId ] ? 'COMPLETE' : 'ACTIVE' ,
34- steps : level . steps . map ( ( step : TT . Step ) => {
37+ steps : currentLevel . steps . map ( ( step : TT . Step ) => {
3538 // label step status for step component
3639 let status : T . ProgressStatus = 'INCOMPLETE'
3740 let subtasks
@@ -59,11 +62,34 @@ const formatLevels = ({ progress, position, levels, testStatus }: Input): Output
5962 return { ...step , status, subtasks }
6063 } ) ,
6164 }
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+
6288 let stepIndex = levelUI . steps . findIndex ( ( s : T . StepUI ) => s . status === 'ACTIVE' )
6389 if ( stepIndex === - 1 ) {
64- stepIndex = level . steps . length
90+ stepIndex = levels [ levelIndex ] . steps . length
6591 }
66- return { level : levelUI , stepIndex }
92+ return { level : levelUI , levels : levelsUI , stepIndex }
6793}
6894
6995export default formatLevels
0 commit comments