85 lines
2.7 KiB
Dart
Raw Normal View History

2022-05-20 15:55:27 +02:00
import 'dart:async';
2022-10-22 21:57:44 +08:00
import 'dart:convert';
2022-05-20 15:55:27 +02:00
import 'dart:io';
import 'package:app_flowy/startup/tasks/rust_sdk.dart';
import 'package:app_flowy/plugins/doc/application/share_service.dart';
2022-10-22 21:57:44 +08:00
import 'package:app_flowy/workspace/application/markdown/document_markdown.dart';
2022-10-13 23:29:37 +08:00
import 'package:flowy_sdk/protobuf/flowy-document/entities.pb.dart';
2022-07-04 15:00:54 +08:00
import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
2021-12-14 18:04:51 +08:00
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart';
2022-10-22 21:57:44 +08:00
import 'package:appflowy_editor/appflowy_editor.dart' show Document;
part 'share_bloc.freezed.dart';
class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
ShareService service;
2022-07-19 14:11:29 +08:00
ViewPB view;
DocShareBloc({required this.view, required this.service})
: super(const DocShareState.initial()) {
on<DocShareEvent>((event, emit) async {
await event.map(
shareMarkdown: (ShareMarkdown value) async {
2022-10-22 21:57:44 +08:00
await service.exportMarkdown(view).then((result) {
result.fold(
2022-10-22 21:57:44 +08:00
(value) => emit(DocShareState.finish(
left(_convertDocumentToMarkdown(value)))),
(error) => emit(DocShareState.finish(right(error))),
);
});
emit(const DocShareState.loading());
},
shareLink: (ShareLink value) {},
shareText: (ShareText value) {},
);
});
}
2021-11-10 14:58:56 +08:00
2022-10-22 21:57:44 +08:00
ExportDataPB _convertDocumentToMarkdown(ExportDataPB value) {
final json = jsonDecode(value.data);
final document = Document.fromJson(json);
final result = documentToMarkdown(document);
2021-11-10 14:58:56 +08:00
value.data = result;
2022-05-20 15:55:27 +02:00
writeFile(result);
2021-11-10 14:58:56 +08:00
return value;
}
2022-05-20 15:55:27 +02:00
2022-05-31 17:36:15 +02:00
Future<Directory> get _exportDir async {
Directory documentsDir = await appFlowyDocumentDirectory();
return documentsDir;
}
2022-05-20 15:55:27 +02:00
Future<String> get _localPath async {
2022-05-31 17:36:15 +02:00
final dir = await _exportDir;
2022-05-20 15:55:27 +02:00
return dir.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/${view.name}.md');
}
Future<File> writeFile(String md) async {
final file = await _localFile;
return file.writeAsString(md);
}
}
@freezed
class DocShareEvent with _$DocShareEvent {
const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
const factory DocShareEvent.shareText() = ShareText;
const factory DocShareEvent.shareLink() = ShareLink;
}
@freezed
class DocShareState with _$DocShareState {
const factory DocShareState.initial() = _Initial;
const factory DocShareState.loading() = _Loading;
const factory DocShareState.finish(
Either<ExportDataPB, FlowyError> successOrFail) = _Finish;
}