support null safety 2

merge-requests/2/head
nextwo 3 years ago
parent 7fb78685ac
commit 5644ccad7c

@ -3,7 +3,7 @@ import '../../models/subtitle.dart';
class HttpStatusManger { class HttpStatusManger {
static String getStatusMessage({ static String getStatusMessage({
required int? status, required int? status,
required Subtitle subtitle, required Subtitle? subtitle,
String? messageFor400, String? messageFor400,
String? messageFor200, String? messageFor200,
}) { }) {
@ -11,28 +11,28 @@ class HttpStatusManger {
return "careful null status"; return "careful null status";
} }
if (status == -1) { if (status == -1) {
return subtitle.currentlyServiceNotAvailable; return subtitle?.currentlyServiceNotAvailable??"";
} }
if (status == -2) { if (status == -2) {
// client's request in process // client's request in process
return subtitle.waitUntilYourRequestComplete; return subtitle?.waitUntilYourRequestComplete??"";
} else if (status >= 200 && status < 300) { } else if (status >= 200 && status < 300) {
// client's request was successfully received // client's request was successfully received
return messageFor200 ?? subtitle.requestCompleteSuccessfully; return messageFor200 ?? subtitle?.requestCompleteSuccessfully??"";
} else if (status >= 400 && status < 500) { } else if (status >= 400 && status < 500) {
// client's request have error // client's request have error
switch (status) { switch (status) {
case 400: case 400:
return messageFor400 ?? subtitle.failedToCompleteRequest; return messageFor400 ?? subtitle?.failedToCompleteRequest??"";
default: default:
return subtitle.failedToCompleteRequest; return subtitle?.failedToCompleteRequest??"";
} }
} else if (status >= 500) { } else if (status >= 500) {
// server error // server error
return subtitle.currentlyServiceNotAvailable; return subtitle?.currentlyServiceNotAvailable??"";
} else { } else {
// no error match so return default error // no error match so return default error
return subtitle.failedToCompleteRequest; return subtitle?.failedToCompleteRequest??"";
} }
} }
} }

