grid_bloc.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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 'grid_service.dart';
  9. part 'grid_bloc.freezed.dart';
  10. class GridBloc extends Bloc<GridEvent, GridState> {
  11. final GridService service;
  12. final View view;
  13. late Grid? _grid;
  14. late List<Field>? _fields;
  15. GridBloc({required this.view, required this.service}) : super(GridState.initial()) {
  16. on<GridEvent>(
  17. (event, emit) async {
  18. await event.map(
  19. initial: (Initial value) async {
  20. await _loadGrid(emit);
  21. await _loadFields(emit);
  22. await _loadGridInfo(emit);
  23. },
  24. createRow: (_CreateRow value) {
  25. service.createRow(gridId: view.id);
  26. },
  27. delete: (_Delete value) {},
  28. rename: (_Rename value) {},
  29. updateDesc: (_Desc value) {},
  30. );
  31. },
  32. );
  33. }
  34. @override
  35. Future<void> close() async {
  36. return super.close();
  37. }
  38. Future<void> _loadGrid(Emitter<GridState> emit) async {
  39. final result = await service.openGrid(gridId: view.id);
  40. result.fold(
  41. (grid) {
  42. _grid = grid;
  43. },
  44. (err) {
  45. emit(state.copyWith(loadingState: GridLoadingState.finish(right(err))));
  46. },
  47. );
  48. }
  49. Future<void> _loadFields(Emitter<GridState> emit) async {
  50. if (_grid != null) {
  51. final result = await service.getFields(fieldOrders: _grid!.fieldOrders);
  52. result.fold(
  53. (fields) {
  54. _fields = fields.items;
  55. },
  56. (err) {
  57. emit(state.copyWith(loadingState: GridLoadingState.finish(right(err))));
  58. },
  59. );
  60. }
  61. }
  62. Future<void> _loadGridInfo(Emitter<GridState> emit) async {
  63. if (_grid != null && _fields != null) {
  64. final result = await service.getRows(rowOrders: _grid!.rowOrders);
  65. result.fold((repeatedRow) {
  66. final rows = repeatedRow.items;
  67. final gridInfo = GridInfo(rows: rows, fields: _fields!);
  68. emit(
  69. state.copyWith(loadingState: GridLoadingState.finish(left(unit)), gridInfo: some(left(gridInfo))),
  70. );
  71. }, (err) {
  72. emit(
  73. state.copyWith(loadingState: GridLoadingState.finish(right(err)), gridInfo: none()),
  74. );
  75. });
  76. }
  77. }
  78. }
  79. @freezed
  80. abstract class GridEvent with _$GridEvent {
  81. const factory GridEvent.initial() = Initial;
  82. const factory GridEvent.rename(String gridId, String name) = _Rename;
  83. const factory GridEvent.updateDesc(String gridId, String desc) = _Desc;
  84. const factory GridEvent.delete(String gridId) = _Delete;
  85. const factory GridEvent.createRow() = _CreateRow;
  86. }
  87. @freezed
  88. abstract class GridState with _$GridState {
  89. const factory GridState({
  90. required GridLoadingState loadingState,
  91. required Option<Either<GridInfo, FlowyError>> gridInfo,
  92. }) = _GridState;
  93. factory GridState.initial() => GridState(
  94. loadingState: const _Loading(),
  95. gridInfo: none(),
  96. );
  97. }
  98. @freezed
  99. class GridLoadingState with _$GridLoadingState {
  100. const factory GridLoadingState.loading() = _Loading;
  101. const factory GridLoadingState.finish(Either<Unit, FlowyError> successOrFail) = _Finish;
  102. }
  103. class GridInfo {
  104. List<GridRow> rows;
  105. List<Field> fields;
  106. GridInfo({
  107. required this.rows,
  108. required this.fields,
  109. });
  110. RowInfo rowInfoAtIndex(int index) {
  111. final row = rows[index];
  112. return RowInfo(
  113. fields: fields,
  114. cellMap: row.cellByFieldId,
  115. );
  116. }
  117. int numberOfRows() {
  118. return rows.length;
  119. }
  120. }
  121. class RowInfo {
  122. List<Field> fields;
  123. Map<String, GridCell> cellMap;
  124. RowInfo({
  125. required this.fields,
  126. required this.cellMap,
  127. });
  128. }