history.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import 'dart:convert';
  2. import 'package:easy_localization/easy_localization.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:provider/provider.dart';
  5. import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
  6. import 'package:telnow_mobile_new/src/api/jwt_token.dart';
  7. import 'package:telnow_mobile_new/src/injector/injector.dart';
  8. import 'package:telnow_mobile_new/src/layouts/mobile/request_create.dart';
  9. import 'package:telnow_mobile_new/src/layouts/web/request_create.dart';
  10. import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
  11. import 'package:telnow_mobile_new/src/utils/U.dart';
  12. import 'package:telnow_mobile_new/src/utils/cache_manager.dart';
  13. import 'package:telnow_mobile_new/src/utils/provider.dart';
  14. import 'package:telnow_mobile_new/src/utils/ui_service.dart';
  15. enum HistoryTab {
  16. ongoing,
  17. done;
  18. List get filters {
  19. switch(this){
  20. case HistoryTab.ongoing:
  21. return [
  22. {'title': 'stateQueue'.tr(), 'value': 'queue', 'filter': '{"or":[{"f":["currentState","EQ","DIANTRIKAN"]},{"f":["currentState","EQ","DIPROSES"]}]}'},
  23. {'title': 'stateDone'.tr(), 'value': 'done', 'filter': '{"f":["currentState","EQ","DIMULAI"]}'},
  24. {'title': 'hold'.tr(), 'value': 'hold', 'filter': '{"f":["currentState","EQ","HOLD"]}'}
  25. ];
  26. case HistoryTab.done:
  27. return [
  28. {'title': 'stateFinish'.tr(), 'value': 'finish', 'filter': '{"or":[{"f":["currentState","EQ","DISELESAIKAN"]},{"f":["currentState","EQ","TUNTAS"]}]}'},
  29. {'title': 'stateCancel'.tr(), 'value': 'cancel', 'filter': '{"f":["currentState","EQ","DIBATALKAN"]}'}
  30. ];
  31. }
  32. }
  33. }
  34. class HistoryFunction{
  35. final JwtToken token = JwtToken();
  36. final ApiAuthProvider apiAuthProvider = ApiAuthProvider();
  37. final SharedPreferencesManager sharedPreferencesManager = locator<SharedPreferencesManager>();
  38. final BuildContext context = UIService.context!;
  39. late final HistoryModule historyModule = Provider.of<HistoryModule>(context, listen: false);
  40. late final UserModule userModule = Provider.of<UserModule>(context, listen: false);
  41. List filterList = [
  42. {'title': 'stateQueue'.tr(), 'value': 1, 'filter': '{"or":[{"f":["currentState","EQ","DIANTRIKAN"]},{"f":["currentState","EQ","DIPROSES"]}]}'},
  43. {'title': 'stateDone'.tr(), 'value': 2, 'filter': '{"f":["currentState","EQ","DIMULAI"]}'},
  44. {'title': 'hold'.tr(), 'value': 3, 'filter': '{"f":["currentState","EQ","HOLD"]}'},
  45. {'title': 'stateFinish'.tr(), 'value': 4, 'filter': '{"or":[{"f":["currentState","EQ","DISELESAIKAN"]},{"f":["currentState","EQ","TUNTAS"]}]}'},
  46. {'title': 'stateCancel'.tr(), 'value': 5, 'filter': '{"f":["currentState","EQ","DIBATALKAN"]}'}
  47. ];
  48. List doneList = [
  49. {'title': 'stateFinish'.tr(), 'value': 4, 'filter': '{"or":[{"f":["currentState","EQ","DISELESAIKAN"]},{"f":["currentState","EQ","TUNTAS"]}]}'},
  50. {'title': 'stateCancel'.tr(), 'value': 5, 'filter': '{"f":["currentState","EQ","DIBATALKAN"]}'},
  51. ];
  52. List ongoingList = [
  53. {'title': 'stateQueue'.tr(), 'value': 1, 'filter': '{"or":[{"f":["currentState","EQ","DIANTRIKAN"]},{"f":["currentState","EQ","DIPROSES"]}]}'},
  54. {'title': 'stateDone'.tr(), 'value': 2, 'filter': '{"f":["currentState","EQ","DIMULAI"]}'},
  55. {'title': 'hold'.tr(), 'value': 3, 'filter': '{"f":["currentState","EQ","HOLD"]}'},
  56. ];
  57. getActiveForum({bool loadAfterAction = false}) async {
  58. try {
  59. String urlForum = '/api/notifications/search/forumNotification';
  60. var val = await CacheMan.readData(urlForum);
  61. if (val != null) {
  62. historyModule.setActiveForum(val['data']);
  63. }
  64. var data = await apiAuthProvider.getData(urlForum, null);
  65. if (data != null) {
  66. historyModule.setActiveForum(data);
  67. CacheMan.writeData(urlForum, data);
  68. }
  69. // kayaknya ga guna getUser disini. 031125
  70. // getUser();
  71. } catch (e) {
  72. debugPrint(e.toString());
  73. }
  74. }
  75. getUser() async {
  76. try {
  77. var res = await token.getUserData();
  78. if (res != null) {
  79. userModule.setList(res);
  80. // dipindah di event onRefresh, paralel sama get notifForum. 031125
  81. // getMission();
  82. } else {
  83. userModule.setResetData(true);
  84. }
  85. } catch (e) {
  86. userModule.setResetData(true);
  87. }
  88. }
  89. getMission() async {
  90. HistoryTab tab = historyModule.activeTab();
  91. List filters = tab.filters;
  92. String selectedFilter = historyModule.selectedFilter();
  93. String state = '${tab.name}::$selectedFilter';
  94. try {
  95. // debugPrint('historyModule.isLoadHistory(state: state): ${historyModule.isLoadHistory(state: state)}');
  96. if (!historyModule.isLoadHistory(state: state) && !historyModule.stopLoadHistory()) {
  97. historyModule.setLoadHistory(true, state);
  98. var sort = ['datetimeRequest,desc'];
  99. String filter;
  100. // If no selected filter button, use default filter;
  101. if(selectedFilter == 'none'){
  102. if(historyModule.activeTab().name == "done"){
  103. filter = '{"or":[{"f":["currentState","EQ","DISELESAIKAN"]},{"f":["currentState","EQ","TUNTAS"]},{"f":["currentState","EQ","DIBATALKAN"]}]}';
  104. } else {
  105. filter = '{"or":[{"f":["currentState","EQ","DIANTRIKAN"]},{"f":["currentState","EQ","DIPROSES"]},{"f":["currentState","EQ","DIMULAI"]}]}';
  106. }
  107. } else {
  108. filter = filters.firstWhere((f) => f['value'] == selectedFilter)['filter'];
  109. }
  110. // If no internet connection and selected status is On going and filter button is Queued, display pending data.
  111. if(historyModule.activeTab().name == "ongoing" && (selectedFilter == 'none' || selectedFilter == 'queue') && U.newServerVersion(1709864293) && !U.getInternetStatus()){
  112. List pendingList = sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyPendingData)!?jsonDecode(sharedPreferencesManager.getString(SharedPreferencesManager.keyPendingData)!):[];
  113. historyModule.setPendingData(pendingList);
  114. }
  115. String url = '/api/requestHistories/search/myReqHistory';
  116. String key = url + filter;
  117. var val = await CacheMan.readData(key);
  118. if (val != null && historyModule.page() == 0) {
  119. historyModule.setDataRequests(state, val['data']);
  120. }
  121. var mission = await apiAuthProvider.getData(url, {'size': '30', 'page': historyModule.page().toString(), 'sort': sort, 'filter': filter});
  122. if (mission != null){
  123. // debugPrint("Cek tekan kene!!");
  124. historyModule.setLoadHistory(false, state);
  125. List tempData = [];
  126. if (mission.containsKey('_embedded')) {
  127. // debugPrint('Balikan data: ${mission['_embedded']['requestHistories'].length}');
  128. for (int i = 0; i < mission['_embedded']['requestHistories'].length; i++) {
  129. var isFrm = false;
  130. String id = "";
  131. String msg = "";
  132. historyModule.activeForum().forEach((el) {
  133. if (el['ticketId'] == mission['_embedded']['requestHistories'][i]['ticketNo']) {
  134. id = el['id'];
  135. msg = el['desc'];
  136. }
  137. });
  138. if (id != "") isFrm = true;
  139. mission['_embedded']['requestHistories'][i]['_hasForum'] = isFrm;
  140. mission['_embedded']['requestHistories'][i]['_forumId'] = id;
  141. mission['_embedded']['requestHistories'][i]['_forumMsg'] = msg;
  142. tempData.add(mission['_embedded']['requestHistories'][i]);
  143. }
  144. }
  145. // debugPrint('Filter Index: ${indexFilterSelected} & Filter: $filter');
  146. // historyModule.setLoadHistory(false);
  147. if (tempData.isEmpty) {
  148. historyModule.setStopLoadHistory(true);
  149. historyModule.clearDataRequests();
  150. CacheMan.writeData(key, tempData);
  151. } else {
  152. if (historyModule.page() == 0) {
  153. CacheMan.writeData(key, tempData);
  154. historyModule.clearDataRequests();
  155. }
  156. historyModule.addPage();
  157. }
  158. historyModule.setDataRequests(state, tempData);
  159. if (historyModule.getMisiLength() >= mission['page']['totalElements']) {
  160. historyModule.setStopLoadHistory(true);
  161. }
  162. } else {
  163. historyModule.setLoadHistory(false, state);
  164. historyModule.setStopLoadHistory(true);
  165. }
  166. }
  167. } catch (e) {
  168. debugPrint(e.toString());
  169. }
  170. }
  171. onRefresh() async {
  172. historyModule.setCurrentPage();
  173. historyModule.clearDataRequests();
  174. historyModule.setPendingData([]);
  175. historyModule.setActiveForum([]);
  176. historyModule.setSelectedIndexes([]);
  177. historyModule.setMultiSelectMode(false);
  178. historyModule.setStopLoadHistory(false);
  179. historyModule.setPage(0);
  180. getMission();
  181. getActiveForum();
  182. }
  183. bool askForRate(list) {
  184. if (list['satisfactionRate'] == 0 && list['servantGroup'] != "#autoresponse") {
  185. return true;
  186. }
  187. return false;
  188. }
  189. bool isAutoResponse(list) {
  190. if (list['servantGroup'] == "#autoresponse") {
  191. return true;
  192. }
  193. return false;
  194. }
  195. selectedController(BuildContext context, i) {
  196. if (historyModule.selectedIndexes().contains(i)) {
  197. historyModule.removeSelectedIndexes(i);
  198. } else {
  199. historyModule.addSelectedIndexes(i);
  200. }
  201. historyModule.setMultiSelectMode(historyModule.selectedIndexes().isEmpty ? false : true);
  202. }
  203. deleteData(BuildContext context) {
  204. showDialog(
  205. context: context,
  206. builder: (BuildContext contextt) {
  207. return AlertDialog(
  208. title: Text("deleteHistory".tr(), style: TextStyle(fontSize: 18),
  209. ),
  210. content: Text("deleteHistoryConfirm".tr()),
  211. actions: <Widget>[
  212. TextButton(
  213. child: Text("buttonNo".tr()),
  214. onPressed: () {
  215. Navigator.of(contextt).pop();
  216. },
  217. ),
  218. TextButton(
  219. onPressed: () async {
  220. Navigator.of(contextt).pop();
  221. List<String> params = [];
  222. historyModule.selectedIndexes().forEach((e) {
  223. params.add(historyModule.dataRequests()[e]["ticketNo"]);
  224. });
  225. var res = await apiAuthProvider.postData("/api/requestHistories/deleteMyHistory", {"ticketNumbers": params}, null);
  226. if (res != null) {
  227. onRefresh();
  228. }
  229. },
  230. child: Text("buttonYes".tr())),
  231. ],
  232. );
  233. },
  234. );
  235. }
  236. requestAgainAction(int i) async{
  237. final isWebView = U.webView(context);
  238. try {
  239. String tenant = '';
  240. String filter = '';
  241. if ((historyModule.dataRequests()[i]['requestGroupCode']).split(" ").length != 1) {
  242. tenant = ',{"f":["tenantCode","EQ","${(historyModule.dataRequests()[i]['requestGroupCode']).split(" ").first}"]}';
  243. }
  244. filter = '{"and":[{"f":["code","EQ","${historyModule.dataRequests()[i]['requestCode']}"]}$tenant]}';
  245. var res = await apiAuthProvider.getData('/api/requests/search/customFind', {'filter': filter});
  246. if (res != null) {
  247. if (res.containsKey('_embedded')) {
  248. UIService.navigateTo(
  249. isWebView ?
  250. WebReqCreatePage(user: userModule.user(), request: res['_embedded']['requests'][0]) :
  251. MobReqCreatePage(user: userModule.user(), request: res['_embedded']['requests'][0])
  252. );
  253. } else {
  254. UIService.showError('reqCodeNotFound'.tr());
  255. }
  256. }
  257. } catch (e) {
  258. UIService.showError(e.toString());
  259. debugPrint(e.toString());
  260. }
  261. }
  262. }