You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.8KB

  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:farm_tpf/custom_model/NotificationDTO.dart';
  5. import 'package:farm_tpf/custom_model/NotificationObjectDTO.dart';
  6. import 'package:farm_tpf/custom_model/UpdateNoti.dart';
  7. import 'package:farm_tpf/data/api/app_exception.dart';
  8. import 'package:farm_tpf/data/repository/repository.dart';
  9. import 'package:farm_tpf/utils/const_string.dart';
  10. import 'package:meta/meta.dart';
  11. part 'noti_event.dart';
  12. part 'noti_state.dart';
  13. class NotiBloc extends Bloc<NotiEvent, NotiState> {
  14. final Repository repository;
  15. NotiBloc({@required this.repository}) : super(NotiInitial());
  16. static int pageSize = 20;
  17. @override
  18. Stream<NotiState> mapEventToState(
  19. NotiEvent event,
  20. ) async* {
  21. if (event is DataFetched &&
  22. !(state is NotiSuccess && (state as NotiSuccess).hasReachedMax)) {
  23. try {
  24. if (state is NotiInitial) {
  25. yield NotiLoadding();
  26. final response =
  27. await repository.getNotifications(page: 0, size: pageSize);
  28. yield NotiSuccess(
  29. unread: response.numberUnreadTotal,
  30. read: response.numberReadTotal,
  31. items: response.notificationDTO,
  32. page: 0,
  33. hasReachedMax:
  34. response.notificationDTO.length < pageSize ? true : false);
  35. }
  36. if (state is NotiSuccess) {
  37. final currentState = state as NotiSuccess;
  38. int page = currentState.page + 1;
  39. final response =
  40. await repository.getNotifications(page: page, size: pageSize);
  41. yield response.notificationDTO.isEmpty
  42. ? currentState.copyWith(hasReachedMax: true)
  43. : NotiSuccess(
  44. unread: response.numberUnreadTotal,
  45. read: response.numberReadTotal,
  46. items: currentState.items + response.notificationDTO,
  47. page: currentState.page + 1,
  48. hasReachedMax: false);
  49. }
  50. } catch (e) {
  51. yield NotiFailure(errorString: AppException.handleError(e));
  52. }
  53. }
  54. if (event is OnRefresh) {
  55. yield NotiLoadding();
  56. try {
  57. final response =
  58. await repository.getNotifications(page: 0, size: pageSize);
  59. List<NotificationDTO> items = new List<NotificationDTO>();
  60. response.notificationDTO
  61. .forEach((e) => items.add(NotificationDTO.clone(e)));
  62. yield NotiSuccess(
  63. unread: response.numberUnreadTotal,
  64. read: response.numberReadTotal,
  65. items: items,
  66. page: 0,
  67. hasReachedMax:
  68. response.notificationDTO.length < pageSize ? true : false);
  69. } catch (e) {
  70. yield NotiFailure(errorString: AppException.handleError(e));
  71. }
  72. }
  73. if (event is OnUpdate) {
  74. yield NotiLoadding();
  75. try {
  76. //Change status notification if mark read
  77. if (event.currentItemId != null) {
  78. var updateNoti = UpdateNoti()
  79. ..id = event.currentItemId
  80. ..isRead = 1;
  81. await repository.updateNoti(updateNoti);
  82. }
  83. yield NotiSuccess(
  84. unread: event.unread,
  85. read: event.read,
  86. items: event.currentItems,
  87. page: event.currentPage,
  88. hasReachedMax: event.hasReachedMax);
  89. } catch (e) {
  90. yield NotiFailure(errorString: exception_common);
  91. }
  92. } else if (event is MarkAllNotificationUpdate) {
  93. yield NotiLoadding();
  94. try {
  95. await repository.updateAllNotification(event.status);
  96. final response =
  97. await repository.getNotifications(page: 0, size: pageSize);
  98. List<NotificationDTO> items = new List<NotificationDTO>();
  99. response.notificationDTO
  100. .forEach((e) => items.add(NotificationDTO.clone(e)));
  101. yield NotiSuccess(
  102. unread: response.numberUnreadTotal,
  103. read: response.numberReadTotal,
  104. items: items,
  105. page: 0,
  106. hasReachedMax:
  107. response.notificationDTO.length < pageSize ? true : false);
  108. } catch (e) {
  109. yield NotiFailure(errorString: exception_common);
  110. }
  111. } else if (event is ReceiveDataFromSocket) {
  112. List<NotificationDTO> updatedItems = new List<NotificationDTO>();
  113. event.updatedItemObject.notificationDTO.forEach((e) {
  114. updatedItems.add(NotificationDTO.clone(e));
  115. });
  116. event.currentItems.forEach((e) {
  117. updatedItems.add(NotificationDTO.clone(e));
  118. });
  119. yield NotiSuccess(
  120. unread: event.updatedItemObject.numberUnreadTotal,
  121. read: event.updatedItemObject.numberReadTotal,
  122. items: updatedItems,
  123. page: event.page,
  124. hasReachedMax: updatedItems.length < pageSize ? true : false);
  125. }
  126. }
  127. }