view_bloc.dart 3.1 KB

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