view_bloc.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 iViewImpl;
  10. final IViewListener listener;
  11. ViewBloc({
  12. required this.iViewImpl,
  13. required this.listener,
  14. }) : super(ViewState.init(iViewImpl.view));
  15. @override
  16. Stream<ViewState> mapEventToState(ViewEvent event) async* {
  17. yield* event.map(initial: (e) async* {
  18. listener.start(updatedCallback: (result) => add(ViewEvent.viewDidUpdate(result)));
  19. yield state;
  20. }, setIsEditing: (e) async* {
  21. yield state.copyWith(isEditing: e.isEditing);
  22. }, viewDidUpdate: (e) async* {
  23. yield* _handleViewDidUpdate(e.result);
  24. }, rename: (e) async* {
  25. final result = await iViewImpl.rename(e.newName);
  26. yield result.fold(
  27. (l) => state.copyWith(successOrFailure: left(unit)),
  28. (error) => state.copyWith(successOrFailure: right(error)),
  29. );
  30. }, delete: (e) async* {
  31. final result = await iViewImpl.pushIntoTrash();
  32. yield result.fold(
  33. (l) => state.copyWith(successOrFailure: left(unit)),
  34. (error) => state.copyWith(successOrFailure: right(error)),
  35. );
  36. });
  37. }
  38. Stream<ViewState> _handleViewDidUpdate(Either<View, WorkspaceError> result) async* {
  39. yield result.fold(
  40. (view) => state.copyWith(view: view, successOrFailure: left(unit)),
  41. (error) => state.copyWith(successOrFailure: right(error)),
  42. );
  43. }
  44. @override
  45. Future<void> close() async {
  46. await listener.stop();
  47. return super.close();
  48. }
  49. }
  50. @freezed
  51. class ViewEvent with _$ViewEvent {
  52. const factory ViewEvent.initial() = Initial;
  53. const factory ViewEvent.setIsEditing(bool isEditing) = SetEditing;
  54. const factory ViewEvent.rename(String newName) = Rename;
  55. const factory ViewEvent.delete() = Delete;
  56. const factory ViewEvent.viewDidUpdate(Either<View, WorkspaceError> result) = ViewDidUpdate;
  57. }
  58. @freezed
  59. class ViewState with _$ViewState {
  60. const factory ViewState({
  61. required View view,
  62. required bool isEditing,
  63. required Either<Unit, WorkspaceError> successOrFailure,
  64. }) = _ViewState;
  65. factory ViewState.init(View view) => ViewState(
  66. view: view,
  67. isEditing: false,
  68. successOrFailure: left(unit),
  69. );
  70. }