view_bloc.dart 3.2 KB

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