155 lines
5.3 KiB
Dart
Raw Normal View History

2021-07-24 18:55:13 +08:00
import 'package:app_flowy/workspace/application/home/home_bloc.dart';
2021-09-08 18:25:32 +08:00
import 'package:app_flowy/workspace/application/home/home_auth_bloc.dart';
2021-07-22 17:06:53 +08:00
import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
2021-07-12 23:27:58 +08:00
import 'package:app_flowy/startup/startup.dart';
import 'package:flowy_log/flowy_log.dart';
2021-07-28 15:13:48 +08:00
import 'package:flowy_infra_ui/style_widget/container.dart';
import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
2021-06-19 23:41:19 +08:00
import 'package:flutter/material.dart';
2021-07-12 23:27:58 +08:00
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart';
import 'home_layout.dart';
2021-06-19 23:41:19 +08:00
class HomeScreen extends StatelessWidget {
static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
2021-09-04 16:53:58 +08:00
final UserProfile user;
final String workspaceId;
const HomeScreen(this.user, this.workspaceId, {Key? key}) : super(key: key);
2021-06-19 23:41:19 +08:00
@override
Widget build(BuildContext context) {
2021-07-12 23:27:58 +08:00
return MultiBlocProvider(
providers: [
2021-09-08 18:25:32 +08:00
BlocProvider<HomeAuthBloc>(
2021-10-10 11:40:45 +08:00
create: (context) => getIt<HomeAuthBloc>(param1: user)..add(const HomeAuthEvent.started()),
2021-09-08 18:25:32 +08:00
),
2021-07-12 23:27:58 +08:00
BlocProvider<HomeBloc>(create: (context) => getIt<HomeBloc>()),
],
child: Scaffold(
key: HomeScreen.scaffoldKey,
2021-09-08 18:25:32 +08:00
body: BlocListener<HomeAuthBloc, HomeAuthState>(
listener: (context, state) {
state.map(
loading: (_) {},
unauthorized: (unauthorized) {
// TODO: push to login screen when user token was invalid
Log.error("Push to login screen when user token was invalid");
2021-09-08 18:25:32 +08:00
},
2021-07-12 23:27:58 +08:00
);
},
2021-09-08 18:25:32 +08:00
child: BlocBuilder<HomeBloc, HomeState>(
buildWhen: (previous, current) => previous != current,
builder: (context, state) {
return FlowyContainer(
Theme.of(context).colorScheme.surface,
// Colors.white,
2021-10-10 11:40:45 +08:00
child: _buildBody(state, context.read<HomeBloc>().state.forceCollapse),
2021-09-08 18:25:32 +08:00
);
},
),
2021-07-12 23:27:58 +08:00
),
),
);
}
2021-07-20 23:51:08 +08:00
Widget _buildBody(HomeState state, bool forceCollapse) {
2021-07-12 23:27:58 +08:00
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
2021-07-20 23:51:08 +08:00
final layout = HomeLayout(context, constraints, forceCollapse);
2021-07-12 23:27:58 +08:00
const homePage = HomePage();
final menu = _buildHomeMenu(
layout: layout,
context: context,
);
final editPannel = _buildEditPannel(
homeState: state,
layout: layout,
context: context,
);
2021-10-10 11:40:45 +08:00
return _layoutWidgets(layout: layout, homePage: homePage, homeMenu: menu, editPannel: editPannel);
2021-07-12 23:27:58 +08:00
},
);
}
2021-10-10 11:40:45 +08:00
Widget _buildHomeMenu({required HomeLayout layout, required BuildContext context}) {
2021-07-12 23:27:58 +08:00
final homeBloc = context.read<HomeBloc>();
Widget homeMenu = HomeMenu(
pageContextChanged: (pageContext) {
2021-10-10 15:58:57 +08:00
getIt<HomeStack>().setStack(pageContext);
2021-07-12 23:27:58 +08:00
},
isCollapseChanged: (isCollapse) {
2021-07-20 23:51:08 +08:00
homeBloc.add(HomeEvent.forceCollapse(isCollapse));
2021-07-12 23:27:58 +08:00
},
2021-07-26 11:51:39 +08:00
user: user,
workspaceId: workspaceId,
2021-07-12 23:27:58 +08:00
);
homeMenu = RepaintBoundary(child: homeMenu);
homeMenu = FocusTraversalGroup(child: homeMenu);
return homeMenu;
}
2021-10-10 11:40:45 +08:00
Widget _buildEditPannel({required HomeState homeState, required BuildContext context, required HomeLayout layout}) {
2021-07-12 23:27:58 +08:00
final homeBloc = context.read<HomeBloc>();
Widget editPannel = EditPannel(
context: homeState.editContext,
onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()),
);
// editPannel = RepaintBoundary(child: editPannel);
// editPannel = FocusTraversalGroup(child: editPannel);
return editPannel;
}
Widget _layoutWidgets(
2021-10-10 11:40:45 +08:00
{required HomeLayout layout, required Widget homeMenu, required Widget homePage, required Widget editPannel}) {
2021-07-12 23:27:58 +08:00
return Stack(
children: [
homeMenu
.animatedPanelX(
closeX: -layout.menuWidth,
isClosed: !layout.showMenu,
)
2021-10-10 11:40:45 +08:00
.positioned(left: 0, top: 0, width: layout.menuWidth, bottom: 0, animate: true)
2021-07-12 23:27:58 +08:00
.animate(layout.animDuration, Curves.easeOut),
homePage
.constrained(minWidth: 500)
2021-10-10 11:40:45 +08:00
.positioned(left: layout.homePageLOffset, right: layout.homePageROffset, bottom: 0, top: 0, animate: true)
2021-07-12 23:27:58 +08:00
.animate(layout.animDuration, Curves.easeOut),
editPannel
.animatedPanelX(
duration: layout.animDuration.inMilliseconds * 0.001,
closeX: layout.editPannelWidth,
isClosed: !layout.showEditPannel,
)
2021-10-10 11:40:45 +08:00
.positioned(right: 0, top: 0, bottom: 0, width: layout.editPannelWidth),
2021-07-12 23:27:58 +08:00
],
2021-06-19 23:41:19 +08:00
);
}
}
2021-07-12 23:27:58 +08:00
class HomePage extends StatelessWidget {
static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
// final Size size;
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Log.info('HomePage build');
return Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
2021-10-10 15:58:57 +08:00
getIt<HomeStack>().stackTopBar(),
Expanded(
2021-07-12 23:27:58 +08:00
child: Container(
color: Colors.white,
child: FocusTraversalGroup(
2021-10-10 15:58:57 +08:00
child: getIt<HomeStack>().stackWidget(),
2021-07-12 23:27:58 +08:00
),
),
),
],
2021-07-12 23:27:58 +08:00
);
}
}