doc_bloc.dart 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:app_flowy/workspace/domain/i_doc.dart';
  4. import 'package:freezed_annotation/freezed_annotation.dart';
  5. import 'package:flowy_editor/flowy_editor.dart';
  6. import 'dart:convert';
  7. part 'doc_bloc.freezed.dart';
  8. class DocBloc extends Bloc<DocEvent, DocState> {
  9. final IDoc iDocImpl;
  10. DocBloc({
  11. required this.iDocImpl,
  12. }) : super(const DocState.loading());
  13. @override
  14. Stream<DocState> mapEventToState(DocEvent event) async* {
  15. yield* event.map(
  16. loadDoc: (_) async* {
  17. yield* _readDoc();
  18. },
  19. );
  20. }
  21. Stream<DocState> _readDoc() async* {
  22. final docOrFail = await iDocImpl.readDoc();
  23. yield docOrFail.fold(
  24. (doc) {
  25. final flowyDoc = FlowyDoc(doc: doc, data: _decodeToDocument(doc.data));
  26. return DocState.loadDoc(flowyDoc);
  27. },
  28. (error) {
  29. return DocState.loadFail(error);
  30. },
  31. );
  32. }
  33. Document _decodeToDocument(String text) {
  34. final json = jsonDecode(text);
  35. final document = Document.fromJson(json);
  36. return document;
  37. }
  38. }
  39. @freezed
  40. class DocEvent with _$DocEvent {
  41. const factory DocEvent.loadDoc() = LoadDoc;
  42. }
  43. @freezed
  44. class DocState with _$DocState {
  45. const factory DocState.loading() = Loading;
  46. const factory DocState.loadDoc(FlowyDoc doc) = LoadedDoc;
  47. const factory DocState.loadFail(WorkspaceError error) = LoadFail;
  48. }