share_bloc.dart 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import 'dart:io';
  2. import 'package:appflowy/workspace/application/export/document_exporter.dart';
  3. import 'package:appflowy_backend/protobuf/flowy-document2/entities.pb.dart';
  4. import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
  5. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  6. import 'package:freezed_annotation/freezed_annotation.dart';
  7. import 'package:flutter_bloc/flutter_bloc.dart';
  8. import 'package:dartz/dartz.dart';
  9. part 'share_bloc.freezed.dart';
  10. class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
  11. DocShareBloc({
  12. required this.view,
  13. }) : super(const DocShareState.initial()) {
  14. on<ShareMarkdown>(_onShareMarkdown);
  15. }
  16. final ViewPB view;
  17. Future<void> _onShareMarkdown(
  18. ShareMarkdown event,
  19. Emitter<DocShareState> emit,
  20. ) async {
  21. emit(const DocShareState.loading());
  22. final documentExporter = DocumentExporter(view);
  23. final result = await documentExporter.export(DocumentExportType.markdown);
  24. emit(
  25. DocShareState.finish(
  26. result.fold(
  27. (error) => right(error),
  28. (markdown) => left(_saveMarkdownToPath(markdown, event.path)),
  29. ),
  30. ),
  31. );
  32. }
  33. ExportDataPB _saveMarkdownToPath(String markdown, String path) {
  34. File(path).writeAsStringSync(markdown);
  35. return ExportDataPB()
  36. ..data = markdown
  37. ..exportType = ExportType.Markdown;
  38. }
  39. }
  40. @freezed
  41. class DocShareEvent with _$DocShareEvent {
  42. const factory DocShareEvent.shareMarkdown(String path) = ShareMarkdown;
  43. const factory DocShareEvent.shareText() = ShareText;
  44. const factory DocShareEvent.shareLink() = ShareLink;
  45. }
  46. @freezed
  47. class DocShareState with _$DocShareState {
  48. const factory DocShareState.initial() = _Initial;
  49. const factory DocShareState.loading() = _Loading;
  50. const factory DocShareState.finish(
  51. Either<ExportDataPB, FlowyError> successOrFail,
  52. ) = _Finish;
  53. }