grid_bloc.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import 'dart:async';
  2. import 'package:dartz/dartz.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-grid-data-model/protobuf.dart';
  6. import 'package:flutter_bloc/flutter_bloc.dart';
  7. import 'package:freezed_annotation/freezed_annotation.dart';
  8. import 'data.dart';
  9. import 'grid_service.dart';
  10. part 'grid_bloc.freezed.dart';
  11. class GridBloc extends Bloc<GridEvent, GridState> {
  12. final GridService service;
  13. final View view;
  14. Grid? _grid;
  15. List<Field>? _fields;
  16. GridBloc({required this.view, required this.service}) : super(GridState.initial()) {
  17. on<GridEvent>(
  18. (event, emit) async {
  19. await event.map(
  20. initial: (InitialGrid value) async {
  21. await _loadGrid(emit);
  22. await _loadFields(emit);
  23. await _loadGridInfo(emit);
  24. },
  25. createRow: (_CreateRow value) {
  26. service.createRow(gridId: view.id);
  27. },
  28. delete: (_Delete value) {},
  29. rename: (_Rename value) {},
  30. updateDesc: (_Desc value) {},
  31. );
  32. },
  33. );
  34. }
  35. @override
  36. Future<void> close() async {
  37. return super.close();
  38. }
  39. Future<void> _loadGrid(Emitter<GridState> emit) async {
  40. final result = await service.openGrid(gridId: view.id);
  41. result.fold(
  42. (grid) {
  43. _grid = grid;
  44. },
  45. (err) {
  46. emit(state.copyWith(loadingState: GridLoadingState.finish(right(err))));
  47. },
  48. );
  49. }
  50. Future<void> _loadFields(Emitter<GridState> emit) async {
  51. if (_grid != null) {
  52. final result = await service.getFields(gridId: _grid!.id, fieldOrders: _grid!.fieldOrders);
  53. result.fold(
  54. (fields) {
  55. _fields = fields.items;
  56. },
  57. (err) {
  58. emit(state.copyWith(loadingState: GridLoadingState.finish(right(err))));
  59. },
  60. );
  61. }
  62. }
  63. Future<void> _loadGridInfo(Emitter<GridState> emit) async {
  64. if (_grid != null && _fields != null) {
  65. final result = await service.getRows(gridId: _grid!.id, rowOrders: _grid!.rowOrders);
  66. result.fold((repeatedRow) {
  67. final rows = repeatedRow.items;
  68. final gridInfo = GridInfo(rows: rows, fields: _fields!);
  69. emit(
  70. state.copyWith(loadingState: GridLoadingState.finish(left(unit)), gridInfo: some(left(gridInfo))),
  71. );
  72. }, (err) {
  73. emit(
  74. state.copyWith(loadingState: GridLoadingState.finish(right(err)), gridInfo: none()),
  75. );
  76. });
  77. }
  78. }
  79. }
  80. @freezed
  81. abstract class GridEvent with _$GridEvent {
  82. const factory GridEvent.initial() = InitialGrid;
  83. const factory GridEvent.rename(String gridId, String name) = _Rename;
  84. const factory GridEvent.updateDesc(String gridId, String desc) = _Desc;
  85. const factory GridEvent.delete(String gridId) = _Delete;
  86. const factory GridEvent.createRow() = _CreateRow;
  87. }
  88. @freezed
  89. abstract class GridState with _$GridState {
  90. const factory GridState({
  91. required GridLoadingState loadingState,
  92. required Option<Either<GridInfo, FlowyError>> gridInfo,
  93. }) = _GridState;
  94. factory GridState.initial() => GridState(
  95. loadingState: const _Loading(),
  96. gridInfo: none(),
  97. );
  98. }
  99. @freezed
  100. class GridLoadingState with _$GridLoadingState {
  101. const factory GridLoadingState.loading() = _Loading;
  102. const factory GridLoadingState.finish(Either<Unit, FlowyError> successOrFail) = _Finish;
  103. }