menu_watch.dart 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import 'package:app_flowy/workspace/domain/i_workspace.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:freezed_annotation/freezed_annotation.dart';
  6. import 'package:flutter_bloc/flutter_bloc.dart';
  7. import 'package:dartz/dartz.dart';
  8. part 'menu_watch.freezed.dart';
  9. class MenuWatchBloc extends Bloc<MenuWatchEvent, MenuWatchState> {
  10. final IWorkspaceWatch watcher;
  11. MenuWatchBloc(this.watcher) : super(const MenuWatchState.initial());
  12. @override
  13. Stream<MenuWatchState> mapEventToState(MenuWatchEvent event) async* {
  14. yield* event.map(
  15. started: (_) async* {
  16. watcher.startWatching(
  17. addAppCallback: (appsOrFail) => _handleAppsOrFail(appsOrFail),
  18. );
  19. },
  20. appsReceived: (e) async* {
  21. yield e.appsOrFail.fold(
  22. (apps) => MenuWatchState.loadApps(apps),
  23. (error) => MenuWatchState.loadFail(error),
  24. );
  25. },
  26. );
  27. }
  28. @override
  29. Future<void> close() async {
  30. await watcher.stopWatching();
  31. return super.close();
  32. }
  33. void _handleAppsOrFail(Either<List<App>, WorkspaceError> appsOrFail) {
  34. appsOrFail.fold(
  35. (apps) => add(MenuWatchEvent.appsReceived(left(apps))),
  36. (error) => add(MenuWatchEvent.appsReceived(right(error))),
  37. );
  38. }
  39. }
  40. @freezed
  41. abstract class MenuWatchEvent with _$MenuWatchEvent {
  42. const factory MenuWatchEvent.started() = _Started;
  43. const factory MenuWatchEvent.appsReceived(
  44. Either<List<App>, WorkspaceError> appsOrFail) = AppsReceived;
  45. }
  46. @freezed
  47. abstract class MenuWatchState with _$MenuWatchState {
  48. const factory MenuWatchState.initial() = _Initial;
  49. const factory MenuWatchState.loadApps(
  50. List<App> apps,
  51. ) = _LoadApps;
  52. const factory MenuWatchState.loadFail(
  53. WorkspaceError error,
  54. ) = _LoadFail;
  55. }