menu_watch.dart 1.9 KB

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