diff --git a/app_flowy/lib/workspace/application/menu/menu_bloc.dart b/app_flowy/lib/workspace/application/menu/menu_bloc.dart index 4b9c93a143..c1441e2fb6 100644 --- a/app_flowy/lib/workspace/application/menu/menu_bloc.dart +++ b/app_flowy/lib/workspace/application/menu/menu_bloc.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:app_flowy/workspace/domain/i_workspace.dart'; import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; +import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart'; import 'package:dartz/dartz.dart'; import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart'; @@ -37,12 +38,11 @@ class MenuBloc extends Bloc { } Stream _performActionOnOpenPage(OpenPage e) async* { - yield state.copyWith(stackView: e.stackView); + yield state.copyWith(context: e.context); } Stream _performActionOnCreateApp(CreateApp event) async* { - final result = - await workspace.createApp(name: event.name, desc: event.desc); + final result = await workspace.createApp(name: event.name, desc: event.desc); yield result.fold( (app) => state.copyWith(apps: some([app])), (error) { @@ -69,7 +69,7 @@ class MenuBloc extends Bloc { class MenuEvent with _$MenuEvent { const factory MenuEvent.initial() = _Initial; const factory MenuEvent.collapse() = Collapse; - const factory MenuEvent.openPage(HomeStackView stackView) = OpenPage; + const factory MenuEvent.openPage(HomeStackContext context) = OpenPage; const factory MenuEvent.createApp(String name, {String? desc}) = CreateApp; } @@ -79,12 +79,13 @@ class MenuState with _$MenuState { required bool isCollapse, required Option> apps, required Either successOrFailure, - HomeStackView? stackView, + required HomeStackContext context, }) = _MenuState; factory MenuState.initial() => MenuState( isCollapse: false, apps: none(), successOrFailure: left(unit), + context: DefaultHomeStackContext(), ); } diff --git a/app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart b/app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart index 157287f476..068be18799 100644 --- a/app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart +++ b/app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart @@ -24,9 +24,9 @@ class _$MenuEventTearOff { return const Collapse(); } - OpenPage openPage(HomeStackView stackView) { + OpenPage openPage(HomeStackContext context) { return OpenPage( - stackView, + context, ); } @@ -47,7 +47,7 @@ mixin _$MenuEvent { TResult when({ required TResult Function() initial, required TResult Function() collapse, - required TResult Function(HomeStackView stackView) openPage, + required TResult Function(HomeStackContext context) openPage, required TResult Function(String name, String? desc) createApp, }) => throw _privateConstructorUsedError; @@ -55,7 +55,7 @@ mixin _$MenuEvent { TResult maybeWhen({ TResult Function()? initial, TResult Function()? collapse, - TResult Function(HomeStackView stackView)? openPage, + TResult Function(HomeStackContext context)? openPage, TResult Function(String name, String? desc)? createApp, required TResult orElse(), }) => @@ -133,7 +133,7 @@ class _$_Initial implements _Initial { TResult when({ required TResult Function() initial, required TResult Function() collapse, - required TResult Function(HomeStackView stackView) openPage, + required TResult Function(HomeStackContext context) openPage, required TResult Function(String name, String? desc) createApp, }) { return initial(); @@ -144,7 +144,7 @@ class _$_Initial implements _Initial { TResult maybeWhen({ TResult Function()? initial, TResult Function()? collapse, - TResult Function(HomeStackView stackView)? openPage, + TResult Function(HomeStackContext context)? openPage, TResult Function(String name, String? desc)? createApp, required TResult orElse(), }) { @@ -224,7 +224,7 @@ class _$Collapse implements Collapse { TResult when({ required TResult Function() initial, required TResult Function() collapse, - required TResult Function(HomeStackView stackView) openPage, + required TResult Function(HomeStackContext context) openPage, required TResult Function(String name, String? desc) createApp, }) { return collapse(); @@ -235,7 +235,7 @@ class _$Collapse implements Collapse { TResult maybeWhen({ TResult Function()? initial, TResult Function()? collapse, - TResult Function(HomeStackView stackView)? openPage, + TResult Function(HomeStackContext context)? openPage, TResult Function(String name, String? desc)? createApp, required TResult orElse(), }) { @@ -280,7 +280,7 @@ abstract class Collapse implements MenuEvent { abstract class $OpenPageCopyWith<$Res> { factory $OpenPageCopyWith(OpenPage value, $Res Function(OpenPage) then) = _$OpenPageCopyWithImpl<$Res>; - $Res call({HomeStackView stackView}); + $Res call({HomeStackContext context}); } /// @nodoc @@ -294,13 +294,13 @@ class _$OpenPageCopyWithImpl<$Res> extends _$MenuEventCopyWithImpl<$Res> @override $Res call({ - Object? stackView = freezed, + Object? context = freezed, }) { return _then(OpenPage( - stackView == freezed - ? _value.stackView - : stackView // ignore: cast_nullable_to_non_nullable - as HomeStackView, + context == freezed + ? _value.context + : context // ignore: cast_nullable_to_non_nullable + as HomeStackContext, )); } } @@ -308,28 +308,27 @@ class _$OpenPageCopyWithImpl<$Res> extends _$MenuEventCopyWithImpl<$Res> /// @nodoc class _$OpenPage implements OpenPage { - const _$OpenPage(this.stackView); + const _$OpenPage(this.context); @override - final HomeStackView stackView; + final HomeStackContext context; @override String toString() { - return 'MenuEvent.openPage(stackView: $stackView)'; + return 'MenuEvent.openPage(context: $context)'; } @override bool operator ==(dynamic other) { return identical(this, other) || (other is OpenPage && - (identical(other.stackView, stackView) || - const DeepCollectionEquality() - .equals(other.stackView, stackView))); + (identical(other.context, context) || + const DeepCollectionEquality().equals(other.context, context))); } @override int get hashCode => - runtimeType.hashCode ^ const DeepCollectionEquality().hash(stackView); + runtimeType.hashCode ^ const DeepCollectionEquality().hash(context); @JsonKey(ignore: true) @override @@ -341,10 +340,10 @@ class _$OpenPage implements OpenPage { TResult when({ required TResult Function() initial, required TResult Function() collapse, - required TResult Function(HomeStackView stackView) openPage, + required TResult Function(HomeStackContext context) openPage, required TResult Function(String name, String? desc) createApp, }) { - return openPage(stackView); + return openPage(context); } @override @@ -352,12 +351,12 @@ class _$OpenPage implements OpenPage { TResult maybeWhen({ TResult Function()? initial, TResult Function()? collapse, - TResult Function(HomeStackView stackView)? openPage, + TResult Function(HomeStackContext context)? openPage, TResult Function(String name, String? desc)? createApp, required TResult orElse(), }) { if (openPage != null) { - return openPage(stackView); + return openPage(context); } return orElse(); } @@ -390,9 +389,9 @@ class _$OpenPage implements OpenPage { } abstract class OpenPage implements MenuEvent { - const factory OpenPage(HomeStackView stackView) = _$OpenPage; + const factory OpenPage(HomeStackContext context) = _$OpenPage; - HomeStackView get stackView => throw _privateConstructorUsedError; + HomeStackContext get context => throw _privateConstructorUsedError; @JsonKey(ignore: true) $OpenPageCopyWith get copyWith => throw _privateConstructorUsedError; @@ -473,7 +472,7 @@ class _$CreateApp implements CreateApp { TResult when({ required TResult Function() initial, required TResult Function() collapse, - required TResult Function(HomeStackView stackView) openPage, + required TResult Function(HomeStackContext context) openPage, required TResult Function(String name, String? desc) createApp, }) { return createApp(name, desc); @@ -484,7 +483,7 @@ class _$CreateApp implements CreateApp { TResult maybeWhen({ TResult Function()? initial, TResult Function()? collapse, - TResult Function(HomeStackView stackView)? openPage, + TResult Function(HomeStackContext context)? openPage, TResult Function(String name, String? desc)? createApp, required TResult orElse(), }) { @@ -539,12 +538,12 @@ class _$MenuStateTearOff { {required bool isCollapse, required Option> apps, required Either successOrFailure, - HomeStackView? stackView}) { + required HomeStackContext context}) { return _MenuState( isCollapse: isCollapse, apps: apps, successOrFailure: successOrFailure, - stackView: stackView, + context: context, ); } } @@ -558,7 +557,7 @@ mixin _$MenuState { Option> get apps => throw _privateConstructorUsedError; Either get successOrFailure => throw _privateConstructorUsedError; - HomeStackView? get stackView => throw _privateConstructorUsedError; + HomeStackContext get context => throw _privateConstructorUsedError; @JsonKey(ignore: true) $MenuStateCopyWith get copyWith => @@ -573,7 +572,7 @@ abstract class $MenuStateCopyWith<$Res> { {bool isCollapse, Option> apps, Either successOrFailure, - HomeStackView? stackView}); + HomeStackContext context}); } /// @nodoc @@ -589,7 +588,7 @@ class _$MenuStateCopyWithImpl<$Res> implements $MenuStateCopyWith<$Res> { Object? isCollapse = freezed, Object? apps = freezed, Object? successOrFailure = freezed, - Object? stackView = freezed, + Object? context = freezed, }) { return _then(_value.copyWith( isCollapse: isCollapse == freezed @@ -604,10 +603,10 @@ class _$MenuStateCopyWithImpl<$Res> implements $MenuStateCopyWith<$Res> { ? _value.successOrFailure : successOrFailure // ignore: cast_nullable_to_non_nullable as Either, - stackView: stackView == freezed - ? _value.stackView - : stackView // ignore: cast_nullable_to_non_nullable - as HomeStackView?, + context: context == freezed + ? _value.context + : context // ignore: cast_nullable_to_non_nullable + as HomeStackContext, )); } } @@ -622,7 +621,7 @@ abstract class _$MenuStateCopyWith<$Res> implements $MenuStateCopyWith<$Res> { {bool isCollapse, Option> apps, Either successOrFailure, - HomeStackView? stackView}); + HomeStackContext context}); } /// @nodoc @@ -639,7 +638,7 @@ class __$MenuStateCopyWithImpl<$Res> extends _$MenuStateCopyWithImpl<$Res> Object? isCollapse = freezed, Object? apps = freezed, Object? successOrFailure = freezed, - Object? stackView = freezed, + Object? context = freezed, }) { return _then(_MenuState( isCollapse: isCollapse == freezed @@ -654,10 +653,10 @@ class __$MenuStateCopyWithImpl<$Res> extends _$MenuStateCopyWithImpl<$Res> ? _value.successOrFailure : successOrFailure // ignore: cast_nullable_to_non_nullable as Either, - stackView: stackView == freezed - ? _value.stackView - : stackView // ignore: cast_nullable_to_non_nullable - as HomeStackView?, + context: context == freezed + ? _value.context + : context // ignore: cast_nullable_to_non_nullable + as HomeStackContext, )); } } @@ -669,7 +668,7 @@ class _$_MenuState implements _MenuState { {required this.isCollapse, required this.apps, required this.successOrFailure, - this.stackView}); + required this.context}); @override final bool isCollapse; @@ -678,11 +677,11 @@ class _$_MenuState implements _MenuState { @override final Either successOrFailure; @override - final HomeStackView? stackView; + final HomeStackContext context; @override String toString() { - return 'MenuState(isCollapse: $isCollapse, apps: $apps, successOrFailure: $successOrFailure, stackView: $stackView)'; + return 'MenuState(isCollapse: $isCollapse, apps: $apps, successOrFailure: $successOrFailure, context: $context)'; } @override @@ -697,9 +696,8 @@ class _$_MenuState implements _MenuState { (identical(other.successOrFailure, successOrFailure) || const DeepCollectionEquality() .equals(other.successOrFailure, successOrFailure)) && - (identical(other.stackView, stackView) || - const DeepCollectionEquality() - .equals(other.stackView, stackView))); + (identical(other.context, context) || + const DeepCollectionEquality().equals(other.context, context))); } @override @@ -708,7 +706,7 @@ class _$_MenuState implements _MenuState { const DeepCollectionEquality().hash(isCollapse) ^ const DeepCollectionEquality().hash(apps) ^ const DeepCollectionEquality().hash(successOrFailure) ^ - const DeepCollectionEquality().hash(stackView); + const DeepCollectionEquality().hash(context); @JsonKey(ignore: true) @override @@ -721,7 +719,7 @@ abstract class _MenuState implements MenuState { {required bool isCollapse, required Option> apps, required Either successOrFailure, - HomeStackView? stackView}) = _$_MenuState; + required HomeStackContext context}) = _$_MenuState; @override bool get isCollapse => throw _privateConstructorUsedError; @@ -731,7 +729,7 @@ abstract class _MenuState implements MenuState { Either get successOrFailure => throw _privateConstructorUsedError; @override - HomeStackView? get stackView => throw _privateConstructorUsedError; + HomeStackContext get context => throw _privateConstructorUsedError; @override @JsonKey(ignore: true) _$MenuStateCopyWith<_MenuState> get copyWith => diff --git a/app_flowy/lib/workspace/domain/page_stack/page_stack.dart b/app_flowy/lib/workspace/domain/page_stack/page_stack.dart index 5261799f50..32acea368e 100644 --- a/app_flowy/lib/workspace/domain/page_stack/page_stack.dart +++ b/app_flowy/lib/workspace/domain/page_stack/page_stack.dart @@ -1,48 +1,56 @@ +import 'package:app_flowy/workspace/presentation/stack_page/doc/doc_stack_page.dart'; import 'package:equatable/equatable.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:app_flowy/workspace/presentation/doc/doc_stack_page.dart'; -import 'package:app_flowy/workspace/presentation/widgets/blank_page.dart'; -import 'package:app_flowy/workspace/presentation/widgets/fading_index_stack.dart'; +import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart'; +import 'package:app_flowy/workspace/presentation/stack_page/fading_index_stack.dart'; import 'package:app_flowy/workspace/presentation/widgets/prelude.dart'; -abstract class HomeStackView extends Equatable { - final ViewType type; - final String title; - final String identifier; - const HomeStackView( - {required this.type, required this.title, required this.identifier}); +abstract class HomeStackContext extends Equatable { + String get title; + String get identifier; + ViewType get type; + Widget render(); } -class PageStackNotifier extends ChangeNotifier { - HomeStackView? innerView; +HomeStackContext stackCtxFromView(View view) { + switch (view.viewType) { + case ViewType.Blank: + return DefaultHomeStackContext(); + case ViewType.Doc: + return DocStackContext(view: view); + default: + return DefaultHomeStackContext(); + } +} - PageStackNotifier({ - this.innerView, - }); +class HomeStackNotifier extends ChangeNotifier { + HomeStackContext inner; - set view(HomeStackView view) { - innerView = view; + HomeStackNotifier({ + HomeStackContext? context, + }) : inner = context ?? DefaultHomeStackContext(); + + set context(HomeStackContext context) { + inner = context; notifyListeners(); } - HomeStackView get view { - return innerView ?? const AnnouncementStackView(); - } + HomeStackContext get context => inner; } // HomePageStack is initialized as singleton to controll the page stack. -class HomePageStack { - final PageStackNotifier _notifier = PageStackNotifier(); - HomePageStack(); +class HomeStack { + final HomeStackNotifier _notifier = HomeStackNotifier(); + HomeStack(); String title() { - return _notifier.view.title; + return _notifier.context.title; } - void setStackView(HomeStackView? stackView) { - _notifier.view = stackView ?? const AnnouncementStackView(); + void setStack(HomeStackContext context) { + _notifier.context = context; } Widget stackTopBar() { @@ -50,8 +58,8 @@ class HomePageStack { providers: [ ChangeNotifierProvider.value(value: _notifier), ], - child: Consumer(builder: (ctx, PageStackNotifier notifier, child) { - return HomeTopBar(view: notifier.view); + child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) { + return HomeTopBar(view: notifier.context); }), ); } @@ -61,10 +69,16 @@ class HomePageStack { providers: [ ChangeNotifierProvider.value(value: _notifier), ], - child: Consumer(builder: (ctx, PageStackNotifier notifier, child) { + child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) { return FadingIndexedStack( - index: pages.indexOf(notifier.view.type), - children: _buildStackWidget(notifier.view), + index: pages.indexOf(notifier.context.type), + children: ViewType.values.map((viewType) { + if (viewType == notifier.context.type) { + return notifier.context.render(); + } else { + return const AnnouncementStackPage(); + } + }).toList(), ); }), ); @@ -72,40 +86,3 @@ class HomePageStack { } List pages = ViewType.values.toList(); - -List _buildStackWidget(HomeStackView stackView) { - return ViewType.values.map((viewType) { - if (viewType == stackView.type) { - switch (stackView.type) { - case ViewType.Blank: - return AnnouncementStackPage( - stackView: stackView as AnnouncementStackView); - case ViewType.Doc: - final docView = stackView as DocPageStackView; - return DocStackPage( - key: ValueKey(docView.view.id), stackView: docView); - default: - return AnnouncementStackPage( - stackView: stackView as AnnouncementStackView); - } - } else { - return const AnnouncementStackPage(stackView: AnnouncementStackView()); - } - }).toList(); -} - -HomeStackView stackViewFromView(View view) { - switch (view.viewType) { - case ViewType.Blank: - return const AnnouncementStackView(); - case ViewType.Doc: - return DocPageStackView(view); - default: - return const AnnouncementStackView(); - } -} - -abstract class HomeStackWidget extends StatefulWidget { - final HomeStackView stackView; - const HomeStackWidget({Key? key, required this.stackView}) : super(key: key); -} diff --git a/app_flowy/lib/workspace/infrastructure/deps_resolver.dart b/app_flowy/lib/workspace/infrastructure/deps_resolver.dart index ec6e38403a..fb450a2b0f 100644 --- a/app_flowy/lib/workspace/infrastructure/deps_resolver.dart +++ b/app_flowy/lib/workspace/infrastructure/deps_resolver.dart @@ -28,68 +28,53 @@ import 'i_view_impl.dart'; class HomeDepsResolver { static Future resolve(GetIt getIt) async { // - getIt.registerLazySingleton(() => HomePageStack()); + getIt.registerLazySingleton(() => HomeStack()); //App - getIt.registerFactoryParam( - (appId, _) => IAppImpl(repo: AppRepository(appId: appId))); + getIt.registerFactoryParam((appId, _) => IAppImpl(repo: AppRepository(appId: appId))); getIt.registerFactoryParam( (appId, _) => IAppWatchImpl(repo: AppWatchRepository(appId: appId))); //workspace getIt.registerFactoryParam( - (user, workspaceId) => IWorkspaceImpl( - repo: WorkspaceRepo(user: user, workspaceId: workspaceId))); + (user, workspaceId) => IWorkspaceImpl(repo: WorkspaceRepo(user: user, workspaceId: workspaceId))); getIt.registerFactoryParam( - (user, workspaceId) => IWorkspaceWatchImpl( - repo: WorkspaceWatchRepo(user: user, workspaceId: workspaceId))); + (user, workspaceId) => IWorkspaceWatchImpl(repo: WorkspaceWatchRepo(user: user, workspaceId: workspaceId))); // View - getIt.registerFactoryParam( - (view, _) => IViewImpl(repo: ViewRepository(view: view))); + getIt.registerFactoryParam((view, _) => IViewImpl(repo: ViewRepository(view: view))); getIt.registerFactoryParam( (view, _) => IViewWatchImpl(repo: ViewWatchRepository(view: view))); // Doc - getIt.registerFactoryParam( - (docId, _) => IDocImpl(repo: DocRepository(docId: docId))); + getIt.registerFactoryParam((docId, _) => IDocImpl(repo: DocRepository(docId: docId))); // User - getIt.registerFactoryParam( - (user, _) => IUserImpl(repo: UserRepo(user: user))); - getIt.registerFactoryParam( - (user, _) => IUserWatchImpl(user: user)); + getIt.registerFactoryParam((user, _) => IUserImpl(repo: UserRepo(user: user))); + getIt.registerFactoryParam((user, _) => IUserWatchImpl(user: user)); //Menu Bloc getIt.registerFactoryParam( - (user, workspaceId) => - MenuBloc(getIt(param1: user, param2: workspaceId))); + (user, workspaceId) => MenuBloc(getIt(param1: user, param2: workspaceId))); getIt.registerFactoryParam( - (user, workspaceId) => MenuWatchBloc( - getIt(param1: user, param2: workspaceId))); + (user, workspaceId) => MenuWatchBloc(getIt(param1: user, param2: workspaceId))); - getIt.registerFactoryParam((user, _) => - MenuUserBloc( - getIt(param1: user), getIt(param1: user))); + getIt.registerFactoryParam( + (user, _) => MenuUserBloc(getIt(param1: user), getIt(param1: user))); // - getIt.registerFactoryParam( - (appId, _) => AppBloc(getIt(param1: appId))); - getIt.registerFactoryParam( - (appId, _) => AppWatchBloc(getIt(param1: appId))); + getIt.registerFactoryParam((appId, _) => AppBloc(getIt(param1: appId))); + getIt.registerFactoryParam((appId, _) => AppWatchBloc(getIt(param1: appId))); - getIt.registerFactoryParam( - (viewId, _) => ViewBloc(iViewImpl: getIt(param1: viewId))); + getIt + .registerFactoryParam((viewId, _) => ViewBloc(iViewImpl: getIt(param1: viewId))); - getIt.registerFactoryParam( - (docId, _) => DocBloc(iDocImpl: getIt(param1: docId))); + getIt.registerFactoryParam((docId, _) => DocBloc(iDocImpl: getIt(param1: docId))); - getIt.registerFactoryParam( - (docId, _) => DocEditBloc(getIt(param1: docId))); + getIt.registerFactoryParam((docId, _) => DocEditBloc(getIt(param1: docId))); // editor - getIt.registerFactoryParam, void>( - (views, _) => ViewListBloc(views: views)); + getIt.registerFactoryParam, void>((views, _) => ViewListBloc(views: views)); getIt.registerFactoryParam( (user, _) => WelcomeBloc( diff --git a/app_flowy/lib/workspace/presentation/home/home_screen.dart b/app_flowy/lib/workspace/presentation/home/home_screen.dart index 0db08a19c8..0971bd03d7 100644 --- a/app_flowy/lib/workspace/presentation/home/home_screen.dart +++ b/app_flowy/lib/workspace/presentation/home/home_screen.dart @@ -77,7 +77,7 @@ class HomeScreen extends StatelessWidget { final homeBloc = context.read(); Widget homeMenu = HomeMenu( pageContextChanged: (pageContext) { - getIt().setStackView(pageContext); + getIt().setStack(pageContext); }, isCollapseChanged: (isCollapse) { homeBloc.add(HomeEvent.forceCollapse(isCollapse)); @@ -139,12 +139,12 @@ class HomePage extends StatelessWidget { return Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - getIt().stackTopBar(), + getIt().stackTopBar(), Expanded( child: Container( color: Colors.white, child: FocusTraversalGroup( - child: getIt().stackWidget(), + child: getIt().stackWidget(), ), ), ), @@ -152,30 +152,3 @@ class HomePage extends StatelessWidget { ); } } - -// class HomeIndexStack extends StatelessWidget { -// const HomeIndexStack({Key? key}) : super(key: key); -// @override -// Widget build(BuildContext context) { -// return BlocBuilder( -// buildWhen: (p, c) { -// if (p.pageContext != c.pageContext) { -// Log.info( -// 'PageContext switch from ${p.pageContext.pageType} to ${c.pageContext.pageType}'); -// } -// return p.pageContext != c.pageContext; -// }, -// builder: (context, state) { -// final pageContext = context.read().state.pageContext; -// return Expanded( -// child: Container( -// color: Colors.white, -// child: FocusTraversalGroup( -// child: getIt().indexStack(pageContext), -// ), -// ), -// ); -// }, -// ); -// } -// } diff --git a/app_flowy/lib/workspace/presentation/home/navigation_list.dart b/app_flowy/lib/workspace/presentation/home/navigation.dart similarity index 86% rename from app_flowy/lib/workspace/presentation/home/navigation_list.dart rename to app_flowy/lib/workspace/presentation/home/navigation.dart index 0a758aafeb..a461df57bd 100644 --- a/app_flowy/lib/workspace/presentation/home/navigation_list.dart +++ b/app_flowy/lib/workspace/presentation/home/navigation.dart @@ -14,17 +14,17 @@ abstract class NaviItem { } class NavigationNotifier with ChangeNotifier { - PageStackNotifier pageStackNotifier; + HomeStackNotifier pageStackNotifier; NavigationNotifier(this.pageStackNotifier); - void update(PageStackNotifier notifier) { + void update(HomeStackNotifier notifier) { pageStackNotifier = notifier; notifyListeners(); } List get naviItems { List items = [ - ViewNaviItemImpl(pageStackNotifier.view), + ViewNaviItemImpl(pageStackNotifier.context), // ViewNaviItemImpl(pageStackNotifier.view), // ViewNaviItemImpl(pageStackNotifier.view), // ViewNaviItemImpl(pageStackNotifier.view), @@ -35,14 +35,14 @@ class NavigationNotifier with ChangeNotifier { } } -class StyledNavigationList extends StatelessWidget { - const StyledNavigationList({Key? key}) : super(key: key); +class FlowyNavigation extends StatelessWidget { + const FlowyNavigation({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return ChangeNotifierProxyProvider( + return ChangeNotifierProxyProvider( create: (_) => NavigationNotifier( - Provider.of( + Provider.of( context, listen: false, ), @@ -63,9 +63,7 @@ class StyledNavigationList extends StatelessWidget { Widget last = NaviItemWidget(newItems.removeLast()); List widgets = List.empty(growable: true); - widgets.addAll(newItems - .map((item) => NaviItemDivider(child: NaviItemWidget(item))) - .toList()); + widgets.addAll(newItems.map((item) => NaviItemDivider(child: NaviItemWidget(item))).toList()); widgets.add(last); return widgets; diff --git a/app_flowy/lib/workspace/presentation/widgets/blank_page.dart b/app_flowy/lib/workspace/presentation/stack_page/blank/blank_page.dart similarity index 53% rename from app_flowy/lib/workspace/presentation/widgets/blank_page.dart rename to app_flowy/lib/workspace/presentation/stack_page/blank/blank_page.dart index b671143ded..ed13ef094d 100644 --- a/app_flowy/lib/workspace/presentation/widgets/blank_page.dart +++ b/app_flowy/lib/workspace/presentation/stack_page/blank/blank_page.dart @@ -2,21 +2,30 @@ import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; import 'package:flutter/material.dart'; -class AnnouncementStackView extends HomeStackView { - const AnnouncementStackView() - : super(type: ViewType.Blank, title: 'Blank', identifier: "Announcement"); +class DefaultHomeStackContext extends HomeStackContext { + @override + String get identifier => "1"; @override - List get props => []; + List get props => ["1"]; + + @override + String get title => "Blank page"; + + @override + ViewType get type => ViewType.Blank; + + @override + Widget render() { + return const AnnouncementStackPage(); + } } -class AnnouncementStackPage extends HomeStackWidget { - const AnnouncementStackPage( - {Key? key, required AnnouncementStackView stackView}) - : super(key: key, stackView: stackView); +class AnnouncementStackPage extends StatefulWidget { + const AnnouncementStackPage({Key? key}) : super(key: key); @override - State createState() => _AnnouncementPage(); + State createState() => _AnnouncementPage(); } class _AnnouncementPage extends State { diff --git a/app_flowy/lib/workspace/presentation/doc/doc_page.dart b/app_flowy/lib/workspace/presentation/stack_page/doc/doc_page.dart similarity index 91% rename from app_flowy/lib/workspace/presentation/doc/doc_page.dart rename to app_flowy/lib/workspace/presentation/stack_page/doc/doc_page.dart index 54da272466..d12b4ad847 100644 --- a/app_flowy/lib/workspace/presentation/doc/doc_page.dart +++ b/app_flowy/lib/workspace/presentation/stack_page/doc/doc_page.dart @@ -1,25 +1,23 @@ import 'dart:io'; - import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/doc/doc_edit_bloc.dart'; import 'package:app_flowy/workspace/domain/i_doc.dart'; -// import 'package:flowy_editor/flowy_editor.dart'; import 'package:editor/flutter_quill.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class DocPage extends StatefulWidget { - late QuillController controller; - late DocEditBloc editBloc; + final QuillController controller; + final DocEditBloc editBloc; final FlowyDoc doc; - DocPage({Key? key, required this.doc}) : super(key: key) { - editBloc = getIt(param1: doc.id); - controller = QuillController( - document: doc.document, - selection: const TextSelection.collapsed(offset: 0), - ); - } + DocPage({Key? key, required this.doc}) + : controller = QuillController( + document: doc.document, + selection: const TextSelection.collapsed(offset: 0), + ), + editBloc = getIt(param1: doc.id), + super(key: key); @override State createState() => _DocPageState(); diff --git a/app_flowy/lib/workspace/presentation/doc/doc_stack_page.dart b/app_flowy/lib/workspace/presentation/stack_page/doc/doc_stack_page.dart similarity index 66% rename from app_flowy/lib/workspace/presentation/doc/doc_stack_page.dart rename to app_flowy/lib/workspace/presentation/stack_page/doc/doc_stack_page.dart index 94d64dbe1b..d8b4753968 100644 --- a/app_flowy/lib/workspace/presentation/doc/doc_stack_page.dart +++ b/app_flowy/lib/workspace/presentation/stack_page/doc/doc_stack_page.dart @@ -1,7 +1,6 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/doc/doc_bloc.dart'; import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; -import 'package:app_flowy/workspace/presentation/doc/doc_page.dart'; import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_infra_ui/widget/error_page.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; @@ -9,9 +8,31 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flowy_infra_ui/style_widget/progress_indicator.dart'; -class DocStackPage extends HomeStackWidget { - const DocStackPage({Key? key, required DocPageStackView stackView}) - : super(key: key, stackView: stackView); +import 'doc_page.dart'; + +class DocStackContext extends HomeStackContext { + final View _view; + DocStackContext({required View view, Key? key}) : _view = view; + + @override + String get title => _view.name; + @override + String get identifier => _view.id; + @override + ViewType get type => _view.viewType; + + @override + List get props => [_view.id]; + + @override + Widget render() { + return DocStackPage(_view, key: ValueKey(_view.id)); + } +} + +class DocStackPage extends StatefulWidget { + final View view; + const DocStackPage(this.view, {Key? key}) : super(key: key); @override _DocStackPageState createState() => _DocStackPageState(); @@ -20,15 +41,12 @@ class DocStackPage extends HomeStackWidget { class _DocStackPageState extends State { @override Widget build(BuildContext context) { - final stackView = widget.stackView as DocPageStackView; return MultiBlocProvider( providers: [ BlocProvider( - create: (context) => getIt(param1: stackView.view.id) - ..add(const DocEvent.loadDoc())), + create: (context) => getIt(param1: widget.view.id)..add(const DocEvent.loadDoc())), ], child: BlocBuilder(builder: (context, state) { - assert(widget.stackView is DocPageStackView); return state.map( loading: (_) => const FlowyProgressIndicator(), loadDoc: (s) => DocPage(doc: s.doc), @@ -56,16 +74,3 @@ class _DocStackPageState extends State { super.didUpdateWidget(oldWidget); } } - -class DocPageStackView extends HomeStackView { - final View view; - DocPageStackView(this.view) - : super( - type: view.viewType, - title: view.name, - identifier: view.id, - ); - - @override - List get props => [view.id, type]; -} diff --git a/app_flowy/lib/workspace/presentation/widgets/fading_index_stack.dart b/app_flowy/lib/workspace/presentation/stack_page/fading_index_stack.dart similarity index 100% rename from app_flowy/lib/workspace/presentation/widgets/fading_index_stack.dart rename to app_flowy/lib/workspace/presentation/stack_page/fading_index_stack.dart diff --git a/app_flowy/lib/workspace/presentation/widgets/home_stack_page.dart b/app_flowy/lib/workspace/presentation/widgets/home_stack_page.dart deleted file mode 100644 index e474c01a20..0000000000 --- a/app_flowy/lib/workspace/presentation/widgets/home_stack_page.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; -import 'package:flutter/material.dart'; - -abstract class HomeStackPage extends StatefulWidget { - final HomeStackView pageContext; - const HomeStackPage({Key? key, required this.pageContext}) : super(key: key); -} diff --git a/app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart b/app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart index 5faa589456..8db1f98c0b 100644 --- a/app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart +++ b/app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart @@ -2,7 +2,7 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/domain/image.dart'; import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; import 'package:app_flowy/workspace/presentation/home/home_sizes.dart'; -import 'package:app_flowy/workspace/presentation/home/navigation_list.dart'; +import 'package:app_flowy/workspace/presentation/home/navigation.dart'; import 'package:flowy_infra_ui/widget/rounded_button.dart'; import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; @@ -13,7 +13,7 @@ import 'package:flowy_infra_ui/style_widget/extension.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; class HomeTopBar extends StatelessWidget { - final HomeStackView view; + final HomeStackContext view; const HomeTopBar({Key? key, required this.view}) : super(key: key); @override @@ -23,7 +23,7 @@ class HomeTopBar extends StatelessWidget { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - _renderNavigationList(view), + _renderNavigation(view), const Spacer(), _renderShareButton(), _renderMoreButton(), @@ -52,15 +52,14 @@ class HomeTopBar extends StatelessWidget { Widget _renderMoreButton() { return ViewMoreButton( - width: 24, onPressed: () { debugPrint('show more'); }, ); } - Widget _renderNavigationList(HomeStackView view) { - return const StyledNavigationList(); + Widget _renderNavigation(HomeStackContext view) { + return const FlowyNavigation(); } } @@ -89,12 +88,12 @@ class HomeTitle extends StatelessWidget { } class ViewNaviItemImpl extends NaviItem { - final HomeStackView view; + final HomeStackContext view; ViewNaviItemImpl(this.view); @override - NaviAction get action => () => getIt().setStackView(view); + NaviAction get action => () => getIt().setStack(view); @override String get identifier => view.identifier; diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/menu_page.dart b/app_flowy/lib/workspace/presentation/widgets/menu/menu_page.dart index 3615b3b44a..f8e6908bfc 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/menu_page.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/menu_page.dart @@ -20,7 +20,7 @@ import 'widget/app/app.dart'; import 'widget/app/create_button.dart'; class HomeMenu extends StatelessWidget { - final Function(HomeStackView?) pageContextChanged; + final Function(HomeStackContext) pageContextChanged; final Function(bool) isCollapseChanged; final UserProfile user; final String workspaceId; @@ -46,8 +46,8 @@ class HomeMenu extends StatelessWidget { child: MultiBlocListener( listeners: [ BlocListener( - listenWhen: (p, c) => p.stackView != c.stackView, - listener: (context, state) => pageContextChanged(state.stackView), + listenWhen: (p, c) => p.context != c.context, + listener: (context, state) => pageContextChanged(state.context), ), BlocListener( listenWhen: (p, c) => p.isCollapse != c.isCollapse, diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/app.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/app.dart index e85e05e437..a7be39b755 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/app.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/app.dart @@ -11,19 +11,18 @@ import 'package:app_flowy/workspace/application/app/app_watch_bloc.dart'; import 'package:app_flowy/workspace/presentation/widgets/menu/menu_list.dart'; import 'package:provider/provider.dart'; import 'package:styled_widget/styled_widget.dart'; - -import 'view/view_list.dart'; +import 'section/section.dart'; class AppPageSize { static double expandedIconSize = 16; - static double expandedIconRightSpace = 6; + static double expandedIconPadding = 6; static double scale = 1; - static double get expandedPadding => expandedIconSize * scale + expandedIconRightSpace; + static double get expandedPadding => expandedIconSize * scale + expandedIconPadding; } class AppPageContext { final App app; - final viewListData = ViewListData(); + final viewListData = ViewSectionData(); AppPageContext( this.app, @@ -55,9 +54,9 @@ class AppPage extends MenuItem { builder: (context, state) { final child = state.map( initial: (_) => BlocBuilder( - builder: (context, state) => _renderViewList(state.views), + builder: (context, state) => _renderViewSection(state.views), ), - loadViews: (s) => _renderViewList(s.views), + loadViews: (s) => _renderViewSection(s.views), loadFail: (s) => FlowyErrorPage(s.error.toString()), ); @@ -93,14 +92,14 @@ class AppPage extends MenuItem { ); } - Widget _renderViewList(List? views) { + Widget _renderViewSection(List? views) { appCtx.viewListData.views = views ?? List.empty(growable: false); return MultiProvider( providers: [ ChangeNotifierProvider.value(value: appCtx.viewListData), ], - child: Consumer(builder: (context, ViewListData notifier, child) { - return ViewListPage(notifier.views).padding(vertical: 8); + child: Consumer(builder: (context, ViewSectionData notifier, child) { + return ViewSection(notifier.views).padding(vertical: 8); }), ); } diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header.dart index 32204ed5b7..43b50507ed 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header.dart @@ -1,7 +1,7 @@ import 'package:app_flowy/workspace/application/app/app_bloc.dart'; import 'package:expandable/expandable.dart'; -import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_infra/flowy_icon_data_icons.dart'; @@ -9,6 +9,7 @@ import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:styled_widget/styled_widget.dart'; import 'app.dart'; @@ -43,7 +44,7 @@ class AppHeader extends StatelessWidget { ), ), ), - HSpace(AppPageSize.expandedIconRightSpace), + HSpace(AppPageSize.expandedIconPadding), Expanded( child: GestureDetector( onTapDown: (_) { @@ -55,21 +56,20 @@ class AppHeader extends StatelessWidget { ), )), - // FlowyIconButton( - // icon: const Icon(Icons.add), - // onPressed: () { - // debugPrint('add view'); - // FlowyOverlay.of(context) - // .insert(widget: Text('test'), identifier: 'identifier'); - // }, - // ), - PopupMenuButton( - iconSize: 16, - tooltip: 'create new view', - icon: svg("home/add"), - padding: EdgeInsets.zero, - onSelected: (viewType) => _createView(viewType as ViewType, context), - itemBuilder: (context) => menuItemBuilder()) + ViewAddButton( + onPressed: () { + debugPrint('add view'); + // FlowyOverlay.of(context) + // .insert(widget: Text('test'), identifier: 'identifier'); + }, + ).padding(right: AppPageSize.expandedIconPadding), + // PopupMenuButton( + // iconSize: 16, + // tooltip: 'create new view', + // icon: svg("home/add"), + // padding: EdgeInsets.zero, + // onSelected: (viewType) => _createView(viewType as ViewType, context), + // itemBuilder: (context) => menuItemBuilder()) ], ), ); diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_page.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/item.dart similarity index 91% rename from app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_page.dart rename to app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/item.dart index f99d2d62a6..6139e4a753 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_page.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/item.dart @@ -20,11 +20,11 @@ class ViewWidgetContext { typedef OpenViewCallback = void Function(View); -class ViewPage extends StatelessWidget { +class ViewSectionItem extends StatelessWidget { final ViewWidgetContext viewCtx; final bool isSelected; final OpenViewCallback onOpen; - ViewPage({Key? key, required this.viewCtx, required this.onOpen, required this.isSelected}) + ViewSectionItem({Key? key, required this.viewCtx, required this.onOpen, required this.isSelected}) : super(key: viewCtx.valueKey()); @override @@ -57,7 +57,6 @@ class ViewPage extends StatelessWidget { if (onHover) { children.add(const Spacer()); children.add(ViewMoreButton( - width: 16, onPressed: () { debugPrint('show view setting'); }, @@ -67,7 +66,7 @@ class ViewPage extends StatelessWidget { Widget widget = Container( child: Row(children: children).padding( left: AppPageSize.expandedPadding, - right: 12, + right: AppPageSize.expandedIconPadding, ), height: 24, alignment: Alignment.centerLeft, diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_list.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/section.dart similarity index 65% rename from app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_list.dart rename to app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/section.dart index fdf2a7ebbf..0f7b616aca 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/view/view_list.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/section.dart @@ -6,12 +6,11 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:provider/provider.dart'; import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; +import 'item.dart'; -import 'view_page.dart'; - -class ViewListData extends ChangeNotifier { +class ViewSectionData extends ChangeNotifier { List? innerViews; - ViewListData(); + ViewSectionData(); set views(List views) { innerViews = views; @@ -21,10 +20,10 @@ class ViewListData extends ChangeNotifier { List get views => innerViews ?? []; } -class ViewListNotifier with ChangeNotifier { +class ViewSectionNotifier with ChangeNotifier { List innerViews; View? _selectedView; - ViewListNotifier(this.innerViews); + ViewSectionNotifier(this.innerViews); set views(List views) => innerViews = views; List get views => innerViews; @@ -36,51 +35,51 @@ class ViewListNotifier with ChangeNotifier { View? get selectedView => _selectedView; - void update(ViewListData notifier) { + void update(ViewSectionData notifier) { innerViews = notifier.views; notifyListeners(); } } -class ViewListPage extends StatelessWidget { +class ViewSection extends StatelessWidget { final List views; - const ViewListPage(this.views, {Key? key}) : super(key: key); + const ViewSection(this.views, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { // The ViewListNotifier will be updated after ViewListData changed passed by parent widget - return ChangeNotifierProxyProvider( - create: (_) => ViewListNotifier( - Provider.of( + return ChangeNotifierProxyProvider( + create: (_) => ViewSectionNotifier( + Provider.of( context, listen: false, ).views, ), update: (_, notifier, controller) => controller!..update(notifier), - child: Consumer(builder: (context, ViewListNotifier notifier, child) { - return _renderViews(context, notifier.views); + child: Consumer(builder: (context, ViewSectionNotifier notifier, child) { + return _renderItems(context, notifier.views); }), ); } - Widget _renderViews(BuildContext context, List views) { + Widget _renderItems(BuildContext context, List views) { var viewWidgets = views.map((view) { final viewCtx = ViewWidgetContext(view); - final viewWidget = ViewPage( + final item = ViewSectionItem( viewCtx: viewCtx, isSelected: _isViewSelected(context, view.id), onOpen: (view) { Log.debug("Open view: $view"); - context.read().setSelectedView(view); - final stackView = stackViewFromView(viewCtx.view); - getIt().setStackView(stackView); + context.read().setSelectedView(view); + final stackView = stackCtxFromView(viewCtx.view); + getIt().setStack(stackView); }, ); return Padding( padding: const EdgeInsets.symmetric(vertical: 4), - child: viewWidget, + child: item, ); }).toList(growable: false); @@ -90,7 +89,7 @@ class ViewListPage extends StatelessWidget { } bool _isViewSelected(BuildContext context, String viewId) { - final view = context.read().selectedView; + final view = context.read().selectedView; if (view != null) { return view.id == viewId; } else { diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite.dart deleted file mode 100644 index f69dbd92f1..0000000000 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter/material.dart'; -import '../menu_list.dart'; - -class MenuFav extends MenuItem { - @override - Widget build(BuildContext context) { - // TODO: implement build - throw UnimplementedError(); - } - - @override - // TODO: implement type - MenuItemType get type => throw UnimplementedError(); -} diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/favorite.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/favorite.dart new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/header.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/header.dart new file mode 100644 index 0000000000..28bb99b4bb --- /dev/null +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/header.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import '../../menu_list.dart'; + +class FavoriteHeader extends MenuItem { + const FavoriteHeader({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + throw UnimplementedError(); + } + + @override + MenuItemType get type => MenuItemType.favorites; +} diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/section.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/favorite/section.dart new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app_flowy/lib/workspace/presentation/widgets/menu/widget/user.dart b/app_flowy/lib/workspace/presentation/widgets/menu/widget/user.dart index 7d554b5c3c..e13424c156 100644 --- a/app_flowy/lib/workspace/presentation/widgets/menu/widget/user.dart +++ b/app_flowy/lib/workspace/presentation/widgets/menu/widget/user.dart @@ -1,7 +1,6 @@ import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart'; import 'package:app_flowy/workspace/presentation/widgets/menu/menu_list.dart'; -import 'package:flowy_infra/image.dart'; import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart'; import 'package:flutter/material.dart'; @@ -16,8 +15,7 @@ class MenuUser extends MenuItem { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => - getIt(param1: user)..add(const MenuUserEvent.initial()), + create: (context) => getIt(param1: user)..add(const MenuUserEvent.initial()), child: BlocBuilder( builder: (context, state) => Row( children: [ @@ -56,10 +54,7 @@ class MenuUser extends MenuItem { } Widget _renderDropButton(BuildContext context) { - return FlowyIconButton( - width: 20, - iconRatio: 1.0, - icon: svg("home/drop_down_show"), + return FlowyDropdownButton( onPressed: () { debugPrint('show user profile'); }, diff --git a/app_flowy/lib/workspace/presentation/widgets/prelude.dart b/app_flowy/lib/workspace/presentation/widgets/prelude.dart index c6106aa1c8..117115a244 100644 --- a/app_flowy/lib/workspace/presentation/widgets/prelude.dart +++ b/app_flowy/lib/workspace/presentation/widgets/prelude.dart @@ -1,4 +1,4 @@ -export './blank_page.dart'; +export '../stack_page/blank/blank_page.dart'; export './edit_pannel/edit_pannel.dart'; export './edit_pannel/pannel_animation.dart'; export './home_top_bar.dart'; diff --git a/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart b/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart index 64059a8f18..9d5753b073 100644 --- a/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart +++ b/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; class FlowyIconButton extends StatelessWidget { final double width; final double? height; - final double iconRatio; final Widget icon; final VoidCallback? onPressed; @@ -14,7 +13,6 @@ class FlowyIconButton extends StatelessWidget { this.onPressed, this.width = 30, required this.icon, - this.iconRatio = 0.5, }) : super(key: key); @override @@ -25,7 +23,7 @@ class FlowyIconButton extends StatelessWidget { child: IconButton( icon: icon, padding: EdgeInsets.zero, - iconSize: width * iconRatio, + iconSize: width, alignment: Alignment.center, onPressed: onPressed, ), @@ -33,25 +31,53 @@ class FlowyIconButton extends StatelessWidget { } } -class ViewMoreButton extends StatelessWidget { - final double width; - final double? height; +class FlowyDropdownButton extends StatelessWidget { final VoidCallback? onPressed; - - const ViewMoreButton({ + const FlowyDropdownButton({ Key? key, - this.height, this.onPressed, - required this.width, }) : super(key: key); @override Widget build(BuildContext context) { return FlowyIconButton( - width: width, - height: height, - icon: svg("editor/details"), + width: 16, onPressed: onPressed, + icon: svg("home/drop_down_show"), + ); + } +} + +class ViewAddButton extends StatelessWidget { + final VoidCallback? onPressed; + const ViewAddButton({ + Key? key, + this.onPressed, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return FlowyIconButton( + width: 16, + onPressed: onPressed, + icon: svg("home/add"), + ); + } +} + +class ViewMoreButton extends StatelessWidget { + final VoidCallback? onPressed; + const ViewMoreButton({ + Key? key, + this.onPressed, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return FlowyIconButton( + width: 16, + onPressed: onPressed, + icon: svg("editor/details"), ); } }