diff --git a/mobile-app/lib/models/learn/curriculum_model.dart b/mobile-app/lib/models/learn/curriculum_model.dart index 0cdf17463..c29717e67 100644 --- a/mobile-app/lib/models/learn/curriculum_model.dart +++ b/mobile-app/lib/models/learn/curriculum_model.dart @@ -242,27 +242,41 @@ class Block { dashedName: dashedName, description: finalDescription, order: data['order'], - challenges: (data['challengeOrder'] as List) - .map( - (dynamic challenge) => ChallengeOrder( - id: challenge[0] ?? challenge['id'], - title: challenge[1] ?? challenge['title'], - ), - ) - .toList(), - challengeTiles: (data['challengeOrder'] as List) - .map( - (dynamic challenge) => ChallengeListTile( - id: challenge[0] ?? challenge['id'], - name: challenge[1] ?? challenge['title'], - dashedName: challenge[1] ?? - challenge['title'] - .toLowerCase() - .replaceAll(' ', '-') - .replaceAll(RegExp(r"[@':]"), ''), - ), - ) - .toList(), + challenges: () { + final Set seenIds = {}; + final List list = []; + for (dynamic challenge in (data['challengeOrder'] as List? ?? [])) { + final String id = challenge[0] ?? challenge['id']; + final String title = challenge[1] ?? challenge['title']; + if (!seenIds.contains(id)) { + seenIds.add(id); + list.add(ChallengeOrder(id: id, title: title)); + } + } + return list; + }(), + challengeTiles: () { + final Set seenIds = {}; + final List list = []; + for (dynamic challenge in (data['challengeOrder'] as List? ?? [])) { + final String id = challenge[0] ?? challenge['id']; + final String title = challenge[1] ?? challenge['title']; + if (!seenIds.contains(id)) { + seenIds.add(id); + list.add( + ChallengeListTile( + id: id, + name: title, + dashedName: title + .toLowerCase() + .replaceAll(' ', '-') + .replaceAll(RegExp(r"[@':]"), ''), + ), + ); + } + } + return list; + }(), ); } } diff --git a/mobile-app/lib/ui/views/learn/widgets/pass/pass_widget_view.dart b/mobile-app/lib/ui/views/learn/widgets/pass/pass_widget_view.dart index cef5c365e..6aef4db58 100644 --- a/mobile-app/lib/ui/views/learn/widgets/pass/pass_widget_view.dart +++ b/mobile-app/lib/ui/views/learn/widgets/pass/pass_widget_view.dart @@ -91,7 +91,10 @@ class PassWidgetView extends StatelessWidget { Padding( padding: const EdgeInsets.all(16.0), child: LinearProgressIndicator( - value: completed / maxChallenges, + value: maxChallenges > 0 + ? (completed / maxChallenges) + .clamp(0.0, 1.0) + : 0.0, minHeight: 7, backgroundColor: const Color.fromRGBO( 0x3B, 0x3B, 0x4F, 1), @@ -106,10 +109,13 @@ class PassWidgetView extends StatelessWidget { Expanded( child: Text( context.t.completed_percent( - ((completed * 100) / - maxChallenges) - .round() - .toString(), + maxChallenges > 0 + ? (((completed * 100) / + maxChallenges) + .clamp(0, 100) + .round() + .toString()) + : '0', ), textAlign: TextAlign.right, ),