share_bloc.dart 2.3 KB

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