menu_bloc.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'dart:async';
  2. import 'package:app_flowy/workspace/domain/i_workspace.dart';
  3. import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
  4. import 'package:dartz/dartz.dart';
  5. import 'package:flowy_log/flowy_log.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-workspace/app_create.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:freezed_annotation/freezed_annotation.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. part 'menu_bloc.freezed.dart';
  12. class MenuBloc extends Bloc<MenuEvent, MenuState> {
  13. final IWorkspace workspace;
  14. MenuBloc(this.workspace) : super(MenuState.initial());
  15. @override
  16. Stream<MenuState> mapEventToState(
  17. MenuEvent event,
  18. ) async* {
  19. yield* event.map(
  20. initial: (value) async* {
  21. yield* _fetchApps();
  22. },
  23. collapse: (e) async* {
  24. final isCollapse = state.isCollapse;
  25. yield state.copyWith(isCollapse: !isCollapse);
  26. },
  27. openPage: (OpenPage e) async* {
  28. yield* _performActionOnOpenPage(e);
  29. },
  30. createApp: (CreateApp event) async* {
  31. yield* _performActionOnCreateApp(event);
  32. },
  33. );
  34. }
  35. Stream<MenuState> _performActionOnOpenPage(OpenPage e) async* {
  36. yield state.copyWith(stackView: e.stackView);
  37. }
  38. Stream<MenuState> _performActionOnCreateApp(CreateApp event) async* {
  39. final result =
  40. await workspace.createApp(name: event.name, desc: event.desc);
  41. yield result.fold(
  42. (app) => state.copyWith(apps: some([app])),
  43. (error) {
  44. Log.error(error);
  45. return state.copyWith(successOrFailure: right(error));
  46. },
  47. );
  48. }
  49. // ignore: unused_element
  50. Stream<MenuState> _fetchApps() async* {
  51. final appsOrFail = await workspace.getApps();
  52. yield appsOrFail.fold(
  53. (apps) => state.copyWith(apps: some(apps)),
  54. (error) {
  55. Log.error(error);
  56. return state.copyWith(successOrFailure: right(error));
  57. },
  58. );
  59. }
  60. }
  61. @freezed
  62. class MenuEvent with _$MenuEvent {
  63. const factory MenuEvent.initial() = _Initial;
  64. const factory MenuEvent.collapse() = Collapse;
  65. const factory MenuEvent.openPage(HomeStackView stackView) = OpenPage;
  66. const factory MenuEvent.createApp(String name, {String? desc}) = CreateApp;
  67. }
  68. @freezed
  69. class MenuState with _$MenuState {
  70. const factory MenuState({
  71. required bool isCollapse,
  72. required Option<List<App>> apps,
  73. required Either<Unit, WorkspaceError> successOrFailure,
  74. HomeStackView? stackView,
  75. }) = _MenuState;
  76. factory MenuState.initial() => MenuState(
  77. isCollapse: false,
  78. apps: none(),
  79. successOrFailure: left(unit),
  80. );
  81. }