calendar_bloc.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
  2. import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
  3. import 'package:appflowy_backend/log.dart';
  4. import 'package:appflowy_backend/protobuf/flowy-error/protobuf.dart';
  5. import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
  6. import 'package:appflowy_backend/protobuf/flowy-database/protobuf.dart';
  7. import 'package:calendar_view/calendar_view.dart';
  8. import 'package:dartz/dartz.dart';
  9. import 'package:flutter_bloc/flutter_bloc.dart';
  10. import 'package:freezed_annotation/freezed_annotation.dart';
  11. import 'calendar_data_controller.dart';
  12. part 'calendar_bloc.freezed.dart';
  13. class CalendarBloc extends Bloc<CalendarEvent, CalendarState> {
  14. final CalendarDataController _databaseDataController;
  15. final EventController calendarEventsController = EventController();
  16. GridFieldController get fieldController =>
  17. _databaseDataController.fieldController;
  18. String get databaseId => _databaseDataController.databaseId;
  19. CalendarBloc({required ViewPB view})
  20. : _databaseDataController = CalendarDataController(view: view),
  21. super(CalendarState.initial(view.id)) {
  22. on<CalendarEvent>(
  23. (event, emit) async {
  24. await event.when(
  25. initial: () async {
  26. _startListening();
  27. await _openDatabase(emit);
  28. },
  29. didReceiveCalendarSettings: (CalendarSettingsPB settings) {
  30. emit(state.copyWith(settings: Some(settings)));
  31. },
  32. didReceiveDatabaseUpdate: (DatabasePB database) {
  33. emit(state.copyWith(database: Some(database)));
  34. },
  35. didReceiveError: (FlowyError error) {
  36. emit(state.copyWith(noneOrError: Some(error)));
  37. },
  38. );
  39. },
  40. );
  41. }
  42. Future<void> _openDatabase(Emitter<CalendarState> emit) async {
  43. final result = await _databaseDataController.openDatabase();
  44. result.fold(
  45. (database) => emit(
  46. state.copyWith(loadingState: DatabaseLoadingState.finish(left(unit))),
  47. ),
  48. (err) => emit(
  49. state.copyWith(loadingState: DatabaseLoadingState.finish(right(err))),
  50. ),
  51. );
  52. }
  53. GridRowCache? getRowCache(String blockId) {
  54. return _databaseDataController.rowCache;
  55. }
  56. void _startListening() {
  57. _databaseDataController.addListener(
  58. onDatabaseChanged: (database) {
  59. if (!isClosed) return;
  60. add(CalendarEvent.didReceiveDatabaseUpdate(database));
  61. },
  62. onSettingsChanged: (CalendarSettingsPB settings) {
  63. if (isClosed) return;
  64. add(CalendarEvent.didReceiveCalendarSettings(settings));
  65. },
  66. onArrangeWithNewField: (field) {
  67. if (isClosed) return;
  68. _initializeEvents(field);
  69. // add(CalendarEvent.)
  70. },
  71. onError: (err) {
  72. Log.error(err);
  73. },
  74. );
  75. }
  76. void _initializeEvents(FieldPB dateField) {
  77. calendarEventsController.removeWhere((element) => true);
  78. const events = <CalendarEventData<CalendarData>>[];
  79. // final List<CalendarEventData<CalendarData>> events = rows.map((row) {
  80. // final event = CalendarEventData(
  81. // title: "",
  82. // date: row -> dateField -> value,
  83. // event: row,
  84. // );
  85. // return event;
  86. // }).toList();
  87. calendarEventsController.addAll(events);
  88. }
  89. }
  90. @freezed
  91. class CalendarEvent with _$CalendarEvent {
  92. const factory CalendarEvent.initial() = _InitialCalendar;
  93. const factory CalendarEvent.didReceiveCalendarSettings(
  94. CalendarSettingsPB settings) = _DidReceiveCalendarSettings;
  95. const factory CalendarEvent.didReceiveError(FlowyError error) =
  96. _DidReceiveError;
  97. const factory CalendarEvent.didReceiveDatabaseUpdate(DatabasePB database) =
  98. _DidReceiveDatabaseUpdate;
  99. }
  100. @freezed
  101. class CalendarState with _$CalendarState {
  102. const factory CalendarState({
  103. required String databaseId,
  104. required Option<DatabasePB> database,
  105. required Option<FieldPB> dateField,
  106. required Option<List<RowInfo>> unscheduledRows,
  107. required Option<CalendarSettingsPB> settings,
  108. required DatabaseLoadingState loadingState,
  109. required Option<FlowyError> noneOrError,
  110. }) = _CalendarState;
  111. factory CalendarState.initial(String databaseId) => CalendarState(
  112. database: none(),
  113. databaseId: databaseId,
  114. dateField: none(),
  115. unscheduledRows: none(),
  116. settings: none(),
  117. noneOrError: none(),
  118. loadingState: const _Loading(),
  119. );
  120. }
  121. @freezed
  122. class DatabaseLoadingState with _$DatabaseLoadingState {
  123. const factory DatabaseLoadingState.loading() = _Loading;
  124. const factory DatabaseLoadingState.finish(
  125. Either<Unit, FlowyError> successOrFail) = _Finish;
  126. }
  127. class CalendarEditingRow {
  128. RowPB row;
  129. int? index;
  130. CalendarEditingRow({
  131. required this.row,
  132. required this.index,
  133. });
  134. }
  135. class CalendarData {
  136. final RowInfo rowInfo;
  137. CalendarData(this.rowInfo);
  138. }