diff --git a/assets/subtitles/ar_subtitle.json b/assets/translations/ar.json
similarity index 100%
rename from assets/subtitles/ar_subtitle.json
rename to assets/translations/ar.json
diff --git a/assets/subtitles/en_subtitle.json b/assets/translations/en.json
similarity index 100%
rename from assets/subtitles/en_subtitle.json
rename to assets/translations/en.json
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index cbf76fea..71e55807 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -213,4 +213,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048
-COCOAPODS: 1.11.3
+COCOAPODS: 1.10.2
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index a5559bc2..5116f0d6 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 51;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -227,6 +227,7 @@
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@@ -258,6 +259,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 347cd5f4..86b0405c 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -60,5 +60,7 @@
UIViewControllerBasedStatusBarAppearance
+ UIApplicationSupportsIndirectInputEvents
+
diff --git a/lib/controllers/http_status_manger/http_status_manger.dart b/lib/controllers/http_status_manger/http_status_manger.dart
deleted file mode 100644
index 012a9a23..00000000
--- a/lib/controllers/http_status_manger/http_status_manger.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-import 'package:test_sa/models/subtitle.dart';
-import 'package:meta/meta.dart';
-
-class HttpStatusManger{
- static String getStatusMessage({
- @required int status,
- @required Subtitle subtitle,
- String messageFor400,
- String messageFor200,
- }){
- if(status == null)
- // no status code - code error no need for subtitle
- return "careful null status";
- if(status == -1)
- // client's request in process
- return subtitle.currentlyServiceNotAvailable;
- if(status == -2){
- // client's request in process
- return subtitle.waitUntilYourRequestComplete;
- }else if(status >= 200 && status < 300){
- // client's request was successfully received
- return messageFor200 ?? subtitle.requestCompleteSuccessfully;
- } else if(status >= 400 && status < 500){
- // client's request have error
- switch(status){
- case 400:
- return messageFor400 ?? subtitle.failedToCompleteRequest;
- default:
- return subtitle.failedToCompleteRequest;
- }
- } else if(status >= 500){
- // server error
- return subtitle.currentlyServiceNotAvailable;
- } else {
- // no error match so return default error
- return subtitle.failedToCompleteRequest;
- }
-
- }
-}
\ No newline at end of file
diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart
deleted file mode 100644
index 7dba6a8c..00000000
--- a/lib/controllers/providers/api/gas_refill_provider.dart
+++ /dev/null
@@ -1,172 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/cupertino.dart';
-import 'package:http/http.dart';
-import 'package:test_sa/controllers/api_routes/urls.dart';
-import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
-import 'package:test_sa/models/user.dart';
-
-class GasRefillProvider extends ChangeNotifier{
-
- // number of items call in each request
- final pageItemNumber = 50;
-
- //reset provider data
- void reset(){
- items = null;
- 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;
-
- // list of user requests
- List items;
-
- // when requests in-process _loading = true
- // done _loading = true
- // failed _loading = false
- bool isLoading;
-
- /// 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,
- }) async {
- if(isLoading == true)
- return -2;
- isLoading = true;
- Response response;
- try{
- response = await get(
- Uri.parse(
- "$host${URLs.getGasRefill}?uid=${user.id}"
- "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}"
- ),
- headers: {
- "Content-Type":"application/json; charset=utf-8"
- }
- );
- stateCode = response.statusCode;
- if(stateCode >= 200 && stateCode < 300) {
- // client's request was successfully received
- List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
- List itemsPage = requestsListJson.map(
- (request) => GasRefillModel.fromJson(request)).toList();
- items ??= [];
- items.addAll(itemsPage);
- if(itemsPage.length == pageItemNumber){
- nextPage = true;
- }else{
- nextPage = false;
- }
- }
- isLoading = false;
- notifyListeners();
- return response.statusCode;
-
- } catch(error) {
- isLoading = false;
- stateCode = -1;
- notifyListeners();
- return -1;
- }
-
- }
-
- Future createModel ({
- @required String host,
- @required User user,
- @required GasRefillModel model,
- }) async {
- Map body = {
- "uid": user.id.toString(),
- "token": user.token ?? "",
- "title": model.title ?? "",
- "status": "0",//model.status.value.toString(),
- };
-
- body["details"] = jsonEncode(model.details.map((model) => {
- "type": model.type.id?.toString(),
- "size": model.cylinderSize?.id.toString(),
- "requsted_qty": model.requestedQuantity.toString(),
- }).toList());
-
- Response response;
- try{
- response = await post(
- Uri.parse(
- host+URLs.requestGasRefill),
- body: body,
- );
-
- stateCode = response.statusCode;
- if(response.statusCode >= 200 && response.statusCode < 300) {
- if(items != null) {
- items.insert(
- 0,
- GasRefillModel.fromJson(
- json.decode(utf8.decode(response.bodyBytes))[0]
- )
- );
- notifyListeners();
- }
- }
- return response.statusCode;
-
- } catch(error) {
- return -1;
- }
-
- }
-
- Future updateModel ({
- @required String host,
- @required User user,
- @required GasRefillModel oldModel,
- @required GasRefillModel newModel,
- }) async {
- Map body = {
- "uid": user.id.toString(),
- "token": user.token ?? "",
- "title": newModel.title ?? "",
- "status": newModel.status.id.toString(),
- };
-
- body["details"] = jsonEncode(newModel.details.map((model) => {
- "type": model.type.id.toString(),
- "size": model.cylinderSize.id.toString(),
- "requsted_qty": model.requestedQuantity.toString(),
- "deliverd_qty": model.deliveredQuantity.toString(),
- }).toList());
-
- Response response;
- try{
- response = await post(
- Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
- body: body,
- );
-
- stateCode = response.statusCode;
- if(response.statusCode >= 200 && response.statusCode < 300) {
- oldModel.fromGasRefillModel(newModel);
- notifyListeners();
- }
- return response.statusCode;
-
- } catch(error) {
- return -1;
- }
-
- }
-}
\ No newline at end of file
diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart
deleted file mode 100644
index 040ed855..00000000
--- a/lib/controllers/providers/api/service_requests_provider.dart
+++ /dev/null
@@ -1,422 +0,0 @@
-import 'dart:convert';
-
-import 'package:flutter/cupertino.dart';
-import 'package:http/http.dart';
-import 'package:test_sa/controllers/api_routes/urls.dart';
-import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
-import 'package:test_sa/models/issue.dart';
-import 'package:test_sa/models/lookup.dart';
-import 'package:test_sa/models/service_report.dart';
-import 'package:test_sa/models/service_request/service_request.dart';
-import 'package:test_sa/models/service_request/service_request_search.dart';
-import 'package:test_sa/models/subtitle.dart';
-import 'package:test_sa/models/timer_model.dart';
-import 'package:test_sa/models/user.dart';
-
-class ServiceRequestsProvider extends ChangeNotifier{
-
- // number of items call in each request
- final pageItemNumber = 50;
-
- //reset provider data
- void reset(){
- serviceRequests = null;
- 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;
-
- // list of user requests
- List serviceRequests;
-
- // 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=${(serviceRequests?.length ?? 0) ~/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();
- if(serviceRequests == null)
- serviceRequests = [];
- 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 = '';
- if(user != null){
- 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));
- }
-
- }
-
- Future createRequest ({
- @required String host,
- @required User user,
- @required ServiceRequest serviceRequest,
- }) async {
-
- var body = {
- "uid": user.id,
- "token": user.token ?? "",
- "sn_id": serviceRequest.deviceId ?? "",
- "date": (DateTime.now().millisecondsSinceEpoch).toString(),
- "client": user.hospital.id ?? '',
- "complaint": serviceRequest.maintenanceIssue,
- "image": json.encode(serviceRequest.devicePhotos),
- "priority": (serviceRequest.priority?.id).toString(),
- "defect_types": (serviceRequest.defectType?.id).toString(),
- };
- if(serviceRequest.audio != null){
- body["audio"] = serviceRequest.audio;
- }
- Response response;
- try{
- response = await post(
- Uri.parse(
- host+URLs.createRequest),
- body: body,
- );
- stateCode = response.statusCode;
- if(response.statusCode >= 200 && response.statusCode < 300) {
- if(serviceRequests != null)
- serviceRequests.insert(
- 0,
- ServiceRequest.fromJson(
- json.decode(utf8.decode(response.bodyBytes))[0]
- )
- );
- notifyListeners();
- }
- return response.statusCode;
-
- } catch(error) {
- return -1;
- }
-
- }
-
- 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;
- if(newDate != null) body["date"] = newDate;
- if(employee != null) 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 = '';
- if(user != null){
- 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 / 1000).toStringAsFixed(0);
- body["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
- body["working_hours"] = (timer.durationInSecond / 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 = '';
- if(user != null){
- 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));
- }
-
- }
-
-
-}
\ No newline at end of file
diff --git a/lib/core/app_configs/app_localizations.dart b/lib/core/app_configs/app_localizations.dart
new file mode 100644
index 00000000..b26ef59c
--- /dev/null
+++ b/lib/core/app_configs/app_localizations.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+import 'package:test_sa/core/enums.dart' show SupportedLanguagesEnum;
+
+class AppLocalizations {
+ AppLocalizations._();
+
+ static List supportedLocales =
+ SupportedLanguagesEnum.values.map((e) => Locale(e.name)).toList();
+
+ static List get delegates => const [
+ // AppLocalization.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ];
+}
diff --git a/lib/core/app_configs/app_routes.dart b/lib/core/app_configs/app_routes.dart
new file mode 100644
index 00000000..a45d0a44
--- /dev/null
+++ b/lib/core/app_configs/app_routes.dart
@@ -0,0 +1,29 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/screens/login_screen/login_screen.dart';
+import 'package:test_sa/screens/splash_screen/splash_screen.dart';
+
+Map appRoutes = {
+ SplashScreen.routeName: (_) => const SplashScreen(),
+ LoginScreen.routeName: (_) => const LoginScreen(),
+ // LandPage.routeName: (_) => const LandPage(),
+ // Register.routeName: (_) => Register(),
+ // ProfilePage.routeName: (_) => ProfilePage(),
+ // ReportIssuesPage.routeName: (_) => const ReportIssuesPage(),
+ // RequestGasRefill.routeName: (_) => const RequestGasRefill(),
+ // CreateRequestPage.routeName: (_) => CreateRequestPage(),
+ // SingleHospitalPicker.routeName: (_) => SingleHospitalPicker(),
+ // SingleDevicePicker.routeName: (_) => SingleDevicePicker(),
+ // SingleDepartmentPicker.routeName: (_) => SingleDepartmentPicker(),
+ // ServiceRequestsPage.routeName: (_) => ServiceRequestsPage(),
+ // NotificationsPage.routeName: (_) => NotificationsPage(),
+ // FutureRequestServiceDetails.routeName: (_) =>
+ // FutureRequestServiceDetails(),
+ // PreventiveMaintenanceVisitsPage.routeName: (_) =>
+ // PreventiveMaintenanceVisitsPage(),
+ // RegularVisitsPage.routeName: (_) => RegularVisitsPage(),
+ // TrackGasRefillPage.routeName: (_) => const TrackGasRefillPage(),
+ // RequestDeviceTransfer.routeName: (_) =>
+ // const RequestDeviceTransfer(),
+ // TrackDeviceTransferPage.routeName: (_) =>
+ // const TrackDeviceTransferPage(),
+};
diff --git a/lib/core/app_configs/app_theme.dart b/lib/core/app_configs/app_theme.dart
new file mode 100644
index 00000000..ae61fed9
--- /dev/null
+++ b/lib/core/app_configs/app_theme.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/core/constants/app_colors.dart';
+
+class AppTheme {
+ AppTheme._();
+
+ static get theme => ThemeData(
+ fontFamily: "Poppins",
+ canvasColor: AppColors.primaryColor,
+ scaffoldBackgroundColor: AppColors.scaffoldBackgroundColor,
+ primaryColor: AppColors.primaryColor,
+ indicatorColor: AppColors.primaryColor,
+ colorScheme: const ColorScheme.light(
+ primary: AppColors.primaryColor,
+ onPrimary: Colors.white,
+ secondary: AppColors.secondaryColor,
+ onSecondary: Colors.white,
+ ),
+ );
+}
diff --git a/lib/core/constants/api_constants.dart b/lib/core/constants/api_constants.dart
new file mode 100644
index 00000000..7738c43a
--- /dev/null
+++ b/lib/core/constants/api_constants.dart
@@ -0,0 +1,66 @@
+class ApiConstants {
+ ApiConstants._();
+ static const host2 = "http://194.163.164.213/atoms/api";
+ static const host1 = "https://atoms.hmg.com/api";
+
+ // API Routes
+ static const login = "/handle/user/login"; // post
+ static const register = "/handle/create/user"; // post
+ static const updateProfile = "/update/user/profile"; // post
+ static const getHospitals = "/handle/return/all/clients"; // get
+ static const getDepartments = "/handle/return/all/departments"; // get
+ static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051
+ static const getServiceRequests = "/return/user/calls"; // get
+
+ static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get
+ static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get
+
+ static const getRegularVisits = "/return/user/ppm"; // get
+ static const updateRegularVisits = "/update/user/ppm"; // get
+
+ static const getSingleServiceRequest = "/return/call/information"; // get
+ static const getNotifications = "/return/user/notification"; // get
+ static const getRecentNotifications = "/return/user/recent/notification"; // get
+ static const createRequest = "/handle/create/request"; // get
+ static const createReport = "/handle/create/report/issue"; // get
+ static const updateRequestDate = "/handle/update/request"; // get
+
+ // service report
+ static const createServiceReport = "/handle/create/service/report"; // get
+ static const updateServiceReport = "/handle/update/service/report"; // get
+ static const getServiceReport = "/handle/view/service/report"; // get
+ static const createDuplicatedReport = "/handle/duplicate/request"; // get
+
+ static const getServiceReportReasons = "/return/service/report/reasons"; // get
+ static const getServiceReportTypes = "/return/service/report/type"; // get
+ static const getServiceReportStatus = "/return/service/report/status"; // get
+ static const getServiceReportLastCalls = "/return/call/last/situation"; // get
+ static const getServiceTypes = "/return/service/type"; // get
+ static const getPartNumber = "/handle/return/all/parts"; // get
+ static const getServiceReportPriority = "/return/call/priority/list"; // get
+ static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get
+
+ //gas refill
+ static const getGasTypes = "/return/gas/refill/types"; // get
+ static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get
+ static const getGasStatus = "/return/gas/refill/status"; // get
+ static const requestGasRefill = "/create/gas/refill"; // get
+ static const updateGasRefill = "/update/gas/refill/"; // get
+ static const getGasRefill = "/search/gas/refill"; // get
+
+ //device transfer
+ static const requestDeviceTransfer = "/create/transfer/asset"; // get
+ static const updateDeviceTransfer = "/update/transfer/asset"; // get
+ static const getDeviceTransfer = "/search/transfer/asset"; // get
+
+ // employee
+ static const getEmployees = "/return/assigned/employee"; // get
+ // pentry
+ static const getPentry = "/return/pentry/details"; // get
+ static const updatePentry = "/update/pentry/details"; // get
+ static const getPentryTaskStatus = "/return/pentry/task/status"; // get
+ static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get
+ static const getPentryStatus = "/return/pentry/status/list"; // get
+ // contacts
+ static const getPentryContacts = "/handle/return/all/contacts"; // get
+}
diff --git a/lib/core/constants/app_colors.dart b/lib/core/constants/app_colors.dart
new file mode 100644
index 00000000..a8ebe4ce
--- /dev/null
+++ b/lib/core/constants/app_colors.dart
@@ -0,0 +1,50 @@
+import 'package:flutter/material.dart';
+
+class AppColors {
+ AppColors._();
+
+ static const Color white = Color(0xffffffff);
+ static const Color black = Color(0xff000000);
+ static const Color grey3A = Color(0xff2e303a);
+ static const Color grey = Color(0xffe1e7e7);
+ static const green = Colors.green;
+ static const Color orange = Colors.orange;
+ static const Color deepOrange = Colors.deepOrangeAccent;
+ static const Color red = Colors.red;
+ static const Color deepRed = Color(0xFFD32F2F);
+ static const Color scaffoldBackgroundColor = Color(0xffffffff);
+ static const Color secondaryColor = Color(0xff111427);
+ static const Color primaryColor = Color(0xff5bb0da);
+ static const Color cyan = Color(0xff4A8DB7);
+ static const Color onPrimaryColor = Color(0xffffffff);
+ static const Color inputFieldBackgroundColor = Color(0xfff5f5f5);
+ static const Color greyEF = Color(0xffEFEFEF);
+
+ static Color getRequestStatusColor(int id) {
+ switch (id) {
+ case 4:
+ return deepRed;
+ case 6:
+ return green;
+ case 5:
+ return orange;
+ case 8:
+ return green;
+ case 9:
+ return orange;
+ default:
+ return grey;
+ }
+ }
+
+ static Color getGasStatusColor(int id) {
+ switch (id) {
+ case 0:
+ return orange;
+ case 1:
+ return green;
+ default:
+ return grey;
+ }
+ }
+}
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
new file mode 100644
index 00000000..c5cc7bbe
--- /dev/null
+++ b/lib/core/enums.dart
@@ -0,0 +1,20 @@
+enum SupportedLanguagesEnum { ar, en }
+
+enum RequestMethod { get, post, put, delete }
+
+enum ApiExceptionsEnum {
+ badRequest(10),
+ unauthorized(10),
+ forbidden(10),
+ notFound(10),
+ internalServerError(10),
+ upgradeRequired(10),
+ badResponseFormat(10),
+ other(10),
+ timeout(10),
+ unknown(10);
+
+ final int statusCode;
+
+ const ApiExceptionsEnum(this.statusCode);
+}
diff --git a/lib/core/extensions/context_extension.dart b/lib/core/extensions/context_extension.dart
new file mode 100644
index 00000000..65f8e468
--- /dev/null
+++ b/lib/core/extensions/context_extension.dart
@@ -0,0 +1,3 @@
+import 'package:flutter/widgets.dart';
+
+extension ContextExtension on BuildContext {}
diff --git a/lib/core/extensions/num_extension.dart b/lib/core/extensions/num_extension.dart
new file mode 100644
index 00000000..440d8401
--- /dev/null
+++ b/lib/core/extensions/num_extension.dart
@@ -0,0 +1,16 @@
+import 'package:flutter/material.dart';
+import 'package:test_sa/core/constants/app_colors.dart';
+
+extension NumExtension on num {
+ Widget get height => SizedBox(height: toDouble());
+
+ Widget get width => SizedBox(width: toDouble());
+
+ Widget get divider => Divider(
+ height: toDouble(),
+ thickness: toDouble(),
+ color: AppColors.greyEF,
+ );
+
+ Widget get makeItSquare => SizedBox(width: toDouble(), height: toDouble());
+}
diff --git a/lib/core/extensions/string_extension.dart b/lib/core/extensions/string_extension.dart
new file mode 100644
index 00000000..4259e1e7
--- /dev/null
+++ b/lib/core/extensions/string_extension.dart
@@ -0,0 +1 @@
+extension StringExtension on String {}
diff --git a/lib/core/extensions/widget_extension.dart b/lib/core/extensions/widget_extension.dart
new file mode 100644
index 00000000..134f9496
--- /dev/null
+++ b/lib/core/extensions/widget_extension.dart
@@ -0,0 +1,3 @@
+import 'package:flutter/material.dart';
+
+extension WidgetExtension on Widget {}
diff --git a/lib/core/utils/provider_scope.dart b/lib/core/utils/provider_scope.dart
new file mode 100644
index 00000000..5d83ff39
--- /dev/null
+++ b/lib/core/utils/provider_scope.dart
@@ -0,0 +1,46 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:test_sa/providers/settings_provider.dart';
+
+class ProviderScope extends StatelessWidget {
+ final Widget child;
+
+ const ProviderScope({required this.child, Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return MultiProvider(
+ providers: [
+ ChangeNotifierProvider(create: (_) => SettingsProvider()),
+ // ChangeNotifierProvider(create: (_) => UserProvider()),
+ // ChangeNotifierProvider(create: (_) => HospitalsProvider()),
+ // ChangeNotifierProvider(create: (_) => DevicesProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceRequestsProvider()),
+ // ChangeNotifierProvider(create: (_) => DepartmentsProvider()),
+ // ChangeNotifierProvider(create: (_) => NotificationsProvider()),
+ // ChangeNotifierProvider(
+ // create: (_) => PreventiveMaintenanceVisitsProvider()),
+ // ChangeNotifierProvider(create: (_) => RegularVisitsProvider()),
+ // ChangeNotifierProvider(create: (_) => PartsProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()),
+ // ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()),
+ // ChangeNotifierProvider(create: (_) => GasStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => GasTypesProvider()),
+ // ChangeNotifierProvider(create: (_) => GasRefillProvider()),
+ // ChangeNotifierProvider(create: (_) => DeviceTransferProvider()),
+ // ChangeNotifierProvider(create: (_) => EmployeesProvider()),
+ // ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => PentryStatusProvider()),
+ // ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()),
+ // ChangeNotifierProvider(
+ // create: (_) => ServiceRequestDefectTypesProvider()),
+ ],
+ child: child,
+ );
+ }
+}
diff --git a/lib/data/api/api_client.dart b/lib/data/api/api_client.dart
new file mode 100644
index 00000000..71192923
--- /dev/null
+++ b/lib/data/api/api_client.dart
@@ -0,0 +1,57 @@
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:test_sa/core/enums.dart';
+
+class ApiClient {
+ final String baseUrl, endPoint;
+ final RequestMethod requestMethod;
+
+ ApiClient.request({
+ required this.baseUrl,
+ required this.endPoint,
+ required this.requestMethod,
+ });
+
+ Future