You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/controllers/providers/api/service_requests_provider.dart

222 lines
8.2 KiB
Dart

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<ServiceRequest> 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<File> 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<void>(
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<ServiceReport?> getSingleServiceReport({required String reportId}) async {
return await ServiceRequestApiClient().getSingleServiceReport(reportId: reportId);
}
}