share_bloc.dart 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:app_flowy/startup/startup.dart';
  4. import 'package:app_flowy/workspace/application/doc/share_service.dart';
  5. import 'package:app_flowy/workspace/application/markdown/delta_markdown.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-text-block/entities.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-folder-data-model/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:path_provider/path_provider.dart';
  12. import 'package:dartz/dartz.dart';
  13. part 'share_bloc.freezed.dart';
  14. class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
  15. ShareService service;
  16. View view;
  17. DocShareBloc({required this.view, required this.service}) : 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(DocShareState.finish(left(_convertDeltaToMarkdown(value)))),
  24. (error) => emit(DocShareState.finish(right(error))),
  25. );
  26. });
  27. emit(const DocShareState.loading());
  28. },
  29. shareLink: (ShareLink value) {},
  30. shareText: (ShareText value) {},
  31. );
  32. });
  33. }
  34. ExportData _convertDeltaToMarkdown(ExportData value) {
  35. final result = deltaToMarkdown(value.data);
  36. value.data = result;
  37. writeFile(result);
  38. return value;
  39. }
  40. Future<Directory> appFlowyDocumentDirectory() async {
  41. Directory documentsDir = await getApplicationDocumentsDirectory();
  42. switch (integrationEnv()) {
  43. case IntegrationMode.develop:
  44. return Directory('${documentsDir.path}/flowy_dev').create();
  45. case IntegrationMode.release:
  46. return Directory('${documentsDir.path}/flowy').create();
  47. case IntegrationMode.test:
  48. return Directory("${Directory.current.path}/.sandbox");
  49. }
  50. }
  51. Future<String> get _localPath async {
  52. final dir = await appFlowyDocumentDirectory();
  53. return dir.path;
  54. }
  55. Future<File> get _localFile async {
  56. final path = await _localPath;
  57. return File('$path/${view.name}.md');
  58. }
  59. Future<File> writeFile(String md) async {
  60. final file = await _localFile;
  61. return file.writeAsString(md);
  62. }
  63. }
  64. @freezed
  65. class DocShareEvent with _$DocShareEvent {
  66. const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
  67. const factory DocShareEvent.shareText() = ShareText;
  68. const factory DocShareEvent.shareLink() = ShareLink;
  69. }
  70. @freezed
  71. class DocShareState with _$DocShareState {
  72. const factory DocShareState.initial() = _Initial;
  73. const factory DocShareState.loading() = _Loading;
  74. const factory DocShareState.finish(Either<ExportData, FlowyError> successOrFail) = _Finish;
  75. }