Skip to content

Commit 75d1f4c

Browse files
fix: challenge view bugs (#1603)
* fix: reset code bug * fix: remove file editable region boundaries on code reset * chore: missing dot Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com> * fix: editor state not updated when changing away from editor view * fix: close webview and listener before going to next challenge * fix: challenge completion percentage * chore: remove dead code * chore: remove comment * fix: challenge completion progress bar length on login * chore: remove unused challengesCompleted property --------- Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
1 parent 5169cf3 commit 75d1f4c

17 files changed

Lines changed: 80 additions & 141 deletions

File tree

mobile-app/integration_test/test_runner/curriculum_tests.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void main() {
8787

8888
// JavaScript Chapter
8989
'workshop-greeting-bot',
90-
'lab-javascript-trivia-bot', // TODO: Re-verify after Oliver supports before all for JS challenges
90+
'lab-javascript-trivia-bot',
9191
'lab-sentence-maker',
9292
'workshop-teacher-chatbot',
9393
'workshop-mathbot',

mobile-app/lib/app/app.router.dart

Lines changed: 6 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mobile-app/lib/service/learn/learn_service.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ class LearnService {
140140

141141
void goToNextChallenge(
142142
int maxChallenges,
143-
int challengesCompleted,
144143
Challenge challenge,
145144
Block block, {
146145
String solutionLink = '',
@@ -159,7 +158,6 @@ class LearnService {
159158
arguments: ChallengeTemplateViewArguments(
160159
challengeId: block.challengeTiles[challengeIndex + 1].id,
161160
block: block,
162-
challengesCompleted: challengesCompleted + 1,
163161
),
164162
);
165163
}

mobile-app/lib/ui/views/learn/block/block_template_viewmodel.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class BlockTemplateViewModel extends BaseViewModel {
4444
arguments: ChallengeTemplateViewArguments(
4545
challengeId: challengeId,
4646
block: block,
47-
challengesCompleted: _challengesCompleted,
4847
),
4948
);
5049
}

mobile-app/lib/ui/views/learn/challenge/challenge_view.dart

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,19 @@ class ChallengeView extends StatelessWidget {
2121
super.key,
2222
required this.block,
2323
required this.challenge,
24-
required this.challengesCompleted,
2524
required this.isProject,
2625
});
2726

2827
final Challenge challenge;
2928
final Block block;
30-
final int challengesCompleted;
3129
final bool isProject;
3230

3331
@override
3432
Widget build(BuildContext context) {
3533
return ViewModelBuilder<ChallengeViewModel>.reactive(
3634
viewModelBuilder: () => ChallengeViewModel(),
3735
onViewModelReady: (model) {
38-
model.init(block, challenge, challengesCompleted);
36+
model.init(block, challenge);
3937
},
4038
onDispose: (model) {
4139
model.closeWebViews();
@@ -139,7 +137,6 @@ class ChallengeView extends StatelessWidget {
139137
challenge: challenge,
140138
model: model,
141139
maxChallenges: maxChallenges,
142-
challengesCompleted: challengesCompleted,
143140
),
144141
),
145142
);
@@ -295,7 +292,7 @@ class ChallengeView extends StatelessWidget {
295292
},
296293
},
297294
);
298-
log('TestRunner: \\$res');
295+
log('TestRunner: $res');
299296
},
300297
initialSettings: InAppWebViewSettings(
301298
isInspectable: true,
@@ -306,7 +303,6 @@ class ChallengeView extends StatelessWidget {
306303
..._panelIconButtons(
307304
model,
308305
challenge,
309-
challengesCompleted,
310306
block,
311307
),
312308
Expanded(
@@ -336,20 +332,8 @@ class ChallengeView extends StatelessWidget {
336332
Icons.done_rounded,
337333
size: 30,
338334
),
339-
onPressed: model.hasTypedInEditor
340-
? () async {
341-
if (model.showPanel &&
342-
model.panelType == PanelType.pass) {
343-
model.learnService.goToNextChallenge(
344-
model.block!.challenges.length,
345-
challengesCompleted,
346-
challenge,
347-
block,
348-
);
349-
}
350-
model.runTests();
351-
}
352-
: null,
335+
onPressed:
336+
model.hasTypedInEditor ? model.runTests : null,
353337
splashColor: Colors.transparent,
354338
highlightColor: Colors.transparent,
355339
),
@@ -459,6 +443,7 @@ class ChallengeView extends StatelessWidget {
459443
return TextButton.icon(
460444
onPressed: () {
461445
model.setShowTestsPanel = !model.showTestsPanel;
446+
model.setMounted = false;
462447
},
463448
label: Text(
464449
'Tests',
@@ -555,7 +540,6 @@ class ChallengeView extends StatelessWidget {
555540
List<Widget> _panelIconButtons(
556541
ChallengeViewModel model,
557542
Challenge challenge,
558-
int challengesCompleted,
559543
Block block,
560544
) {
561545
return [
@@ -578,6 +562,7 @@ class ChallengeView extends StatelessWidget {
578562
ChallengeFile currFile = model.currentFile(challenge);
579563
model.setShowPreview = !model.showPreview;
580564
model.setShowConsole = false;
565+
model.setMounted = false;
581566
model.initFile(challenge, currFile);
582567
},
583568
),
@@ -587,6 +572,7 @@ class ChallengeView extends StatelessWidget {
587572
onPressed: () {
588573
model.setShowConsole = !model.showConsole;
589574
model.setShowPreview = false;
575+
model.setMounted = false;
590576
},
591577
),
592578
];

mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,6 @@ class ChallengeViewModel extends BaseViewModel {
124124
Block? _block;
125125
Block? get block => _block;
126126

127-
int _challengesCompleted = 0;
128-
int get challengesCompleted => _challengesCompleted;
129-
130127
EditorOptions defaultEditorOptions = EditorOptions();
131128

132129
TextFieldData? _textFieldData;
@@ -224,11 +221,6 @@ class ChallengeViewModel extends BaseViewModel {
224221
notifyListeners();
225222
}
226223

227-
set setChallengesCompleted(int value) {
228-
_challengesCompleted = value;
229-
notifyListeners();
230-
}
231-
232224
set setMounted(bool value) {
233225
_mounted = value;
234226
notifyListeners();
@@ -289,7 +281,6 @@ class ChallengeViewModel extends BaseViewModel {
289281
void init(
290282
Block block,
291283
Challenge challenge,
292-
int challengesCompleted,
293284
) async {
294285
await _babelWebView.run();
295286
await _localhostServer.start();
@@ -298,7 +289,6 @@ class ChallengeViewModel extends BaseViewModel {
298289

299290
setChallenge = challenge;
300291
setBlock = block;
301-
setChallengesCompleted = challengesCompleted;
302292

303293
listenToSymbolBarScrollController();
304294
}
@@ -343,7 +333,7 @@ class ChallengeViewModel extends BaseViewModel {
343333
key: ValueKey(editorText),
344334
defaultLanguage: editorLanguage,
345335
defaultValue: editorText ?? '',
346-
path: '/${challenge.id}/${getFullFileName(file)}',
336+
path: getFullFilePath(challenge, file),
347337
options: options,
348338
);
349339

@@ -480,7 +470,7 @@ class ChallengeViewModel extends BaseViewModel {
480470
.toList();
481471

482472
String text = prefs.getString(
483-
'${currChallenge.id}.${currentFile[0].name}',
473+
'${currChallenge.id}.${getFullFileName(currentFile[0])}',
484474
) ??
485475
currentFile[0].contents;
486476

@@ -545,6 +535,10 @@ class ChallengeViewModel extends BaseViewModel {
545535
return '${file.name}.${file.ext.value}';
546536
}
547537

538+
String getFullFilePath(Challenge challenge, ChallengeFile file) {
539+
return '/${challenge.id}/${getFullFileName(file)}';
540+
}
541+
548542
ChallengeFile currentFile(Challenge challenge) {
549543
if (currentSelectedFile.isNotEmpty) {
550544
ChallengeFile file = challenge.files.firstWhere(
@@ -576,10 +570,13 @@ class ChallengeViewModel extends BaseViewModel {
576570
);
577571

578572
if (res?.confirmed == true) {
579-
Challenge? currChallenge = challenge;
573+
Challenge currChallenge = challenge!;
580574

581-
for (ChallengeFile file in currChallenge!.files) {
575+
for (ChallengeFile file in currChallenge.files) {
576+
// NOTE: Removes file content from cache
582577
await prefs.remove('${currChallenge.id}.${getFullFileName(file)}');
578+
// NOTE: Removes file editable region boundaries from cache
579+
await prefs.remove(getFullFilePath(currChallenge, file));
583580
}
584581

585582
var challengeIndex = block!.challengeTiles.indexWhere(
@@ -593,12 +590,14 @@ class ChallengeViewModel extends BaseViewModel {
593590

594591
await prefs.remove(challengeUrl);
595592

593+
closeWebViews();
594+
disposeOfListeners();
595+
596596
_navigationService.replaceWith(
597597
Routes.challengeTemplateView,
598598
arguments: ChallengeTemplateViewArguments(
599599
block: block!,
600600
challengeId: currChallenge.id,
601-
challengesCompleted: challengesCompleted,
602601
),
603602
);
604603
}
@@ -693,7 +692,6 @@ class ChallengeViewModel extends BaseViewModel {
693692
required Challenge challenge,
694693
required ChallengeViewModel model,
695694
required int maxChallenges,
696-
required int challengesCompleted,
697695
}) {
698696
switch (panelType) {
699697
case PanelType.instruction:
@@ -713,7 +711,6 @@ class ChallengeViewModel extends BaseViewModel {
713711
case PanelType.pass:
714712
return PassWidgetView(
715713
challengeModel: model,
716-
challengesCompleted: challengesCompleted,
717714
maxChallenges: maxChallenges,
718715
);
719716
default:

mobile-app/lib/ui/views/learn/challenge/templates/english/english_view.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ class EnglishView extends StatelessWidget {
118118
),
119119
onPressed: model.allInputsCorrect
120120
? () => model.learnService.goToNextChallenge(
121-
block.challenges.length,
122-
currentChallengeNum,
123-
challenge,
124-
block)
121+
block.challenges.length,
122+
challenge,
123+
block,
124+
)
125125
: () => {model.checkAnswers(challenge)},
126126
child: Text(
127127
model.allInputsCorrect ||

mobile-app/lib/ui/views/learn/challenge/templates/multiple_choice/multiple_choice_view.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,12 @@ class MultipleChoiceView extends StatelessWidget {
1919
super.key,
2020
required this.challenge,
2121
required this.block,
22-
required this.challengesCompleted,
2322
required this.currentChallengeNum,
2423
});
2524

2625
final Challenge challenge;
2726
final Block block;
2827
final int currentChallengeNum;
29-
final int challengesCompleted;
3028

3129
Widget buildDivider() {
3230
return const Divider(
@@ -168,7 +166,6 @@ class MultipleChoiceView extends StatelessWidget {
168166
model.hasPassedAllQuestions) {
169167
model.learnService.goToNextChallenge(
170168
block.challenges.length,
171-
challengesCompleted,
172169
challenge,
173170
block,
174171
);

0 commit comments

Comments
 (0)