From 9c22bb4feda58c953d15a539aae6a7ca0459d0da Mon Sep 17 00:00:00 2001 From: Mathias Mogensen <42929161+Xazin@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:11:39 +0100 Subject: [PATCH] fix: tab change speed + remove favorite option (#6819) --- .../application/tabs/tab_menu_bloc.dart | 79 ---------------- .../presentation/home/home_stack.dart | 3 +- .../presentation/home/tabs/flowy_tab.dart | 90 ++++--------------- .../presentation/home/tabs/tabs_manager.dart | 16 +--- .../presentation/widgets/tab_bar_item.dart | 5 +- 5 files changed, 25 insertions(+), 168 deletions(-) delete mode 100644 frontend/appflowy_flutter/lib/workspace/application/tabs/tab_menu_bloc.dart diff --git a/frontend/appflowy_flutter/lib/workspace/application/tabs/tab_menu_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/tabs/tab_menu_bloc.dart deleted file mode 100644 index e27e07bb5f..0000000000 --- a/frontend/appflowy_flutter/lib/workspace/application/tabs/tab_menu_bloc.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'dart:async'; - -import 'package:appflowy/workspace/application/view/view_service.dart'; -import 'package:appflowy_backend/log.dart'; -import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; -import 'package:bloc/bloc.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'tab_menu_bloc.freezed.dart'; - -class TabMenuBloc extends Bloc { - TabMenuBloc({required this.viewId}) : super(const TabMenuState.isLoading()) { - _fetchView(); - _dispatch(); - } - - final String viewId; - ViewPB? view; - - void _dispatch() { - on( - (event, emit) async { - await event.when( - error: (error) async => emit(const TabMenuState.isError()), - fetchedView: (view) async => - emit(TabMenuState.isReady(isFavorite: view.isFavorite)), - toggleFavorite: () async { - final didToggle = await ViewBackendService.favorite(viewId: viewId); - if (didToggle.isSuccess) { - final isFavorite = state.maybeMap( - isReady: (s) => s.isFavorite, - orElse: () => null, - ); - if (isFavorite != null) { - emit(TabMenuState.isReady(isFavorite: !isFavorite)); - } - } - }, - ); - }, - ); - } - - Future _fetchView() async { - final viewOrFailure = await ViewBackendService.getView(viewId); - viewOrFailure.fold( - (view) { - this.view = view; - add(TabMenuEvent.fetchedView(view)); - }, - (error) { - Log.error(error); - add(TabMenuEvent.error(error)); - }, - ); - } -} - -@freezed -class TabMenuEvent with _$TabMenuEvent { - const factory TabMenuEvent.error(FlowyError error) = _Error; - const factory TabMenuEvent.fetchedView(ViewPB view) = _FetchedView; - const factory TabMenuEvent.toggleFavorite() = _ToggleFavorite; -} - -@freezed -class TabMenuState with _$TabMenuState { - const factory TabMenuState.isLoading() = _IsLoading; - - /// This will only be the state in case fetching the view failed. - /// - /// One such case can be from when a View is in the trash, as such we can disable - /// certain options in the TabMenu such as the favorite option. - /// - const factory TabMenuState.isError() = _IsError; - - const factory TabMenuState.isReady({required bool isFavorite}) = _IsReady; -} diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart index bbcf8f3f6e..804cb443a6 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/home_stack.dart @@ -85,9 +85,8 @@ class _HomeStackState extends State { ), ), Expanded( - child: FadingIndexedStack( + child: IndexedStack( index: selectedIndex, - duration: const Duration(milliseconds: 350), children: state.pageManagers .map( (pm) => Column( diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/flowy_tab.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/flowy_tab.dart index 7e8946f077..c681237236 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/flowy_tab.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/flowy_tab.dart @@ -1,6 +1,5 @@ import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart'; -import 'package:appflowy/workspace/application/tabs/tab_menu_bloc.dart'; import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart'; import 'package:appflowy/workspace/presentation/home/home_sizes.dart'; import 'package:appflowy/workspace/presentation/home/home_stack.dart'; @@ -51,12 +50,7 @@ class _FlowyTabState extends State { showAtCursor: true, popupBuilder: (_) => BlocProvider.value( value: context.read(), - child: BlocProvider( - create: (_) => TabMenuBloc( - viewId: widget.pageManager.plugin.id, - ), - child: TabMenu(pageId: widget.pageManager.plugin.id), - ), + child: TabMenu(pageId: widget.pageManager.plugin.id), ), child: ChangeNotifierProvider.value( value: widget.pageManager.notifier, @@ -126,56 +120,21 @@ class TabMenu extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state.maybeMap( - isLoading: (_) => true, - orElse: () => false, - )) { - return const SizedBox.shrink(); - } - - final disableFavoriteOption = state.maybeWhen( - isReady: (_) => false, - orElse: () => true, - ); - - return SeparatedColumn( - separatorBuilder: () => const VSpace(4), - mainAxisSize: MainAxisSize.min, - children: [ - FlowyButton( - text: FlowyText.regular(LocaleKeys.tabMenu_close.tr()), - onTap: () => _closeTab(context), - ), - FlowyButton( - text: FlowyText.regular( - LocaleKeys.tabMenu_closeOthers.tr(), - ), - onTap: () => _closeOtherTabs(context), - ), - const Divider(height: 1), - _favoriteDisabledTooltip( - showTooltip: disableFavoriteOption, - child: FlowyButton( - disable: disableFavoriteOption, - text: FlowyText.regular( - state.maybeWhen( - isReady: (isFavorite) => isFavorite - ? LocaleKeys.tabMenu_unfavorite.tr() - : LocaleKeys.tabMenu_favorite.tr(), - orElse: () => LocaleKeys.tabMenu_favorite.tr(), - ), - color: disableFavoriteOption - ? Theme.of(context).hintColor - : null, - ), - onTap: () => _toggleFavorite(context), - ), - ), - ], - ); - }, + return SeparatedColumn( + separatorBuilder: () => const VSpace(4), + mainAxisSize: MainAxisSize.min, + children: [ + FlowyButton( + text: FlowyText.regular(LocaleKeys.tabMenu_close.tr()), + onTap: () => _closeTab(context), + ), + FlowyButton( + text: FlowyText.regular( + LocaleKeys.tabMenu_closeOthers.tr(), + ), + onTap: () => _closeOtherTabs(context), + ), + ], ); } @@ -184,21 +143,4 @@ class TabMenu extends StatelessWidget { void _closeOtherTabs(BuildContext context) => context.read().add(TabsEvent.closeOtherTabs(pageId)); - - void _toggleFavorite(BuildContext context) => - context.read().add(const TabMenuEvent.toggleFavorite()); - - Widget _favoriteDisabledTooltip({ - required bool showTooltip, - required Widget child, - }) { - if (showTooltip) { - return FlowyTooltip( - message: LocaleKeys.tabMenu_favoriteDisabledHint.tr(), - child: child, - ); - } - - return child; - } } diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/tabs_manager.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/tabs_manager.dart index dd382fb584..6ae3edba8a 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/tabs_manager.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/tabs/tabs_manager.dart @@ -6,19 +6,11 @@ import 'package:appflowy/workspace/presentation/home/home_sizes.dart'; import 'package:appflowy/workspace/presentation/home/tabs/flowy_tab.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -class TabsManager extends StatefulWidget { - const TabsManager({ - super.key, - required this.onIndexChanged, - }); +class TabsManager extends StatelessWidget { + const TabsManager({super.key, required this.onIndexChanged}); final void Function(int) onIndexChanged; - @override - State createState() => _TabsManagerState(); -} - -class _TabsManagerState extends State { @override Widget build(BuildContext context) { return BlocProvider.value( @@ -26,7 +18,7 @@ class _TabsManagerState extends State { child: BlocListener( listenWhen: (prev, curr) => prev.currentIndex != curr.currentIndex || prev.pages != curr.pages, - listener: (context, state) => widget.onIndexChanged(state.currentIndex), + listener: (context, state) => onIndexChanged(state.currentIndex), child: BlocBuilder( builder: (context, state) { if (state.pages == 1) { @@ -54,7 +46,7 @@ class _TabsManagerState extends State { onTap: () { if (state.currentPageManager != pm) { final index = state.pageManagers.indexOf(pm); - widget.onIndexChanged(index); + onIndexChanged(index); } }, ), diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/tab_bar_item.dart b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/tab_bar_item.dart index b12d4f1e05..e4f3098c39 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/widgets/tab_bar_item.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/widgets/tab_bar_item.dart @@ -39,5 +39,8 @@ class _ViewTabBarItemState extends State { } @override - Widget build(BuildContext context) => FlowyText.medium(view.nameOrDefault); + Widget build(BuildContext context) => FlowyText.medium( + view.nameOrDefault, + overflow: TextOverflow.ellipsis, + ); }