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.
222 lines
8.2 KiB
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);
|
|
}
|
|
}
|