@@ -10,6 +10,7 @@ interface Input {
1010
1111type Output = {
1212level :T . LevelUI
13+ levels :T . LevelUI [ ]
1314stepIndex :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 ) {
2829throw new Error ( `Level${ position . levelId } not found` )
2930}
3031
32+ const currentLevel = levels [ levelIndex ]
33+
3134const levelUI :T . LevelUI = {
32- ...level ,
35+ ...currentLevel ,
3336status :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
3639let status :T . ProgressStatus = 'INCOMPLETE'
3740let subtasks
@@ -59,11 +62,34 @@ const formatLevels = ({ progress, position, levels, testStatus }: Input): Output
5962return { ...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+
6288let stepIndex = levelUI . steps . findIndex ( ( s :T . StepUI ) => s . status === 'ACTIVE' )
6389if ( 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