diff --git a/mobile-app/integration_test/test_runner/curriculum_tests.dart b/mobile-app/integration_test/test_runner/curriculum_tests.dart index 1e02b77d9..8a0c59755 100644 --- a/mobile-app/integration_test/test_runner/curriculum_tests.dart +++ b/mobile-app/integration_test/test_runner/curriculum_tests.dart @@ -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) { diff --git a/mobile-app/lib/models/learn/challenge_model.dart b/mobile-app/lib/models/learn/challenge_model.dart index 44ada1d9c..131d5c475 100644 --- a/mobile-app/lib/models/learn/challenge_model.dart +++ b/mobile-app/lib/models/learn/challenge_model.dart @@ -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) backEndProject, // 4 jsProject, // 5 modern, // 6 @@ -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 { @@ -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; @@ -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'] ?? '', @@ -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 diff --git a/mobile-app/lib/models/learn/completed_challenge_model.dart b/mobile-app/lib/models/learn/completed_challenge_model.dart index 1c3c4458c..ad13de607 100644 --- a/mobile-app/lib/models/learn/completed_challenge_model.dart +++ b/mobile-app/lib/models/learn/completed_challenge_model.dart @@ -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 files; @@ -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((file) => ChallengeFile.fromJson(file)) diff --git a/mobile-app/lib/service/learn/learn_service.dart b/mobile-app/lib/service/learn/learn_service.dart index 9f8651b4d..4d833617d 100644 --- a/mobile-app/lib/service/learn/learn_service.dart +++ b/mobile-app/lib/service/learn/learn_service.dart @@ -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 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( @@ -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( diff --git a/mobile-app/lib/ui/views/learn/challenge/challenge_view.dart b/mobile-app/lib/ui/views/learn/challenge/challenge_view.dart index adf160c15..4dee527eb 100644 --- a/mobile-app/lib/ui/views/learn/challenge/challenge_view.dart +++ b/mobile-app/lib/ui/views/learn/challenge/challenge_view.dart @@ -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, @@ -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(), diff --git a/mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart b/mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart index 4dccfc17d..d2524528e 100644 --- a/mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart +++ b/mobile-app/lib/ui/views/learn/challenge/challenge_viewmodel.dart @@ -703,7 +703,9 @@ class ChallengeViewModel extends BaseViewModel { setTestConsoleMessages = ['

// running tests

']; // 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!, diff --git a/mobile-app/lib/ui/views/learn/challenge/templates/template_view.dart b/mobile-app/lib/ui/views/learn/challenge/templates/template_view.dart index d4801a4ba..a13a78934 100644 --- a/mobile-app/lib/ui/views/learn/challenge/templates/template_view.dart +++ b/mobile-app/lib/ui/views/learn/challenge/templates/template_view.dart @@ -39,57 +39,56 @@ class ChallengeTemplateView extends StatelessWidget { if (snapshot.hasData) { Challenge challenge = snapshot.data!; - int challengeType = challenge.challengeType; List 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, diff --git a/mobile-app/lib/ui/views/learn/test_runner.dart b/mobile-app/lib/ui/views/learn/test_runner.dart index fbd63b0c0..8ff9f7515 100644 --- a/mobile-app/lib/ui/views/learn/test_runner.dart +++ b/mobile-app/lib/ui/views/learn/test_runner.dart @@ -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.'); @@ -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: @@ -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; diff --git a/mobile-app/test/unit/challenge_utils_test.dart b/mobile-app/test/unit/challenge_utils_test.dart index 23794fb1e..a6346d650 100644 --- a/mobile-app/test/unit/challenge_utils_test.dart +++ b/mobile-app/test/unit/challenge_utils_test.dart @@ -16,7 +16,7 @@ void main() { instructions: '', dashedName: 'challenge-$id', superBlock: 'superblock', - challengeType: 0, + challengeType: ChallengeType.html, tests: [], files: [], helpCategory: HelpCategory.htmlCss, diff --git a/mobile-app/test/unit/learn_file_controller_test.dart b/mobile-app/test/unit/learn_file_controller_test.dart index 6217ed878..5c1c289d4 100644 --- a/mobile-app/test/unit/learn_file_controller_test.dart +++ b/mobile-app/test/unit/learn_file_controller_test.dart @@ -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: ''), @@ -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: ''), @@ -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: ''), @@ -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: ''),