Skip to content

Commit a134b3c

Browse files
authored
fix: handle nodules in reviews (#1732)
1 parent 91b2bd1 commit a134b3c

3 files changed

Lines changed: 97 additions & 67 deletions

File tree

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

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import 'package:freecodecamp/ui/views/learn/utils/challenge_utils.dart';
77
import 'package:freecodecamp/ui/views/learn/widgets/assignment_widget.dart';
88
import 'package:freecodecamp/ui/views/learn/widgets/audio/audio_player_view.dart';
99
import 'package:freecodecamp/ui/views/learn/widgets/challenge_card.dart';
10+
import 'package:freecodecamp/ui/views/learn/widgets/example_editor.dart';
1011
import 'package:freecodecamp/ui/views/learn/widgets/explanation_widget.dart';
1112
import 'package:freecodecamp/ui/views/learn/widgets/quiz_widget.dart';
1213
import 'package:freecodecamp/ui/views/learn/widgets/scene/scene_view.dart';
1314
import 'package:freecodecamp/ui/views/learn/widgets/transcript_widget.dart';
1415
import 'package:freecodecamp/ui/views/learn/widgets/youtube_player_widget.dart';
1516
import 'package:freecodecamp/ui/views/news/html_handler/html_handler.dart';
16-
import 'package:phone_ide/phone_ide.dart';
1717
import 'package:stacked/stacked.dart';
1818

1919
class MultipleChoiceView extends StatelessWidget {
@@ -241,70 +241,4 @@ class MultipleChoiceView extends StatelessWidget {
241241
}
242242
}
243243

244-
class ExampleEditor extends StatelessWidget {
245-
const ExampleEditor({
246-
super.key,
247-
required this.nodules,
248-
required this.parser,
249-
});
250-
251-
final List<Nodules> nodules;
252-
final HTMLParser parser;
253244

254-
@override
255-
Widget build(BuildContext context) {
256-
return ChallengeCard(
257-
title: 'Lesson',
258-
child: Column(
259-
children: [
260-
...nodules.map(
261-
(nodule) {
262-
if (nodule.type == NoduleType.paragraph) {
263-
return Column(
264-
children: parser.parse(nodule.asString()),
265-
);
266-
} else if (nodule.type == NoduleType.interactiveEditor) {
267-
return Column(
268-
children: nodule
269-
.asList()
270-
.map(
271-
(file) => Padding(
272-
padding: const EdgeInsets.only(bottom: 16.0),
273-
child: Column(
274-
crossAxisAlignment: CrossAxisAlignment.start,
275-
children: [
276-
Text(
277-
file.ext.toUpperCase(),
278-
style: const TextStyle(
279-
fontWeight: FontWeight.bold,
280-
fontSize: 16,
281-
),
282-
),
283-
const SizedBox(height: 8),
284-
Editor(
285-
options: EditorOptions(
286-
fontFamily: 'Hack',
287-
takeFullHeight: false,
288-
showLinebar: false,
289-
isEditable: false,
290-
),
291-
defaultLanguage: file.ext,
292-
defaultValue: file.contents,
293-
path: '/',
294-
),
295-
],
296-
),
297-
),
298-
)
299-
.toList(),
300-
);
301-
} else {
302-
return const SizedBox.shrink();
303-
}
304-
},
305-
)
306-
],
307-
),
308-
);
309-
}
310-
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import 'package:freecodecamp/ui/views/learn/utils/challenge_utils.dart';
88
import 'package:freecodecamp/ui/views/learn/widgets/assignment_widget.dart';
99
import 'package:freecodecamp/ui/views/learn/widgets/audio/audio_player_view.dart';
1010
import 'package:freecodecamp/ui/views/learn/widgets/challenge_card.dart';
11+
import 'package:freecodecamp/ui/views/learn/widgets/example_editor.dart';
1112
import 'package:freecodecamp/ui/views/learn/widgets/scene/scene_view.dart';
1213
import 'package:freecodecamp/ui/views/learn/widgets/transcript_widget.dart';
1314
import 'package:freecodecamp/ui/views/learn/widgets/youtube_player_widget.dart';
15+
import 'package:freecodecamp/ui/views/news/html_handler/html_handler.dart';
1416
import 'package:stacked/stacked.dart';
1517

1618
class ReviewView extends StatelessWidget {
@@ -25,6 +27,8 @@ class ReviewView extends StatelessWidget {
2527

2628
@override
2729
Widget build(BuildContext context) {
30+
HTMLParser parser = HTMLParser(context: context);
31+
2832
return ViewModelBuilder<ReviewViewmodel>.reactive(
2933
viewModelBuilder: () => ReviewViewmodel(),
3034
onViewModelReady: (model) => model.initChallenge(challenge, context),
@@ -47,6 +51,11 @@ class ReviewView extends StatelessWidget {
4751
],
4852
),
4953
),
54+
if (challenge.nodules?.isNotEmpty ?? false)
55+
ExampleEditor(
56+
nodules: challenge.nodules!,
57+
parser: parser,
58+
),
5059
if (challenge.videoId != null) ...[
5160
const SizedBox(height: 12),
5261
ChallengeCard(
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_html/flutter_html.dart';
3+
import 'package:freecodecamp/models/learn/challenge_model.dart';
4+
import 'package:freecodecamp/ui/views/learn/widgets/challenge_card.dart';
5+
import 'package:freecodecamp/ui/views/news/html_handler/html_handler.dart';
6+
import 'package:phone_ide/editor/editor.dart';
7+
import 'package:phone_ide/editor/editor_options.dart';
8+
9+
class ExampleEditor extends StatelessWidget {
10+
const ExampleEditor({
11+
super.key,
12+
required this.nodules,
13+
required this.parser,
14+
});
15+
16+
final List<Nodules> nodules;
17+
final HTMLParser parser;
18+
19+
@override
20+
Widget build(BuildContext context) {
21+
return ChallengeCard(
22+
title: 'Lesson',
23+
child: Column(
24+
mainAxisAlignment: MainAxisAlignment.start,
25+
crossAxisAlignment: CrossAxisAlignment.start,
26+
children: [
27+
...nodules.map(
28+
(nodule) {
29+
if (nodule.type == NoduleType.paragraph) {
30+
return Column(
31+
children: parser.parse(
32+
nodule.asString(),
33+
customStyles: {
34+
'*': Style(
35+
fontSize: FontSize(18),
36+
),
37+
'ul': Style(
38+
fontSize: FontSize(18),
39+
padding: HtmlPaddings.only(left: 10))
40+
},
41+
),
42+
);
43+
} else if (nodule.type == NoduleType.interactiveEditor) {
44+
return Column(
45+
children: nodule
46+
.asList()
47+
.map(
48+
(file) => Padding(
49+
padding: const EdgeInsets.only(bottom: 16.0),
50+
child: Column(
51+
crossAxisAlignment: CrossAxisAlignment.start,
52+
children: [
53+
Text(
54+
file.ext.toUpperCase(),
55+
style: const TextStyle(
56+
fontWeight: FontWeight.bold,
57+
fontSize: 16,
58+
),
59+
),
60+
const SizedBox(height: 8),
61+
Editor(
62+
options: EditorOptions(
63+
fontFamily: 'Hack',
64+
takeFullHeight: false,
65+
showLinebar: false,
66+
isEditable: false,
67+
),
68+
defaultLanguage: file.ext,
69+
defaultValue: file.contents,
70+
path: '/',
71+
),
72+
],
73+
),
74+
),
75+
)
76+
.toList(),
77+
);
78+
} else {
79+
return const SizedBox.shrink();
80+
}
81+
},
82+
)
83+
],
84+
),
85+
);
86+
}
87+
}

0 commit comments

Comments
 (0)