import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/api/service_request_api_client.dart'; import 'package:test_sa/controllers/providers/loading_notifier.dart'; import '../../../models/issue.dart'; import '../../../models/lookup.dart'; import '../../../models/service_report.dart'; import '../../../models/service_request/service_request.dart'; import '../../../models/service_request/service_request_search.dart'; import '../../../models/subtitle.dart'; import '../../../models/timer_model.dart'; import '../../../models/user.dart'; import '../../api_routes/urls.dart'; import '../../http_status_manger/http_status_manger.dart'; import '../../localization/localization.dart'; class ServiceRequestsProvider extends LoadingNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data void reset() { ServiceRequestApiClient().serviceRequests.clear(); nextPage = true; stateCode = null; } // state code of current request to defied error message // like 400 customer request failed // 500 service not available int? stateCode; // true if there is next page in product list and false if not bool? nextPage = true; // when requests in-process _loading = true // done _loading = true // failed _loading = false bool? isLoading; ServiceRequestSearch? search = ServiceRequestSearch(); /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart Future getRequests({ required String host, required User? user, required String? hospitalId, }) async { if (isLoading == true) { return -2; } isLoading = true; Response response; try { response = await get( Uri.parse( "$host${URLs.getServiceRequests}?uid=${user?.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user?.token}&page=${(ServiceRequestApiClient().serviceRequests.length) ~/ pageItemNumber}${search?.toSearchString()}", ), headers: {"Content-Type": "application/json; charset=utf-8"}, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); ServiceRequestApiClient().serviceRequests.addAll(serviceRequestsPage); if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } Future getSingleServiceRequest({ required String requestId, required String host, required User user, required Subtitle subtitle, }) async { String userData = ''; userData += "&uid=${user.id}"; userData += "&token=${user.token}"; Response response; try { response = await get(Uri.parse( '$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData', )); } catch (error) { throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? ''); } // If the call to the server was successful, parse the JSON. if (response.statusCode >= 200 && response.statusCode < 300) { // If the call to the server was successful, parse the JSON. List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); return requests[0]; } else { throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); } } /// ### Create service request and add the response to [ServiceRequestApiClient.serviceRequests] Future createRequest(BuildContext context, {required ServiceRequest serviceRequest, required List deviceImages}) async { final subtitle = AppLocalization.of(context)?.subtitle; serviceRequest.devicePhotos = deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); if (serviceRequest.audio != null) { final file = File(serviceRequest.audio!); serviceRequest.audio = base64Encode(file.readAsBytesSync()); } waitApiRequest(() async { await ServiceRequestApiClient().createRequest(serviceRequest); }, onSuccess: () { /// TODO : this is temporary stateCode = 200; Fluttertoast.showToast(msg: subtitle?.requestCompleteSuccessfully ?? ''); Navigator.of(context).pop(); }, onError: (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; String errorMessage = HttpStatusManger.getStatusMessage(status: error.error?.errorCode, subtitle: subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); }); } Future createIssueReport({ required String host, required User user, required Issue issue, }) async { Response response; Map body = issue.toMap(); body["uid"] = user.id ?? ""; body["token"] = user.token ?? ""; try { response = await post( Uri.parse(host + URLs.createReport), body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) {} return response.statusCode; } catch (error) { return -1; } } Future updateDate({ required String? host, required User? user, required String? newDate, required Lookup? employee, required ServiceRequest? request, }) async { Response response; Map body = {}; body["uid"] = user?.id ?? ''; body["token"] = user?.token ?? ''; body["nid"] = request?.id ?? ''; body["date"] = newDate ?? ''; body["ass_emp"] = employee?.id.toString() ?? ''; try { response = await post( Uri.parse((host ?? '') + URLs.updateRequestDate), body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { request?.engineerName = employee?.label; notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } Future createServiceReport({ required String host, required User user, required ServiceReport report, required ServiceRequest request, }) async { Response response; Map body = report.toMap(); body["uid"] = user.id ?? ""; body["token"] = user.token ?? ""; body["job_id"] = request.id ?? ''; try { response = await post( Uri.parse(host + URLs.createServiceReport), body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } Future createDuplicatedReport({ required String host, required User user, required ServiceRequest request, }) async { Response response; String userData = ''; userData += "&uid=${user.id}"; userData += "&token=${user.token}"; try { response = await get( Uri.parse( "$host${URLs.createDuplicatedReport}?nid=${request.id}$userData", ), ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } Future updateServiceReport({ required String host, required User user, required ServiceReport report, required ServiceRequest request, }) async { Response response; Map body = report.toMap(); body["uid"] = user.id ?? ""; body["token"] = user.token ?? ""; body["job_id"] = request.id ?? ''; body["report_id"] = request.reportID ?? ''; try { response = await post( Uri.parse(host + URLs.updateServiceReport), body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } Future updateServiceReportTimer({ required String host, required User user, required TimerModel timer, required ServiceRequest request, }) async { Response response; Map body = {}; body["uid"] = user.id ?? ""; body["token"] = user.token ?? ""; body["job_id"] = request.id ?? ''; body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0); body["end_time"] = ((timer.endAt?.millisecondsSinceEpoch ?? 0) / 1000).toStringAsFixed(0); body["working_hours"] = ((timer.durationInSecond ?? 0) / 60 / 60).toStringAsFixed(5); body["report_id"] = request.reportID ?? ''; try { response = await post( Uri.parse(host + URLs.updateServiceReport), body: body, ); //stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // reset(); // notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } Future getSingleServiceReport({ required String reportId, required String host, required User user, required Subtitle subtitle, }) async { String userData = ''; userData += "&uid=${user.id}"; userData += "&token=${user.token}"; Response response; try { response = await get(Uri.parse( '$host${URLs.getServiceReport}?report_id=$reportId$userData', )); } catch (error) { throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? ''); } // If the call to the server was successful, parse the JSON. if (response.statusCode >= 200 && response.statusCode < 300) { // If the call to the server was successful, parse the JSON. return ServiceReport.fromJson(json.decode(utf8.decode(response.bodyBytes)), reportId); } else { throw (HttpStatusManger.getStatusMessage( status: response.statusCode, subtitle: subtitle, ) ?? ''); } } }