Skip to content
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ void main() {

Challenge challenge = Challenge.fromJson(currChallenge);
print(
'Challenge: ${challenge.id} - ${challenge.title} - ${challenge.challengeType}');
'Challenge: ${challenge.id} - ${challenge.title} - ${challenge.challengeType.index}');

String getLines(String contents, [List? range]) {
if (range == null || range.isEmpty) {
Expand Down
25 changes: 18 additions & 7 deletions mobile-app/lib/models/learn/challenge_model.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import 'package:freecodecamp/enums/ext_type.dart';

// NOTE: For reference
enum ChallengeType {
html, // 0
js, // 1
backend, // 2
zipline, // 3
frontEndProject, // 3
frontEndProject, // 3 (zipline is also 3 in main repo, but omitted to avoid duplicate enum values)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm keeping frontEndProject instead of zipline because zipline is an older term and I think we've stopped using it.

backEndProject, // 4
jsProject, // 5
modern, // 6
Expand All @@ -20,7 +18,20 @@ enum ChallengeType {
multifileCertProject, // 14
theOdinProject, // 15
colab, // 16
exam // 17
exam, // 17
msTrophy, // 18
multipleChoice, // 19
python, // 20
dialogue, // 21
fillInTheBlank, // 22
multifilePythonCertProject, // 23
generic, // 24
lab, // 25
jsLab, // 26
pyLab, // 27
dailyChallengeJs, // 28
dailyChallengePy, // 29
examDownload // 30
}

enum HelpCategory {
Expand Down Expand Up @@ -54,7 +65,7 @@ class Challenge {
final String dashedName;
final String superBlock;
final String? videoId;
final int challengeType;
final ChallengeType challengeType;
final HelpCategory helpCategory;
final String? explanation;
final String transcript;
Expand Down Expand Up @@ -111,7 +122,7 @@ class Challenge {
dashedName: data['dashedName'],
superBlock: data['superBlock'],
videoId: data['videoId'],
challengeType: data['challengeType'],
challengeType: ChallengeType.values[data['challengeType']],
helpCategory: HelpCategory.fromValue(data['helpCategory']),
explanation: data['explanation'] ?? '',
transcript: data['transcript'] ?? '',
Expand Down Expand Up @@ -157,7 +168,7 @@ class Challenge {
'dashedName': challenge.dashedName,
'superBlock': challenge.superBlock,
'videoId': challenge.videoId,
'challengeType': challenge.challengeType,
'challengeType': challenge.challengeType.index,
'helpCategory': challenge.helpCategory.value,
'transcript': challenge.transcript,
'tests': challenge.tests
Expand Down
6 changes: 4 additions & 2 deletions mobile-app/lib/models/learn/completed_challenge_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class CompletedChallenge {
final String id;
final String? solution;
final String? githubLink;
final int? challengeType;
final ChallengeType? challengeType;
final DateTime completedDate;
final List<ChallengeFile> files;

Expand All @@ -22,7 +22,9 @@ class CompletedChallenge {
id: data['id'],
solution: data['solution'],
githubLink: data['githubLink'],
challengeType: data['challengeType'],
challengeType: data['challengeType'] != null
? ChallengeType.values[data['challengeType']]
: null,
completedDate: DateTime.fromMillisecondsSinceEpoch(data['completedDate']),
files: (data['files'] as List)
.map<ChallengeFile>((file) => ChallengeFile.fromJson(file))
Expand Down
12 changes: 6 additions & 6 deletions mobile-app/lib/service/learn/learn_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,26 @@ class LearnService {
String? solutionLink,
}) async {
String challengeId = challenge.id;
int challengeType = challenge.challengeType;
ChallengeType challengeType = challenge.challengeType;

Response submitTypesRes = await _dio.get('$baseUrlV2/submit-types.json');
Map<String, dynamic> submitTypes = submitTypesRes.data;

switch (submitTypes[challengeType.toString()]) {
switch (submitTypes[challengeType.index.toString()]) {
case 'tests':
late Map payload;
if (challengeType == 14 ||
if (challengeType == ChallengeType.multifileCertProject ||
challenge.block ==
'javascript-algorithms-and-data-structures-projects') {
payload = {
'id': challengeId,
'challengeType': challengeType,
'challengeType': challengeType.index,
'files': challengeFiles,
};
} else {
payload = {
'id': challengeId,
'challengeType': challengeType,
'challengeType': challengeType.index,
};
}
Response res = await _dio.post(
Expand All @@ -100,7 +100,7 @@ class LearnService {
case 'project.backEnd':
Map payload = {
'id': challengeId,
'challengeType': challengeType,
'challengeType': challengeType.index,
'solution': solutionLink
};
Response res = await _dio.post(
Expand Down
10 changes: 5 additions & 5 deletions mobile-app/lib/ui/views/learn/challenge/challenge_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -612,10 +612,10 @@ class ChallengeView extends StatelessWidget {
model.scaffoldKey.currentState?.openEndDrawer();
},
),
if (challenge.challengeType != 1 &&
challenge.challengeType != 26 &&
challenge.challengeType != 28 &&
challenge.challengeType != 29)
if (challenge.challengeType != ChallengeType.js &&
challenge.challengeType != ChallengeType.jsLab &&
challenge.challengeType != ChallengeType.dailyChallengeJs &&
challenge.challengeType != ChallengeType.dailyChallengePy)
_panelIconButton(
isActive: model.showPreview,
icon: Icons.remove_red_eye_outlined,
Expand All @@ -640,7 +640,7 @@ class ChallengeView extends StatelessWidget {
}

Widget testList(Challenge challenge, ChallengeViewModel model) {
log(challenge.challengeType.toString());
log(challenge.challengeType.index.toString());
return ListView.builder(
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,9 @@ class ChallengeViewModel extends BaseViewModel {
setTestConsoleMessages = ['<p>// running tests</p>'];

// Get user code console messages
if ([1, 26, 28].contains(challenge!.challengeType)) {
if (challenge!.challengeType == ChallengeType.js ||
challenge!.challengeType == ChallengeType.jsLab ||
challenge!.challengeType == ChallengeType.dailyChallengeJs) {
final evalResult = await testController!.callAsyncJavaScript(
functionBody: await builder.buildUserCode(
challenge!,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,57 +39,56 @@ class ChallengeTemplateView extends StatelessWidget {
if (snapshot.hasData) {
Challenge challenge = snapshot.data!;

int challengeType = challenge.challengeType;
List<ChallengeListTile> tiles = block.challengeTiles;
int challNum =
tiles.indexWhere((el) => el.id == challenge.id) + 1;
switch (challengeType) {
case 0:
case 1:
case 14:
case 20:
case 23:
case 25:
case 26:
case 28:
case 29:
switch (challenge.challengeType) {
case ChallengeType.html:
case ChallengeType.js:
case ChallengeType.multifileCertProject:
case ChallengeType.python:
case ChallengeType.multifilePythonCertProject:
case ChallengeType.lab:
case ChallengeType.jsLab:
case ChallengeType.dailyChallengeJs:
case ChallengeType.dailyChallengePy:
return ChallengeView(
challenge: challenge,
block: block,
isProject: tiles.length > 1,
challengeDate: challengeDate,
);
case 8:
case ChallengeType.quiz:
return QuizView(
challenge: challenge,
block: block,
);
case 10:
case ChallengeType.pythonProject:
return PythonProjectView(
challenge: challenge,
block: block,
);
case 11:
case ChallengeType.video:
return PythonView(
challenge: challenge,
block: block,
currentChallengeNum: challNum,
);
case 15:
case 19:
case ChallengeType.theOdinProject:
case ChallengeType.multipleChoice:
return MultipleChoiceView(
challenge: challenge,
block: block,
currentChallengeNum: challNum,
);
case 21:
case 22:
case ChallengeType.dialogue:
case ChallengeType.fillInTheBlank:
return EnglishView(
challenge: challenge,
block: block,
currentChallengeNum: challNum,
);
case 24:
case ChallengeType.generic:
return ReviewView(
challenge: challenge,
block: block,
Expand Down
56 changes: 28 additions & 28 deletions mobile-app/lib/ui/views/learn/test_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ return testRes;

switch (challenge.challengeType) {
// JS-only challenges
case 1:
case 26:
case 28:
case ChallengeType.js:
case ChallengeType.jsLab:
case ChallengeType.dailyChallengeJs:
// TODO: Move to learn file service
if (babelController == null) {
throw Exception('Babel controller is required to transpile JS code.');
Expand All @@ -72,10 +72,10 @@ return testRes;
}

return babelRes?.value ?? challengeFile;
case 20:
case 23:
case 27:
case 29:
case ChallengeType.python:
case ChallengeType.multifilePythonCertProject:
case ChallengeType.pyLab:
case ChallengeType.dailyChallengePy:
// Python challenges do not require transpilation, return the file as is.
return challengeFile;
default:
Expand All @@ -102,37 +102,37 @@ return testRes;
}
}

String getWorkerType(int challengeType) {
String getWorkerType(ChallengeType challengeType) {
switch (challengeType) {
case 0:
case 14:
case 25:
case ChallengeType.html:
case ChallengeType.multifileCertProject:
case ChallengeType.lab:
return 'dom';
case 1:
case 26:
case 28:
case ChallengeType.js:
case ChallengeType.jsLab:
case ChallengeType.dailyChallengeJs:
return 'javascript';
case 20:
case 23:
case 27:
case 29:
case ChallengeType.python:
case ChallengeType.multifilePythonCertProject:
case ChallengeType.pyLab:
case ChallengeType.dailyChallengePy:
return 'python';
default:
return 'dom';
}

return 'dom';
}

Ext getChallengeExt(int challengeType) {
Ext getChallengeExt(ChallengeType challengeType) {
switch (challengeType) {
// JS-only challenges
case 1:
case 26:
case 28:
case ChallengeType.js:
case ChallengeType.jsLab:
case ChallengeType.dailyChallengeJs:
return Ext.js;
case 20:
case 23:
case 27:
case 29:
case ChallengeType.python:
case ChallengeType.multifilePythonCertProject:
case ChallengeType.pyLab:
case ChallengeType.dailyChallengePy:
return Ext.py;
default:
return Ext.html;
Expand Down
2 changes: 1 addition & 1 deletion mobile-app/test/unit/challenge_utils_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ void main() {
instructions: '',
dashedName: 'challenge-$id',
superBlock: 'superblock',
challengeType: 0,
challengeType: ChallengeType.html,
tests: [],
files: [],
helpCategory: HelpCategory.htmlCss,
Expand Down
8 changes: 4 additions & 4 deletions mobile-app/test/unit/learn_file_controller_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ void main() {
transcript: 'this is the transcript',
dashedName: 'hello-world',
superBlock: '2022/responsive-web-design',
challengeType: 1,
challengeType: ChallengeType.js,
helpCategory: HelpCategory.htmlCss,
tests: [],
hooks: Hooks(beforeAll: '', beforeEach: '', afterEach: ''),
Expand Down Expand Up @@ -201,7 +201,7 @@ void main() {
transcript: '',
dashedName: 'css-test',
superBlock: 'super block',
challengeType: 1,
challengeType: ChallengeType.js,
helpCategory: HelpCategory.htmlCss,
tests: [],
hooks: Hooks(beforeAll: '', beforeEach: '', afterEach: ''),
Expand Down Expand Up @@ -245,7 +245,7 @@ void main() {
transcript: '',
dashedName: 'css-test',
superBlock: 'super block',
challengeType: 1,
challengeType: ChallengeType.js,
helpCategory: HelpCategory.htmlCss,
tests: [],
hooks: Hooks(beforeAll: '', beforeEach: '', afterEach: ''),
Expand Down Expand Up @@ -288,7 +288,7 @@ void main() {
transcript: '',
dashedName: 'js-test',
superBlock: 'super block',
challengeType: 1,
challengeType: ChallengeType.js,
helpCategory: HelpCategory.htmlCss,
tests: [],
hooks: Hooks(beforeAll: '', beforeEach: '', afterEach: ''),
Expand Down
Loading