Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ void main() {

// JavaScript Chapter
'workshop-greeting-bot',
'lab-javascript-trivia-bot', // TODO: Re-verify after Oliver supports before all for JS challenges
'lab-javascript-trivia-bot',
'lab-sentence-maker',
'workshop-teacher-chatbot',
'workshop-mathbot',
Expand Down
30 changes: 6 additions & 24 deletions mobile-app/lib/app/app.router.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions mobile-app/lib/service/learn/learn_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ class LearnService {

void goToNextChallenge(
int maxChallenges,
int challengesCompleted,
Challenge challenge,
Block block, {
String solutionLink = '',
Expand All @@ -159,7 +158,6 @@ class LearnService {
arguments: ChallengeTemplateViewArguments(
challengeId: block.challengeTiles[challengeIndex + 1].id,
block: block,
challengesCompleted: challengesCompleted + 1,
),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ class BlockTemplateViewModel extends BaseViewModel {
arguments: ChallengeTemplateViewArguments(
challengeId: challengeId,
block: block,
challengesCompleted: _challengesCompleted,
),
);
}
Expand Down
28 changes: 7 additions & 21 deletions mobile-app/lib/ui/views/learn/challenge/challenge_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,19 @@ class ChallengeView extends StatelessWidget {
super.key,
required this.block,
required this.challenge,
required this.challengesCompleted,
required this.isProject,
});

final Challenge challenge;
final Block block;
final int challengesCompleted;
final bool isProject;

@override
Widget build(BuildContext context) {
return ViewModelBuilder<ChallengeViewModel>.reactive(
viewModelBuilder: () => ChallengeViewModel(),
onViewModelReady: (model) {
model.init(block, challenge, challengesCompleted);
model.init(block, challenge);
},
onDispose: (model) {
model.closeWebViews();
Expand Down Expand Up @@ -139,7 +137,6 @@ class ChallengeView extends StatelessWidget {
challenge: challenge,
model: model,
maxChallenges: maxChallenges,
challengesCompleted: challengesCompleted,
),
),
);
Expand Down Expand Up @@ -295,7 +292,7 @@ class ChallengeView extends StatelessWidget {
},
},
);
log('TestRunner: \\$res');
log('TestRunner: $res');
},
initialSettings: InAppWebViewSettings(
isInspectable: true,
Expand All @@ -306,7 +303,6 @@ class ChallengeView extends StatelessWidget {
..._panelIconButtons(
model,
challenge,
challengesCompleted,
block,
),
Expanded(
Expand Down Expand Up @@ -336,20 +332,8 @@ class ChallengeView extends StatelessWidget {
Icons.done_rounded,
size: 30,
),
onPressed: model.hasTypedInEditor
? () async {
if (model.showPanel &&
model.panelType == PanelType.pass) {
model.learnService.goToNextChallenge(
model.block!.challenges.length,
challengesCompleted,
challenge,
block,
);
}
model.runTests();
}
: null,
onPressed:
model.hasTypedInEditor ? model.runTests : null,
splashColor: Colors.transparent,
highlightColor: Colors.transparent,
),
Expand Down Expand Up @@ -459,6 +443,7 @@ class ChallengeView extends StatelessWidget {
return TextButton.icon(
onPressed: () {
model.setShowTestsPanel = !model.showTestsPanel;
model.setMounted = false;
},
label: Text(
'Tests',
Expand Down Expand Up @@ -555,7 +540,6 @@ class ChallengeView extends StatelessWidget {
List<Widget> _panelIconButtons(
ChallengeViewModel model,
Challenge challenge,
int challengesCompleted,
Block block,
) {
return [
Expand All @@ -578,6 +562,7 @@ class ChallengeView extends StatelessWidget {
ChallengeFile currFile = model.currentFile(challenge);
model.setShowPreview = !model.showPreview;
model.setShowConsole = false;
model.setMounted = false;
model.initFile(challenge, currFile);
},
),
Expand All @@ -587,6 +572,7 @@ class ChallengeView extends StatelessWidget {
onPressed: () {
model.setShowConsole = !model.showConsole;
model.setShowPreview = false;
model.setMounted = false;
},
),
];
Expand Down
31 changes: 14 additions & 17 deletions mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,6 @@ class ChallengeViewModel extends BaseViewModel {
Block? _block;
Block? get block => _block;

int _challengesCompleted = 0;
int get challengesCompleted => _challengesCompleted;

EditorOptions defaultEditorOptions = EditorOptions();

TextFieldData? _textFieldData;
Expand Down Expand Up @@ -224,11 +221,6 @@ class ChallengeViewModel extends BaseViewModel {
notifyListeners();
}

set setChallengesCompleted(int value) {
_challengesCompleted = value;
notifyListeners();
}

set setMounted(bool value) {
_mounted = value;
notifyListeners();
Expand Down Expand Up @@ -289,7 +281,6 @@ class ChallengeViewModel extends BaseViewModel {
void init(
Block block,
Challenge challenge,
int challengesCompleted,
) async {
await _babelWebView.run();
await _localhostServer.start();
Expand All @@ -298,7 +289,6 @@ class ChallengeViewModel extends BaseViewModel {

setChallenge = challenge;
setBlock = block;
setChallengesCompleted = challengesCompleted;

listenToSymbolBarScrollController();
}
Expand Down Expand Up @@ -343,7 +333,7 @@ class ChallengeViewModel extends BaseViewModel {
key: ValueKey(editorText),
defaultLanguage: editorLanguage,
defaultValue: editorText ?? '',
path: '/${challenge.id}/${getFullFileName(file)}',
path: getFullFilePath(challenge, file),
options: options,
);

Expand Down Expand Up @@ -480,7 +470,7 @@ class ChallengeViewModel extends BaseViewModel {
.toList();

String text = prefs.getString(
'${currChallenge.id}.${currentFile[0].name}',
'${currChallenge.id}.${getFullFileName(currentFile[0])}',
) ??
currentFile[0].contents;

Expand Down Expand Up @@ -545,6 +535,10 @@ class ChallengeViewModel extends BaseViewModel {
return '${file.name}.${file.ext.value}';
}

String getFullFilePath(Challenge challenge, ChallengeFile file) {
return '/${challenge.id}/${getFullFileName(file)}';
}

ChallengeFile currentFile(Challenge challenge) {
if (currentSelectedFile.isNotEmpty) {
ChallengeFile file = challenge.files.firstWhere(
Expand Down Expand Up @@ -576,10 +570,13 @@ class ChallengeViewModel extends BaseViewModel {
);

if (res?.confirmed == true) {
Challenge? currChallenge = challenge;
Challenge currChallenge = challenge!;

for (ChallengeFile file in currChallenge!.files) {
for (ChallengeFile file in currChallenge.files) {
// NOTE: Removes file content from cache
await prefs.remove('${currChallenge.id}.${getFullFileName(file)}');
// NOTE: Removes file editable region boundaries from cache
await prefs.remove(getFullFilePath(currChallenge, file));
}

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

await prefs.remove(challengeUrl);

closeWebViews();
disposeOfListeners();

_navigationService.replaceWith(
Routes.challengeTemplateView,
arguments: ChallengeTemplateViewArguments(
block: block!,
challengeId: currChallenge.id,
challengesCompleted: challengesCompleted,
),
);
}
Expand Down Expand Up @@ -693,7 +692,6 @@ class ChallengeViewModel extends BaseViewModel {
required Challenge challenge,
required ChallengeViewModel model,
required int maxChallenges,
required int challengesCompleted,
}) {
switch (panelType) {
case PanelType.instruction:
Expand All @@ -713,7 +711,6 @@ class ChallengeViewModel extends BaseViewModel {
case PanelType.pass:
return PassWidgetView(
challengeModel: model,
challengesCompleted: challengesCompleted,
maxChallenges: maxChallenges,
);
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,10 @@ class EnglishView extends StatelessWidget {
),
onPressed: model.allInputsCorrect
? () => model.learnService.goToNextChallenge(
block.challenges.length,
currentChallengeNum,
challenge,
block)
block.challenges.length,
challenge,
block,
)
: () => {model.checkAnswers(challenge)},
child: Text(
model.allInputsCorrect ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@ class MultipleChoiceView extends StatelessWidget {
super.key,
required this.challenge,
required this.block,
required this.challengesCompleted,
required this.currentChallengeNum,
});

final Challenge challenge;
final Block block;
final int currentChallengeNum;
final int challengesCompleted;

Widget buildDivider() {
return const Divider(
Expand Down Expand Up @@ -168,7 +166,6 @@ class MultipleChoiceView extends StatelessWidget {
model.hasPassedAllQuestions) {
model.learnService.goToNextChallenge(
block.challenges.length,
challengesCompleted,
challenge,
block,
);
Expand Down
Loading
Loading