share_bloc.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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:app_flowy/workspace/presentation/widgets/dialogs.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-text-block/entities.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-folder-data-model/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:path_provider/path_provider.dart';
  13. import 'package:dartz/dartz.dart';
  14. part 'share_bloc.freezed.dart';
  15. class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
  16. ShareService service;
  17. View view;
  18. DocShareBloc({required this.view, required this.service}) : super(const DocShareState.initial()) {
  19. on<DocShareEvent>((event, emit) async {
  20. await event.map(
  21. shareMarkdown: (ShareMarkdown value) async {
  22. await service.exportMarkdown(view.id).then((result) {
  23. result.fold(
  24. (value) => emit(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. bool checkFile = false;
  36. ExportData _convertDeltaToMarkdown(ExportData value) {
  37. final result = deltaToMarkdown(value.data);
  38. value.data = result;
  39. writeFile(result);
  40. return value;
  41. }
  42. Future<Directory> appFlowyDocumentDirectory() async {
  43. Directory documentsDir = await getApplicationDocumentsDirectory();
  44. switch (integrationEnv()) {
  45. case IntegrationMode.develop:
  46. return Directory('${documentsDir.path}/flowy_dev').create();
  47. case IntegrationMode.release:
  48. return Directory('${documentsDir.path}/flowy').create();
  49. case IntegrationMode.test:
  50. return Directory("${Directory.current.path}/.sandbox");
  51. }
  52. }
  53. Future<String> get _localPath async {
  54. final dir = await appFlowyDocumentDirectory();
  55. return dir.path;
  56. }
  57. Future<File> get _localFile async {
  58. final path = await _localPath;
  59. checkFile = true;
  60. return File('$path/${view.name}.md');
  61. }
  62. Future<File> writeFile(String md) async {
  63. final file = await _localFile;
  64. if (checkFile)
  65. BubbleNotification(msgTitle: 'Export To Markdown', msgBody: 'File saved to $file');
  66. else
  67. BubbleNotification(msgTitle: 'Failed to write to file', msgBody: '$file');
  68. return file.writeAsString(md);
  69. }
  70. }
  71. @freezed
  72. class DocShareEvent with _$DocShareEvent {
  73. const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
  74. const factory DocShareEvent.shareText() = ShareText;
  75. const factory DocShareEvent.shareLink() = ShareLink;
  76. }
  77. @freezed
  78. class DocShareState with _$DocShareState {
  79. const factory DocShareState.initial() = _Initial;
  80. const factory DocShareState.loading() = _Loading;
  81. const factory DocShareState.finish(Either<ExportData, FlowyError> successOrFail) = _Finish;
  82. }