home_screen.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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_log/flowy_log.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. Log.error("Push to login screen when user token was invalid");
  37. },
  38. );
  39. },
  40. child: BlocBuilder<HomeBloc, HomeState>(
  41. buildWhen: (previous, current) => previous != current,
  42. builder: (context, state) {
  43. return FlowyContainer(
  44. Theme.of(context).colorScheme.surface,
  45. // Colors.white,
  46. child: _buildBody(
  47. state, context.read<HomeBloc>().state.forceCollapse),
  48. );
  49. },
  50. ),
  51. ),
  52. ),
  53. );
  54. }
  55. Widget _buildBody(HomeState state, bool forceCollapse) {
  56. return LayoutBuilder(
  57. builder: (BuildContext context, BoxConstraints constraints) {
  58. final layout = HomeLayout(context, constraints, forceCollapse);
  59. const homePage = HomePage();
  60. final menu = _buildHomeMenu(
  61. layout: layout,
  62. context: context,
  63. );
  64. final editPannel = _buildEditPannel(
  65. homeState: state,
  66. layout: layout,
  67. context: context,
  68. );
  69. return _layoutWidgets(
  70. layout: layout,
  71. homePage: homePage,
  72. homeMenu: menu,
  73. editPannel: editPannel);
  74. },
  75. );
  76. }
  77. Widget _buildHomeMenu(
  78. {required HomeLayout layout, required BuildContext context}) {
  79. final homeBloc = context.read<HomeBloc>();
  80. Widget homeMenu = HomeMenu(
  81. pageContextChanged: (pageContext) {
  82. getIt<HomePageStack>().setStackView(pageContext);
  83. },
  84. isCollapseChanged: (isCollapse) {
  85. homeBloc.add(HomeEvent.forceCollapse(isCollapse));
  86. },
  87. user: user,
  88. workspaceId: workspaceId,
  89. );
  90. homeMenu = RepaintBoundary(child: homeMenu);
  91. homeMenu = FocusTraversalGroup(child: homeMenu);
  92. return homeMenu;
  93. }
  94. Widget _buildEditPannel(
  95. {required HomeState homeState,
  96. required BuildContext context,
  97. required HomeLayout layout}) {
  98. final homeBloc = context.read<HomeBloc>();
  99. Widget editPannel = EditPannel(
  100. context: homeState.editContext,
  101. onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()),
  102. );
  103. // editPannel = RepaintBoundary(child: editPannel);
  104. // editPannel = FocusTraversalGroup(child: editPannel);
  105. return editPannel;
  106. }
  107. Widget _layoutWidgets(
  108. {required HomeLayout layout,
  109. required Widget homeMenu,
  110. required Widget homePage,
  111. required Widget editPannel}) {
  112. return Stack(
  113. children: [
  114. homeMenu
  115. .animatedPanelX(
  116. closeX: -layout.menuWidth,
  117. isClosed: !layout.showMenu,
  118. )
  119. .positioned(
  120. left: 0,
  121. top: 0,
  122. width: layout.menuWidth,
  123. bottom: 0,
  124. animate: true)
  125. .animate(layout.animDuration, Curves.easeOut),
  126. homePage
  127. .constrained(minWidth: 500)
  128. .positioned(
  129. left: layout.homePageLOffset,
  130. right: layout.homePageROffset,
  131. bottom: 0,
  132. top: 0,
  133. animate: true)
  134. .animate(layout.animDuration, Curves.easeOut),
  135. editPannel
  136. .animatedPanelX(
  137. duration: layout.animDuration.inMilliseconds * 0.001,
  138. closeX: layout.editPannelWidth,
  139. isClosed: !layout.showEditPannel,
  140. )
  141. .positioned(
  142. right: 0, top: 0, bottom: 0, width: layout.editPannelWidth),
  143. ],
  144. );
  145. }
  146. }
  147. class HomePage extends StatelessWidget {
  148. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  149. // final Size size;
  150. const HomePage({Key? key}) : super(key: key);
  151. @override
  152. Widget build(BuildContext context) {
  153. Log.info('HomePage build');
  154. return Column(
  155. mainAxisAlignment: MainAxisAlignment.start,
  156. children: [
  157. getIt<HomePageStack>().stackTopBar(),
  158. Expanded(
  159. child: Container(
  160. color: Colors.white,
  161. child: FocusTraversalGroup(
  162. child: getIt<HomePageStack>().stackWidget(),
  163. ),
  164. ),
  165. ),
  166. ],
  167. );
  168. }
  169. }
  170. // class HomeIndexStack extends StatelessWidget {
  171. // const HomeIndexStack({Key? key}) : super(key: key);
  172. // @override
  173. // Widget build(BuildContext context) {
  174. // return BlocBuilder<HomeBloc, HomeState>(
  175. // buildWhen: (p, c) {
  176. // if (p.pageContext != c.pageContext) {
  177. // Log.info(
  178. // 'PageContext switch from ${p.pageContext.pageType} to ${c.pageContext.pageType}');
  179. // }
  180. // return p.pageContext != c.pageContext;
  181. // },
  182. // builder: (context, state) {
  183. // final pageContext = context.read<HomeBloc>().state.pageContext;
  184. // return Expanded(
  185. // child: Container(
  186. // color: Colors.white,
  187. // child: FocusTraversalGroup(
  188. // child: getIt<FlowyHomeIndexStack>().indexStack(pageContext),
  189. // ),
  190. // ),
  191. // );
  192. // },
  193. // );
  194. // }
  195. // }