doc_bloc.dart 1.7 KB

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