view_bloc.dart 3.1 KB

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