Skip to content

Commit 8bedc8b

Browse files
committed
refactor: use ChallengeType in place of int
1 parent 00977e2 commit 8bedc8b

8 files changed

Lines changed: 53 additions & 54 deletions

File tree

mobile-app/integration_test/test_runner/curriculum_tests.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ void main() {
213213

214214
Challenge challenge = Challenge.fromJson(currChallenge);
215215
print(
216-
'Challenge: ${challenge.id} - ${challenge.title} - ${challenge.challengeTypeIndex}');
216+
'Challenge: ${challenge.id} - ${challenge.title} - ${challenge.challengeType.index}');
217217

218218
String getLines(String contents, [List? range]) {
219219
if (range == null || range.isEmpty) {
@@ -254,7 +254,7 @@ void main() {
254254
babelWebView.webViewController,
255255
testing: true,
256256
),
257-
'workerType': builder.getWorkerType(challenge.challengeTypeIndex),
257+
'workerType': builder.getWorkerType(challenge.challengeType),
258258
'combinedCode': await builder.combinedCode(challenge),
259259
'editableRegionContent': editableRegion,
260260
'hooks': {

mobile-app/lib/models/learn/challenge_model.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import 'package:freecodecamp/enums/ext_type.dart';
22

3-
// NOTE: For reference
43
enum ChallengeType {
54
html, // 0
65
js, // 1
76
backend, // 2
8-
zipline, // 3 (frontEndProject is also 3 in main repo, but omitted to avoid duplicate enum values)
7+
frontEndProject, // 3 (zipline is also 3 in main repo, but omitted to avoid duplicate enum values)
98
backEndProject, // 4
109
jsProject, // 5
1110
modern, // 6
@@ -113,9 +112,6 @@ class Challenge {
113112
required this.hooks,
114113
});
115114

116-
// Backward compatibility getter for challengeType as int
117-
int get challengeTypeIndex => challengeType.index;
118-
119115
factory Challenge.fromJson(Map<String, dynamic> data) {
120116
return Challenge(
121117
id: data['id'],

mobile-app/lib/models/learn/completed_challenge_model.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class CompletedChallenge {
44
final String id;
55
final String? solution;
66
final String? githubLink;
7-
final int? challengeType;
7+
final ChallengeType? challengeType;
88
final DateTime completedDate;
99
final List<ChallengeFile> files;
1010

@@ -22,7 +22,9 @@ class CompletedChallenge {
2222
id: data['id'],
2323
solution: data['solution'],
2424
githubLink: data['githubLink'],
25-
challengeType: data['challengeType'],
25+
challengeType: data['challengeType'] != null
26+
? ChallengeType.values[data['challengeType']]
27+
: null,
2628
completedDate: DateTime.fromMillisecondsSinceEpoch(data['completedDate']),
2729
files: (data['files'] as List)
2830
.map<ChallengeFile>((file) => ChallengeFile.fromJson(file))

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,26 @@ class LearnService {
5151
String? solutionLink,
5252
}) async {
5353
String challengeId = challenge.id;
54-
int challengeType = challenge.challengeTypeIndex;
54+
ChallengeType challengeType = challenge.challengeType;
5555

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

59-
switch (submitTypes[challengeType.toString()]) {
59+
switch (submitTypes[challengeType.index.toString()]) {
6060
case 'tests':
6161
late Map payload;
62-
if (challengeType == 14 ||
62+
if (challengeType == ChallengeType.multifileCertProject ||
6363
challenge.block ==
6464
'javascript-algorithms-and-data-structures-projects') {
6565
payload = {
6666
'id': challengeId,
67-
'challengeType': challengeType,
67+
'challengeType': challengeType.index,
6868
'files': challengeFiles,
6969
};
7070
} else {
7171
payload = {
7272
'id': challengeId,
73-
'challengeType': challengeType,
73+
'challengeType': challengeType.index,
7474
};
7575
}
7676
Response res = await _dio.post(
@@ -91,7 +91,7 @@ class LearnService {
9191
case 'project.backEnd':
9292
Map payload = {
9393
'id': challengeId,
94-
'challengeType': challengeType,
94+
'challengeType': challengeType.index,
9595
'solution': solutionLink
9696
};
9797
Response res = await _dio.post(

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ class ChallengeView extends StatelessWidget {
282282
arguments: {
283283
'userCode': '',
284284
'workerType':
285-
builder.getWorkerType(challenge.challengeTypeIndex),
285+
builder.getWorkerType(challenge.challengeType),
286286
'combinedCode': '',
287287
'editableRegionContent': '',
288288
'hooks': {
@@ -554,7 +554,8 @@ class ChallengeView extends StatelessWidget {
554554
model.scaffoldKey.currentState?.openEndDrawer();
555555
},
556556
),
557-
if (challenge.challengeTypeIndex != 1 && challenge.challengeTypeIndex != 26)
557+
if (challenge.challengeType != ChallengeType.js &&
558+
challenge.challengeType != ChallengeType.jsLab)
558559
_panelIconButton(
559560
isActive: model.showPreview,
560561
icon: Icons.remove_red_eye_outlined,
@@ -579,7 +580,7 @@ class ChallengeView extends StatelessWidget {
579580
}
580581

581582
Widget testList(Challenge challenge, ChallengeViewModel model) {
582-
log(challenge.challengeTypeIndex.toString());
583+
log(challenge.challengeType.index.toString());
583584
return ListView.builder(
584585
shrinkWrap: true,
585586
physics: const ClampingScrollPhysics(),

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,8 @@ class ChallengeViewModel extends BaseViewModel {
614614
setTestConsoleMessages = ['<p>// running tests</p>'];
615615

616616
// Get user code console messages
617-
if (challenge!.challengeTypeIndex == 1 || challenge!.challengeTypeIndex == 26) {
617+
if (challenge!.challengeType == ChallengeType.js ||
618+
challenge!.challengeType == ChallengeType.jsLab) {
618619
final evalResult = await testController!.callAsyncJavaScript(
619620
functionBody: await builder.buildUserCode(
620621
challenge!,
@@ -638,7 +639,7 @@ class ChallengeViewModel extends BaseViewModel {
638639
challenge!,
639640
_babelWebView.webViewController,
640641
),
641-
'workerType': builder.getWorkerType(challenge!.challengeTypeIndex),
642+
'workerType': builder.getWorkerType(challenge!.challengeType),
642643
'combinedCode': await builder.combinedCode(challenge!),
643644
'editableRegionContent': editableRegionContent,
644645
'hooks': {

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,61 +34,60 @@ class ChallengeTemplateView extends StatelessWidget {
3434
if (snapshot.hasData) {
3535
Challenge challenge = snapshot.data!;
3636

37-
int challengeType = challenge.challengeTypeIndex;
3837
List<ChallengeListTile> tiles = block.challengeTiles;
3938
int challNum =
4039
tiles.indexWhere((el) => el.id == challenge.id) + 1;
41-
switch (challengeType) {
42-
case 0:
43-
case 1:
44-
case 14:
45-
case 20:
46-
case 25:
47-
case 26:
40+
switch (challenge.challengeType) {
41+
case ChallengeType.html:
42+
case ChallengeType.js:
43+
case ChallengeType.multifileCertProject:
44+
case ChallengeType.python:
45+
case ChallengeType.lab:
46+
case ChallengeType.jsLab:
4847
return ChallengeView(
4948
challenge: challenge,
5049
block: block,
5150
isProject: tiles.length > 1,
5251
);
53-
case 8:
52+
case ChallengeType.quiz:
5453
return QuizView(
5554
challenge: challenge,
5655
block: block,
5756
);
58-
case 10:
57+
case ChallengeType.pythonProject:
5958
return PythonProjectView(
6059
challenge: challenge,
6160
block: block,
6261
);
63-
case 11:
62+
case ChallengeType.video:
6463
return PythonView(
6564
challenge: challenge,
6665
block: block,
6766
currentChallengeNum: challNum,
6867
);
69-
case 15:
70-
case 19:
68+
case ChallengeType.theOdinProject:
69+
case ChallengeType.multipleChoice:
7170
return MultipleChoiceView(
7271
challenge: challenge,
7372
block: block,
7473
currentChallengeNum: challNum,
7574
);
76-
case 21:
77-
case 22:
75+
case ChallengeType.dialogue:
76+
case ChallengeType.fillInTheBlank:
7877
return EnglishView(
7978
challenge: challenge,
8079
block: block,
8180
currentChallengeNum: challNum,
8281
);
83-
case 24:
82+
case ChallengeType.generic:
8483
return ReviewView(
8584
challenge: challenge,
8685
block: block,
8786
);
8887
default:
8988
return Center(
9089
child: Text(
91-
'Unknown Challenge, info : ${challenge.challengeTypeIndex}',
90+
'Unknown Challenge, info : ${challenge.challengeType}',
9291
),
9392
);
9493
}

mobile-app/lib/ui/views/learn/test_runner.dart

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ return testRes;
4848
}) async {
4949
String challengeFile = await fileService.getFirstFileFromCache(
5050
challenge,
51-
getChallengeExt(challenge.challengeTypeIndex),
51+
getChallengeExt(challenge.challengeType),
5252
testing: testing,
5353
);
5454

55-
switch (challenge.challengeTypeIndex) {
55+
switch (challenge.challengeType) {
5656
// JS-only challenges
57-
case 1:
58-
case 26:
57+
case ChallengeType.js:
58+
case ChallengeType.jsLab:
5959
// TODO: Move to learn file service
6060
if (babelController == null) {
6161
throw Exception('Babel controller is required to transpile JS code.');
@@ -95,28 +95,28 @@ return testRes;
9595
}
9696
}
9797

98-
String getWorkerType(int challengeType) {
98+
String getWorkerType(ChallengeType challengeType) {
9999
switch (challengeType) {
100-
case 0:
101-
case 14:
102-
case 25:
100+
case ChallengeType.html:
101+
case ChallengeType.multifileCertProject:
102+
case ChallengeType.lab:
103103
return 'dom';
104-
case 1:
105-
case 26:
104+
case ChallengeType.js:
105+
case ChallengeType.jsLab:
106106
return 'javascript';
107-
case 20:
108-
case 23:
107+
case ChallengeType.python:
108+
case ChallengeType.multifilePythonCertProject:
109109
return 'python';
110+
default:
111+
return 'dom';
110112
}
111-
112-
return 'dom';
113113
}
114114

115-
Ext getChallengeExt(int challengeType) {
115+
Ext getChallengeExt(ChallengeType challengeType) {
116116
switch (challengeType) {
117117
// JS-only challenges
118-
case 1:
119-
case 26:
118+
case ChallengeType.js:
119+
case ChallengeType.jsLab:
120120
return Ext.js;
121121
default:
122122
return Ext.html;

0 commit comments

Comments
 (0)