view_bloc.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import 'package:dartz/dartz.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  4. import 'package:flutter_bloc/flutter_bloc.dart';
  5. import 'package:freezed_annotation/freezed_annotation.dart';
  6. import 'package:app_flowy/workspace/domain/i_view.dart';
  7. part 'view_bloc.freezed.dart';
  8. class ViewBloc extends Bloc<ViewEvent, ViewState> {
  9. final IView viewManager;
  10. final IViewListener listener;
  11. ViewBloc({
  12. required this.viewManager,
  13. required this.listener,
  14. }) : super(ViewState.init(viewManager.view));
  15. @override
  16. Stream<ViewState> mapEventToState(ViewEvent event) async* {
  17. yield* event.map(
  18. initial: (e) async* {
  19. listener.start(updatedCallback: (result) => add(ViewEvent.viewDidUpdate(result)));
  20. yield state;
  21. },
  22. setIsEditing: (e) async* {
  23. yield state.copyWith(isEditing: e.isEditing);
  24. },
  25. viewDidUpdate: (e) async* {
  26. yield* _handleViewDidUpdate(e.result);
  27. },
  28. rename: (e) async* {
  29. final result = await viewManager.rename(e.newName);
  30. yield result.fold(
  31. (l) => state.copyWith(successOrFailure: left(unit)),
  32. (error) => state.copyWith(successOrFailure: right(error)),
  33. );
  34. },
  35. delete: (e) async* {
  36. final result = await viewManager.delete();
  37. yield result.fold(
  38. (l) => state.copyWith(successOrFailure: left(unit)),
  39. (error) => state.copyWith(successOrFailure: right(error)),
  40. );
  41. },
  42. duplicate: (e) async* {
  43. final result = await viewManager.duplicate();
  44. yield result.fold(
  45. (l) => state.copyWith(successOrFailure: left(unit)),
  46. (error) => state.copyWith(successOrFailure: right(error)),
  47. );
  48. },
  49. );
  50. }
  51. Stream<ViewState> _handleViewDidUpdate(Either<View, WorkspaceError> result) async* {
  52. yield result.fold(
  53. (view) => state.copyWith(view: view, successOrFailure: left(unit)),
  54. (error) => state.copyWith(successOrFailure: right(error)),
  55. );
  56. }
  57. @override
  58. Future<void> close() async {
  59. await listener.stop();
  60. return super.close();
  61. }
  62. }
  63. @freezed
  64. class ViewEvent with _$ViewEvent {
  65. const factory ViewEvent.initial() = Initial;
  66. const factory ViewEvent.setIsEditing(bool isEditing) = SetEditing;
  67. const factory ViewEvent.rename(String newName) = Rename;
  68. const factory ViewEvent.delete() = Delete;
  69. const factory ViewEvent.duplicate() = Duplicate;
  70. const factory ViewEvent.viewDidUpdate(Either<View, WorkspaceError> result) = ViewDidUpdate;
  71. }
  72. @freezed
  73. class ViewState with _$ViewState {
  74. const factory ViewState({
  75. required View view,
  76. required bool isEditing,
  77. required Either<Unit, WorkspaceError> successOrFailure,
  78. }) = _ViewState;
  79. factory ViewState.init(View view) => ViewState(
  80. view: view,
  81. isEditing: false,
  82. successOrFailure: left(unit),
  83. );
  84. }