Merge branch 'zaid-development' into 'master'

Zaid development - Retrieve The Previous Structure and Applying Null-Safety

See merge request haroon6138/cloudsolutions-atoms!4
merge-requests/5/merge
Sikander Saleem 3 years ago
commit 4484a63955

@ -6,10 +6,10 @@ PODS:
- Firebase/Messaging (10.3.0): - Firebase/Messaging (10.3.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseMessaging (~> 10.3.0) - FirebaseMessaging (~> 10.3.0)
- firebase_core (2.4.1): - firebase_core (2.6.1):
- Firebase/CoreOnly (= 10.3.0) - Firebase/CoreOnly (= 10.3.0)
- Flutter - Flutter
- firebase_messaging (14.2.1): - firebase_messaging (14.2.4):
- Firebase/Messaging (= 10.3.0) - Firebase/Messaging (= 10.3.0)
- firebase_core - firebase_core
- Flutter - Flutter
@ -79,8 +79,9 @@ PODS:
- nanopb/encode (2.30909.0) - nanopb/encode (2.30909.0)
- package_info (0.0.1): - package_info (0.0.1):
- Flutter - Flutter
- path_provider_ios (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS
- permission_handler_apple (9.0.4): - permission_handler_apple (9.0.4):
- Flutter - Flutter
- PromisesObjC (2.1.1) - PromisesObjC (2.1.1)
@ -89,8 +90,9 @@ PODS:
- MTBBarcodeScanner - MTBBarcodeScanner
- share (0.0.1): - share (0.0.1):
- Flutter - Flutter
- shared_preferences_ios (0.0.1): - shared_preferences_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS
- speech_to_text (0.0.1): - speech_to_text (0.0.1):
- Flutter - Flutter
- Try - Try
@ -113,11 +115,11 @@ DEPENDENCIES:
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- package_info (from `.symlinks/plugins/package_info/ios`) - package_info (from `.symlinks/plugins/package_info/ios`)
- path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`)
- share (from `.symlinks/plugins/share/ios`) - share (from `.symlinks/plugins/share/ios`)
- shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
- speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
@ -160,16 +162,16 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/image_picker_ios/ios" :path: ".symlinks/plugins/image_picker_ios/ios"
package_info: package_info:
:path: ".symlinks/plugins/package_info/ios" :path: ".symlinks/plugins/package_info/ios"
path_provider_ios: path_provider_foundation:
:path: ".symlinks/plugins/path_provider_ios/ios" :path: ".symlinks/plugins/path_provider_foundation/ios"
permission_handler_apple: permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios" :path: ".symlinks/plugins/permission_handler_apple/ios"
qr_code_scanner: qr_code_scanner:
:path: ".symlinks/plugins/qr_code_scanner/ios" :path: ".symlinks/plugins/qr_code_scanner/ios"
share: share:
:path: ".symlinks/plugins/share/ios" :path: ".symlinks/plugins/share/ios"
shared_preferences_ios: shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_ios/ios" :path: ".symlinks/plugins/shared_preferences_foundation/ios"
speech_to_text: speech_to_text:
:path: ".symlinks/plugins/speech_to_text/ios" :path: ".symlinks/plugins/speech_to_text/ios"
sqflite: sqflite:
@ -180,8 +182,8 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
Firebase: f92fc551ead69c94168d36c2b26188263860acd9 Firebase: f92fc551ead69c94168d36c2b26188263860acd9
firebase_core: bf59c32d2e53814f558efa20840c1902fa2fe461 firebase_core: 6242f038aefa4582e028536e71312f7e3a41e6bb
firebase_messaging: ee597229fc260f8fa491fa8f2d4a32dfbfa406fa firebase_messaging: ee61b8065c395a117864224e3031729e656232af
FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a
FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b
FirebaseInstallations: e2f26126089dcf41e215f7b8925af8d953c7d602 FirebaseInstallations: e2f26126089dcf41e215f7b8925af8d953c7d602
@ -199,18 +201,18 @@ SPEC CHECKSUMS:
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
share: 0b2c3e82132f5888bccca3351c504d0003b3b410 share: 0b2c3e82132f5888bccca3351c504d0003b3b410
shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca
speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96
url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de url_launcher_ios: fb12c43172927bb5cf75aeebd073f883801f1993
PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048
COCOAPODS: 1.10.2 COCOAPODS: 1.11.3

@ -13,7 +13,7 @@ class NotificationsProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset() { void reset() {
notifications = null; notifications.clear();
nextPage = true; nextPage = true;
stateCode = null; stateCode = null;
} }
@ -27,7 +27,7 @@ class NotificationsProvider extends ChangeNotifier {
bool? nextPage = true; bool? nextPage = true;
// list of user requests // list of user requests
List<AppNotification>? notifications; List<AppNotification> notifications = [];
// when requests in-process _loading = true // when requests in-process _loading = true
// done _loading = true // done _loading = true
@ -64,8 +64,7 @@ class NotificationsProvider extends ChangeNotifier {
List<AppNotification> serviceRequestsPage = requestsListJson List<AppNotification> serviceRequestsPage = requestsListJson
.map((request) => AppNotification.fromJson(request)) .map((request) => AppNotification.fromJson(request))
.toList(); .toList();
notifications ??= []; notifications.addAll(serviceRequestsPage);
notifications?.addAll(serviceRequestsPage);
if (serviceRequestsPage.length == pageItemNumber) { if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {

@ -16,7 +16,7 @@ class RegularVisitsProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset() { void reset() {
visits = null; visits.clear();
nextPage = true; nextPage = true;
stateCode = null; stateCode = null;
} }
@ -30,7 +30,7 @@ class RegularVisitsProvider extends ChangeNotifier {
bool nextPage = true; bool nextPage = true;
// list of user requests // list of user requests
List<Visit>? visits; List<Visit> visits = [];
// when requests in-process _loading = true // when requests in-process _loading = true
// done _loading = true // done _loading = true
@ -45,8 +45,8 @@ class RegularVisitsProvider extends ChangeNotifier {
/// for more details check http state manager /// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart /// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getVisits({ Future<int> getVisits({
required String host, required String? host,
required User user, required User? user,
// VisitsSearch visitsSearch, // VisitsSearch visitsSearch,
}) async { }) async {
if (isLoading == true) { if (isLoading == true) {
@ -58,7 +58,7 @@ class RegularVisitsProvider extends ChangeNotifier {
try { try {
response = await get( response = await get(
Uri.parse( Uri.parse(
"$host${URLs.getRegularVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}", "$host${URLs.getRegularVisits}?uid=${user?.id}&token=${user?.token}&page=${(visits.length) ~/ pageItemNumber}${visitsSearch?.toSearchString()}",
), ),
headers: {"Content-Type": "application/json; charset=utf-8"}, headers: {"Content-Type": "application/json; charset=utf-8"},
); );

@ -50,7 +50,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
/// lib\controllers\http_status_manger\http_status_manger.dart /// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getRequests({ Future<int> getRequests({
required String host, required String host,
required User user, required User? user,
required String? hospitalId, required String? hospitalId,
}) async { }) async {
if (isLoading == true) { if (isLoading == true) {
@ -61,7 +61,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
try { try {
response = await get( response = await get(
Uri.parse( Uri.parse(
"$host${URLs.getServiceRequests}?uid=${user.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}", "$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"}, headers: {"Content-Type": "application/json; charset=utf-8"},
); );
@ -108,7 +108,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
'$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData', '$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData',
)); ));
} catch (error) { } catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? ''); throw (HttpStatusManger.getStatusMessage(
status: -1, subtitle: subtitle) ??
'');
} }
// If the call to the server was successful, parse the JSON. // If the call to the server was successful, parse the JSON.
@ -121,7 +123,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
return requests[0]; return requests[0];
} else { } else {
throw (HttpStatusManger.getStatusMessage( throw (HttpStatusManger.getStatusMessage(
status: response.statusCode, subtitle: subtitle) ?? ""); status: response.statusCode, subtitle: subtitle) ??
"");
} }
} }

@ -1,17 +0,0 @@
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<Locale> supportedLocales =
SupportedLanguagesEnum.values.map((e) => Locale(e.name)).toList();
static List<LocalizationsDelegate> get delegates => const [
// AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
];
}

@ -1,29 +0,0 @@
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<String, Widget Function(BuildContext)> 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(),
};

@ -1,20 +0,0 @@
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,
),
);
}

@ -1,66 +0,0 @@
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
}

@ -1,50 +0,0 @@
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;
}
}
}

@ -1,20 +0,0 @@
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);
}

@ -1,3 +0,0 @@
import 'package:flutter/widgets.dart';
extension ContextExtension on BuildContext {}

@ -1,16 +0,0 @@
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());
}

@ -1 +0,0 @@
extension StringExtension on String {}

@ -1,3 +0,0 @@
import 'package:flutter/material.dart';
extension WidgetExtension on Widget {}

@ -1,46 +0,0 @@
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,
);
}
}

@ -1,57 +0,0 @@
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<Map<String, dynamic>> execute({
Map<String, String>? headers,
Map<String, dynamic>? queryParameters,
Object? body,
}) async {
final url = Uri.tryParse(baseUrl + endPoint);
if (url != null) {
late http.Response response;
switch (requestMethod) {
case RequestMethod.get:
response = await http.get(url, headers: headers);
break;
case RequestMethod.post:
response = await http.post(url, headers: headers, body: body);
break;
case RequestMethod.put:
response = await http.put(url, headers: headers, body: body);
break;
case RequestMethod.delete:
response = await http.delete(url, headers: headers, body: body);
break;
}
return await _handleResponse(response);
} else {
throw ApiExceptionsEnum.other;
}
}
Future<Map<String, dynamic>> _handleResponse(http.Response response) {
print('status code ${response.statusCode} : ${response.request?.url}');
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else if (response.statusCode == 401) {
throw ApiExceptionsEnum.unauthorized;
} else if (response.statusCode == 400) {
throw ApiExceptionsEnum.badRequest;
} else if (response.statusCode == 500) {
throw ApiExceptionsEnum.internalServerError;
}
throw ApiExceptionsEnum.unknown;
}
}

@ -1,18 +0,0 @@
import 'package:test_sa/core/enums.dart';
import 'package:test_sa/data/api/api_client.dart';
import 'package:test_sa/data/models/user_model.dart';
class UserService {
static UserService instance = UserService._internal();
UserService._internal();
Future<UserModel> getUser() async {
final response = await ApiClient.request(
baseUrl: 'baseUrl',
endPoint: 'endPoint',
requestMethod: RequestMethod.get,
).execute();
return UserModel.fromJson(response);
}
}

@ -1,7 +0,0 @@
class UserModel {
UserModel();
factory UserModel.fromJson(Map<String, dynamic> json) {
return UserModel();
}
}

@ -2,14 +2,56 @@ import 'dart:io';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/providers/settings_provider.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/screens/splash_screen/splash_screen.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/login.dart';
import 'package:test_sa/views/pages/register.dart';
import 'package:test_sa/views/pages/splash_screen.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/land_page.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/profile_page.dart';
import 'package:test_sa/views/pages/user/report_issues_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart';
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
import 'package:test_sa/views/pages/user/requests/requests_page.dart';
import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart';
import 'package:test_sa/views/widgets/departments/single_department_picker.dart';
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import 'core/app_configs/app_localizations.dart'; import 'controllers/providers/api/parts_provider.dart';
import 'core/app_configs/app_routes.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart';
import 'core/app_configs/app_theme.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart';
import 'core/utils/provider_scope.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart';
import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart';
import 'controllers/providers/api/status_drop_down/report/service_report_types_provider.dart';
import 'controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import 'controllers/providers/api/user_provider.dart';
import 'controllers/providers/settings/setting_provider.dart';
import 'views/pages/device_transfer/request_device_transfer.dart';
import 'views/pages/device_transfer/track_device_transfer.dart';
import 'views/widgets/hospitals/single_hospital_picker.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@ -19,21 +61,54 @@ void main() async {
apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc",
appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395",
messagingSenderId: "973582662416", messagingSenderId: "973582662416",
projectId: "atoms-fb912", projectId: "atoms-fb912"),
),
); );
} else { } else {
await Firebase.initializeApp(); await Firebase.initializeApp();
} }
runApp(const EntryPoint()); runApp(ChangeNotifierProvider(
create: (_) => SettingProvider(),
child: MyApp(),
));
} }
class EntryPoint extends StatelessWidget { class MyApp extends StatelessWidget {
const EntryPoint({Key? key}) : super(key: key); const MyApp({super.key});
// This widget is the root of your application.
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ProviderScope( final settingProvider = Provider.of<SettingProvider>(context);
return MultiProvider(
providers: [
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: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context); FocusScopeNode currentFocus = FocusScope.of(context);
@ -41,17 +116,56 @@ class EntryPoint extends StatelessWidget {
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
} }
}, },
child: Consumer<SettingsProvider>( child: MaterialApp(
builder: (context, settingProvider, _) => MaterialApp(
title: 'ATOMS', title: 'ATOMS',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: AppTheme.theme, theme: ThemeData(
localizationsDelegates: AppLocalizations.delegates, fontFamily: "Poppins",
supportedLocales: AppLocalizations.supportedLocales, //canvasColor: AColors.primaryColor,
locale: settingProvider.locale, scaffoldBackgroundColor: AColors.scaffoldBackgroundColor,
initialRoute: SplashScreen.routeName, primaryColor: AColors.primaryColor,
routes: appRoutes, indicatorColor: AColors.primaryColor,
), colorScheme: const ColorScheme.light(
primary: AColors.primaryColor,
onPrimary: Colors.white,
secondary: AColors.secondaryColor,
onSecondary: Colors.white)),
localizationsDelegates: const [
// ... app-specific localization delegate[s] here
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en'),
Locale('ar'),
],
locale: Locale(settingProvider.language ?? 'en'),
initialRoute: SplashScreen.id,
routes: {
SplashScreen.id: (_) => const SplashScreen(),
LandPage.id: (_) => const LandPage(),
Login.id: (_) => const Login(),
Register.id: (_) => Register(),
ProfilePage.id: (_) => ProfilePage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_) => CreateRequestPage(),
SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
SingleDevicePicker.id: (_) => SingleDevicePicker(),
SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(),
ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
NotificationsPage.id: (_) => NotificationsPage(),
FutureRequestServiceDetails.id: (_) =>
const FutureRequestServiceDetails(),
PreventiveMaintenanceVisitsPage.id: (_) =>
PreventiveMaintenanceVisitsPage(),
RegularVisitsPage.id: (_) => const RegularVisitsPage(),
TrackGasRefillPage.id: (_) => const TrackGasRefillPage(),
RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(),
TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(),
},
), ),
), ),
); );

@ -1,12 +0,0 @@
import 'package:flutter/material.dart';
class SettingsProvider with ChangeNotifier {
Locale? _locale;
Locale? get locale => _locale;
set locale(Locale? value) {
_locale = value;
notifyListeners();
}
}

@ -1,12 +0,0 @@
import 'package:flutter/material.dart';
class LoginScreen extends StatelessWidget {
static const routeName = '/loginScreen';
const LoginScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold();
}
}

@ -1,32 +0,0 @@
import 'package:flare_flutter/flare_actor.dart';
import 'package:flutter/material.dart';
import 'package:test_sa/screens/login_screen/login_screen.dart';
class SplashScreen extends StatelessWidget {
static const routeName = "/splashScreen";
const SplashScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: SizedBox(
width: MediaQuery.of(context).size.width / 1.1,
child: FlareActor(
"assets/rives/atoms_splash.flr",
fit: BoxFit.contain,
animation: "splash",
callback: (animation) async {
Navigator.of(context).pushNamed(LoginScreen.routeName);
// if (_settingProvider.isLoaded && _settingProvider.user != null) {
// _goToUserScreen(_settingProvider.user);
// }
},
),
),
),
);
}
}

@ -34,8 +34,10 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
UserProvider? _userProvider; UserProvider? _userProvider;
SettingProvider? _settingProvider; SettingProvider? _settingProvider;
DeviceTransferProvider? _deviceTransferProvider; DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController =
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo()); TextEditingController();
final DeviceTransfer _formModel =
DeviceTransfer(receiver: DeviceTransferInfo());
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -73,7 +75,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));
@ -91,7 +94,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_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);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: Form( body: Form(
@ -112,7 +116,10 @@ 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),
), ),
), ),
), ),
@ -139,7 +146,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
), ),
6.height, 6.height,
DeviceButton( DeviceButton(
device: _formModel.device!, device: _formModel.device,
onDevicePick: (device) { onDevicePick: (device) {
_formModel.device = device; _formModel.device = device;
setState(() {}); setState(() {});

@ -15,9 +15,10 @@ import '../widgets/buttons/app_button.dart';
import '../widgets/loaders/loading_manager.dart'; import '../widgets/loaders/loading_manager.dart';
import 'user/land_page.dart'; import 'user/land_page.dart';
class Login extends StatefulWidget { class Login extends StatefulWidget {
static final String id = "/login"; static const String id = "/login";
const Login({super.key});
@override @override
_LoginState createState() => _LoginState(); _LoginState createState() => _LoginState();
@ -26,9 +27,9 @@ class Login extends StatefulWidget {
class _LoginState extends State<Login> { class _LoginState extends State<Login> {
UserProvider? _userProvider; UserProvider? _userProvider;
SettingProvider? _settingProvider; SettingProvider? _settingProvider;
User _user = User(); final User _user = User();
bool _obscurePassword = true; bool _obscurePassword = true;
bool _firstTime = true; final bool _firstTime = true;
late double _height; late double _height;
late double _width; late double _width;
late String _payload; late String _payload;
@ -41,12 +42,13 @@ class _LoginState extends State<Login> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
Subtitle? _subtitle = AppLocalization.of(context)?.subtitle; Subtitle? subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: (_userProvider?.isLoading??false) || !(_settingProvider?.isLoaded??false), isLoading: (_userProvider?.isLoading ?? false) ||
!(_settingProvider?.isLoaded ?? false),
isFailedLoading: false, isFailedLoading: false,
stateCode: 200, stateCode: 200,
onRefresh: () async {}, onRefresh: () async {},
@ -65,37 +67,44 @@ class _LoginState extends State<Login> {
child: Image( child: Image(
height: _height / 6, height: _height / 6,
fit: BoxFit.contain, fit: BoxFit.contain,
image: AssetImage("assets/images/logo.png"), image: const AssetImage("assets/images/logo.png"),
), ),
), ),
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 24 * AppStyle.getScaleFactor(context), vertical: 24 * AppStyle.getScaleFactor(context)), padding: EdgeInsets.symmetric(
horizontal: 24 * AppStyle.getScaleFactor(context),
vertical: 24 * AppStyle.getScaleFactor(context)),
child: Column( child: Column(
children: [ children: [
SizedBox( SizedBox(
height: 24 * AppStyle.getScaleFactor(context), height: 24 * AppStyle.getScaleFactor(context),
), ),
ATextFormField( ATextFormField(
initialValue: _user?.userName??"", initialValue: _user.userName ?? "",
hintText: _subtitle?.name??"", hintText: subtitle?.name ?? "",
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyLarge,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
validator: (value) => Validator.hasValue(value!) ? '' : _subtitle?.nameValidateMessage??"", validator: (value) => Validator.hasValue(value ?? '')
? null
: subtitle?.nameValidateMessage,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value) { onSaved: (value) {
_user.userName = value!; _user.userName = value!;
}, },
), ),
SizedBox(height: 12), const SizedBox(height: 12),
ATextFormField( ATextFormField(
initialValue: _user.password, initialValue: _user.password,
hintText: _subtitle?.password??"", hintText: subtitle?.password ?? "",
obscureText: _obscurePassword, obscureText: _obscurePassword,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
textAlign: TextAlign.left, textAlign: TextAlign.left,
validator: (value) => Validator.isValidPassword(value!) ? '' : _subtitle?.passwordValidateMessage??"", validator: (value) =>
Validator.isValidPassword(value ?? '')
? null
: subtitle?.passwordValidateMessage,
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
@ -108,23 +117,35 @@ class _LoginState extends State<Login> {
height: 32 * AppStyle.getScaleFactor(context), height: 32 * AppStyle.getScaleFactor(context),
), ),
AButton( AButton(
text: _subtitle?.signIn??"", text: subtitle?.signIn ?? "",
onPressed: () async { onPressed: () async {
if (!(_formKey.currentState?.validate()??false)) return; if (!(_formKey.currentState?.validate() ?? true)) {
return;
}
_formKey.currentState?.save(); _formKey.currentState?.save();
int? status = await _userProvider?.login( int? status = await _userProvider?.login(
user: _user, user: _user,
host: _settingProvider?.host ?? "", host: _settingProvider?.host ?? "",
); );
if (status !=null && status >= 200 && status < 300) { if (status != null &&
_settingProvider?.setUser(_userProvider?.user??User()); status >= 200 &&
if (_userProvider?.user?.isActive??false) status < 300) {
_settingProvider
?.setUser(_userProvider?.user ?? User());
if (_userProvider?.user?.isActive ?? false) {
Navigator.of(context).pushNamed(LandPage.id); Navigator.of(context).pushNamed(LandPage.id);
else
Fluttertoast.showToast(msg: _subtitle?.activationAlert??"");
} else { } else {
String errorMessage = status == 400 ? _subtitle?.wrongEmailOrPassword??"" : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); Fluttertoast.showToast(
ScaffoldMessenger.of(context).showSnackBar(SnackBar( msg: subtitle?.activationAlert ?? "",
);
}
} else {
String errorMessage = status == 400
? subtitle?.wrongEmailOrPassword ?? ""
: HttpStatusManger.getStatusMessage(
status: status, subtitle: subtitle);
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),
)); ));
} }

@ -15,7 +15,7 @@ import 'login.dart';
import 'user/land_page.dart'; import 'user/land_page.dart';
class SplashScreen extends StatefulWidget { class SplashScreen extends StatefulWidget {
static const String routeName = '/splashScreen'; static const String id = '/splashScreen';
const SplashScreen({Key? key}) : super(key: key); const SplashScreen({Key? key}) : super(key: key);
@ -38,9 +38,10 @@ class _SplashScreenState extends State<SplashScreen> {
Firebase.initializeApp(); Firebase.initializeApp();
NotificationManger.initialisation((notificationDetails) { NotificationManger.initialisation((notificationDetails) {
AppNotification notification = AppNotification notification = AppNotification.fromJson(
AppNotification.fromJson(json.decode(notificationDetails.payload??"")); json.decode(notificationDetails.payload ?? ""));
if (notification.path == null || (notification.path?.isEmpty??false)) return; if (notification.path == null || (notification.path?.isEmpty ?? false))
return;
Navigator.pushNamed(context, notification.path ?? "", Navigator.pushNamed(context, notification.path ?? "",
arguments: notification.requestId); arguments: notification.requestId);
}, (id, title, body, payload) async {}); }, (id, title, body, payload) async {});
@ -63,7 +64,8 @@ class _SplashScreenState extends State<SplashScreen> {
callback: (animation) async { callback: (animation) async {
print(await FirebaseMessaging.instance.getToken()); print(await FirebaseMessaging.instance.getToken());
Navigator.of(context).pushNamed(Login.id); Navigator.of(context).pushNamed(Login.id);
if ((_settingProvider?.isLoaded??false) && _settingProvider?.user != null) { if ((_settingProvider?.isLoaded ?? false) &&
_settingProvider?.user != null) {
_goToUserScreen(_settingProvider?.user); _goToUserScreen(_settingProvider?.user);
} }
}, },

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@ -73,7 +72,7 @@ class _LandPageState extends State<LandPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String path = ModalRoute.of(context)!.settings.arguments.toString(); String? path = ModalRoute.of(context)?.settings.arguments as String?;
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
@ -81,12 +80,14 @@ class _LandPageState extends State<LandPage> {
_departmentsProvider = Provider.of<DepartmentsProvider>(context); _departmentsProvider = Provider.of<DepartmentsProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context); _preventiveMaintenanceVisitsProvider =
Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if (firstTime) { if (firstTime) {
if (path != null) { if (path != null) {
Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last); Navigator.of(context).pushNamed("/" + path.split("/").first,
arguments: path.split("/").last);
} }
firstTime = false; firstTime = false;
} }
@ -158,14 +159,16 @@ class _LandPageState extends State<LandPage> {
text: _subtitle.newServiceRequest, text: _subtitle.newServiceRequest,
icon: FontAwesomeIcons.tools, icon: FontAwesomeIcons.tools,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(CreateRequestPage.id); Navigator.of(context)
.pushNamed(CreateRequestPage.id);
}, },
), ),
LandPageItem( LandPageItem(
text: _subtitle.trackServiceRequest, text: _subtitle.trackServiceRequest,
icon: FontAwesomeIcons.tasks, icon: FontAwesomeIcons.tasks,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(ServiceRequestsPage.id); Navigator.of(context)
.pushNamed(ServiceRequestsPage.id);
}, },
), ),
//if (_userProvider.user.type == UsersTypes.engineer) //if (_userProvider.user.type == UsersTypes.engineer)
@ -189,28 +192,32 @@ class _LandPageState extends State<LandPage> {
text: "Request Gas Refill", text: "Request Gas Refill",
icon: FontAwesomeIcons.truckFast, icon: FontAwesomeIcons.truckFast,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(RequestGasRefill.id); Navigator.of(context)
.pushNamed(RequestGasRefill.id);
}, },
), ),
LandPageItem( LandPageItem(
text: "Track Gas Refill", text: "Track Gas Refill",
icon: Icons.content_paste_search, icon: Icons.content_paste_search,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(TrackGasRefillPage.id); Navigator.of(context)
.pushNamed(TrackGasRefillPage.id);
}, },
), ),
LandPageItem( LandPageItem(
text: "transfer Device", text: "transfer Device",
icon: FontAwesomeIcons.rightLeft, icon: FontAwesomeIcons.rightLeft,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(RequestDeviceTransfer.id); Navigator.of(context)
.pushNamed(RequestDeviceTransfer.id);
}, },
), ),
LandPageItem( LandPageItem(
text: "Track Device Transfer", text: "Track Device Transfer",
icon: FontAwesomeIcons.peopleCarryBox, icon: FontAwesomeIcons.peopleCarryBox,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); Navigator.of(context)
.pushNamed(TrackDeviceTransferPage.id);
}, },
), ),
], ],
@ -243,7 +250,8 @@ class _LandPageState extends State<LandPage> {
Align( Align(
alignment: Alignment.topRight, alignment: Alignment.topRight,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), padding:
const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: AIconButton( child: AIconButton(
iconData: Icons.menu, iconData: Icons.menu,
color: AColors.primaryColor, color: AColors.primaryColor,
@ -275,10 +283,17 @@ class _LandPageState extends State<LandPage> {
height: 50 * AppStyle.getScaleFactor(context), height: 50 * AppStyle.getScaleFactor(context),
width: 50 * AppStyle.getScaleFactor(context), width: 50 * AppStyle.getScaleFactor(context),
padding: EdgeInsets.all(4), padding: EdgeInsets.all(4),
decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle), decoration: BoxDecoration(
border: Border.all(
color: Theme.of(context).primaryColor, width: 2),
shape: BoxShape.circle),
child: ClipOval( child: ClipOval(
child: ClipOval( child: ClipOval(
child: Icon(Icons.person,size: 36,color: Theme.of(context).colorScheme.primary,), child: Icon(
Icons.person,
size: 36,
color: Theme.of(context).colorScheme.primary,
),
), ),
), ),
), ),
@ -311,7 +326,10 @@ class _LandPageState extends State<LandPage> {
}), }),
Text( Text(
"English", "English",
style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A), style: Theme.of(context)
.textTheme
.bodyText1
?.copyWith(color: AColors.grey3A),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
Radio( Radio(
@ -324,7 +342,10 @@ class _LandPageState extends State<LandPage> {
}), }),
Text( Text(
"عربي", "عربي",
style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A), style: Theme.of(context)
.textTheme
.bodyText1
?.copyWith(color: AColors.grey3A),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
], ],
@ -368,8 +389,12 @@ class _LandPageState extends State<LandPage> {
icon: Icons.share, icon: Icons.share,
title: _subtitle.shareApp, title: _subtitle.shareApp,
onPressed: () async { onPressed: () async {
PackageInfo packageInfo = await PackageInfo.fromPlatform(); PackageInfo packageInfo =
String shareLink = "\n https://play.google.com/store/apps/details?id=" + packageInfo.packageName + "\n https://apps.apple.com/us/app/"; await PackageInfo.fromPlatform();
String shareLink =
"\n https://play.google.com/store/apps/details?id=" +
packageInfo.packageName +
"\n https://apps.apple.com/us/app/";
Share.share(shareLink); Share.share(shareLink);
}, },
), ),
@ -381,11 +406,15 @@ class _LandPageState extends State<LandPage> {
children: [ children: [
Text( Text(
"Powered By NewTrack", "Powered By NewTrack",
style: Theme.of(context).textTheme.headline6?.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12), style: Theme.of(context).textTheme.headline6?.copyWith(
fontWeight: FontWeight.w500,
color: AColors.grey3A,
fontSize: 12),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
6.width, 6.width,
Image.asset("assets/images/qr.jpeg", width: 32, height: 32, color: AColors.grey3A) Image.asset("assets/images/qr.jpeg",
width: 32, height: 32, color: AColors.grey3A)
], ],
).paddingOnly(left: 20, right: 20, top: 8, bottom: 8), ).paddingOnly(left: 20, right: 20, top: 8, bottom: 8),
], ],

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save