home_screen.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import 'package:app_flowy/workspace/application/home/home_bloc.dart';
  2. import 'package:app_flowy/workspace/application/home/home_auth_bloc.dart';
  3. import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
  4. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  5. import 'package:app_flowy/startup/startup.dart';
  6. import 'package:flowy_infra/flowy_logger.dart';
  7. import 'package:flowy_infra_ui/style_widget/container.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. import 'package:styled_widget/styled_widget.dart';
  12. import 'home_layout.dart';
  13. class HomeScreen extends StatelessWidget {
  14. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  15. final UserProfile user;
  16. final String workspaceId;
  17. const HomeScreen(this.user, this.workspaceId, {Key? key}) : super(key: key);
  18. @override
  19. Widget build(BuildContext context) {
  20. return MultiBlocProvider(
  21. providers: [
  22. BlocProvider<HomeAuthBloc>(
  23. create: (context) => getIt<HomeAuthBloc>(param1: user)
  24. ..add(const HomeAuthEvent.started()),
  25. ),
  26. BlocProvider<HomeBloc>(create: (context) => getIt<HomeBloc>()),
  27. ],
  28. child: Scaffold(
  29. key: HomeScreen.scaffoldKey,
  30. body: BlocListener<HomeAuthBloc, HomeAuthState>(
  31. listener: (context, state) {
  32. state.map(
  33. loading: (_) {},
  34. unauthorized: (unauthorized) {
  35. // TODO: push to login screen when user token was invalid
  36. },
  37. );
  38. },
  39. child: BlocBuilder<HomeBloc, HomeState>(
  40. buildWhen: (previous, current) => previous != current,
  41. builder: (context, state) {
  42. return FlowyContainer(
  43. Theme.of(context).colorScheme.surface,
  44. // Colors.white,
  45. child: _buildBody(
  46. state, context.read<HomeBloc>().state.forceCollapse),
  47. );
  48. },
  49. ),
  50. ),
  51. ),
  52. );
  53. }
  54. Widget _buildBody(HomeState state, bool forceCollapse) {
  55. return LayoutBuilder(
  56. builder: (BuildContext context, BoxConstraints constraints) {
  57. final layout = HomeLayout(context, constraints, forceCollapse);
  58. const homePage = HomePage();
  59. final menu = _buildHomeMenu(
  60. layout: layout,
  61. context: context,
  62. );
  63. final editPannel = _buildEditPannel(
  64. homeState: state,
  65. layout: layout,
  66. context: context,
  67. );
  68. return _layoutWidgets(
  69. layout: layout,
  70. homePage: homePage,
  71. homeMenu: menu,
  72. editPannel: editPannel);
  73. },
  74. );
  75. }
  76. Widget _buildHomeMenu(
  77. {required HomeLayout layout, required BuildContext context}) {
  78. final homeBloc = context.read<HomeBloc>();
  79. Widget homeMenu = HomeMenu(
  80. pageContextChanged: (pageContext) {
  81. getIt<HomePageStack>().setStackView(pageContext);
  82. },
  83. isCollapseChanged: (isCollapse) {
  84. homeBloc.add(HomeEvent.forceCollapse(isCollapse));
  85. },
  86. user: user,
  87. workspaceId: workspaceId,
  88. );
  89. homeMenu = RepaintBoundary(child: homeMenu);
  90. homeMenu = FocusTraversalGroup(child: homeMenu);
  91. return homeMenu;
  92. }
  93. Widget _buildEditPannel(
  94. {required HomeState homeState,
  95. required BuildContext context,
  96. required HomeLayout layout}) {
  97. final homeBloc = context.read<HomeBloc>();
  98. Widget editPannel = EditPannel(
  99. context: homeState.editContext,
  100. onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()),
  101. );
  102. // editPannel = RepaintBoundary(child: editPannel);
  103. // editPannel = FocusTraversalGroup(child: editPannel);
  104. return editPannel;
  105. }
  106. Widget _layoutWidgets(
  107. {required HomeLayout layout,
  108. required Widget homeMenu,
  109. required Widget homePage,
  110. required Widget editPannel}) {
  111. return Stack(
  112. children: [
  113. homeMenu
  114. .animatedPanelX(
  115. closeX: -layout.menuWidth,
  116. isClosed: !layout.showMenu,
  117. )
  118. .positioned(
  119. left: 0,
  120. top: 0,
  121. width: layout.menuWidth,
  122. bottom: 0,
  123. animate: true)
  124. .animate(layout.animDuration, Curves.easeOut),
  125. homePage
  126. .constrained(minWidth: 500)
  127. .positioned(
  128. left: layout.homePageLOffset,
  129. right: layout.homePageROffset,
  130. bottom: 0,
  131. top: 0,
  132. animate: true)
  133. .animate(layout.animDuration, Curves.easeOut),
  134. editPannel
  135. .animatedPanelX(
  136. duration: layout.animDuration.inMilliseconds * 0.001,
  137. closeX: layout.editPannelWidth,
  138. isClosed: !layout.showEditPannel,
  139. )
  140. .positioned(
  141. right: 0, top: 0, bottom: 0, width: layout.editPannelWidth),
  142. ],
  143. );
  144. }
  145. }
  146. class HomePage extends StatelessWidget {
  147. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  148. // final Size size;
  149. const HomePage({Key? key}) : super(key: key);
  150. @override
  151. Widget build(BuildContext context) {
  152. Log.info('HomePage build');
  153. return Column(
  154. mainAxisAlignment: MainAxisAlignment.start,
  155. children: [
  156. getIt<HomePageStack>().stackTopBar(),
  157. Expanded(
  158. child: Container(
  159. color: Colors.white,
  160. child: FocusTraversalGroup(
  161. child: getIt<HomePageStack>().stackWidget(),
  162. ),
  163. ),
  164. ),
  165. ],
  166. );
  167. }
  168. }
  169. // class HomeIndexStack extends StatelessWidget {
  170. // const HomeIndexStack({Key? key}) : super(key: key);
  171. // @override
  172. // Widget build(BuildContext context) {
  173. // return BlocBuilder<HomeBloc, HomeState>(
  174. // buildWhen: (p, c) {
  175. // if (p.pageContext != c.pageContext) {
  176. // Log.info(
  177. // 'PageContext switch from ${p.pageContext.pageType} to ${c.pageContext.pageType}');
  178. // }
  179. // return p.pageContext != c.pageContext;
  180. // },
  181. // builder: (context, state) {
  182. // final pageContext = context.read<HomeBloc>().state.pageContext;
  183. // return Expanded(
  184. // child: Container(
  185. // color: Colors.white,
  186. // child: FocusTraversalGroup(
  187. // child: getIt<FlowyHomeIndexStack>().indexStack(pageContext),
  188. // ),
  189. // ),
  190. // );
  191. // },
  192. // );
  193. // }
  194. // }