import 'dart:convert'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/api/service_request_api_client.dart'; import 'package:test_sa/controllers/providers/loading_notifier.dart'; import 'package:test_sa/exceptions/api_exception.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/timer_model.dart'; import '../../../views/widgets/dialogs/dialog.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; ServiceRequestSearch? search = ServiceRequestSearch(); /// Get Service Requests and Fill [ServiceRequestApiClient.serviceRequests] Future getRequests() async { await waitApiRequest(() async { final serviceRequestsPage = await ServiceRequestApiClient().getRequests(pageItemNumber: pageItemNumber, search: search); if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; } else { nextPage = false; } }, onSuccess: () { /// TODO : this is temporary stateCode = 200; }, onError: (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; }); } Future getSingleServiceRequest({required String? requestId}) async { return await ServiceRequestApiClient().getServiceById(requestId); } /// ### 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(BuildContext context, {required Issue issue}) async { await waitApiRequest(() async { await ServiceRequestApiClient().createIssueReport(issue); }, onSuccess: () { final subtitle = AppLocalization.of(context)?.subtitle; Fluttertoast.showToast(msg: subtitle?.requestCompleteSuccessfully ?? ''); /// TODO : this is temporary stateCode = 200; }, onError: (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; }); } Future updateDate(BuildContext context, {required String? newDate, required Lookup? employee, required ServiceRequest? request}) async { final subtitle = AppLocalization.of(context)?.subtitle; showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return CupertinoAlertDialog(title: Text(subtitle?.updatingDots ?? ''), content: const Center(child: CircularProgressIndicator())); }, ); await waitApiRequest( () async { await ServiceRequestApiClient().updateDate(newDate: newDate, employee: employee, request: request); }, onSuccess: () { Navigator.of(context).pop(); Fluttertoast.showToast(msg: HttpStatusManger.getStatusMessage(status: 200, subtitle: subtitle)); /// TODO : this is temporary stateCode = 200; }, onError: (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; }, ); } Future createServiceReport(BuildContext context, {required ServiceReport? report, required ServiceRequest? request}) async { final subtitle = AppLocalization.of(context)?.subtitle; await waitApiRequest( () async { await ServiceRequestApiClient().createServiceReport(report: report, request: request); reset(); }, onSuccess: () { /// TODO : this is temporary stateCode = 200; Fluttertoast.showToast(msg: subtitle?.requestCompleteSuccessfully ?? ""); Navigator.of(context).pop(); 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 createDuplicatedReport(BuildContext context, {required ServiceRequest request}) async { final subtitle = AppLocalization.of(context)?.subtitle; bool result = await showDialog(context: context, builder: (_) => AAlertDialog(title: subtitle?.duplicateAlert, content: subtitle?.duplicateAlertMessage)); if (result == true && context.mounted) { showDialog( context: context, builder: (context) { return const Center(child: CircularProgressIndicator()); }, ); await waitApiRequest( () async { await ServiceRequestApiClient().createDuplicatedReport(request: request); reset(); }, onSuccess: () { Navigator.of(context).pop(); }, onError: (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(HttpStatusManger.getStatusMessage(status: error.error?.errorCode, subtitle: subtitle)))); Navigator.of(context).pop(); }, ); } } Future updateServiceReport(BuildContext context, {required ServiceReport report, required ServiceRequest request}) async { final subtitle = AppLocalization.of(context)?.subtitle; await waitApiRequest( () async { await ServiceRequestApiClient().updateServiceReport(report: report, request: request); reset(); }, onSuccess: () { Fluttertoast.showToast(msg: subtitle?.requestCompleteSuccessfully ?? ''); Navigator.of(context).pop(); Navigator.of(context).pop(); /// TODO : this is temporary stateCode = 200; }, 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 updateServiceReportTimer({required TimerModel timer, required ServiceRequest request}) async { try { await ServiceRequestApiClient().updateServiceReportTimer(timer: timer, request: request); /// TODO : this is temporary stateCode = 200; } on APIException catch (error) { /// TODO : this is temporary stateCode = error.error?.errorCode; } } Future getSingleServiceReport({required String reportId}) async { return await ServiceRequestApiClient().getSingleServiceReport(reportId: reportId); } }