@ -5,6 +5,8 @@ import 'package:flutter/services.dart';
import '../../models/subtitle.dart'; import '../../models/subtitle.dart';
class AppLocalization { class AppLocalization {
AppLocalization(this.locale); AppLocalization(this.locale);

@ -57,7 +57,7 @@ class FirebaseNotificationManger {
AppNotification notification = AppNotification.fromJson(message.data); AppNotification notification = AppNotification.fromJson(message.data);
Navigator.pushNamed( Navigator.pushNamed(
context, context,
notification.path, notification.path??"",
arguments: notification.requestId, arguments: notification.requestId,
); );
}); });
@ -67,7 +67,7 @@ class FirebaseNotificationManger {
NotificationManger.showNotification( NotificationManger.showNotification(
title: message.notification?.title, title: message.notification?.title,
subtext: message.notification?.body, subtext: message.notification?.body,
hashcode: int.tryParse(notification.requestId) ?? 1, hashcode: int.tryParse(notification.requestId??"0") ?? 1,
payload: json.encode(message.data), payload: json.encode(message.data),
); );
return; return;

@ -98,12 +98,12 @@ class DeviceTransferProvider extends ChangeNotifier {
Future<int> createRequest({ Future<int> createRequest({
required String host, required String host,
required User user, required User? user,
required DeviceTransfer model, required DeviceTransfer model,
}) async { }) async {
Map<String, dynamic> body = { Map<String, dynamic> body = {
"uid": user.id.toString(), "uid": user?.id.toString(),
"token": user.token ?? "", "token": user?.token ?? "",
"serial_id": model.device?.id ?? "", "serial_id": model.device?.id ?? "",
"destination_client": model.receiver?.client?.id ?? "", "destination_client": model.receiver?.client?.id ?? "",
"destination_department": model.receiver?.department?.id ?? "", "destination_department": model.receiver?.department?.id ?? "",

@ -95,8 +95,8 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = group.toJson(); Map<String, String> body = group.toJson();
body["token"] = user.token; body["token"] = user.token??"";
body["uid"] = user.id; body["uid"] = user.id??"";
//userId = 397.toString(); // testing id to view data //userId = 397.toString(); // testing id to view data
try { try {
response = await post( response = await post(
@ -107,11 +107,11 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier {
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
for (var visit in group.visits) { for (var visit in (group.visits??[])) {
visit.status = group.status; visit.status = group.status;
visit.actualDate = group.date.toString().split(" ").first; visit.actualDate = group.date.toString().split(" ").first;
} }
group.visits.clear(); group.visits?.clear();
notifyListeners(); notifyListeners();
} }

@ -107,7 +107,7 @@ class RegularVisitsProvider extends ChangeNotifier {
Response response; Response response;
Map<String, String> body = group.toJson(); Map<String, String> body = group.toJson();
body["token"] = user.token ?? ""; body["token"] = user.token ?? "";
body["uid"] = user.id; body["uid"] = user.id??"";
//userId = 397.toString(); // testing id to view data //userId = 397.toString(); // testing id to view data
try { try {
response = await post( response = await post(
@ -157,8 +157,8 @@ class RegularVisitsProvider extends ChangeNotifier {
try { try {
Response response; Response response;
Map<String, String> body = pentry.toMap(); Map<String, String> body = pentry.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
response = await post( response = await post(
Uri.parse("$host${URLs.updatePentry}/${visit.id}"), Uri.parse("$host${URLs.updatePentry}/${visit.id}"),
body: body, body: body,

@ -135,7 +135,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"token": user.token ?? "", "token": user.token ?? "",
"sn_id": serviceRequest.deviceId ?? "", "sn_id": serviceRequest.deviceId ?? "",
"date": (DateTime.now().millisecondsSinceEpoch).toString(), "date": (DateTime.now().millisecondsSinceEpoch).toString(),
"client": user.hospital.id ?? '', "client": user.hospital?.id ?? '',
"complaint": serviceRequest.maintenanceIssue, "complaint": serviceRequest.maintenanceIssue,
"image": json.encode(serviceRequest.devicePhotos), "image": json.encode(serviceRequest.devicePhotos),
"priority": (serviceRequest.priority?.id).toString(), "priority": (serviceRequest.priority?.id).toString(),
@ -174,8 +174,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = issue.toMap(); Map<String, String> body = issue.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
try { try {
response = await post( response = await post(
Uri.parse(host + URLs.createReport), Uri.parse(host + URLs.createReport),
@ -199,8 +199,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = {}; Map<String, String> body = {};
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["nid"] = request.id ?? ''; body["nid"] = request.id ?? '';
body["date"] = newDate; body["date"] = newDate;
body["ass_emp"] = employee.id.toString(); body["ass_emp"] = employee.id.toString();
@ -228,8 +228,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = report.toMap(); Map<String, String> body = report.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
try { try {
response = await post( response = await post(
@ -285,8 +285,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = report.toMap(); Map<String, String> body = report.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
body["report_id"] = request.reportID ?? ''; body["report_id"] = request.reportID ?? '';
try { try {
@ -314,15 +314,15 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = {}; Map<String, String> body = {};
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
body["start_time"] = body["start_time"] =
(timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); ((timer.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
body["end_time"] = body["end_time"] =
(timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); ((timer.endAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
body["working_hours"] = body["working_hours"] =
(timer.durationInSecond / 60 / 60).toStringAsFixed(5); ((timer.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
body["report_id"] = request.reportID ?? ''; body["report_id"] = request.reportID ?? '';
try { try {
response = await post( response = await post(

@ -128,8 +128,8 @@ class UserProvider extends ChangeNotifier {
Map<String, dynamic> jsonObject = {}; Map<String, dynamic> jsonObject = {};
jsonObject["uid"] = user.id; jsonObject["uid"] = user.id;
jsonObject["token"] = user.token; jsonObject["token"] = user.token;
if (user.department.id != _user?.department.id) { if (user.department?.id != _user?.department?.id) {
jsonObject["department"] = user.department.id; jsonObject["department"] = user.department?.id;
} }
if (user.whatsApp != _user?.whatsApp) { if (user.whatsApp != _user?.whatsApp) {
jsonObject["whatsapp"] = user.whatsApp; jsonObject["whatsapp"] = user.whatsApp;

@ -1,11 +1,12 @@
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
import '../views/pages/user/requests/future_request_service_details.dart';
class AppNotification{ class AppNotification{
String requestId; String? requestId;
String title; String? title;
String description; String? description;
String date; String? date;
String path; String? path;
AppNotification({ AppNotification({
this.requestId, this.requestId,

@ -1,6 +1,6 @@
class Department{ class Department{
String id; String? id;
String name; String? name;
Department({ Department({
this.id, this.id,

@ -1,6 +1,6 @@
class Hospital{ class Hospital{
String id; String? id;
String name; String? name;
Hospital({ Hospital({
this.id, this.id,

@ -1,10 +1,10 @@
class Issue{ class Issue{
String title; String? title;
String userId; String? userId;
List<int> reports; List<int>? reports;
String serviceRequestId; String? serviceRequestId;
String description; String? description;
bool isSelected; bool? isSelected;
Issue({ Issue({
this.description, this.description,
@ -17,11 +17,11 @@ class Issue{
Map<String,String> toMap(){ Map<String,String> toMap(){
Map<String,String> map ={}; Map<String,String> map ={};
if(title != null) map["title"] = title; if(title != null) map["title"] = title??"";
if(reports != null) map["issue_report"] = reports.toString(); if(reports != null) map["issue_report"] = reports.toString();
if(userId != null) map["uid"] = userId; if(userId != null) map["uid"] = userId??"";
if(description != null) map["desc"] = description; if(description != null) map["desc"] = description??"";
if(serviceRequestId != null) map["call_id"] = serviceRequestId; if(serviceRequestId != null) map["call_id"] = serviceRequestId??"";
return map; return map;
} }
} }

@ -1,8 +1,8 @@
class Lookup{ class Lookup{
final String label; final String? label;
final String key; final String? key;
final int id; final int? id;
const Lookup({ const Lookup({
this.label, this.label,
@ -29,7 +29,6 @@ class Lookup{
} }
factory Lookup.fromJson(Map<String,dynamic> parsedJson){ factory Lookup.fromJson(Map<String,dynamic> parsedJson){
if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
return Lookup( return Lookup(
label: parsedJson["value"], label: parsedJson["value"],
id: parsedJson["id"] is int id: parsedJson["id"] is int

@ -54,11 +54,11 @@ class Pentry {
.toStringAsFixed(0); .toStringAsFixed(0);
if (timer != null) { if (timer != null) {
map["start_date"] = map["start_date"] =
(timer!.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); ((timer!.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
map["end_date"] = map["end_date"] =
((timer!.endAt).millisecondsSinceEpoch / 1000).toStringAsFixed(0); (((timer!.endAt)?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
map["working_hours"] = map["working_hours"] =
(timer!.durationInSecond / 60 / 60).toStringAsFixed(5); ((timer!.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
} }
// if(contacts?.isNotEmpty == true) { // if(contacts?.isNotEmpty == true) {
// for(int i = 0;i<contacts.length;i++){ // for(int i = 0;i<contacts.length;i++){

@ -1,7 +1,7 @@
class Part{ class Part{
String id; String? id;
String code; String? code;
String name; String? name;
int quantity; int quantity;
Part({ Part({

@ -1,32 +1,31 @@
import 'dart:convert'; import 'dart:convert';
import 'package:test_sa/models/device/device.dart'; import 'device/device.dart';
import 'package:test_sa/models/lookup.dart'; import 'lookup.dart';
import 'package:test_sa/models/part.dart'; import 'part.dart';
import 'package:test_sa/models/timer_model.dart'; import 'timer_model.dart';
class ServiceReport { class ServiceReport {
String id; String? id;
String operatingHours; String? operatingHours;
DateTime visitDate; DateTime? visitDate;
DateTime endDate; DateTime? endDate;
Lookup serviceType; Lookup? serviceType;
Lookup callLastSituation; Lookup? callLastSituation;
Lookup status; Lookup? status;
Lookup type; Lookup? type;
Lookup reason; Lookup? reason;
String faultDescription; String? faultDescription;
String workPreformed; String? workPreformed;
//String workHours; String? travelingHours;
String travelingHours; String? invoiceNumber;
String invoiceNumber; String? invoiceCode;
String invoiceCode; List<Part>? parts;
List<Part> parts; String? image;
String image; Device? device;
Device device; String? quantity;
String quantity; String? jobSheetNumber;
String jobSheetNumber; TimerModel? timer;
TimerModel timer;
ServiceReport({ ServiceReport({
this.id, this.id,
@ -36,7 +35,6 @@ class ServiceReport {
this.status, this.status,
this.type, this.type,
this.faultDescription, this.faultDescription,
//this.workHours,
this.travelingHours, this.travelingHours,
this.parts, this.parts,
this.workPreformed, this.workPreformed,
@ -54,38 +52,39 @@ class ServiceReport {
Map<String,String> toMap(){ Map<String,String> toMap(){
Map<String,String> _map = {}; Map<String,String> _map = {};
if(id != null) _map["id"] = id; if(id != null) _map["id"] = id??"";
if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); if(visitDate != null) _map["visit_date"] = ((visitDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
if(serviceType != null) _map["service_type"] = serviceType.id.toString(); if(serviceType != null) _map["service_type"] = serviceType?.id.toString()??"";
if(status != null) _map["status"] = status.id.toString(); if(status != null) _map["status"] = status?.id.toString()??"";
if(type != null) _map["service_report_type"] = type.id.toString(); if(type != null) _map["service_report_type"] = type?.id.toString()??"";
if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; if(faultDescription != null && (faultDescription?.isNotEmpty??false)) _map["fault_description"] = faultDescription??"";
//if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours;
if(timer != null){ if(timer != null){
_map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); _map["start_time"] = ((timer?.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
_map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); _map["end_time"] = ((timer?.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
_map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); _map["working_hours"] = ((timer?.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
} }
if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; if(travelingHours != null && (travelingHours?.isNotEmpty??false)) _map["traveling_hours"] = travelingHours??"";
if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed; if(workPreformed != null && (workPreformed?.isNotEmpty??false)) _map["work_performed"] = workPreformed??"";
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) _map["job_sheet_no"] = jobSheetNumber??"";
if(parts != null && parts.isNotEmpty){ if(parts != null && (parts?.isNotEmpty??false)){
Map<String,int> _partsMap = {}; Map<String,int> _partsMap = {};
parts.forEach((part) { parts?.forEach((part) {
if(part.id.isNotEmpty) if((part.id?.isNotEmpty??false)) {
_partsMap[part.id] = part.quantity; _partsMap[part?.id??""] = part.quantity;
}
}); });
_map["parts"] = json.encode(_partsMap); _map["parts"] = json.encode(_partsMap);
} }
if(device?.id != null && device.id != null) _map["eq_id"] = device.id; if(device?.id != null && device?.id != null) _map["eq_id"] = device?.id??"";
if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; if(quantity != null && (quantity?.isNotEmpty??false)) _map["qty"] = quantity??"";
if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); if(endDate != null) _map["end_date"] = ((endDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
if(reason != null) _map["reasons"] = reason.id.toString(); if(reason != null) _map["reasons"] = reason?.id.toString()??"";
if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; if(operatingHours != null && (operatingHours?.isNotEmpty??false)) _map["operation_hours"] = operatingHours??"";
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation?.id.toString()??"";
if(image != null) _map["image"] = image; if(image != null) _map["image"] = image??"";
if(invoiceCode != null) _map["invoice_no"] = invoiceCode; if(invoiceCode != null) _map["invoice_no"] = invoiceCode??"";
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber??"";
return _map; return _map;
} }
@ -102,7 +101,7 @@ class ServiceReport {
if(parts == null) return false; if(parts == null) return false;
//if(endDate == null) return false; //if(endDate == null) return false;
//if(reason == null) return false; //if(reason == null) return false;
if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; if((device?.id == null ||(device?.id?.isEmpty??false)) && type?.id != 1) return false;
//if(quantity == null || quantity.isEmpty) return false; //if(quantity == null || quantity.isEmpty) return false;
//if(image == null) return false; //if(image == null) return false;
return true; return true;
@ -144,6 +143,6 @@ class ServiceReport {
static getDate(String date){ static getDate(String date){
return date == null || date.isEmpty return date == null || date.isEmpty
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); ? null : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date)??0) * 1000);
} }
} }

@ -226,187 +226,187 @@ class Subtitle{
} }
Subtitle({ Subtitle({
@required this.currentlyServiceNotAvailable, required this.currentlyServiceNotAvailable,
@required this.waitUntilYourRequestComplete, required this.waitUntilYourRequestComplete,
@required this.requestCompleteSuccessfully, required this.requestCompleteSuccessfully,
@required this.failedToCompleteRequest, required this.failedToCompleteRequest,
@required this.update, required this.update,
@required this.cancel, required this.cancel,
@required this.confirm, required this.confirm,
@required this.exit, required this.exit,
@required this.exitAlert, required this.exitAlert,
@required this.signOutAlert, required this.signOutAlert,
@required this.language, required this.language,
@required this.name, required this.name,
@required this.email, required this.email,
@required this.phoneNumber, required this.phoneNumber,
@required this.password, required this.password,
@required this.forgetPassword, required this.forgetPassword,
@required this.confirmPassword, required this.confirmPassword,
@required this.signIn, required this.signIn,
@required this.signUp, required this.signUp,
@required this.nameValidateMessage, required this.nameValidateMessage,
@required this.emailValidateMessage, required this.emailValidateMessage,
@required this.phoneNumberValidateMessage, required this.phoneNumberValidateMessage,
@required this.passwordValidateMessage, required this.passwordValidateMessage,
@required this.confirmPasswordValidateMessage, required this.confirmPasswordValidateMessage,
@required this.emailExist, required this.emailExist,
@required this.forgetPasswordWithMark, required this.forgetPasswordWithMark,
@required this.phoneNumberExist, required this.phoneNumberExist,
@required this.showPassword, required this.showPassword,
@required this.signOut, required this.signOut,
@required this.wrongEmailOrPassword, required this.wrongEmailOrPassword,
@required this.next, required this.next,
@required this.back, required this.back,
@required this.search, required this.search,
@required this.searchByName, required this.searchByName,
@required this.address, required this.address,
@required this.description, required this.description,
@required this.title, required this.title,
@required this.addressNotFound, required this.addressNotFound,
@required this.addressValidateMessage, required this.addressValidateMessage,
@required this.dataNotFound, required this.dataNotFound,
@required this.descriptionNotFound, required this.descriptionNotFound,
@required this.descriptionValidateMessage, required this.descriptionValidateMessage,
@required this.edit, required this.edit,
@required this.emailNotFound, required this.emailNotFound,
@required this.from, required this.from,
@required this.linkNotFound, required this.linkNotFound,
@required this.nameNotFound, required this.nameNotFound,
@required this.phoneNumberNotFound, required this.phoneNumberNotFound,
@required this.titleNotFound, required this.titleNotFound,
@required this.titleValidateMessage, required this.titleValidateMessage,
@required this.to, required this.to,
@required this.urlNotFound, required this.urlNotFound,
@required this.nameExist, required this.nameExist,
@required this.unitRequired, required this.unitRequired,
@required this.unite, required this.unite,
@required this.hospitalRequired, required this.hospitalRequired,
@required this.whatsApp, required this.whatsApp,
@required this.submit, required this.submit,
@required this.shareAntherIssue, required this.shareAntherIssue,
@required this.reportIssue, required this.reportIssue,
@required this.noUniteFound, required this.noUniteFound,
@required this.pickUnite, required this.pickUnite,
@required this.noHospitalFound, required this.noHospitalFound,
@required this.pickHospital, required this.pickHospital,
@required this.shareApp, required this.shareApp,
@required this.ourWebsite, required this.ourWebsite,
@required this.linkedIn, required this.linkedIn,
@required this.facebook, required this.facebook,
@required this.hotLine, required this.hotLine,
@required this.trackServiceRequest, required this.trackServiceRequest,
@required this.newServiceRequest, required this.newServiceRequest,
@required this.deviceModel, required this.deviceModel,
@required this.noServiceRequestFound, required this.noServiceRequestFound,
@required this.engineerName, required this.engineerName,
@required this.serviceRequests, required this.serviceRequests,
@required this.jobSheetNumber, required this.jobSheetNumber,
@required this.visitDate, required this.visitDate,
@required this.workPerformed, required this.workPerformed,
@required this.faultDescription, required this.faultDescription,
@required this.serviceRequestInformation, required this.serviceRequestInformation,
@required this.maintenanceIssue, required this.maintenanceIssue,
@required this.deviceArName, required this.deviceArName,
@required this.hospital, required this.hospital,
@required this.status, required this.status,
@required this.date, required this.date,
@required this.engineerPhone, required this.engineerPhone,
@required this.device, required this.device,
@required this.deviceSN, required this.deviceSN,
@required this.details, required this.details,
@required this.requestInformation, required this.requestInformation,
@required this.model, required this.model,
@required this.brand, required this.brand,
@required this.noDeviceFound, required this.noDeviceFound,
@required this.noDateFound, required this.noDateFound,
@required this.searchBySn, required this.searchBySn,
@required this.pickDevice, required this.pickDevice,
@required this.notifications, required this.notifications,
@required this.notificationsNotFound, required this.notificationsNotFound,
@required this.twitter, required this.twitter,
@required this.add, required this.add,
@required this.code, required this.code,
@required this.deviceEnName, required this.deviceEnName,
@required this.deviceName, required this.deviceName,
@required this.serialNumber, required this.serialNumber,
@required this.policy, required this.policy,
@required this.clearSearch, required this.clearSearch,
@required this.closed, required this.closed,
@required this.create, required this.create,
@required this.createServiceRequest, required this.createServiceRequest,
@required this.delete, required this.delete,
@required this.deviceImages, required this.deviceImages,
@required this.deviceRequired, required this.deviceRequired,
@required this.general, required this.general,
@required this.maintenanceIssueRequired, required this.maintenanceIssueRequired,
@required this.maxImagesNumberIs5, required this.maxImagesNumberIs5,
@required this.newWord, required this.newWord,
@required this.noModelFound, required this.noModelFound,
@required this.noSnFound, required this.noSnFound,
@required this.reason1, required this.reason1,
@required this.reason2, required this.reason2,
@required this.reason3, required this.reason3,
@required this.reason4, required this.reason4,
@required this.reason5, required this.reason5,
@required this.repaired, required this.repaired,
@required this.repeated, required this.repeated,
@required this.sn, required this.sn,
@required this.underRepair, required this.underRepair,
@required this.actualDate, required this.actualDate,
@required this.expectDate, required this.expectDate,
@required this.visitInformation, required this.visitInformation,
@required this.regularVisitsUpdatedSuccessfully, required this.regularVisitsUpdatedSuccessfully,
@required this.regularVisits, required this.regularVisits,
@required this.updateRegularVisits, required this.updateRegularVisits,
@required this.updatingDots, required this.updatingDots,
@required this.preventiveMaintenanceUpdatedSuccessfully, required this.preventiveMaintenanceUpdatedSuccessfully,
@required this.updatePreventiveMaintenance, required this.updatePreventiveMaintenance,
@required this.preventiveMaintenance, required this.preventiveMaintenance,
@required this.requiredStatus, required this.requiredStatus,
@required this.noSerialNumberFound, required this.noSerialNumberFound,
@required this.updateVisitsGroup, required this.updateVisitsGroup,
@required this.pickFromGallery, required this.pickFromGallery,
@required this.pickFromCamera, required this.pickFromCamera,
@required this.images, required this.images,
@required this.done, required this.done,
@required this.imagesRequired, required this.imagesRequired,
@required this.notYet, required this.notYet,
@required this.noVisitsFound, required this.noVisitsFound,
@required this.onHold, required this.onHold,
@required this.nextVisitDate, required this.nextVisitDate,
@required this.contactStatus, required this.contactStatus,
@required this.travelingHours, required this.travelingHours,
@required this.workingHours, required this.workingHours,
@required this.taskStatus, required this.taskStatus,
@required this.image, required this.image,
@required this.pickImage, required this.pickImage,
@required this.requiredImage, required this.requiredImage,
@required this.activationAlert, required this.activationAlert,
@required this.callId, required this.callId,
@required this.requiredWord, required this.requiredWord,
@required this.quantity, required this.quantity,
@required this.callLastSituation, required this.callLastSituation,
@required this.invoiceNumber, required this.invoiceNumber,
@required this.invoiceCode, required this.invoiceCode,
@required this.attachImage, required this.attachImage,
@required this.customer, required this.customer,
@required this.editServiceReport, required this.editServiceReport,
@required this.newServiceReport, required this.newServiceReport,
@required this.number, required this.number,
@required this.operatingHours, required this.operatingHours,
@required this.partNumber, required this.partNumber,
@required this.reasons, required this.reasons,
@required this.reportStatus, required this.reportStatus,
@required this.reportType, required this.reportType,
@required this.serviceType, required this.serviceType,
@required this.workPreformed, required this.workPreformed,
@required this.alert, required this.alert,
@required this.duplicateAlert, required this.duplicateAlert,
@required this.duplicateAlertMessage, required this.duplicateAlertMessage,
@required this.duplicateRequest, required this.duplicateRequest,
}); });
factory Subtitle.fromJson(Map<String,dynamic> parsedJson){ factory Subtitle.fromJson(Map<String,dynamic> parsedJson){

@ -1,7 +1,7 @@
class TimerModel { class TimerModel {
DateTime startAt; DateTime? startAt;
DateTime endAt; DateTime? endAt;
int durationInSecond; int? durationInSecond;
TimerModel({this.startAt,this.endAt,this.durationInSecond}); TimerModel({this.startAt,this.endAt,this.durationInSecond});
} }

@ -1,20 +1,22 @@
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/enums/user_types.dart'; import '../controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/hospital.dart'; import 'department.dart';
import 'enums/user_types.dart';
import 'hospital.dart';
class User { class User {
String id; String? id;
String userName; String userName;
String password; String password;
String email; String email;
String image; String? image;
Hospital hospital; Hospital? hospital;
Department department; Department? department;
UsersTypes type; UsersTypes? type;
String phoneNumber; String? phoneNumber;
String whatsApp; String? whatsApp;
String token; String? token;
bool isActive; bool isActive;
User( User(
@ -22,7 +24,7 @@ class User {
this.userName = "", this.userName = "",
this.email = "", this.email = "",
this.password = "", this.password = "",
this.phoneNumber = "", this.phoneNumber,
this.hospital, this.hospital,
this.image, this.image,
this.department, this.department,
@ -42,9 +44,9 @@ class User {
Map<String, dynamic> toUpdateProfileJson() { Map<String, dynamic> toUpdateProfileJson() {
Map<String, dynamic> jsonObject = {}; Map<String, dynamic> jsonObject = {};
if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id; if (department?.id != null && (department?.id?.isNotEmpty??false)) jsonObject["department"] = department?.id??"";
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; if (whatsApp != null && (whatsApp?.isNotEmpty??false)) jsonObject["whatsapp"] = whatsApp;
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; if (phoneNumber != null && (phoneNumber?.isNotEmpty??false)) jsonObject["phone"] = phoneNumber;
return jsonObject; return jsonObject;
} }
@ -54,7 +56,7 @@ class User {
"username": userName, "username": userName,
"email": email, "email": email,
"whatsapp": whatsApp, "whatsapp": whatsApp,
"client": hospital.id, "client": hospital?.id,
"department": department?.id, "department": department?.id,
"phone": phoneNumber, "phone": phoneNumber,
"pass": password, "pass": password,

@ -1,24 +1,25 @@
import 'package:test_sa/models/lookup.dart';
import '../lookup.dart';
class Visit{ class Visit{
String id; String? id;
String serialNumber; String? serialNumber;
String expectDate; String? expectDate;
String actualDate; String? actualDate;
String hospitalId; String? hospitalId;
String hospitalName; String? hospitalName;
String deviceId; String? deviceId;
String deviceSerialNumber; String? deviceSerialNumber;
String deviceArabicName; String? deviceArabicName;
String deviceEnglishName; String? deviceEnglishName;
String employId; String? employId;
String employName; String? employName;
String modelAndBrand; String? modelAndBrand;
String contactStatus; String? contactStatus;
Lookup status; Lookup? status;
String assignTo; String? assignTo;
String deviceNumber; String? deviceNumber;
List<String> images; List<String>? images;
Visit({ Visit({
this.id, this.id,
@ -60,7 +61,7 @@ class Visit{
contactStatus: parsedJson["contactStatus"], contactStatus: parsedJson["contactStatus"],
images: List<String>.from(parsedJson["images"] ?? []), images: List<String>.from(parsedJson["images"] ?? []),
status: Lookup( status: Lookup(
id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) id: int.tryParse(parsedJson["status"] ?? "-1")??-1, // actual value (0,1,2)
label: parsedJson["status_value"] // text value label: parsedJson["status_value"] // text value
), ),
assignTo: parsedJson["assigned_to"], assignTo: parsedJson["assigned_to"],

@ -1,17 +1,19 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/visits/visit.dart';
import '../lookup.dart';
import 'visit.dart';
class VisitsGroup{ class VisitsGroup{
String userId; String? userId;
String workingHours; String? workingHours;
String travelingHours; String? travelingHours;
String jobSheetNumber; String? jobSheetNumber;
String image; String? image;
Lookup status; Lookup? status;
Lookup taskStatus; Lookup? taskStatus;
DateTime date; DateTime? date;
List<Visit> visits; List<Visit>? visits;
VisitsGroup({ VisitsGroup({
this.userId, this.userId,
@ -27,17 +29,20 @@ class VisitsGroup{
Map<String,String> toJson(){ Map<String,String> toJson(){
Map<String,String> jsonObject = {}; Map<String,String> jsonObject = {};
jsonObject["nids"] = visits.map((e) => e.id).toList().join(','); jsonObject["nids"] = visits!.map((e) => e.id).toList().join(',');
if(status != null) jsonObject["status"] = status.id.toString(); if(status != null) jsonObject["status"] = status?.id.toString()??"";
if(date != null) jsonObject["date"] = date.toString().split(" ").first; if(date != null) jsonObject["date"] = date.toString().split(" ").first;
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) {
jsonObject["job_sheet_no"] = jobSheetNumber; jsonObject["job_sheet_no"] = jobSheetNumber!;
if(travelingHours != null && travelingHours.isNotEmpty) }
jsonObject["traveling_hours"] = travelingHours; if(travelingHours != null &&(travelingHours?.isNotEmpty??false)) {
if(workingHours != null && workingHours.isNotEmpty) jsonObject["traveling_hours"] = travelingHours??"";
jsonObject["working_hours"] = workingHours; }
if(image != null) jsonObject["image"] = image; if(workingHours != null && (workingHours?.isNotEmpty??false)) {
if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); jsonObject["working_hours"] = workingHours??"";
}
if(image != null) jsonObject["image"] = image??"";
if(taskStatus != null) jsonObject["task_status"] = taskStatus?.id.toString()??"";
return jsonObject; return jsonObject;
} }

@ -1,14 +1,14 @@
class VisitsSearch{ class VisitsSearch{
String deviceSerialNumber; String? deviceSerialNumber;
String hospitalName; String? hospitalName;
String brand; String? brand;
String model; String? model;
String contactStatus; String? contactStatus;
DateTime expectedDateFrom; DateTime? expectedDateFrom;
DateTime expectedDateTo; DateTime? expectedDateTo;
DateTime actualDateFrom; DateTime? actualDateFrom;
DateTime actualDateTo; DateTime? actualDateTo;
int statusValue; int? statusValue;
VisitsSearch({ VisitsSearch({
this.deviceSerialNumber, this.deviceSerialNumber,
@ -38,36 +38,36 @@ class VisitsSearch{
String toSearchString(){ String toSearchString(){
String _search = ""; String _search = "";
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ if(deviceSerialNumber != null && (deviceSerialNumber?.isNotEmpty??false)){
_search += "&sn_id=$deviceSerialNumber"; _search += "&sn_id=$deviceSerialNumber";
} }
if(hospitalName != null && hospitalName.isNotEmpty){ if(hospitalName != null && (hospitalName?.isNotEmpty??false)){
_search += "&client=$hospitalName"; _search += "&client=$hospitalName";
} }
if(brand != null && brand.isNotEmpty){ if(brand != null && (brand?.isNotEmpty??false)){
_search += "&brand=$brand"; _search += "&brand=$brand";
} }
if(model != null && model.isNotEmpty){ if(model != null && (model?.isNotEmpty??false)){
_search += "&model=$model"; _search += "&model=$model";
} }
if(expectedDateFrom != null){ if(expectedDateFrom != null){
_search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}"; _search += "&expected_date_from=${(expectedDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}";
} }
if(expectedDateTo != null){ if(expectedDateTo != null){
_search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}"; _search += "&expected_date_to=${(expectedDateTo?.millisecondsSinceEpoch??0) ~/1000}";
} }
if(actualDateFrom != null){ if(actualDateFrom != null){
_search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}"; _search += "&actual_date_from=${(actualDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}";
} }
if(actualDateTo != null){ if(actualDateTo != null){
_search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}"; _search += "&actual_date_to=${(actualDateTo?.millisecondsSinceEpoch??0) ~/1000}";
} }
if(statusValue != null){ if(statusValue != null){

@ -45,12 +45,12 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_isSender = _userProvider?.user.id == widget.model.sender?.userId; _isSender = _userProvider?.user?.id == widget.model.sender?.userId;
_isReceiver = _userProvider?.user.id == widget.model.receiver?.userId; _isReceiver = _userProvider?.user?.id == widget.model.receiver?.userId;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -92,11 +92,11 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
children: [ children: [
RequestInfoRow( RequestInfoRow(
title: _subtitle?.title??"", title: _subtitle?.title??"",
info: widget.model.title, info: widget.model.title??"",
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle?.device??"", title: _subtitle?.device??"",
info: widget.model.device.serialNumber, info: widget.model.device?.serialNumber??"",
), ),
const SizedBox(height:8), const SizedBox(height:8),
Row( Row(

@ -2,12 +2,22 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/device_transfer_provider.dart'; import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart'; import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../extensions/int_extensions.dart';
import '../../../models/device/device_transfer.dart'; import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart'; import '../../../models/device/device_transfer_info.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
import '../../app_style/sizing.dart';
import '../../widgets/buttons/app_button.dart';
import '../../widgets/departments/department_button.dart';
import '../../widgets/equipment/device_button.dart';
import '../../widgets/hospitals/hospital_button.dart';
import '../../widgets/loaders/loading_manager.dart';
import '../../widgets/titles/app_sub_title.dart';
class RequestDeviceTransfer extends StatefulWidget { class RequestDeviceTransfer extends StatefulWidget {
static const String id = "/request-device-transfer"; static const String id = "/request-device-transfer";
@ -36,11 +46,11 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_onSubmit() async { _onSubmit() async {
_validate = true; _validate = true;
if (!_formKey.currentState.validate()) { if ((_formKey.currentState?.validate()??false)) {
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState?.save();
if (!_formModel.validate()) { if (!_formModel.validate()) {
setState(() {}); setState(() {});
@ -50,16 +60,16 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _deviceTransferProvider.createRequest( int? status = await _deviceTransferProvider?.createRequest(
user: _userProvider.user, user: _userProvider?.user,
host: _settingProvider.host, host: _settingProvider?.host??"",
model: _formModel, model: _formModel,
); );
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
if (status >= 200 && status < 300) { if (status!=null && status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle?.requestCompleteSuccessfully??"",
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
@ -78,7 +88,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -102,7 +112,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
"Transfer Device", "Transfer Device",
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.headline5?.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
), ),
), ),
), ),
@ -124,7 +134,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Device"), const ASubTitle("Device"),
if (_validate && _formModel.device == null) if (_validate && _formModel.device == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, _subtitle?.requiredWord??"",
color: Colors.red, color: Colors.red,
), ),
6.height, 6.height,
@ -149,37 +159,37 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
// ), // ),
12.height, 12.height,
const ASubTitle("Destination Client"), const ASubTitle("Destination Client"),
if (_validate && _formModel.receiver.client == null) if (_validate && _formModel.receiver?.client == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, _subtitle?.requiredWord??"",
color: Colors.red, color: Colors.red,
), ),
6.height, 6.height,
HospitalButton( HospitalButton(
hospital: _formModel.receiver.client, hospital: _formModel.receiver?.client,
onHospitalPick: (hospital) { onHospitalPick: (hospital) {
_formModel.receiver.client = hospital; _formModel.receiver?.client = hospital;
setState(() {}); setState(() {});
}, },
), ),
12.height, 12.height,
const ASubTitle("Destination Department"), const ASubTitle("Destination Department"),
if (_validate && _formModel.receiver.department == null) if (_validate && _formModel.receiver?.department == null)
ASubTitle( ASubTitle(
_subtitle.requiredWord, _subtitle?.requiredWord??"",
color: Colors.red, color: Colors.red,
), ),
6.height, 6.height,
DepartmentButton( DepartmentButton(
department: _formModel.receiver.department, department: _formModel.receiver?.department,
onDepartmentPick: (department) { onDepartmentPick: (department) {
_formModel.receiver.department = department; _formModel.receiver?.department = department;
setState(() {}); setState(() {});
}, },
), ),
12.height, 12.height,
AButton( AButton(
text: _subtitle.submit, text: _subtitle?.submit??"",
onPressed: _onSubmit, onPressed: _onSubmit,
), ),
const SizedBox( const SizedBox(

@ -1,18 +1,21 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import '../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../models/subtitle.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../models/user.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import '../../app_style/colors.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/device_trancfer/device_transfer_list.dart';
import '../../widgets/loaders/loading_manager.dart';
class TrackDeviceTransferPage extends StatefulWidget { class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer"; static const String id = "/track-device-transfer";
const TrackDeviceTransferPage({Key key}) : super(key: key); const TrackDeviceTransferPage({Key? key}) : super(key: key);
@override @override
State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState(); State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState();
@ -20,27 +23,27 @@ class TrackDeviceTransferPage extends StatefulWidget {
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
with TickerProviderStateMixin{ with TickerProviderStateMixin{
DeviceTransferProvider _deviceTransferProvider; late DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider; UserProvider? _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle? _subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _deviceTransferProvider.isLoading, isLoading: _deviceTransferProvider.isLoading??false,
isFailedLoading: _deviceTransferProvider.items == null, isFailedLoading: _deviceTransferProvider.items == null,
stateCode: _deviceTransferProvider.stateCode, stateCode: _deviceTransferProvider.stateCode??0,
onRefresh: () async { onRefresh: () async {
_deviceTransferProvider.reset(); _deviceTransferProvider.reset();
await _deviceTransferProvider.getRequests( await _deviceTransferProvider.getRequests(
user: _userProvider.user, user: _userProvider?.user??User(),
host: _settingProvider.host, host: _settingProvider.host??"",
); );
}, },
child: Stack( child: Stack(
@ -59,7 +62,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
child: Center( child: Center(
child: Text( child: Text(
"Device Transfer", "Device Transfer",
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic
), ),
@ -78,8 +81,8 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
nextPage: _deviceTransferProvider.nextPage, nextPage: _deviceTransferProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _deviceTransferProvider.getRequests( await _deviceTransferProvider.getRequests(
user: _userProvider.user, user: _userProvider?.user??User(),
host: _settingProvider.host, host: _settingProvider.host??"",
); );
}, },
items: _deviceTransferProvider.items, items: _deviceTransferProvider.items,

@ -1,29 +1,21 @@
import 'dart:convert'; .import 'dart:convert';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart'; import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart';
import '../../../models/subtitle.dart';
class UpdateDeviceTransfer extends StatefulWidget { class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model; final DeviceTransfer? model;
final bool isSender; final bool? isSender;
const UpdateDeviceTransfer({Key key, this.model, this.isSender}) : super(key: key); const UpdateDeviceTransfer({Key? key, this.model, this.isSender}) : super(key: key);
@override @override
State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState(); State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState();
@ -32,11 +24,11 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> { class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle; Subtitle? _subtitle;
UserProvider _userProvider; UserProvider? _userProvider;
SettingProvider _settingProvider; SettingProvider? _settingProvider;
Uint8List _signature; Uint8List? _signature;
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransferInfo _formModel = DeviceTransferInfo(); final DeviceTransferInfo _formModel = DeviceTransferInfo();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -44,27 +36,27 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_update() async { _update() async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if((_formKey.currentState?.validate()??false)){
setState(() {}); setState(() {});
return false; return false;
} }
_formKey.currentState.save(); _formKey.currentState?.save();
_isLoading =true; _isLoading =true;
setState(() {}); setState(() {});
int status = await _deviceTransferProvider.updateRequest( int? status = await _deviceTransferProvider?.updateRequest(
user: _userProvider.user, user: _userProvider.user,
host: _settingProvider.host, host: _settingProvider.host,
requestId: widget.model.id, requestId: widget.model.,
isSender: widget.isSender, isSender: widget.isSender??false,
newModel: _formModel, newModel: _formModel,
oldModel: widget.model oldModel: widget.model
); );
_isLoading =false; _isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if(status!=null && status >= 200 && status < 300){
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle?.requestCompleteSuccessfully??"",
); );
_validate = false; _validate = false;
Navigator.of(context).pop(); Navigator.of(context).pop();

@ -1,31 +1,33 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import '../../../controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../models/device/device_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart'; import '../../../models/subtitle.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart'; import '../../pages/device_transfer/device_transfer_details.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import '../loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../loaders/no_item_found.dart';
import 'device_transfer_item.dart';
class DeviceTransferList extends StatelessWidget { class DeviceTransferList extends StatelessWidget {
final List<DeviceTransfer> items; final List<DeviceTransfer>? items;
final bool nextPage; final bool? nextPage;
final Future<void> Function() onLazyLoad; final Future<void> Function()? onLazyLoad;
const DeviceTransferList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); const DeviceTransferList({Key? key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if(items.length == 0){ if((items?.isEmpty??0) == 0){
Subtitle subtitle = AppLocalization.of(context).subtitle; Subtitle? subtitle = AppLocalization.of(context)?.subtitle;
return NoItemFound(message: subtitle.noServiceRequestFound,); return NoItemFound(message: subtitle?.noServiceRequestFound??"",);
} }
return LazyLoading( return LazyLoading(
nextPage: nextPage, nextPage: nextPage,
onLazyLoad: onLazyLoad, onLazyLoad: onLazyLoad,
child: ListView.builder( child: ListView.builder(
//physics: const BouncingScrollPhysics(), //physics: const BouncingScrollPhysics(),
itemCount: items.length, itemCount: items?.length,
padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8),
itemBuilder: (context,itemIndex){ itemBuilder: (context,itemIndex){
return DeviceTransferItem( return DeviceTransferItem(

@ -7,7 +7,7 @@ class ImageLoader extends StatelessWidget {
final Alignment alignment; final Alignment alignment;
const ImageLoader({ const ImageLoader({
Key key, Key key,
@required this.url, this.url,
this.boxFit, this.boxFit,
this.color, this.color,
this.alignment this.alignment

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import '../../app_style/sizing.dart';
import 'app_loading.dart'; import 'app_loading.dart';
class LazyLoading extends StatefulWidget { class LazyLoading extends StatefulWidget {
final Widget child; final Widget child;
final bool nextPage; final bool nextPage;
@ -9,11 +9,11 @@ class LazyLoading extends StatefulWidget {
final VoidCallback onLoadingEnd; final VoidCallback onLoadingEnd;
const LazyLoading({ const LazyLoading({
Key key, Key? key,
this.nextPage = false, this.nextPage = false,
this.child, required this.child,
this.onLazyLoad, required this.onLazyLoad,
this.onLoadingEnd, required this.onLoadingEnd,
}) : super(key: key); }) : super(key: key);
@override @override
@ -22,17 +22,17 @@ class LazyLoading extends StatefulWidget {
class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin { class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin {
AnimationController _animationController; late AnimationController _animationController;
Animation<Offset> _offsetAnimation; late Animation<Offset> _offsetAnimation;
_scrollListener() async { _scrollListener() async {
if (!_animationController.isAnimating && !_animationController.isCompleted && widget.nextPage) { if (!_animationController.isAnimating && !_animationController.isCompleted && widget.nextPage) {
_animationController.forward(); _animationController?.forward();
setState(() {}); setState(() {});
await widget.onLazyLoad(); await widget.onLazyLoad();
await Future.delayed(Duration(milliseconds: 600)); await Future.delayed(Duration(milliseconds: 600));
setState(() {}); setState(() {});
_animationController.reverse(); _animationController?.reverse();
} }
} }
@ -57,7 +57,7 @@ class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
_animationController.dispose(); _animationController?.dispose();
} }
@override @override
@ -77,7 +77,7 @@ class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin
position: _offsetAnimation, position: _offsetAnimation,
child: Center( child: Center(
child: Visibility( child: Visibility(
visible: _animationController.isAnimating || _animationController.isCompleted, visible: (_animationController?.isAnimating??false) || (_animationController?.isCompleted??false),
child: Container( child: Container(
height: 36 * AppStyle.getScaleFactor(context), height: 36 * AppStyle.getScaleFactor(context),
width: 36 * AppStyle.getScaleFactor(context), width: 36 * AppStyle.getScaleFactor(context),

@ -17,11 +17,11 @@ class LoadingManager extends StatefulWidget {
LoadingManager({ LoadingManager({
Key key, Key key,
@required this.isLoading, this.isLoading,
@required this.isFailedLoading, this.isFailedLoading,
@required this.stateCode, this.stateCode,
@required this.onRefresh, this.onRefresh,
@required this.child, this.child,
this.progress, this.progress,
this.isNotPage = false, this.isNotPage = false,
this.askOnBack = false, this.askOnBack = false,

@ -12,7 +12,7 @@ import '../../app_style/sizing.dart';
class RecordSound extends StatefulWidget { class RecordSound extends StatefulWidget {
final Function(String) onRecord; final Function(String) onRecord;
const RecordSound({Key key, @required this.onRecord}) : super(key: key); const RecordSound({Key key, this.onRecord}) : super(key: key);
@override @override
State<RecordSound> createState() => _RecordSoundState(); State<RecordSound> createState() => _RecordSoundState();

@ -10,7 +10,7 @@ class ServiceReportLastCallsMenu extends StatelessWidget {
final ServiceReport report; final ServiceReport report;
const ServiceReportLastCallsMenu({ const ServiceReportLastCallsMenu({
Key key,@required this.onSelect,@required this.report}) : super(key: key); Key key, this.onSelect, this.report}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ServiceReportLastCallsProvider _menuProvider = Provider.of<ServiceReportLastCallsProvider>(context); ServiceReportLastCallsProvider _menuProvider = Provider.of<ServiceReportLastCallsProvider>(context);

@ -1,18 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../app_style/sizing.dart';
class ASubTitle extends StatelessWidget { class ASubTitle extends StatelessWidget {
final String text; final String text;
final EdgeInsets padding; final EdgeInsets? padding;
final Color color; final Color? color;
final double font; final double? font;
const ASubTitle(this.text, {Key key,this.padding, this.color, this.font}) : super(key: key); const ASubTitle(this.text, {Key? key,this.padding, this.color, this.font}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: padding ?? EdgeInsets.zero, padding: padding ?? EdgeInsets.zero,
child: Text( child: Text(
text, text,
style: Theme.of(context).textTheme.bodyText1.copyWith( style: Theme.of(context).textTheme.bodyText1?.copyWith(
// fontWeight: FontWeight.bold, // fontWeight: FontWeight.bold,
fontSize: font, fontSize: font,
color: color color: color

Loading…
Cancel
Save