From ef42cf5cee77fa37de36af8023175d697e587df2 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Fri, 26 Sep 2025 13:23:03 -0400 Subject: [PATCH] chore: changes to chat list main view (#4158) * chore: changes to chat list main view * remove onboarding page --- lib/config/routes.dart | 12 +- lib/l10n/intl_en.arb | 5 +- lib/pages/chat_list/chat_list_body.dart | 151 +++++++++++------- lib/pages/chat_list/chat_list_view.dart | 11 +- .../widgets/pangea_chat_list_header.dart | 8 +- .../utils/bot_client_extension.dart | 31 ++++ .../instructions/instructions_enum.dart | 4 + lib/pangea/onboarding/onboarding.dart | 115 ------------- .../onboarding/onboarding_complete.dart | 77 --------- .../onboarding/onboarding_constants.dart | 3 - lib/pangea/onboarding/onboarding_step.dart | 103 ------------ .../onboarding/onboarding_steps_enum.dart | 54 ------- lib/pangea/onboarding/onboarding_view.dart | 135 ---------------- 13 files changed, 151 insertions(+), 558 deletions(-) create mode 100644 lib/pangea/chat_settings/utils/bot_client_extension.dart delete mode 100644 lib/pangea/onboarding/onboarding.dart delete mode 100644 lib/pangea/onboarding/onboarding_complete.dart delete mode 100644 lib/pangea/onboarding/onboarding_constants.dart delete mode 100644 lib/pangea/onboarding/onboarding_step.dart delete mode 100644 lib/pangea/onboarding/onboarding_steps_enum.dart delete mode 100644 lib/pangea/onboarding/onboarding_view.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index c142fa3c0..057b8014b 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -2,8 +2,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:go_router/go_router.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/chat/chat.dart'; @@ -39,6 +41,7 @@ import 'package:fluffychat/pangea/course_creation/new_course_page.dart'; import 'package:fluffychat/pangea/course_creation/selected_course_page.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/find_your_people/find_your_people.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/language_selection_page.dart'; @@ -48,7 +51,6 @@ 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/signup.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; import 'package:fluffychat/pangea/space_analytics/space_analytics.dart'; import 'package:fluffychat/pangea/spaces/constants/space_constants.dart'; import 'package:fluffychat/pangea/spaces/utils/join_with_alias.dart'; @@ -322,7 +324,13 @@ abstract class AppRoutes { FluffyThemes.isColumnMode(context) // #Pangea // ? const EmptyPage() - ? const Onboarding() + ? Center( + child: CachedNetworkImage( + width: 250.0, + imageUrl: + "${AppConfig.assetsBaseURL}/${FindYourPeopleConstants.sideBearFileName}", + ), + ) // Pangea# : ChatList( activeChat: state.pathParameters['roomid'], diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index de9945d98..3c9f486ff 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5288,5 +5288,8 @@ "writingAnalyticsDesc": "Send messages to practice writing.", "endActivity": "End activity", "allLanguages": "All languages", - "allCefrLevels": "All CEFR levels" + "allCefrLevels": "All CEFR levels", + "chatListTooltip": "Here you’ll find your direct messages! Click on any user’s avatar and “start conversation” to send a DM.", + "directMessageBotTitle": "Direct message Pangea Bot", + "directMessageBotDesc": "Talking to humans is more fun but... AI is always ready!" } diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 9485d48ee..200160a83 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -1,6 +1,6 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; @@ -9,13 +9,17 @@ import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart'; import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; import 'package:fluffychat/pangea/chat_list/widgets/pangea_chat_list_header.dart'; +import 'package:fluffychat/pangea/chat_settings/utils/bot_client_extension.dart'; import 'package:fluffychat/pangea/course_chats/course_chats_page.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; +import 'package:fluffychat/pangea/instructions/instructions_enum.dart'; +import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart'; import 'package:fluffychat/pangea/public_spaces/public_room_bottom_sheet.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import '../../config/themes.dart'; import '../../widgets/matrix.dart'; @@ -87,7 +91,10 @@ class ChatListViewBody extends StatelessWidget { slivers: [ // #Pangea // ChatListHeader(controller: controller), - PangeaChatListHeader(controller: controller), + PangeaChatListHeader( + controller: controller, + showSearch: rooms.length >= 7, + ), // Pangea# SliverList( delegate: SliverChildListDelegate( @@ -219,51 +226,61 @@ class ChatListViewBody extends StatelessWidget { title: L10n.of(context).chats, icon: const Icon(Icons.forum_outlined), ), - if (client.prevBatch != null && - rooms.isEmpty && - !controller.isSearchMode) ...[ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Stack( - alignment: Alignment.center, - children: [ - const Column( - mainAxisSize: MainAxisSize.min, - children: [ - DummyChatListItem( - opacity: 0.5, - animate: false, - ), - DummyChatListItem( - opacity: 0.3, - animate: false, - ), - ], - ), - Icon( - CupertinoIcons.chat_bubble_text_fill, - size: 128, - color: theme.colorScheme.secondary, - ), - ], - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - client.rooms.isEmpty - ? L10n.of(context).noChatsFoundHereYet - : L10n.of(context).noMoreChatsFound, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - color: theme.colorScheme.secondary, - ), - ), - ), - ], + // #Pangea + const InstructionsInlineTooltip( + instructionsEnum: InstructionsEnum.chatListTooltip, + padding: EdgeInsets.only( + left: 16.0, + right: 16.0, + bottom: 16.0, ), - ], + ), + // if (client.prevBatch != null && + // rooms.isEmpty && + // !controller.isSearchMode) ...[ + // Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Stack( + // alignment: Alignment.center, + // children: [ + // const Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // DummyChatListItem( + // opacity: 0.5, + // animate: false, + // ), + // DummyChatListItem( + // opacity: 0.3, + // animate: false, + // ), + // ], + // ), + // Icon( + // CupertinoIcons.chat_bubble_text_fill, + // size: 128, + // color: theme.colorScheme.secondary, + // ), + // ], + // ), + // Padding( + // padding: const EdgeInsets.all(16.0), + // child: Text( + // client.rooms.isEmpty + // ? L10n.of(context).noChatsFoundHereYet + // : L10n.of(context).noMoreChatsFound, + // textAlign: TextAlign.center, + // style: TextStyle( + // fontSize: 18, + // color: theme.colorScheme.secondary, + // ), + // ), + // ), + // ], + // ), + // ], + // Pangea# ], ), ), @@ -296,13 +313,39 @@ class ChatListViewBody extends StatelessWidget { }, ), // #Pangea - const SliverPadding(padding: EdgeInsets.all(12.0)), - if (!FluffyThemes.isColumnMode(context)) - SliverList.builder( - itemCount: 1, - itemBuilder: (context, _) { - return const Onboarding(); - }, + if (!client.hasBotDM && !controller.isSearchMode) + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + leading: const BotFace( + expression: BotExpression.idle, + width: Avatar.defaultSize, + ), + trailing: const Icon( + Icons.chat_bubble_outline, + ), + title: Text(L10n.of(context).directMessageBotTitle), + subtitle: Text(L10n.of(context).directMessageBotDesc), + onTap: () async { + final resp = await showFutureLoadingDialog( + context: context, + future: () => + Matrix.of(context).client.startChatWithBot(), + ); + if (resp.isError) return; + context.go("/rooms/${resp.result}"); + }, + ), + ), + ), ), // Pangea# ], diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index 55f6eac05..6bf986215 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -5,8 +5,6 @@ import 'package:go_router/go_router.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pangea/chat_list/widgets/chat_list_view_body_wrapper.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_steps_enum.dart'; class ChatListView extends StatelessWidget { final ChatListController controller; @@ -53,14 +51,9 @@ class ChatListView extends StatelessWidget { // #Pangea // body: ChatListViewBody(controller), body: ChatListViewBodyWrapper(controller: controller), - // floatingActionButton: !controller.isSearchMode && - // controller.activeSpaceId == null + // Pangea# floatingActionButton: !controller.isSearchMode && - controller.activeSpaceId == null && - OnboardingController.complete( - OnboardingStepsEnum.chatWithBot, - ) - // Pangea# + controller.activeSpaceId == null ? FloatingActionButton.extended( onPressed: () => context.go('/rooms/newprivatechat'), // #Pangea diff --git a/lib/pangea/chat_list/widgets/pangea_chat_list_header.dart b/lib/pangea/chat_list/widgets/pangea_chat_list_header.dart index d14e4aa06..a951ef459 100644 --- a/lib/pangea/chat_list/widgets/pangea_chat_list_header.dart +++ b/lib/pangea/chat_list/widgets/pangea_chat_list_header.dart @@ -4,17 +4,17 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_steps_enum.dart'; class PangeaChatListHeader extends StatelessWidget implements PreferredSizeWidget { final ChatListController controller; final bool globalSearch; + final bool showSearch; const PangeaChatListHeader({ super.key, required this.controller, + required this.showSearch, this.globalSearch = true, }); @@ -32,9 +32,7 @@ class PangeaChatListHeader extends StatelessWidget const LearningProgressIndicators(), AnimatedSize( duration: FluffyThemes.animationDuration, - child: OnboardingController.complete( - OnboardingStepsEnum.joinSpace, - ) + child: showSearch ? TextField( controller: controller.searchController, focusNode: controller.searchFocusNode, diff --git a/lib/pangea/chat_settings/utils/bot_client_extension.dart b/lib/pangea/chat_settings/utils/bot_client_extension.dart new file mode 100644 index 000000000..d1aae75f3 --- /dev/null +++ b/lib/pangea/chat_settings/utils/bot_client_extension.dart @@ -0,0 +1,31 @@ +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; +import 'package:fluffychat/pangea/chat/constants/default_power_level.dart'; +import 'package:fluffychat/pangea/chat_settings/constants/bot_mode.dart'; +import 'package:fluffychat/pangea/chat_settings/models/bot_options_model.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; + +extension BotClientExtension on Client { + bool get hasBotDM => rooms.any((room) { + if (room.isDirectChat && + room.directChatMatrixID == BotName.byEnvironment) { + return true; + } + if (room.botOptions?.mode == BotMode.directChat) { + return true; + } + return false; + }); + + Future startChatWithBot() => startDirectChat( + BotName.byEnvironment, + preset: CreateRoomPreset.trustedPrivateChat, + initialState: [ + BotOptionsModel(mode: BotMode.directChat).toStateEvent, + RoomDefaults.defaultPowerLevels( + userID!, + ), + ], + ); +} diff --git a/lib/pangea/instructions/instructions_enum.dart b/lib/pangea/instructions/instructions_enum.dart index 8f9d74890..ef910ac3b 100644 --- a/lib/pangea/instructions/instructions_enum.dart +++ b/lib/pangea/instructions/instructions_enum.dart @@ -30,6 +30,7 @@ enum InstructionsEnum { readingAssistanceOverview, emptyChatWarning, activityStatsMenu, + chatListTooltip, } extension InstructionsEnumExtension on InstructionsEnum { @@ -62,6 +63,7 @@ extension InstructionsEnumExtension on InstructionsEnum { case InstructionsEnum.morphAnalyticsList: case InstructionsEnum.readingAssistanceOverview: case InstructionsEnum.activityStatsMenu: + case InstructionsEnum.chatListTooltip: ErrorHandler.logError( e: Exception("No title for this instruction"), m: 'InstructionsEnumExtension.title', @@ -124,6 +126,8 @@ extension InstructionsEnumExtension on InstructionsEnum { return l10n.emptyChatWarningDesc; case InstructionsEnum.activityStatsMenu: return l10n.activityStatsButtonInstruction; + case InstructionsEnum.chatListTooltip: + return l10n.chatListTooltip; } } diff --git a/lib/pangea/onboarding/onboarding.dart b/lib/pangea/onboarding/onboarding.dart deleted file mode 100644 index 53d45bd87..000000000 --- a/lib/pangea/onboarding/onboarding.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:get_storage/get_storage.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; -import 'package:fluffychat/pangea/chat/constants/default_power_level.dart'; -import 'package:fluffychat/pangea/chat_settings/constants/bot_mode.dart'; -import 'package:fluffychat/pangea/chat_settings/models/bot_options_model.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_steps_enum.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_view.dart'; -import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/widgets/future_loading_dialog.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class Onboarding extends StatefulWidget { - const Onboarding({super.key}); - - @override - OnboardingController createState() => OnboardingController(); -} - -class OnboardingController extends State { - static final GetStorage _onboardingStorage = GetStorage('onboarding_storage'); - - @override - void initState() { - super.initState(); - // Initialize the storage if needed - GetStorage.init('onboarding_storage').then((_) { - if (mounted) setState(() {}); - }); - } - - static bool get isClosed => _onboardingStorage.read('closed') ?? false; - - static bool get isComplete => OnboardingStepsEnum.values.every( - (step) => complete(step), - ); - - static bool complete(OnboardingStepsEnum step) { - switch (step) { - case OnboardingStepsEnum.chatWithBot: - return hasBotDM; - case OnboardingStepsEnum.joinSpace: - return MatrixState.pangeaController.matrixState.client.rooms.any( - (r) => r.isSpace, - ); - case OnboardingStepsEnum.inviteFriends: - return MatrixState.pangeaController.matrixState.client.rooms.any( - (r) => - r.isDirectChat && r.directChatMatrixID != BotName.byEnvironment, - ); - } - } - - static bool get hasBotDM => - MatrixState.pangeaController.matrixState.client.rooms.any((room) { - if (room.isDirectChat && - room.directChatMatrixID == BotName.byEnvironment) { - return true; - } - if (room.botOptions?.mode == BotMode.directChat) { - return true; - } - return false; - }); - - Future closeCompletedMessage() async { - await _onboardingStorage.write('closed', true); - if (mounted) setState(() {}); - } - - Future inviteFriends() async { - FluffyShare.shareInviteLink(context); - } - - Future startChatWithBot() async { - final resp = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.startDirectChat( - BotName.byEnvironment, - preset: CreateRoomPreset.trustedPrivateChat, - initialState: [ - BotOptionsModel(mode: BotMode.directChat).toStateEvent, - RoomDefaults.defaultPowerLevels( - Matrix.of(context).client.userID!, - ), - ], - ), - ); - if (resp.isError) return; - context.go("/rooms/${resp.result}"); - } - - void joinCommunities() { - context.go('/rooms/communities'); - } - - Future onPressed(OnboardingStepsEnum step) async { - switch (step) { - case OnboardingStepsEnum.chatWithBot: - return startChatWithBot(); - case OnboardingStepsEnum.joinSpace: - return joinCommunities(); - case OnboardingStepsEnum.inviteFriends: - return inviteFriends(); - } - } - - @override - Widget build(BuildContext context) => OnboardingView(controller: this); -} diff --git a/lib/pangea/onboarding/onboarding_complete.dart b/lib/pangea/onboarding/onboarding_complete.dart deleted file mode 100644 index fcef4d8ab..000000000 --- a/lib/pangea/onboarding/onboarding_complete.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_constants.dart'; - -class OnboardingComplete extends StatelessWidget { - final OnboardingController controller; - const OnboardingComplete({super.key, required this.controller}); - - @override - Widget build(BuildContext context) { - final isColumnMode = FluffyThemes.isColumnMode(context); - return Stack( - children: [ - Container( - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .surfaceContainerHigh - .withAlpha(170), - borderRadius: BorderRadius.circular( - 10.0, - ), - ), - margin: const EdgeInsets.all(12.0), - padding: isColumnMode - ? const EdgeInsets.all(48.0) - : const EdgeInsets.fromLTRB( - 48.0, - 8.0, - 48.0, - 0.0, - ), - child: isColumnMode - ? Text( - L10n.of(context).getStartedComplete, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 14, - ), - ) - : Column( - mainAxisSize: MainAxisSize.min, - spacing: 24.0, - children: [ - Text( - L10n.of(context).getStartedComplete, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 14.0, - ), - ), - CachedNetworkImage( - imageUrl: - "${AppConfig.assetsBaseURL}/${OnboardingConstants.onboardingImageFileName}", - fit: BoxFit.cover, - ), - ], - ), - ), - Positioned( - right: 16.0, - top: 16.0, - child: IconButton( - icon: const Icon(Icons.close), - onPressed: controller.closeCompletedMessage, - ), - ), - ], - ); - } -} diff --git a/lib/pangea/onboarding/onboarding_constants.dart b/lib/pangea/onboarding/onboarding_constants.dart deleted file mode 100644 index 744acec18..000000000 --- a/lib/pangea/onboarding/onboarding_constants.dart +++ /dev/null @@ -1,3 +0,0 @@ -class OnboardingConstants { - static String onboardingImageFileName = "Getting+Started.png"; -} diff --git a/lib/pangea/onboarding/onboarding_step.dart b/lib/pangea/onboarding/onboarding_step.dart deleted file mode 100644 index b97b2ff93..000000000 --- a/lib/pangea/onboarding/onboarding_step.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_steps_enum.dart'; - -class OnboardingStep extends StatelessWidget { - final OnboardingStepsEnum step; - - final bool isComplete; - final VoidCallback onPressed; - - const OnboardingStep({ - super.key, - required this.step, - this.isComplete = false, - required this.onPressed, - }); - - @override - Widget build(BuildContext context) { - final isColumnMode = FluffyThemes.isColumnMode(context); - - return Container( - padding: EdgeInsets.symmetric( - horizontal: isColumnMode ? 20.0 : 8.0, - vertical: isColumnMode ? 24.0 : 8.0, - ), - margin: isColumnMode - ? const EdgeInsets.only( - bottom: 10.0, - ) - : const EdgeInsets.all(0.0), - decoration: isColumnMode && isComplete - ? ShapeDecoration( - shape: RoundedRectangleBorder( - side: const BorderSide( - width: 1, - color: AppConfig.success, - ), - borderRadius: BorderRadius.circular( - 24, - ), - ), - ) - : null, - child: Row( - spacing: isColumnMode ? 24.0 : 12.0, - children: [ - Icon( - Icons.task_alt, - size: isColumnMode ? 30.0 : 18.0, - color: isComplete - ? AppConfig.success - : Theme.of(context).colorScheme.primary, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: isColumnMode ? 16.0 : 8.0, - children: [ - Text( - isComplete - ? step.completeMessage( - L10n.of(context), - ) - : step.description( - L10n.of(context), - ), - style: TextStyle( - fontSize: isColumnMode ? 20.0 : 12.0, - ), - ), - if (!isComplete) - ElevatedButton( - onPressed: onPressed, - child: Row( - spacing: 8.0, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - step.icon(18.0), - Text( - step.buttonText( - L10n.of( - context, - ), - ), - style: const TextStyle( - fontSize: 14.0, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/lib/pangea/onboarding/onboarding_steps_enum.dart b/lib/pangea/onboarding/onboarding_steps_enum.dart deleted file mode 100644 index 004420d1b..000000000 --- a/lib/pangea/onboarding/onboarding_steps_enum.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; - -enum OnboardingStepsEnum { - chatWithBot, - joinSpace, - inviteFriends; - - String description(L10n l10n) { - switch (this) { - case OnboardingStepsEnum.chatWithBot: - return l10n.getStartedBotChatDesc; - case OnboardingStepsEnum.joinSpace: - return l10n.getStartedCommunitiesDesc; - case OnboardingStepsEnum.inviteFriends: - return l10n.getStartedFriendsDesc; - } - } - - String completeMessage(L10n l10n) { - switch (this) { - case OnboardingStepsEnum.chatWithBot: - return l10n.getStartedBotChatComplete; - case OnboardingStepsEnum.joinSpace: - return l10n.getStartedCommunitiesComplete; - case OnboardingStepsEnum.inviteFriends: - return l10n.getStartedFriendsComplete; - } - } - - Widget icon(double size) { - switch (this) { - case OnboardingStepsEnum.chatWithBot: - return BotFace(expression: BotExpression.gold, width: size); - case OnboardingStepsEnum.joinSpace: - return Icon(Icons.groups_outlined, size: size); - case OnboardingStepsEnum.inviteFriends: - return Icon(Icons.share, size: size); - } - } - - String buttonText(L10n l10n) { - switch (this) { - case OnboardingStepsEnum.chatWithBot: - return l10n.getStartedBotChatButton; - case OnboardingStepsEnum.joinSpace: - return l10n.findCourse; - case OnboardingStepsEnum.inviteFriends: - return l10n.getStartedFriendsButton; - } - } -} diff --git a/lib/pangea/onboarding/onboarding_view.dart b/lib/pangea/onboarding/onboarding_view.dart deleted file mode 100644 index e598ee624..000000000 --- a/lib/pangea/onboarding/onboarding_view.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_complete.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_constants.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_step.dart'; -import 'package:fluffychat/pangea/onboarding/onboarding_steps_enum.dart'; -import 'package:fluffychat/utils/stream_extension.dart'; -import 'package:fluffychat/widgets/layouts/empty_page.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class OnboardingView extends StatelessWidget { - final OnboardingController controller; - - const OnboardingView({ - super.key, - required this.controller, - }); - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - final isColumnMode = FluffyThemes.isColumnMode(context); - - if (OnboardingController.isClosed && isColumnMode) { - return const EmptyPage(); - } - - final screenheight = MediaQuery.of(context).size.height; - - return Material( - child: StreamBuilder( - key: ValueKey( - client.userID.toString(), - ), - stream: client.onSync.stream - .where((s) => s.hasRoomUpdate) - .rateLimit(const Duration(seconds: 1)), - builder: (context, _) { - return Stack( - alignment: Alignment.topCenter, - children: [ - if (isColumnMode && !OnboardingController.isClosed) - Positioned( - bottom: 0.0, - child: AnimatedOpacity( - duration: FluffyThemes.animationDuration, - opacity: OnboardingController.isComplete ? 1.0 : 0.3, - child: CachedNetworkImage( - imageUrl: - "${AppConfig.assetsBaseURL}/${OnboardingConstants.onboardingImageFileName}", - fit: BoxFit.cover, - ), - ), - ), - AnimatedContainer( - duration: FluffyThemes.animationDuration, - height: OnboardingController.isClosed ? 0 : screenheight, - child: Padding( - padding: EdgeInsets.symmetric( - vertical: 12.0, - horizontal: isColumnMode ? 20.0 : 8.0, - ), - child: MaxWidthBody( - showBorder: false, - maxWidth: 850.0, - child: Column( - children: [ - Text( - L10n.of(context).getStarted, - style: TextStyle( - fontSize: isColumnMode ? 32.0 : 16.0, - height: isColumnMode ? 1.2 : 1.5, - ), - ), - Padding( - padding: EdgeInsets.all( - isColumnMode ? 40.0 : 12.0, - ), - child: Row( - spacing: 8.0, - mainAxisSize: MainAxisSize.min, - children: OnboardingStepsEnum.values.map((step) { - final complete = - OnboardingController.complete(step); - return CircleAvatar( - radius: 6.0, - backgroundColor: complete - ? AppConfig.success - : Theme.of(context).colorScheme.primary, - child: CircleAvatar( - radius: 3.0, - backgroundColor: - Theme.of(context).colorScheme.surface, - ), - ); - }).toList(), - ), - ), - OnboardingController.isComplete - ? OnboardingComplete( - controller: controller, - ) - : Column( - spacing: 12.0, - children: [ - for (final step in OnboardingStepsEnum.values) - OnboardingStep( - step: step, - isComplete: - OnboardingController.complete(step), - onPressed: () => - controller.onPressed(step), - ), - ], - ), - ], - ), - ), - ), - ), - ], - ); - }, - ), - ); - } -}