share_bloc.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:app_flowy/startup/tasks/rust_sdk.dart';
  5. import 'package:app_flowy/plugins/doc/application/share_service.dart';
  6. import 'package:app_flowy/workspace/application/markdown/document_markdown.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-document/entities.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  9. import 'package:flowy_sdk/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' show Document;
  14. part 'share_bloc.freezed.dart';
  15. class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
  16. ShareService service;
  17. ViewPB view;
  18. DocShareBloc({required this.view, required this.service})
  19. : super(const DocShareState.initial()) {
  20. on<DocShareEvent>((event, emit) async {
  21. await event.map(
  22. shareMarkdown: (ShareMarkdown value) async {
  23. await service.exportMarkdown(view).then((result) {
  24. result.fold(
  25. (value) => emit(DocShareState.finish(
  26. left(_convertDocumentToMarkdown(value)))),
  27. (error) => emit(DocShareState.finish(right(error))),
  28. );
  29. });
  30. emit(const DocShareState.loading());
  31. },
  32. shareLink: (ShareLink value) {},
  33. shareText: (ShareText value) {},
  34. );
  35. });
  36. }
  37. ExportDataPB _convertDocumentToMarkdown(ExportDataPB value) {
  38. final json = jsonDecode(value.data);
  39. final document = Document.fromJson(json);
  40. final result = documentToMarkdown(document);
  41. value.data = result;
  42. writeFile(result);
  43. return value;
  44. }
  45. Future<Directory> get _exportDir async {
  46. Directory documentsDir = await appFlowyDocumentDirectory();
  47. return documentsDir;
  48. }
  49. Future<String> get _localPath async {
  50. final dir = await _exportDir;
  51. return dir.path;
  52. }
  53. Future<File> get _localFile async {
  54. final path = await _localPath;
  55. return File('$path/${view.name}.md');
  56. }
  57. Future<File> writeFile(String md) async {
  58. final file = await _localFile;
  59. return file.writeAsString(md);
  60. }
  61. }
  62. @freezed
  63. class DocShareEvent with _$DocShareEvent {
  64. const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
  65. const factory DocShareEvent.shareText() = ShareText;
  66. const factory DocShareEvent.shareLink() = ShareLink;
  67. }
  68. @freezed
  69. class DocShareState with _$DocShareState {
  70. const factory DocShareState.initial() = _Initial;
  71. const factory DocShareState.loading() = _Loading;
  72. const factory DocShareState.finish(
  73. Either<ExportDataPB, FlowyError> successOrFail) = _Finish;
  74. }