share_bloc.dart 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:appflowy/plugins/document/application/share_service.dart';
  4. import 'package:appflowy/plugins/document/presentation/editor_plugins/parsers/divider_node_parser.dart';
  5. import 'package:appflowy/plugins/document/presentation/editor_plugins/parsers/math_equation_node_parser.dart';
  6. import 'package:appflowy/plugins/document/presentation/editor_plugins/parsers/code_block_node_parser.dart';
  7. import 'package:appflowy_backend/protobuf/flowy-document2/entities.pb.dart';
  8. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  9. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  10. import 'package:freezed_annotation/freezed_annotation.dart';
  11. import 'package:flutter_bloc/flutter_bloc.dart';
  12. import 'package:dartz/dartz.dart';
  13. import 'package:appflowy_editor/appflowy_editor.dart'
  14. show Document, documentToMarkdown;
  15. part 'share_bloc.freezed.dart';
  16. class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
  17. ShareService service;
  18. ViewPB view;
  19. DocShareBloc({required this.view, required this.service})
  20. : super(const DocShareState.initial()) {
  21. on<DocShareEvent>((event, emit) async {
  22. await event.map(
  23. shareMarkdown: (ShareMarkdown shareMarkdown) async {
  24. await service.exportMarkdown(view).then((result) {
  25. result.fold(
  26. (value) => emit(
  27. DocShareState.finish(
  28. left(_saveMarkdown(value, shareMarkdown.path)),
  29. ),
  30. ),
  31. (error) => emit(DocShareState.finish(right(error))),
  32. );
  33. });
  34. emit(const DocShareState.loading());
  35. },
  36. shareLink: (ShareLink value) {},
  37. shareText: (ShareText value) {},
  38. );
  39. });
  40. }
  41. ExportDataPB _saveMarkdown(ExportDataPB value, String path) {
  42. final markdown = _convertDocumentToMarkdown(value);
  43. value.data = markdown;
  44. File(path).writeAsStringSync(markdown);
  45. return value;
  46. }
  47. String _convertDocumentToMarkdown(ExportDataPB value) {
  48. final json = jsonDecode(value.data);
  49. final document = Document.fromJson(json);
  50. return documentToMarkdown(
  51. document,
  52. customParsers: [
  53. const DividerNodeParser(),
  54. const MathEquationNodeParser(),
  55. const CodeBlockNodeParser(),
  56. ],
  57. );
  58. }
  59. }
  60. @freezed
  61. class DocShareEvent with _$DocShareEvent {
  62. const factory DocShareEvent.shareMarkdown(String path) = ShareMarkdown;
  63. const factory DocShareEvent.shareText() = ShareText;
  64. const factory DocShareEvent.shareLink() = ShareLink;
  65. }
  66. @freezed
  67. class DocShareState with _$DocShareState {
  68. const factory DocShareState.initial() = _Initial;
  69. const factory DocShareState.loading() = _Loading;
  70. const factory DocShareState.finish(
  71. Either<ExportDataPB, FlowyError> successOrFail,
  72. ) = _Finish;
  73. }