home_screen.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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)..add(const HomeAuthEvent.started()),
  24. ),
  25. BlocProvider<HomeBloc>(create: (context) => getIt<HomeBloc>()),
  26. ],
  27. child: Scaffold(
  28. key: HomeScreen.scaffoldKey,
  29. body: BlocListener<HomeAuthBloc, HomeAuthState>(
  30. listener: (context, state) {
  31. state.map(
  32. loading: (_) {},
  33. unauthorized: (unauthorized) {
  34. // TODO: push to login screen when user token was invalid
  35. Log.error("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(state, context.read<HomeBloc>().state.forceCollapse),
  46. );
  47. },
  48. ),
  49. ),
  50. ),
  51. );
  52. }
  53. Widget _buildBody(HomeState state, bool forceCollapse) {
  54. return LayoutBuilder(
  55. builder: (BuildContext context, BoxConstraints constraints) {
  56. final layout = HomeLayout(context, constraints, forceCollapse);
  57. const homePage = HomePage();
  58. final menu = _buildHomeMenu(
  59. layout: layout,
  60. context: context,
  61. );
  62. final editPannel = _buildEditPannel(
  63. homeState: state,
  64. layout: layout,
  65. context: context,
  66. );
  67. return _layoutWidgets(layout: layout, homePage: homePage, homeMenu: menu, editPannel: editPannel);
  68. },
  69. );
  70. }
  71. Widget _buildHomeMenu({required HomeLayout layout, required BuildContext context}) {
  72. final homeBloc = context.read<HomeBloc>();
  73. Widget homeMenu = HomeMenu(
  74. pageContextChanged: (pageContext) {
  75. getIt<HomePageStack>().setStackView(pageContext);
  76. },
  77. isCollapseChanged: (isCollapse) {
  78. homeBloc.add(HomeEvent.forceCollapse(isCollapse));
  79. },
  80. user: user,
  81. workspaceId: workspaceId,
  82. );
  83. homeMenu = RepaintBoundary(child: homeMenu);
  84. homeMenu = FocusTraversalGroup(child: homeMenu);
  85. return homeMenu;
  86. }
  87. Widget _buildEditPannel({required HomeState homeState, required BuildContext context, required HomeLayout layout}) {
  88. final homeBloc = context.read<HomeBloc>();
  89. Widget editPannel = EditPannel(
  90. context: homeState.editContext,
  91. onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()),
  92. );
  93. // editPannel = RepaintBoundary(child: editPannel);
  94. // editPannel = FocusTraversalGroup(child: editPannel);
  95. return editPannel;
  96. }
  97. Widget _layoutWidgets(
  98. {required HomeLayout layout, required Widget homeMenu, required Widget homePage, required Widget editPannel}) {
  99. return Stack(
  100. children: [
  101. homeMenu
  102. .animatedPanelX(
  103. closeX: -layout.menuWidth,
  104. isClosed: !layout.showMenu,
  105. )
  106. .positioned(left: 0, top: 0, width: layout.menuWidth, bottom: 0, animate: true)
  107. .animate(layout.animDuration, Curves.easeOut),
  108. homePage
  109. .constrained(minWidth: 500)
  110. .positioned(left: layout.homePageLOffset, right: layout.homePageROffset, bottom: 0, top: 0, animate: true)
  111. .animate(layout.animDuration, Curves.easeOut),
  112. editPannel
  113. .animatedPanelX(
  114. duration: layout.animDuration.inMilliseconds * 0.001,
  115. closeX: layout.editPannelWidth,
  116. isClosed: !layout.showEditPannel,
  117. )
  118. .positioned(right: 0, top: 0, bottom: 0, width: layout.editPannelWidth),
  119. ],
  120. );
  121. }
  122. }
  123. class HomePage extends StatelessWidget {
  124. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  125. // final Size size;
  126. const HomePage({Key? key}) : super(key: key);
  127. @override
  128. Widget build(BuildContext context) {
  129. Log.info('HomePage build');
  130. return Column(
  131. mainAxisAlignment: MainAxisAlignment.start,
  132. children: [
  133. getIt<HomePageStack>().stackTopBar(),
  134. Expanded(
  135. child: Container(
  136. color: Colors.white,
  137. child: FocusTraversalGroup(
  138. child: getIt<HomePageStack>().stackWidget(),
  139. ),
  140. ),
  141. ),
  142. ],
  143. );
  144. }
  145. }
  146. // class HomeIndexStack extends StatelessWidget {
  147. // const HomeIndexStack({Key? key}) : super(key: key);
  148. // @override
  149. // Widget build(BuildContext context) {
  150. // return BlocBuilder<HomeBloc, HomeState>(
  151. // buildWhen: (p, c) {
  152. // if (p.pageContext != c.pageContext) {
  153. // Log.info(
  154. // 'PageContext switch from ${p.pageContext.pageType} to ${c.pageContext.pageType}');
  155. // }
  156. // return p.pageContext != c.pageContext;
  157. // },
  158. // builder: (context, state) {
  159. // final pageContext = context.read<HomeBloc>().state.pageContext;
  160. // return Expanded(
  161. // child: Container(
  162. // color: Colors.white,
  163. // child: FocusTraversalGroup(
  164. // child: getIt<FlowyHomeIndexStack>().indexStack(pageContext),
  165. // ),
  166. // ),
  167. // );
  168. // },
  169. // );
  170. // }
  171. // }