view_bloc.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'package:dartz/dartz.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-core/errors.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.updatedNotifier.addPublishListener((result) {
  20. add(ViewEvent.viewDidUpdate(result));
  21. });
  22. listener.start();
  23. yield state;
  24. },
  25. setIsEditing: (e) async* {
  26. yield state.copyWith(isEditing: e.isEditing);
  27. },
  28. viewDidUpdate: (e) async* {
  29. yield* _handleViewDidUpdate(e.result);
  30. },
  31. rename: (e) async* {
  32. final result = await viewManager.rename(e.newName);
  33. yield result.fold(
  34. (l) => state.copyWith(successOrFailure: left(unit)),
  35. (error) => state.copyWith(successOrFailure: right(error)),
  36. );
  37. },
  38. delete: (e) async* {
  39. final result = await viewManager.delete();
  40. yield result.fold(
  41. (l) => state.copyWith(successOrFailure: left(unit)),
  42. (error) => state.copyWith(successOrFailure: right(error)),
  43. );
  44. },
  45. duplicate: (e) async* {
  46. final result = await viewManager.duplicate();
  47. yield result.fold(
  48. (l) => state.copyWith(successOrFailure: left(unit)),
  49. (error) => state.copyWith(successOrFailure: right(error)),
  50. );
  51. },
  52. );
  53. }
  54. Stream<ViewState> _handleViewDidUpdate(Either<View, WorkspaceError> result) async* {
  55. yield result.fold(
  56. (view) => state.copyWith(view: view, successOrFailure: left(unit)),
  57. (error) => state.copyWith(successOrFailure: right(error)),
  58. );
  59. }
  60. @override
  61. Future<void> close() async {
  62. await listener.stop();
  63. return super.close();
  64. }
  65. }
  66. @freezed
  67. class ViewEvent with _$ViewEvent {
  68. const factory ViewEvent.initial() = Initial;
  69. const factory ViewEvent.setIsEditing(bool isEditing) = SetEditing;
  70. const factory ViewEvent.rename(String newName) = Rename;
  71. const factory ViewEvent.delete() = Delete;
  72. const factory ViewEvent.duplicate() = Duplicate;
  73. const factory ViewEvent.viewDidUpdate(Either<View, WorkspaceError> result) = ViewDidUpdate;
  74. }
  75. @freezed
  76. class ViewState with _$ViewState {
  77. const factory ViewState({
  78. required View view,
  79. required bool isEditing,
  80. required Either<Unit, WorkspaceError> successOrFailure,
  81. }) = _ViewState;
  82. factory ViewState.init(View view) => ViewState(
  83. view: view,
  84. isEditing: false,
  85. successOrFailure: left(unit),
  86. );
  87. }