From fd8fa1693b655b3cd2edc13c017b001549a6663e Mon Sep 17 00:00:00 2001 From: Brian La Date: Wed, 17 Apr 2024 18:04:28 -0400 Subject: [PATCH 1/6] Initial commit (untested) --- .../profile/completed_challenges_page.dart | 155 +++++++++++------- 1 file changed, 100 insertions(+), 55 deletions(-) diff --git a/game/lib/profile/completed_challenges_page.dart b/game/lib/profile/completed_challenges_page.dart index 8d4cea4e..9682eee1 100644 --- a/game/lib/profile/completed_challenges_page.dart +++ b/game/lib/profile/completed_challenges_page.dart @@ -1,72 +1,117 @@ import 'package:flutter/material.dart'; +import 'package:game/api/game_client_dto.dart'; +import 'package:game/model/challenge_model.dart'; +import 'package:game/model/event_model.dart'; +import 'package:game/model/tracker_model.dart'; +import 'package:game/model/user_model.dart'; import 'package:game/profile/profile_page.dart'; import 'package:game/profile/completed_challenge_cell.dart'; +import 'package:game/utils/utility_functions.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:tuple/tuple.dart'; /* The page view of all the completed challenges */ class CompletedChallengesPage extends StatelessWidget { - // final locationImage = "assets/images/adwhite.jpeg"; - // final locationImage2 = "assets/images/38582.jpg"; - - final pictureList = ["assets/images/adwhite.jpeg", "assets/images/38582.jpg"]; @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Color.fromARGB(255, 255, 248, 241), - appBar: AppBar( - backgroundColor: Color.fromARGB(255, 237, 86, 86), - leading: IconButton( - icon: const Icon(Icons.navigate_before), - color: Colors.white, - onPressed: () { - Navigator.pop( - context, - ); - }, - ), - title: const Text( - 'Completed', - style: TextStyle( + backgroundColor: Color.fromARGB(255, 255, 248, 241), + appBar: AppBar( + backgroundColor: Color.fromARGB(255, 237, 86, 86), + leading: IconButton( + icon: const Icon(Icons.navigate_before), color: Colors.white, - fontFamily: 'Poppins', - fontWeight: FontWeight.bold, + onPressed: () { + Navigator.pop( + context, + ); + }, ), - ), - actions: [], - ), - body: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - child: CompletedChallengeFull( - name: 'Cornell Cafes', - pictures: pictureList, - type: 'Journeys', - date: 'January 19, 2023', - location: 'Arts Quad', - difficulty: 'Easy', - points: 120, - ), + title: const Text( + 'Completed', + style: TextStyle( + color: Colors.white, + fontFamily: 'Poppins', + fontWeight: FontWeight.bold, ), - Align( - child: CompletedChallengeFull( - name: 'Libe Slope', - pictures: [ - "assets/images/adwhite.jpeg", - "assets/images/38582.jpg", - ], - type: 'Journeys', - date: 'February 20, 2023', - location: 'Arts Quad', - difficulty: 'Hard', - points: 120, - ), - ), - ], + ), + actions: [], ), - ), - ); + body: Consumer4( + builder: (context, userModel, eventModel, trackerModel, + challengeModel, child) { + if (userModel.userData == null) { + return Center( + child: CircularProgressIndicator(), + ); + } + var username = userModel.userData?.username; + var score = userModel.userData?.score; + + List> completedEvents = []; + + //Get completed events + for (var eventId in userModel.userData!.trackedEvents!) { + var tracker = trackerModel.trackerByEventId(eventId); + EventDto? event = eventModel.getEventById(eventId); + if (tracker == null || event == null) { + continue; + } + if (tracker.prevChallengeDates!.length != + event.challenges!.length) { + continue; + } + + var completedDate = tracker.prevChallengeDates!.last; + DateTime date = + DateFormat("E, d MMM y HH:mm:ss").parse(completedDate); + + completedEvents.add(Tuple2(date, event)); + } + //Sort so that the most recent events are first + completedEvents.sort((a, b) => b.item1.compareTo(a.item1)); + final itemCount = completedEvents.length; + return ListView.separated( + itemBuilder: (context, index) { + var event = completedEvents[index].item2; + var date = completedEvents[index].item1; + var type = + event.challenges!.length > 1 ? "Journeys" : "Challenge"; + + const pictureList = []; + const locationList = []; + for (var challengeId in event.challenges ?? []) { + var challenge = challengeModel.getChallengeById(challengeId); + if (challenge != null) { + pictureList.add(challenge.imageUrl!); + locationList.add(challenge.location); + } + } + + //Calculate totalPoints. + var totalPoints = 0; + for (var challengeId in event.challenges ?? []) { + var challenge = challengeModel.getChallengeById(challengeId); + if (challenge != null) { + totalPoints += challenge.points ?? 0; + } + } + return CompletedChallengeFull( + name: event.name!, + pictures: pictureList, + type: type, + date: DateFormat("MMMM d, y").format(date), + location: locationList[0], + difficulty: difficultyToString[event.difficulty]!, + points: totalPoints, + ); + }, + separatorBuilder: (context, index) => const Divider(), + itemCount: itemCount); + } + )); } } From 28a42c891b398dfe6c8a2f4d2d9eb3275cae03b0 Mon Sep 17 00:00:00 2001 From: Brian La Date: Wed, 17 Apr 2024 18:35:57 -0400 Subject: [PATCH 2/6] Connected to back end --- game/lib/profile/completed_challenge_cell.dart | 2 +- game/lib/profile/completed_challenges_page.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/game/lib/profile/completed_challenge_cell.dart b/game/lib/profile/completed_challenge_cell.dart index c81c2d4a..fd21dc21 100644 --- a/game/lib/profile/completed_challenge_cell.dart +++ b/game/lib/profile/completed_challenge_cell.dart @@ -78,7 +78,7 @@ class _CompletedChallengeFullState extends State { builder: (BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(8), - child: Image.asset( + child: Image.network( picture, fit: BoxFit.cover, ), diff --git a/game/lib/profile/completed_challenges_page.dart b/game/lib/profile/completed_challenges_page.dart index 9682eee1..3ed7c4ef 100644 --- a/game/lib/profile/completed_challenges_page.dart +++ b/game/lib/profile/completed_challenges_page.dart @@ -81,8 +81,8 @@ class CompletedChallengesPage extends StatelessWidget { var type = event.challenges!.length > 1 ? "Journeys" : "Challenge"; - const pictureList = []; - const locationList = []; + var pictureList = []; + var locationList = []; for (var challengeId in event.challenges ?? []) { var challenge = challengeModel.getChallengeById(challengeId); if (challenge != null) { From 90ebc56050b26a7a6c8f1810d0b479fae62d4597 Mon Sep 17 00:00:00 2001 From: Brian La Date: Wed, 17 Apr 2024 18:51:26 -0400 Subject: [PATCH 3/6] Fix flutter format --- game/lib/profile/completed_challenges_page.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/game/lib/profile/completed_challenges_page.dart b/game/lib/profile/completed_challenges_page.dart index 3ed7c4ef..c87e97be 100644 --- a/game/lib/profile/completed_challenges_page.dart +++ b/game/lib/profile/completed_challenges_page.dart @@ -14,7 +14,6 @@ import 'package:tuple/tuple.dart'; /* The page view of all the completed challenges */ class CompletedChallengesPage extends StatelessWidget { - @override Widget build(BuildContext context) { return Scaffold( @@ -111,7 +110,6 @@ class CompletedChallengesPage extends StatelessWidget { }, separatorBuilder: (context, index) => const Divider(), itemCount: itemCount); - } - )); + })); } } From 4eeb52d15b3cda604461a25b5c5f8449cb6f0fa0 Mon Sep 17 00:00:00 2001 From: Brian La Date: Sun, 21 Apr 2024 15:16:22 -0400 Subject: [PATCH 4/6] fix challenge name --- game/lib/challenges/challenges_page.dart | 9 +-- game/lib/gameplay/gameplay_page.dart | 12 +--- game/lib/journeys/journeys_page.dart | 61 ++++++++++--------- .../profile/completed_challenges_page.dart | 2 +- game/lib/profile/profile_page.dart | 2 +- game/lib/utils/utility_functions.dart | 13 +++- 6 files changed, 51 insertions(+), 48 deletions(-) diff --git a/game/lib/challenges/challenges_page.dart b/game/lib/challenges/challenges_page.dart index 094a82b7..c2445f94 100644 --- a/game/lib/challenges/challenges_page.dart +++ b/game/lib/challenges/challenges_page.dart @@ -11,6 +11,7 @@ import 'package:game/model/event_model.dart'; import 'package:game/model/group_model.dart'; import 'package:game/model/tracker_model.dart'; import 'package:game/model/user_model.dart'; +import 'package:game/utils/utility_functions.dart'; import 'package:provider/provider.dart'; import 'challenge_cell.dart'; import 'package:game/journeys/filter_form.dart'; @@ -163,13 +164,13 @@ class _ChallengesPageState extends State { ) : ChallengeCell( key: UniqueKey(), - challenge.location?.name ?? "", - challenge.name ?? "", + friendlyLocation[challenge.location] ?? "", + event.name ?? "", Image.network( "https://picsum.photos/250?image=9"), complete, - challenge.description ?? "", - event.difficulty?.name ?? "", + event.description ?? "", + friendlyDifficulty[event.difficulty] ?? "", challenge.points ?? 0, event.id), ), diff --git a/game/lib/gameplay/gameplay_page.dart b/game/lib/gameplay/gameplay_page.dart index bc6c14c2..827130a8 100644 --- a/game/lib/gameplay/gameplay_page.dart +++ b/game/lib/gameplay/gameplay_page.dart @@ -11,6 +11,7 @@ import 'package:game/model/tracker_model.dart'; import 'package:game/model/group_model.dart'; import 'package:game/api/geopoint.dart'; import 'package:game/navigation_page/home_navbar.dart'; +import 'package:game/utils/utility_functions.dart'; import 'package:geolocator/geolocator.dart'; import 'package:game/model/challenge_model.dart'; import 'gameplay_map.dart'; @@ -41,17 +42,6 @@ class _GameplayPageState extends State { late StreamSubscription positionStream; - final Map friendlyLocation = { - "ENG_QUAD": "Eng Quad", - "ARTS_QUAD": "Arts Quad", - "AG_QUAD": "Ag Quad", - "NORTH_CAMPUS": "North Campus", - "WEST_CAMPUS": "West Campus", - "COLLEGETOWN": "Collegetown", - "ITHACA_COMMONS": "Ithaca Commons", - "ANY": "Cornell", - }; - @override void initState() { startPositionStream(); diff --git a/game/lib/journeys/journeys_page.dart b/game/lib/journeys/journeys_page.dart index 3c69d122..62f54b0f 100644 --- a/game/lib/journeys/journeys_page.dart +++ b/game/lib/journeys/journeys_page.dart @@ -10,6 +10,7 @@ import 'package:game/model/group_model.dart'; import 'package:game/model/tracker_model.dart'; import 'package:game/model/challenge_model.dart'; import 'package:game/model/user_model.dart'; +import 'package:game/utils/utility_functions.dart'; import 'package:provider/provider.dart'; class JourneysPage extends StatefulWidget { @@ -159,36 +160,36 @@ class _JourneysPageState extends State { DateTime endtime = HttpDate.parse(event.endTime ?? ""); Duration timeTillExpire = endtime.difference(now); - if (!complete) - eventCells.add( - StreamBuilder( - stream: - Stream.fromFuture(Future.delayed(timeTillExpire)), - builder: (stream, value) => timeTillExpire.isNegative - ? Consumer( - builder: (context, apiClient, child) { - if (event.id == groupModel.curEventId) { - apiClient.serverApi?.setCurrentEvent( - SetCurrentEventDto(eventId: "")); - } - return Container(); - }, - ) - : JourneyCell( - key: UniqueKey(), - event.name ?? "", - location?.name ?? "", - Image.network( - "https://picsum.photos/250?image=9"), // dummy data for now; should pass in thumbnail parameter - event.description ?? "", - locationCount, - numberCompleted, - complete, - difficulty?.name ?? "", - totalPoints, - event.id), - ), - ); + print(event.name); + eventCells.add( + StreamBuilder( + stream: + Stream.fromFuture(Future.delayed(timeTillExpire)), + builder: (stream, value) => timeTillExpire.isNegative + ? Consumer( + builder: (context, apiClient, child) { + if (event.id == groupModel.curEventId) { + apiClient.serverApi?.setCurrentEvent( + SetCurrentEventDto(eventId: "")); + } + return Container(); + }, + ) + : JourneyCell( + key: UniqueKey(), + event.name ?? "", + friendlyLocation[location] ?? "", + Image.network( + "https://picsum.photos/250?image=9"), // dummy data for now; should pass in thumbnail parameter + event.description ?? "", + locationCount, + numberCompleted, + complete, + friendlyDifficulty[difficulty] ?? "", + totalPoints, event.id, + ), + ), + ); } return ListView.separated( padding: const EdgeInsets.symmetric(horizontal: 3), diff --git a/game/lib/profile/completed_challenges_page.dart b/game/lib/profile/completed_challenges_page.dart index 216c4e19..f149d7e2 100644 --- a/game/lib/profile/completed_challenges_page.dart +++ b/game/lib/profile/completed_challenges_page.dart @@ -108,7 +108,7 @@ class CompletedChallengesPage extends StatelessWidget { type: type, date: DateFormat("MMMM d, y").format(date), location: locationList[0], - difficulty: difficultyToString[event.difficulty]!, + difficulty: friendlyDifficulty[event.difficulty]!, points: totalPoints, ); }, diff --git a/game/lib/profile/profile_page.dart b/game/lib/profile/profile_page.dart index 3c7eac44..8caab125 100644 --- a/game/lib/profile/profile_page.dart +++ b/game/lib/profile/profile_page.dart @@ -222,7 +222,7 @@ class _ProfilePageState extends State { locationImage, type, formattedDate, - difficultyToString[event.difficulty]!, + friendlyDifficulty[event.difficulty]!, totalPoints); }, physics: BouncingScrollPhysics(), diff --git a/game/lib/utils/utility_functions.dart b/game/lib/utils/utility_functions.dart index 9304f577..38d0ad96 100644 --- a/game/lib/utils/utility_functions.dart +++ b/game/lib/utils/utility_functions.dart @@ -129,8 +129,19 @@ Text LatoText(String text, double fs, Color color, FontWeight fw) { color: color, fontWeight: FontWeight.bold, fontSize: fs))); } -final Map difficultyToString = { +final Map friendlyDifficulty = { EventDifficultyDto.Easy: "Easy", EventDifficultyDto.Normal: "Normal", EventDifficultyDto.Hard: "Hard", }; + +final Map friendlyLocation = { + "ENG_QUAD": "Eng Quad", + "ARTS_QUAD": "Arts Quad", + "AG_QUAD": "Ag Quad", + "NORTH_CAMPUS": "North Campus", + "WEST_CAMPUS": "West Campus", + "COLLEGETOWN": "Collegetown", + "ITHACA_COMMONS": "Ithaca Commons", + "ANY": "Cornell", +}; From ccc329e7dcde304d3c8eed9bff655978ca1957cd Mon Sep 17 00:00:00 2001 From: Brian La Date: Sun, 21 Apr 2024 15:23:39 -0400 Subject: [PATCH 5/6] Remove print statements --- game/lib/challenges/challenges_page.dart | 1 - game/lib/journeys/journeys_page.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/game/lib/challenges/challenges_page.dart b/game/lib/challenges/challenges_page.dart index c2445f94..7cfdb7ef 100644 --- a/game/lib/challenges/challenges_page.dart +++ b/game/lib/challenges/challenges_page.dart @@ -132,7 +132,6 @@ class _ChallengesPageState extends State { if (curEvent != null) events.add(curEvent); } for (EventDto event in events) { - print(event); var tracker = trackerModel.trackerByEventId(event.id); var numberCompleted = tracker?.prevChallenges?.length ?? 0; var complete = diff --git a/game/lib/journeys/journeys_page.dart b/game/lib/journeys/journeys_page.dart index 62f54b0f..f245d2b2 100644 --- a/game/lib/journeys/journeys_page.dart +++ b/game/lib/journeys/journeys_page.dart @@ -160,7 +160,6 @@ class _JourneysPageState extends State { DateTime endtime = HttpDate.parse(event.endTime ?? ""); Duration timeTillExpire = endtime.difference(now); - print(event.name); eventCells.add( StreamBuilder( stream: From e51dad18b9149156528e1cb78ac8a2d5bcc7495c Mon Sep 17 00:00:00 2001 From: Brian La Date: Sun, 21 Apr 2024 15:34:08 -0400 Subject: [PATCH 6/6] Fix merge mistake --- game/lib/journeys/journeys_page.dart | 59 ++++++++++++++-------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/game/lib/journeys/journeys_page.dart b/game/lib/journeys/journeys_page.dart index f245d2b2..2bc6d174 100644 --- a/game/lib/journeys/journeys_page.dart +++ b/game/lib/journeys/journeys_page.dart @@ -160,35 +160,36 @@ class _JourneysPageState extends State { DateTime endtime = HttpDate.parse(event.endTime ?? ""); Duration timeTillExpire = endtime.difference(now); - eventCells.add( - StreamBuilder( - stream: - Stream.fromFuture(Future.delayed(timeTillExpire)), - builder: (stream, value) => timeTillExpire.isNegative - ? Consumer( - builder: (context, apiClient, child) { - if (event.id == groupModel.curEventId) { - apiClient.serverApi?.setCurrentEvent( - SetCurrentEventDto(eventId: "")); - } - return Container(); - }, - ) - : JourneyCell( - key: UniqueKey(), - event.name ?? "", - friendlyLocation[location] ?? "", - Image.network( - "https://picsum.photos/250?image=9"), // dummy data for now; should pass in thumbnail parameter - event.description ?? "", - locationCount, - numberCompleted, - complete, - friendlyDifficulty[difficulty] ?? "", - totalPoints, event.id, - ), - ), - ); + if (!complete) + eventCells.add( + StreamBuilder( + stream: + Stream.fromFuture(Future.delayed(timeTillExpire)), + builder: (stream, value) => timeTillExpire.isNegative + ? Consumer( + builder: (context, apiClient, child) { + if (event.id == groupModel.curEventId) { + apiClient.serverApi?.setCurrentEvent( + SetCurrentEventDto(eventId: "")); + } + return Container(); + }, + ) + : JourneyCell( + key: UniqueKey(), + event.name ?? "", + friendlyLocation[location] ?? "", + Image.network( + "https://picsum.photos/250?image=9"), // dummy data for now; should pass in thumbnail parameter + event.description ?? "", + locationCount, + numberCompleted, + complete, + friendlyDifficulty[difficulty] ?? "", + totalPoints, event.id, + ), + ), + ); } return ListView.separated( padding: const EdgeInsets.symmetric(horizontal: 3),