view_bloc.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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-data-model/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 View 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. // TODO: Listener can be refactored to a stream.
  22. listener.updatedNotifier.addPublishListener((result) {
  23. // emit.forEach(stream, onData: onData)
  24. add(ViewEvent.viewDidUpdate(result));
  25. });
  26. listener.start();
  27. emit(state);
  28. },
  29. setIsEditing: (e) {
  30. emit(state.copyWith(isEditing: e.isEditing));
  31. },
  32. viewDidUpdate: (e) {
  33. e.result.fold(
  34. (view) =>
  35. emit(state.copyWith(view: view, successOrFailure: left(unit))),
  36. (error) => emit(state.copyWith(successOrFailure: right(error))),
  37. );
  38. },
  39. rename: (e) async {
  40. final result =
  41. await service.updateView(viewId: view.id, name: e.newName);
  42. emit(
  43. result.fold(
  44. (l) => state.copyWith(successOrFailure: left(unit)),
  45. (error) => state.copyWith(successOrFailure: right(error)),
  46. ),
  47. );
  48. },
  49. delete: (e) async {
  50. final result = await service.delete(viewId: view.id);
  51. await service.updateView(viewId: view.id);
  52. emit(
  53. result.fold(
  54. (l) => state.copyWith(successOrFailure: left(unit)),
  55. (error) => state.copyWith(successOrFailure: right(error)),
  56. ),
  57. );
  58. },
  59. duplicate: (e) async {
  60. final result = await service.duplicate(viewId: view.id);
  61. emit(
  62. result.fold(
  63. (l) => state.copyWith(successOrFailure: left(unit)),
  64. (error) => state.copyWith(successOrFailure: right(error)),
  65. ),
  66. );
  67. },
  68. );
  69. });
  70. }
  71. @override
  72. Future<void> close() async {
  73. await listener.close();
  74. return super.close();
  75. }
  76. }
  77. @freezed
  78. class ViewEvent with _$ViewEvent {
  79. const factory ViewEvent.initial() = Initial;
  80. const factory ViewEvent.setIsEditing(bool isEditing) = SetEditing;
  81. const factory ViewEvent.rename(String newName) = Rename;
  82. const factory ViewEvent.delete() = Delete;
  83. const factory ViewEvent.duplicate() = Duplicate;
  84. const factory ViewEvent.viewDidUpdate(Either<View, FlowyError> result) =
  85. ViewDidUpdate;
  86. }
  87. @freezed
  88. class ViewState with _$ViewState {
  89. const factory ViewState({
  90. required View view,
  91. required bool isEditing,
  92. required Either<Unit, FlowyError> successOrFailure,
  93. }) = _ViewState;
  94. factory ViewState.init(View view) => ViewState(
  95. view: view,
  96. isEditing: false,
  97. successOrFailure: left(unit),
  98. );
  99. }