app_watch_bloc.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import 'package:app_flowy/workspace/domain/i_app.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  4. import 'package:freezed_annotation/freezed_annotation.dart';
  5. import 'package:flutter_bloc/flutter_bloc.dart';
  6. import 'package:dartz/dartz.dart';
  7. part 'app_watch_bloc.freezed.dart';
  8. class AppWatchBloc extends Bloc<AppWatchEvent, AppWatchState> {
  9. final IAppWatch watcher;
  10. AppWatchBloc(this.watcher) : super(const AppWatchState.initial());
  11. @override
  12. Stream<AppWatchState> mapEventToState(
  13. AppWatchEvent event,
  14. ) async* {
  15. yield* event.map(started: (_) async* {
  16. watcher.startWatching(
  17. addViewCallback: (viewsOrFail) => _handleViewsOrFail(viewsOrFail),
  18. );
  19. }, viewsReceived: (ViewsReceived value) async* {
  20. yield value.viewsOrFail.fold(
  21. (views) => AppWatchState.loadViews(views),
  22. (error) => AppWatchState.loadFail(error),
  23. );
  24. });
  25. }
  26. void _handleViewsOrFail(Either<List<View>, WorkspaceError> viewsOrFail) {
  27. viewsOrFail.fold(
  28. (views) => add(AppWatchEvent.viewsReceived(left(views))),
  29. (error) => add(AppWatchEvent.viewsReceived(right(error))),
  30. );
  31. }
  32. }
  33. @freezed
  34. class AppWatchEvent with _$AppWatchEvent {
  35. const factory AppWatchEvent.started() = _Started;
  36. const factory AppWatchEvent.viewsReceived(
  37. Either<List<View>, WorkspaceError> viewsOrFail) = ViewsReceived;
  38. }
  39. @freezed
  40. class AppWatchState with _$AppWatchState {
  41. const factory AppWatchState.initial() = _Initial;
  42. const factory AppWatchState.loadViews(
  43. List<View> views,
  44. ) = _LoadViews;
  45. const factory AppWatchState.loadFail(
  46. WorkspaceError error,
  47. ) = _LoadFail;
  48. }