document_page.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import 'package:app_flowy/startup/startup.dart';
  2. import 'package:app_flowy/workspace/application/appearance.dart';
  3. import 'package:app_flowy/plugins/doc/presentation/banner.dart';
  4. import 'package:app_flowy/plugins/doc/presentation/toolbar/tool_bar.dart';
  5. import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
  6. import 'package:flowy_infra_ui/widget/spacing.dart';
  7. import 'package:flutter_quill/flutter_quill.dart' as quill;
  8. import 'package:flowy_infra_ui/widget/error_page.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  10. import 'package:flutter/material.dart';
  11. import 'package:flutter_bloc/flutter_bloc.dart';
  12. import 'package:provider/provider.dart';
  13. import 'application/doc_bloc.dart';
  14. import 'styles.dart';
  15. class DocumentPage extends StatefulWidget {
  16. final ViewPB view;
  17. DocumentPage({Key? key, required this.view}) : super(key: ValueKey(view.id));
  18. @override
  19. State<DocumentPage> createState() => _DocumentPageState();
  20. }
  21. class _DocumentPageState extends State<DocumentPage> {
  22. late DocumentBloc documentBloc;
  23. final scrollController = ScrollController();
  24. final FocusNode _focusNode = FocusNode();
  25. @override
  26. void initState() {
  27. documentBloc = getIt<DocumentBloc>(param1: super.widget.view)
  28. ..add(const DocumentEvent.initial());
  29. super.initState();
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return MultiBlocProvider(
  34. providers: [
  35. BlocProvider<DocumentBloc>.value(value: documentBloc),
  36. ],
  37. child:
  38. BlocBuilder<DocumentBloc, DocumentState>(builder: (context, state) {
  39. return state.loadingState.map(
  40. // loading: (_) => const FlowyProgressIndicator(),
  41. loading: (_) =>
  42. SizedBox.expand(child: Container(color: Colors.transparent)),
  43. finish: (result) => result.successOrFail.fold(
  44. (_) {
  45. if (state.forceClose) {
  46. return _renderAppPage();
  47. } else {
  48. return _renderDocument(context, state);
  49. }
  50. },
  51. (err) => FlowyErrorPage(err.toString()),
  52. ),
  53. );
  54. }),
  55. );
  56. }
  57. @override
  58. Future<void> dispose() async {
  59. documentBloc.close();
  60. _focusNode.dispose();
  61. super.dispose();
  62. }
  63. Widget _renderDocument(BuildContext context, DocumentState state) {
  64. quill.QuillController controller = quill.QuillController(
  65. document: context.read<DocumentBloc>().document,
  66. selection: const TextSelection.collapsed(offset: 0),
  67. );
  68. return Column(
  69. children: [
  70. if (state.isDeleted) _renderBanner(context),
  71. Expanded(
  72. child: Column(
  73. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  74. children: [
  75. _renderEditor(controller),
  76. const VSpace(10),
  77. _renderToolbar(controller),
  78. const VSpace(10),
  79. ],
  80. ),
  81. ),
  82. ],
  83. );
  84. }
  85. Widget _renderBanner(BuildContext context) {
  86. return DocumentBanner(
  87. onRestore: () =>
  88. context.read<DocumentBloc>().add(const DocumentEvent.restorePage()),
  89. onDelete: () => context
  90. .read<DocumentBloc>()
  91. .add(const DocumentEvent.deletePermanently()),
  92. );
  93. }
  94. Widget _renderEditor(quill.QuillController controller) {
  95. final editor = quill.QuillEditor(
  96. controller: controller,
  97. focusNode: _focusNode,
  98. scrollable: true,
  99. paintCursorAboveText: true,
  100. autoFocus: controller.document.isEmpty(),
  101. expands: false,
  102. padding: const EdgeInsets.symmetric(horizontal: 8.0),
  103. readOnly: false,
  104. scrollBottomInset: 0,
  105. scrollController: scrollController,
  106. customStyles: customStyles(context),
  107. );
  108. return Expanded(
  109. child: ScrollbarListStack(
  110. axis: Axis.vertical,
  111. controller: scrollController,
  112. barSize: 6.0,
  113. child: SizedBox.expand(child: editor),
  114. ),
  115. );
  116. }
  117. Widget _renderToolbar(quill.QuillController controller) {
  118. return ChangeNotifierProvider.value(
  119. value: Provider.of<AppearanceSettingModel>(context, listen: true),
  120. child: EditorToolbar.basic(
  121. controller: controller,
  122. ),
  123. );
  124. }
  125. Widget _renderAppPage() {
  126. return Container(
  127. color: Colors.black,
  128. );
  129. }
  130. }