diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 9a7268a3e..58da1b0cb 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -44,13 +44,13 @@ import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/find_your_people/find_your_people_constants.dart'; import 'package:fluffychat/pangea/guard/p_vguard.dart'; import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart'; +import 'package:fluffychat/pangea/login/pages/add_course_page.dart'; +import 'package:fluffychat/pangea/login/pages/course_code_page.dart'; import 'package:fluffychat/pangea/login/pages/create_pangea_account_page.dart'; import 'package:fluffychat/pangea/login/pages/language_selection_page.dart'; import 'package:fluffychat/pangea/login/pages/login_or_signup_view.dart'; -import 'package:fluffychat/pangea/login/pages/new_trip_page.dart'; -import 'package:fluffychat/pangea/login/pages/plan_trip_page.dart'; -import 'package:fluffychat/pangea/login/pages/private_trip_page.dart'; -import 'package:fluffychat/pangea/login/pages/public_trip_page.dart'; +import 'package:fluffychat/pangea/login/pages/new_course_page.dart'; +import 'package:fluffychat/pangea/login/pages/public_courses_page.dart'; import 'package:fluffychat/pangea/login/pages/signup.dart'; import 'package:fluffychat/pangea/space_analytics/space_analytics.dart'; import 'package:fluffychat/pangea/spaces/constants/space_constants.dart'; @@ -207,7 +207,7 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - const PlanTripPage(route: 'registration'), + const AddCoursePage(route: 'registration'), ), routes: [ GoRoute( @@ -216,7 +216,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const PrivateTripPage(), + const CourseCodePage(), ); }, ), @@ -226,7 +226,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const PublicTripPage( + const PublicCoursesPage( route: 'registration', showFilters: false, ), @@ -255,7 +255,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const NewTripPage( + const NewCoursePage( route: 'registration', showFilters: false, ), @@ -428,7 +428,7 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - const PlanTripPage(route: 'rooms'), + const AddCoursePage(route: 'rooms'), ), routes: [ GoRoute( @@ -437,7 +437,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const PrivateTripPage(), + const CourseCodePage(), ); }, ), @@ -447,7 +447,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const PublicTripPage( + const PublicCoursesPage( route: 'rooms', ), ); @@ -475,7 +475,7 @@ abstract class AppRoutes { return defaultPageBuilder( context, state, - const NewTripPage(route: 'rooms'), + const NewCoursePage(route: 'rooms'), ); }, routes: [ @@ -862,7 +862,7 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - NewTripPage( + NewCoursePage( route: 'rooms', spaceId: state.pathParameters['spaceid']!, ), diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 653636aac..726f37d7d 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5173,7 +5173,6 @@ "saveToCompletedActivities": "Save to completed activities", "generatingSummary": "Analyzing chat and generating results", "instructionsLanguage": "Instructions language", - "findCourse": "Find a course", "activityCompletedDesc": "Your completed activity was added to analytics where you can review and practice the language you used.", "pingParticipantsNotification": "{user} is looking for users to join the activity session in {room}", "@pingParticipantsNotification": { @@ -5263,18 +5262,9 @@ "languages": "Languages", "chooseLanguage": "Choose a language.", "letsGo": "Let's go", - "planTrip": "Plan your trip", - "howAreYouTraveling": "How are you traveling?", - "unlockPrivateTrip": "Unlock a private trip", - "joinPublicTrip": "Join a public trip", - "startOwnTrip": "Start my own", - "tripPlanDesc": "Trips are courses. Each has 8-10 sequenced topics with a range of task-based language learning activities.", - "unlockPrivateTripTitle": "Unlock private trip", - "browsePublicTrips": "Browse public trips", - "startOwnTripTitle": "Start my own trip", - "courseCode": "What’s the secret password?", - "courseCodeHint": "Trip code or link", - "unlockMyTrip": "Unlock my trip", + "startOwn": "Start my own", + "joinCourseDesc": "Each course has 8-10 sequenced topics with a range of task-based language learning activities.", + "courseCodeHint": "Course code", "anyLevel": "Any Level", "signupOption": "How do you want to sign up?", "withApple": "With Apple", @@ -5320,5 +5310,8 @@ "@shareCourse": { "type": "String", "placeholders": {} - } + }, + "addCourse": "Add a course", + "joinCourseWithCode": "Join course with code", + "joinPublicCourse": "Join public course" } diff --git a/lib/pangea/login/pages/plan_trip_page.dart b/lib/pangea/login/pages/add_course_page.dart similarity index 88% rename from lib/pangea/login/pages/plan_trip_page.dart rename to lib/pangea/login/pages/add_course_page.dart index c166ee353..b3bf0526b 100644 --- a/lib/pangea/login/pages/plan_trip_page.dart +++ b/lib/pangea/login/pages/add_course_page.dart @@ -8,9 +8,9 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/common/widgets/pangea_logo_svg.dart'; -class PlanTripPage extends StatelessWidget { +class AddCoursePage extends StatelessWidget { final String route; - const PlanTripPage({ + const AddCoursePage({ required this.route, super.key, }); @@ -28,7 +28,7 @@ class PlanTripPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.map_outlined), - Text(L10n.of(context).planTrip), + Text(L10n.of(context).addCourse), ], ), automaticallyImplyLeading: route == 'registration', @@ -51,12 +51,6 @@ class PlanTripPage extends StatelessWidget { Column( spacing: 16.0, children: [ - Text( - L10n.of(context).howAreYouTraveling, - style: theme.textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, - ), - ), ElevatedButton( onPressed: () => context.go( '/$route/course/private', @@ -78,7 +72,7 @@ class PlanTripPage extends StatelessWidget { BlendMode.srcIn, ), ), - Text(L10n.of(context).unlockPrivateTrip), + Text(L10n.of(context).joinCourseWithCode), ], ), ), @@ -99,7 +93,7 @@ class PlanTripPage extends StatelessWidget { size: 24.0, color: theme.colorScheme.onPrimaryContainer, ), - Text(L10n.of(context).joinPublicTrip), + Text(L10n.of(context).joinPublicCourse), ], ), ), @@ -124,7 +118,7 @@ class PlanTripPage extends StatelessWidget { BlendMode.srcIn, ), ), - Text(L10n.of(context).startOwnTrip), + Text(L10n.of(context).startOwn), ], ), ), @@ -132,7 +126,7 @@ class PlanTripPage extends StatelessWidget { contentPadding: const EdgeInsets.all(0.0), leading: const Icon(Icons.school), title: Text( - L10n.of(context).tripPlanDesc, + L10n.of(context).joinCourseDesc, style: theme.textTheme.labelLarge, ), ), diff --git a/lib/pangea/login/pages/private_trip_page.dart b/lib/pangea/login/pages/course_code_page.dart similarity index 77% rename from lib/pangea/login/pages/private_trip_page.dart rename to lib/pangea/login/pages/course_code_page.dart index e4e7ff54f..026b0969a 100644 --- a/lib/pangea/login/pages/private_trip_page.dart +++ b/lib/pangea/login/pages/course_code_page.dart @@ -1,21 +1,24 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/common/widgets/pangea_logo_svg.dart'; +import 'package:fluffychat/pangea/login/pages/add_course_page.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class PrivateTripPage extends StatefulWidget { - const PrivateTripPage({ +class CourseCodePage extends StatefulWidget { + const CourseCodePage({ super.key, }); @override - State createState() => PrivateTripPageState(); + State createState() => CourseCodePageState(); } -class PrivateTripPageState extends State { +class CourseCodePageState extends State { final TextEditingController _codeController = TextEditingController(); @override @@ -57,8 +60,16 @@ class PrivateTripPageState extends State { spacing: 10.0, mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.map_outlined), - Text(L10n.of(context).unlockPrivateTripTitle), + SvgPicture.network( + "${AppConfig.assetsBaseURL}/${AddCoursePage.mapUnlockFileName}", + width: 24.0, + height: 24.0, + colorFilter: ColorFilter.mode( + theme.colorScheme.onSurface, + BlendMode.srcIn, + ), + ), + Text(L10n.of(context).joinCourseWithCode), ], ), ), @@ -81,7 +92,7 @@ class PrivateTripPageState extends State { spacing: 16.0, children: [ Text( - L10n.of(context).courseCode, + L10n.of(context).enterCodeToJoin, style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), @@ -102,7 +113,7 @@ class PrivateTripPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text(L10n.of(context).unlockMyTrip), + Text(L10n.of(context).submit), ], ), ), diff --git a/lib/pangea/login/pages/new_trip_page.dart b/lib/pangea/login/pages/new_course_page.dart similarity index 92% rename from lib/pangea/login/pages/new_trip_page.dart rename to lib/pangea/login/pages/new_course_page.dart index 8ae38ef98..d6a8fb6c7 100644 --- a/lib/pangea/login/pages/new_trip_page.dart +++ b/lib/pangea/login/pages/new_course_page.dart @@ -1,22 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; import 'package:fluffychat/pangea/common/widgets/url_image_widget.dart'; import 'package:fluffychat/pangea/course_creation/course_info_chip_widget.dart'; import 'package:fluffychat/pangea/course_creation/course_language_filter.dart'; import 'package:fluffychat/pangea/course_creation/course_search_provider.dart'; +import 'package:fluffychat/pangea/login/pages/add_course_page.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class NewTripPage extends StatefulWidget { +class NewCoursePage extends StatefulWidget { final String route; final String? spaceId; final bool showFilters; - const NewTripPage({ + const NewCoursePage({ super.key, required this.route, this.spaceId, @@ -24,10 +27,11 @@ class NewTripPage extends StatefulWidget { }); @override - State createState() => NewTripPageState(); + State createState() => NewCoursePageState(); } -class NewTripPageState extends State with CourseSearchProvider { +class NewCoursePageState extends State + with CourseSearchProvider { @override void initState() { super.initState(); @@ -49,11 +53,19 @@ class NewTripPageState extends State with CourseSearchProvider { spacing: 10.0, mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.map_outlined), + SvgPicture.network( + "${AppConfig.assetsBaseURL}/${AddCoursePage.mapStartFileName}", + width: 24.0, + height: 24.0, + colorFilter: ColorFilter.mode( + theme.colorScheme.onSurface, + BlendMode.srcIn, + ), + ), Text( spaceId != null ? L10n.of(context).addCoursePlan - : L10n.of(context).startOwnTripTitle, + : L10n.of(context).startOwn, ), ], ), diff --git a/lib/pangea/login/pages/public_trip_page.dart b/lib/pangea/login/pages/public_courses_page.dart similarity index 83% rename from lib/pangea/login/pages/public_trip_page.dart rename to lib/pangea/login/pages/public_courses_page.dart index 63ad81114..3a63f8771 100644 --- a/lib/pangea/login/pages/public_trip_page.dart +++ b/lib/pangea/login/pages/public_courses_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:material_symbols_icons/symbols.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -17,20 +18,20 @@ import 'package:fluffychat/pangea/spaces/utils/public_course_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class PublicTripPage extends StatefulWidget { +class PublicCoursesPage extends StatefulWidget { final String route; final bool showFilters; - const PublicTripPage({ + const PublicCoursesPage({ super.key, required this.route, this.showFilters = true, }); @override - State createState() => PublicTripPageState(); + State createState() => PublicCoursesPageState(); } -class PublicTripPageState extends State { +class PublicCoursesPageState extends State { bool loading = true; Object? error; @@ -153,8 +154,10 @@ class PublicTripPageState extends State { spacing: 10.0, mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.map_outlined), - Text(L10n.of(context).browsePublicTrips), + const Icon( + Symbols.map_search, + ), + Text(L10n.of(context).joinPublicCourse), ], ), ), @@ -217,7 +220,7 @@ class PublicTripPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text(L10n.of(context).startOwnTrip), + Text(L10n.of(context).startOwn), ], ), ), @@ -291,11 +294,36 @@ class PublicTripPageState extends State { ), ), Flexible( - child: Text( - displayname, - style: theme.textTheme.bodyLarge, - maxLines: 2, - overflow: TextOverflow.ellipsis, + child: Column( + spacing: 0.0, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + displayname, + style: theme.textTheme.bodyLarge, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + Row( + spacing: 4.0, + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.group, + size: 16.0, + ), + Text( + L10n.of(context) + .countParticipants( + roomChunk.numJoinedMembers, + ), + style: + theme.textTheme.bodyMedium, + ), + ], + ), + ], ), ), ], diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 2c36b67e4..8c50b0581 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -178,7 +178,7 @@ class SpacesNavigationRail extends StatelessWidget { child: const Icon(Icons.add), ), ), - toolTip: L10n.of(context).findCourse, + toolTip: L10n.of(context).addCourse, // Pangea# ); }