Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 29 additions & 29 deletions mobile-app/lib/ui/views/learn/challenge/challenge_view.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
Expand All @@ -13,7 +14,6 @@ import 'package:freecodecamp/ui/views/learn/widgets/challenge_widgets/project_pr
import 'package:freecodecamp/ui/views/learn/widgets/challenge_widgets/symbol_bar.dart';
import 'package:freecodecamp/ui/views/learn/widgets/console/console_view.dart';
import 'package:freecodecamp/ui/views/news/html_handler/html_handler.dart';
import 'package:phone_ide/phone_ide.dart';
import 'package:stacked/stacked.dart';

class ChallengeView extends StatelessWidget {
Expand Down Expand Up @@ -550,10 +550,11 @@ class ChallengeView extends StatelessWidget {
);
}

Widget _testExpansionTile({
Widget _testTile({
required dynamic test,
required BuildContext context,
required ChallengeViewModel model,
required int index,
}) {
final parser = HTMLParser(context: context);
final widgets = parser.parse(
Expand All @@ -566,32 +567,27 @@ class ChallengeView extends StatelessWidget {
'p': Style(margin: Margins.zero),
},
);
return ExpansionTile(
backgroundColor: FccColors.gray90,
collapsedBackgroundColor: FccColors.gray85,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: widgets,
),
children: [
Container(
color: FccColors.gray80,
constraints: const BoxConstraints(minHeight: 10, maxHeight: 1000),
padding: const EdgeInsets.symmetric(
vertical: 12,
),
child: Editor(
defaultLanguage: 'javascript',
path: '',
defaultValue: test.javaScript,
options: EditorOptions(
isEditable: false,
takeFullHeight: false,
showLinebar: false,
return Padding(
padding: const EdgeInsets.all(12),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: widgets,
),
),
),
],
if (model.testConsoleMessages.isNotEmpty ||
model.userConsoleMessages.isNotEmpty) ...[
const SizedBox(width: 8),
Icon(
model.failedTestIndexes.contains(index)
? Icons.cancel_rounded
: Icons.check_circle_rounded,
),
]
],
),
);
}

Expand Down Expand Up @@ -640,19 +636,23 @@ class ChallengeView extends StatelessWidget {
}

Widget testList(Challenge challenge, ChallengeViewModel model) {
log(challenge.challengeType.toString());
return ListView.builder(
return ListView.separated(
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
itemCount: challenge.tests.length,
itemBuilder: (context, index) {
final test = challenge.tests[index];
return _testExpansionTile(
return _testTile(
test: test,
context: context,
model: model,
index: index,
);
},
separatorBuilder: (BuildContext context, int i) => const Divider(
color: Colors.white,
height: 1,
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ class ChallengeViewModel extends BaseViewModel {
bool _runningTests = false;
bool get runningTests => _runningTests;

List<int> _failedTestIndexes = [];
List<int> get failedTestIndexes => _failedTestIndexes;

bool _hasTypedInEditor = false;
bool get hasTypedInEditor => _hasTypedInEditor;

Expand Down Expand Up @@ -694,6 +697,7 @@ class ChallengeViewModel extends BaseViewModel {
void runTests() async {
setShowPanel = false;
setIsRunningTests = true;
_failedTestIndexes = [];
ChallengeTest? failedTest;
Map<dynamic, dynamic>? failedTestErr;
ScriptBuilder builder = ScriptBuilder();
Expand Down Expand Up @@ -757,7 +761,8 @@ class ChallengeViewModel extends BaseViewModel {
},
);

for (ChallengeTest test in challenge!.tests) {
for (int i = 0; i < challenge!.tests.length; i++) {
ChallengeTest test = challenge!.tests[i];
final testRes = await testController!.callAsyncJavaScript(
functionBody: ScriptBuilder.testExecutionScript,
arguments: {
Expand All @@ -771,6 +776,7 @@ class ChallengeViewModel extends BaseViewModel {
failedTestsConsole.add(
'<li>${replacePlaceholders(test.instruction, failedTestErr)}</li>',
);
_failedTestIndexes.add(i);
} else if (testRes == null) {
log('TEST RESULT NULL: $testRes');
throw Exception('Test result is null ${testRes.toString()}');
Expand Down
Loading