share_bloc.dart 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:app_flowy/startup/tasks/rust_sdk.dart';
  4. import 'package:app_flowy/workspace/application/markdown/delta_markdown.dart';
  5. import 'package:app_flowy/plugins/doc/application/share_service.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-document/entities.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  9. import 'package:freezed_annotation/freezed_annotation.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. import 'package:dartz/dartz.dart';
  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 value) async {
  21. await service.exportMarkdown(view.id).then((result) {
  22. result.fold(
  23. (value) => emit(
  24. DocShareState.finish(left(_convertDeltaToMarkdown(value)))),
  25. (error) => emit(DocShareState.finish(right(error))),
  26. );
  27. });
  28. emit(const DocShareState.loading());
  29. },
  30. shareLink: (ShareLink value) {},
  31. shareText: (ShareText value) {},
  32. );
  33. });
  34. }
  35. ExportDataPB _convertDeltaToMarkdown(ExportDataPB value) {
  36. final result = deltaToMarkdown(value.data);
  37. value.data = result;
  38. writeFile(result);
  39. return value;
  40. }
  41. Future<Directory> get _exportDir async {
  42. Directory documentsDir = await appFlowyDocumentDirectory();
  43. return documentsDir;
  44. }
  45. Future<String> get _localPath async {
  46. final dir = await _exportDir;
  47. return dir.path;
  48. }
  49. Future<File> get _localFile async {
  50. final path = await _localPath;
  51. return File('$path/${view.name}.md');
  52. }
  53. Future<File> writeFile(String md) async {
  54. final file = await _localFile;
  55. return file.writeAsString(md);
  56. }
  57. }
  58. @freezed
  59. class DocShareEvent with _$DocShareEvent {
  60. const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
  61. const factory DocShareEvent.shareText() = ShareText;
  62. const factory DocShareEvent.shareLink() = ShareLink;
  63. }
  64. @freezed
  65. class DocShareState with _$DocShareState {
  66. const factory DocShareState.initial() = _Initial;
  67. const factory DocShareState.loading() = _Loading;
  68. const factory DocShareState.finish(
  69. Either<ExportDataPB, FlowyError> successOrFail) = _Finish;
  70. }