Compare commits

..

No commits in common. 'master' and 'Courses-CR#-7150' have entirely different histories.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 730 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.2 MiB

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:http/io_client.dart'; import 'package:http/io_client.dart';
@ -19,11 +18,15 @@ class APIError {
dynamic errorCode; dynamic errorCode;
int? errorType; int? errorType;
String? errorMessage; String? errorMessage;
int? errorStatusCode; int? errorStatusCode;
APIError(this.errorCode, this.errorMessage, this.errorType, this.errorStatusCode); APIError(this.errorCode, this.errorMessage, this.errorType, this.errorStatusCode);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage, 'errorType': errorType, 'ErrorStatusCode': errorStatusCode}; Map<String, dynamic> toJson() => {
'errorCode': errorCode,
'errorMessage': errorMessage,
'errorType': errorType,
'ErrorStatusCode': errorStatusCode
};
@override @override
String toString() { String toString() {
@ -45,22 +48,22 @@ APIException _throwAPIException(Response response) {
APIError? apiError; APIError? apiError;
if (response.body != null && response.body.isNotEmpty) { if (response.body != null && response.body.isNotEmpty) {
var jsonError = jsonDecode(response.body); var jsonError = jsonDecode(response.body);
apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'], jsonError['ErrorStatusCode']); apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType'],jsonError['ErrorStatusCode']);
} }
return APIException(APIException.BAD_REQUEST, error: apiError); return APIException(APIException.BAD_REQUEST, error: apiError);
case 401: case 401:
return const APIException(APIException.UNAUTHORIZED); return APIException(APIException.UNAUTHORIZED);
case 403: case 403:
return const APIException(APIException.FORBIDDEN); return APIException(APIException.FORBIDDEN);
case 404: case 404:
return const APIException(APIException.NOT_FOUND); return APIException(APIException.NOT_FOUND);
case 500: case 500:
return const APIException(APIException.INTERNAL_SERVER_ERROR); return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444: case 444:
var downloadUrl = response.headers["location"]; var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
default: default:
return const APIException(APIException.OTHER); return APIException(APIException.OTHER);
} }
} }
@ -71,16 +74,8 @@ class ApiClient {
factory ApiClient() => _instance; factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>( Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
FactoryConstructor<U> factoryConstructor, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
String url,
T jsonObject, {
String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false,
}) async {
var _headers = {'Accept': 'application/json'}; var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) { if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers); _headers.addAll(headers);
@ -126,15 +121,8 @@ class ApiClient {
} }
} }
Future<Response> postJsonForResponse<T>( Future<Response> postJsonForResponse<T>(String url, T jsonObject,
String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
T jsonObject, {
String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false,
}) async {
String? requestBody; String? requestBody;
late Map<String, String> stringObj; late Map<String, String> stringObj;
if (jsonObject != null) { if (jsonObject != null) {
@ -169,9 +157,9 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query; var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString; url = url + '?' + queryString;
} }
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(const Duration(seconds: 120)); var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 120));
if (response.statusCode >= 200 && response.statusCode < 300) { if (response. statusCode >= 200 && response.statusCode < 300) {
return response; return response;
} else { } else {
throw _throwAPIException(response); throw _throwAPIException(response);
@ -179,7 +167,7 @@ class ApiClient {
} on SocketException catch (e) { } on SocketException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -187,7 +175,7 @@ class ApiClient {
} on HttpException catch (e) { } on HttpException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -197,7 +185,7 @@ class ApiClient {
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -236,7 +224,7 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query; var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString; url = url + '?' + queryString;
} }
var response = await _get(Uri.parse(url), headers: _headers).timeout(const Duration(seconds: 60)); var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
return response; return response;
@ -246,7 +234,7 @@ class ApiClient {
} on SocketException catch (e) { } on SocketException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -254,7 +242,7 @@ class ApiClient {
} on HttpException catch (e) { } on HttpException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
@ -264,7 +252,7 @@ class ApiClient {
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(const Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -16,7 +15,6 @@ import 'package:mohem_flutter_app/models/dashboard/get_accural_ticket_balance_mo
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/eit_attachment_ticket_model.dart';
import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart'; import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart'; import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart';
@ -24,7 +22,6 @@ import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart'; import 'package:mohem_flutter_app/models/sso_auth_model.dart';
// import 'package:platform_device_id/platform_device_id.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -37,7 +34,7 @@ class DashboardApiClient {
Future<GetAttendanceTracking?> getAttendanceTracking() async { Future<GetAttendanceTracking?> getAttendanceTracking() async {
String url = "${ApiConsts.erpRest}GET_Attendance_Tracking"; String url = "${ApiConsts.erpRest}GET_Attendance_Tracking";
Map<String, dynamic> postParams = <String, dynamic>{}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -51,7 +48,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getOpenNotifications() async { Future<GenericResponseModel?> getOpenNotifications() async {
String url = "${ApiConsts.erpRest}GET_OPEN_NOTIFICATIONS"; String url = "${ApiConsts.erpRest}GET_OPEN_NOTIFICATIONS";
Map<String, dynamic> postParams = <String, dynamic>{}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -65,7 +62,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getCOCNotifications() async { Future<GenericResponseModel?> getCOCNotifications() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks"; String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
Map<String, dynamic> postParams = <String, dynamic>{"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER}; Map<String, dynamic> postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -79,7 +76,7 @@ class DashboardApiClient {
Future<ItgFormsModel?> getItgFormsPendingTask() async { Future<ItgFormsModel?> getItgFormsPendingTask() async {
String url = "${ApiConsts.cocRest}ITGFormsPendingTasks"; String url = "${ApiConsts.cocRest}ITGFormsPendingTasks";
Map<String, dynamic> postParams = <String, dynamic>{}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -93,13 +90,13 @@ class DashboardApiClient {
Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate, {String? empID}) async { Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate, {String? empID}) async {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES"; String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = <String, dynamic>{"P_EFFECTIVE_DATE": effectiveDate}; Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getAccrualBalancesList ?? <GetAccrualBalancesList>[]; return responseData.getAccrualBalancesList ?? [];
}, },
url, url,
postParams, postParams,
@ -108,13 +105,13 @@ class DashboardApiClient {
Future<List<GetTicketAccuralBalanceModel>> getTicketAccuralBalance(String effectiveDate, {String? empID}) async { Future<List<GetTicketAccuralBalanceModel>> getTicketAccuralBalance(String effectiveDate, {String? empID}) async {
String url = "${ApiConsts.erpRest}GET_TICKET_ACCRUAL_BALANCES"; String url = "${ApiConsts.erpRest}GET_TICKET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = <String, dynamic>{"P_EFFECTIVE_DATE": effectiveDate}; Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getAccrualBalancesTicketList ?? <GetTicketAccuralBalanceModel>[]; return responseData.getAccrualBalancesTicketList ?? [];
}, },
url, url,
postParams, postParams,
@ -123,7 +120,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getOpenMissingSwipes() async { Future<GenericResponseModel?> getOpenMissingSwipes() async {
String url = "${ApiConsts.erpRest}GET_OPEN_MISSING_SWIPES"; String url = "${ApiConsts.erpRest}GET_OPEN_MISSING_SWIPES";
Map<String, dynamic> postParams = <String, dynamic>{}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -138,12 +135,12 @@ class DashboardApiClient {
//Menus List //Menus List
Future<List<ListMenu>> getListMenu() async { Future<List<ListMenu>> getListMenu() async {
String url = "${ApiConsts.erpRest}GET_MENU"; String url = "${ApiConsts.erpRest}GET_MENU";
Map<String, dynamic> postParams = <String, dynamic>{}; Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.listMenu ?? <ListMenu>[]; return responseData.listMenu ?? [];
}, },
url, url,
postParams, postParams,
@ -153,7 +150,7 @@ class DashboardApiClient {
//GET_MENU_ENTRIES //GET_MENU_ENTRIES
Future<GenericResponseModel?> getGetMenuEntries() async { Future<GenericResponseModel?> getGetMenuEntries() async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = <String, dynamic>{"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"}; Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -167,7 +164,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getEventActivity() async { Future<GenericResponseModel?> getEventActivity() async {
String url = "${ApiConsts.erpRest}Get_EventActivity"; String url = "${ApiConsts.erpRest}Get_EventActivity";
Map<String, dynamic> postParams = <String, dynamic>{"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"}; Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -181,7 +178,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getTicketBookingRedirection() async { Future<GenericResponseModel?> getTicketBookingRedirection() async {
String url = "${ApiConsts.erpRest}GET_PORTAL_REDIRECTION"; String url = "${ApiConsts.erpRest}GET_PORTAL_REDIRECTION";
Map<String, dynamic> postParams = <String, dynamic>{"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER}; Map<String, dynamic> postParams = {"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
@ -195,7 +192,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getTicketBalance() async { Future<GenericResponseModel?> getTicketBalance() async {
String url = "${ApiConsts.erpRest}GET_TICKET_BALANCE"; String url = "${ApiConsts.erpRest}GET_TICKET_BALANCE";
Map<String, dynamic> postParams = <String, dynamic>{"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER}; Map<String, dynamic> postParams = {"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
@ -212,7 +209,7 @@ class DashboardApiClient {
String url = "${ApiConsts.ssoAuthRedirection}?grantType=mohemm"; String url = "${ApiConsts.ssoAuthRedirection}?grantType=mohemm";
//https://sso-uat.hmg.com/api/auth/connect?grantType=mohemm' //https://sso-uat.hmg.com/api/auth/connect?grantType=mohemm'
// Map<String, dynamic> postParams = {"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER}; // Map<String, dynamic> postParams = {"P_USER_NAME": AppState().memberInformationList?.eMPLOYEENUMBER};
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"ClientId": clientID, "ClientId": clientID,
// "ClientId": "a9f4d1a0596d4aea8f830992ec4bdac1", // "ClientId": "a9f4d1a0596d4aea8f830992ec4bdac1",
"PersonId": AppState().memberInformationList?.eMPLOYEENUMBER, "PersonId": AppState().memberInformationList?.eMPLOYEENUMBER,
@ -231,35 +228,20 @@ class DashboardApiClient {
); );
} }
Future<GetEitAttachmentTicket?> getTicketEitPDFDownload({required String peiExtraInfoId}) async {
String url = "${ApiConsts.erpRest}GET_EIT_ATTACHMENTS";
Map<String, dynamic> postParams = <String, dynamic>{
"P_PERSON_EXTRA_INFO_ID": peiExtraInfoId,
"PersonId": AppState().memberInformationList?.eMPLOYEENUMBER,
"Username": AppState().memberInformationList?.eMPLOYEENUMBER,
"Language": "US",
"SessionId": AppState().postParamsObject?.pSessionId,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject(
(json) {
GetEitAttachmentTicket responseData = GetEitAttachmentTicket.fromJson(json);
return responseData;
},
url,
postParams,
);
}
Future<dynamic> getBookingSSOFinalRedirection({required String token}) async { Future<dynamic> getBookingSSOFinalRedirection({required String token}) async {
// token = // token =
// "eyJhbGciOiJSUzI1NiIsImtpZCI6IjhjZTE2OWM0YjIwYjQ2ZWM5YTQyOTU3Y2ZhODUzNzQ1IiwidHlwIjoiSldUIn0.eyJ0ZW5hbnRfaWQiOiJhOWY0ZDFhMDU5NmQ0YWVhOGY4MzA5OTJlYzRiZGFjMSIsImVpZCI6IjExNzkzMCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3NpZCI6Ijk2MDI0OGM1NzA3YzQ3MmFhYTEzM2I1N2ZhODE1ZmVhIiwibGFuZ3VhZ2UiOiJVUyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6IjExNzkzMEBobWcuY29tIiwiZXhwIjoxNzgyNDc1NzY5LCJpc3MiOiJodHRwczovL3Nzby11YXQuaG1nLmNvbSIsImF1ZCI6ImE5ZjRkMWEwNTk2ZDRhZWE4ZjgzMDk5MmVjNGJkYWMxIn0.rJcLVsG8D0XECyLERCTD2uqGeWyvp-OBVGE9uL2qKrX4etFUHgdFt_5kYF6edFTtGy-0PIZadHDmv7e-IOhVWHm5HVMClaukiXoRXR8cDN8XA1wfme3Kd-U5PXN-IRh49AyRTzLO0rYNPvH81ScosWGlsFSkOvA-0hJNa2adHdtvgNvB8wJshSU5p7sAmF8mjdDY6aInG19etu2iEuUDwHHA4ZY_ts4hboHo8fE392hFaYGonExoD7bpW5RMx5xKWeRCmWpG_PK8Aw_z1jGzdB9PANus4pteRGuln1J-kmo2lQC9pVrSyZATAKp1HfgfyZ_vUhaHEfM69cMWaCslJQ"; // "eyJhbGciOiJSUzI1NiIsImtpZCI6IjhjZTE2OWM0YjIwYjQ2ZWM5YTQyOTU3Y2ZhODUzNzQ1IiwidHlwIjoiSldUIn0.eyJ0ZW5hbnRfaWQiOiJhOWY0ZDFhMDU5NmQ0YWVhOGY4MzA5OTJlYzRiZGFjMSIsImVpZCI6IjExNzkzMCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3NpZCI6Ijk2MDI0OGM1NzA3YzQ3MmFhYTEzM2I1N2ZhODE1ZmVhIiwibGFuZ3VhZ2UiOiJVUyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6IjExNzkzMEBobWcuY29tIiwiZXhwIjoxNzgyNDc1NzY5LCJpc3MiOiJodHRwczovL3Nzby11YXQuaG1nLmNvbSIsImF1ZCI6ImE5ZjRkMWEwNTk2ZDRhZWE4ZjgzMDk5MmVjNGJkYWMxIn0.rJcLVsG8D0XECyLERCTD2uqGeWyvp-OBVGE9uL2qKrX4etFUHgdFt_5kYF6edFTtGy-0PIZadHDmv7e-IOhVWHm5HVMClaukiXoRXR8cDN8XA1wfme3Kd-U5PXN-IRh49AyRTzLO0rYNPvH81ScosWGlsFSkOvA-0hJNa2adHdtvgNvB8wJshSU5p7sAmF8mjdDY6aInG19etu2iEuUDwHHA4ZY_ts4hboHo8fE392hFaYGonExoD7bpW5RMx5xKWeRCmWpG_PK8Aw_z1jGzdB9PANus4pteRGuln1J-kmo2lQC9pVrSyZATAKp1HfgfyZ_vUhaHEfM69cMWaCslJQ";
http.MultipartRequest request = http.MultipartRequest('POST', Uri.parse('https://www.paxes.com/sso/hmg')); // // var request = http.MultipartRequest('POST', Uri.parse('https://ek.techmaster.in/SSO/HMG'));
// http.MultipartRequest request = http.MultipartRequest('POST', Uri.parse('https://ek.techmaster.in/SSO/HMG')); var request = http.MultipartRequest('POST', Uri.parse('https://Paxes-release.techmaster.in/SSO/HMG')); // UAT
request.fields.addAll(<String, String>{'JWTToken': token}); // var request = http.MultipartRequest('POST', Uri.parse('https://paxes.com/sso/hmg')); // Prod
request.fields.addAll({'JWTToken': token});
// request.headers.addAll(headers);
http.StreamedResponse response = await request.send(); http.StreamedResponse response = await request.send();
if (response.statusCode == 302) { if (response.statusCode == 302) {
String res = await response.stream.bytesToString(); print("================== post ==========");
var res = await response.stream.bytesToString();
return response.headers["location"]; return response.headers["location"];
} else { } else {
print(response.reasonPhrase); print(response.reasonPhrase);
@ -279,7 +261,7 @@ class DashboardApiClient {
var _mobileDeviceIdentifierPlugin = MobileDeviceIdentifier(); var _mobileDeviceIdentifierPlugin = MobileDeviceIdentifier();
Codec<String, String> stringToBase64 = utf8.fuse(base64); Codec<String, String> stringToBase64 = utf8.fuse(base64);
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
Uuid uuid = Uuid(); var uuid = Uuid();
String? deviceId = ""; String? deviceId = "";
// Generate a v4 (random) id // Generate a v4 (random) id
if (Platform.isAndroid) { if (Platform.isAndroid) {
@ -291,7 +273,7 @@ class DashboardApiClient {
IosDeviceInfo iosInfo = await DeviceInfoPlugin().iosInfo; IosDeviceInfo iosInfo = await DeviceInfoPlugin().iosInfo;
deviceId = iosInfo.identifierForVendor; deviceId = iosInfo.identifierForVendor;
} }
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"UID": deviceId, //uuid.v4(), //Mobile Id "UID": deviceId, //uuid.v4(), //Mobile Id
// "UID": uuid.v4(), //Mobile Id // "UID": uuid.v4(), //Mobile Id
"Latitude": lat, "Latitude": lat,
@ -317,10 +299,10 @@ class DashboardApiClient {
//Mark Fake Location //Mark Fake Location
Future<GenericResponseModel?> markFakeLocation({String lat = "0", String? long = "0", required String sourceName}) async { Future<GenericResponseModel?> markFakeLocation({String lat = "0", String? long = "0", required String sourceName}) async {
String url = "${ApiConsts.swpRest}CreateIssueInfo"; String url = "${ApiConsts.swpRest}CreateIssueInfo";
Uuid uuid = Uuid(); var uuid = Uuid();
// Generate a v4 (random) id // Generate a v4 (random) id
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"UID": uuid.v4(), //Mobile Id "UID": uuid.v4(), //Mobile Id
"Latitude": lat, "Latitude": lat,
"Longitude": long, "Longitude": long,
@ -344,7 +326,7 @@ class DashboardApiClient {
Future<MohemmItgResponseItem?> getITGPageNotification() async { Future<MohemmItgResponseItem?> getITGPageNotification() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotification"; String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotification";
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName, "EmployeeNumber": AppState().getUserName,
"ItgEnableAt": "After Service Submission", //Mobile Id "ItgEnableAt": "After Service Submission", //Mobile Id
"ItgServiceName": "Login", "ItgServiceName": "Login",
@ -362,26 +344,11 @@ class DashboardApiClient {
); );
} }
Future<String?> getENSATItgToken() async {
String url = "${ApiConsts.cocRest}Mohemm_ENSAT_GetItgToken";
Map<String, dynamic> postParams = <String, dynamic>{"EmployeeNumber": AppState().getUserName};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject(
(json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.Mohemm_ENSAT_GetItgToken_Response;
},
url,
postParams,
);
}
//Submit ITG //Submit ITG
Future<ItgMainRes?> submitItgForm({required String comment, required String masterId, required List<Map<String, dynamic>> itgList, required int serviceId}) async { Future<ItgMainRes?> submitItgForm({required String comment, required String masterId, required List<Map<String, dynamic>> itgList, required int serviceId}) async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_Survey_Response"; String url = "${ApiConsts.cocRest}Mohemm_ITG_Survey_Response";
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName, "EmployeeNumber": AppState().getUserName,
"ItgComments": comment, "ItgComments": comment,
"ItgNotificationMasterId": masterId, "ItgNotificationMasterId": masterId,
@ -402,7 +369,7 @@ class DashboardApiClient {
Future<ItgMainRes?> getAdvertisementDetail(String masterID) async { Future<ItgMainRes?> getAdvertisementDetail(String masterID) async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotificationDetails"; String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotificationDetails";
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName, "EmployeeNumber": AppState().getUserName,
"ItgNotificationMasterId": masterID, //Mobile Id "ItgNotificationMasterId": masterID, //Mobile Id
}; };
@ -420,7 +387,7 @@ class DashboardApiClient {
Future setAdvertisementViewed(String masterID, int advertisementId, String? ackValue) async { Future setAdvertisementViewed(String masterID, int advertisementId, String? ackValue) async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed";
Map<String, dynamic> postParams = <String, dynamic>{ Map<String, dynamic> postParams = {
"ItgNotificationMasterId": masterID, "ItgNotificationMasterId": masterID,
"EmployeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "EmployeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(),
"ItgAdvertisementId": advertisementId, "ItgAdvertisementId": advertisementId,
@ -458,7 +425,7 @@ class DashboardApiClient {
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
GetEmployeeParking responseData = GetEmployeeParking.fromJson(json); GetEmployeeParking responseData = GetEmployeeParking.fromJson(json);
return responseData; return responseData;
}, },
url, url,
@ -468,14 +435,16 @@ class DashboardApiClient {
//Fetch All Courses Status //Fetch All Courses Status
Future<CoursesResponseModel?> fetchAllCoursesStatus() async { Future<CoursesResponseModel?> fetchAllCoursesStatus() async {
String url = ApiConsts.eLearningBaseUrl + "Fetch_All_Courses_Status.php"; String url = ApiConsts.eLearningBaseUrl +"Fetch_All_Courses_Status.php";
Map<String, String> headers = { Map<String, String> headers = {
'x-api-key': 'bLi@mbXJeXTHd/)h&LFh%25+%25(Nbnaq6hBg%7d%5dyQbthY%7bv6ew6-5UT\$NASwucn%7d,_PSJpuwNCCen2%7djj%7b00HR2T-%5b,k7W%7d-0yepK?%258', 'x-api-key': 'bLi@mbXJeXTHd/)h&LFh%25+%25(Nbnaq6hBg%7d%5dyQbthY%7bv6ew6-5UT\$NASwucn%7d,_PSJpuwNCCen2%7djj%7b00HR2T-%5b,k7W%7d-0yepK?%258',
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
}; };
Map<String, dynamic> postParams = {"username": AppState().memberInformationList?.eMPLOYEENUMBER ?? ""}; Map<String, dynamic> postParams = {
"username": AppState().memberInformationList?.eMPLOYEENUMBER ?? "",
};
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {

@ -25,23 +25,16 @@ class EITApiClient {
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
// Check if GetEITTransactionList exists and is not empty
if (json['GetEITTransactionList'] == null || (json['GetEITTransactionList'] is List && json['GetEITTransactionList'].isEmpty)) {
return isCompleteList ? <List<CollectionTransaction>>[] : <CollectionTransaction>[];
}
if (isCompleteList) { if (isCompleteList) {
List<List<CollectionTransaction>> responseData = []; List<List<CollectionTransaction>> responseData = [];
json['GetEITTransactionList'].forEach((element) { json['GetEITTransactionList'].forEach((element) {
var transactionList = GetEitTransactionsModel.fromJson(element).collectionTransaction; var transactionList = GetEitTransactionsModel.fromJson(element).collectionTransaction;
if (transactionList != null && transactionList.isNotEmpty) { if (transactionList != null) responseData.add(transactionList);
responseData.add(transactionList);
}
}); });
return responseData; return responseData;
} else { } else {
List<CollectionTransaction>? responseData = GetEitTransactionsModel.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; List<CollectionTransaction>? responseData = GetEitTransactionsModel.fromJson(json['GetEITTransactionList'][0]).collectionTransaction;
return responseData ?? <CollectionTransaction>[]; return responseData;
} }
}, },
url, url,

@ -90,7 +90,7 @@ class AppState {
String get getHuaweiPushToken => _huaweiPushToken; String get getHuaweiPushToken => _huaweiPushToken;
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 10.0, mobileType: Platform.isAndroid ? "android" : "ios"); final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 9.5, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;

@ -5,19 +5,12 @@ class ApiConsts {
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server
// static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.201.204.101:2024"; // static String baseUrl = "http://10.201.204.101:2024";
// static String baseUrl = "https://webservices.hmg.com"; // PreProd // static String baseUrl = "https://webservices.hmg.com"; // PreProd
// static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrl = "https://mohemm.hmg.com"; // New Live server static String baseUrl = "https://mohemm.hmg.com"; // New Live server
static String ssoBaseUrl = "https://sso.hmg.com"; // New Live server
//
// static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.20.200.111:1010/";
// static String baseUrl = "https://mohemm.hmg.com"; // New Live server
//static String eLearningBaseUrl = "https://elearning.hmg.com/moodle_dev/api/"; // Elearning server UAT //static String eLearningBaseUrl = "https://elearning.hmg.com/moodle_dev/api/"; // Elearning server UAT
static String eLearningBaseUrl = "https://elearning.hmg.com/moodle/api/"; // Elearning server live static String eLearningBaseUrl = "https://elearning.hmg.com/moodle/api/"; // Elearning server live
static String enSATLiveURL = "https://ensat.hmg.com/auth/autologin"; // ENSAT server live
// static String baseUrl = "http://10.20.200.111:1010/"; // static String baseUrl = "http://10.20.200.111:1010/";
@ -34,8 +27,8 @@ class ApiConsts {
static String user = baseUrlServices + "api/User/"; static String user = baseUrlServices + "api/User/";
static String cocRest = baseUrlServices + "COCWS.svc/REST/"; static String cocRest = baseUrlServices + "COCWS.svc/REST/";
static String ssoAuthRedirection = ssoBaseUrl + "/api/auth/connect"; static String ssoAuthRedirection = "https://sso-uat.hmg.com/api/auth/connect"; // UAT
// static String ssoAuthRedirection = "https://sso.hmg.com/api/auth/connect"; // Prod
//Chat //Chat
static String chatServerBaseUrl = "https://apiderichat.hmg.com/"; static String chatServerBaseUrl = "https://apiderichat.hmg.com/";
@ -63,7 +56,6 @@ class ApiConsts {
static String marathonBaseUrlUAT = "https://marathoon.com/uatservice/api/"; static String marathonBaseUrlUAT = "https://marathoon.com/uatservice/api/";
static String marathonBaseUrl = marathonBaseUrlLive; static String marathonBaseUrl = marathonBaseUrlLive;
// static String marathonBaseUrl = marathonBaseUrlUAT; // static String marathonBaseUrl = marathonBaseUrlUAT;
static String marathonBaseUrlServices = "https://marathoon.com/service/"; static String marathonBaseUrlServices = "https://marathoon.com/service/";
static String marathonParticipantLoginUrl = marathonBaseUrl + "auth/participantlogin"; static String marathonParticipantLoginUrl = marathonBaseUrl + "auth/participantlogin";
@ -95,3 +87,5 @@ class SharedPrefsConsts {
static String mohemmWifiPassword = "mohemmWifiPassword"; static String mohemmWifiPassword = "mohemmWifiPassword";
static String editItemForSale = "editItemForSale"; static String editItemForSale = "editItemForSale";
} }

@ -30,7 +30,7 @@ class CollectionTransaction {
String? dISPLAYFLAG; String? dISPLAYFLAG;
int? fROMROWNUM; int? fROMROWNUM;
int? nOOFROWS; int? nOOFROWS;
dynamic nUMBERVALUE; dynamic? nUMBERVALUE;
int? rOWNUM; int? rOWNUM;
String? sEGMENTNAME; String? sEGMENTNAME;
String? sEGMENTPROMPT; String? sEGMENTPROMPT;
@ -80,7 +80,7 @@ class CollectionTransaction {
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
Map<String, dynamic> data = Map<String, dynamic>(); Map<String, dynamic> data = new Map<String, dynamic>();
data['APPLICATION_COLUMN_NAME'] = this.aPPLICATIONCOLUMNNAME; data['APPLICATION_COLUMN_NAME'] = this.aPPLICATIONCOLUMNNAME;
data['DATATYPE'] = this.dATATYPE; data['DATATYPE'] = this.dATATYPE;
data['DATE_VALUE'] = this.dATEVALUE; data['DATE_VALUE'] = this.dATEVALUE;

@ -1,97 +0,0 @@
import 'dart:convert';
class GetEitAttachmentTicket {
List<GetEitAttachmentList>? getEitAttachmentList;
GetEitAttachmentTicket({
this.getEitAttachmentList,
});
factory GetEitAttachmentTicket.fromRawJson(String str) => GetEitAttachmentTicket.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory GetEitAttachmentTicket.fromJson(Map<String, dynamic> json) => GetEitAttachmentTicket(
getEitAttachmentList: json["GetEITAttachmentList"] == null ? [] : List<GetEitAttachmentList>.from(json["GetEITAttachmentList"]!.map((x) => GetEitAttachmentList.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"GetEITAttachmentList": getEitAttachmentList == null ? [] : List<dynamic>.from(getEitAttachmentList!.map((x) => x.toJson())),
};
}
class GetEitAttachmentList {
int? attachedDocumentId;
int? categoryId;
int? datatypeId;
int? documentId;
String? entityName;
String? fileContentType;
String? fileData;
int? fileId;
String? fileName;
String? pk1Value;
String? pk2Value;
String? pk3Value;
String? pk4Value;
String? pk5Value;
int? seqNum;
GetEitAttachmentList({
this.attachedDocumentId,
this.categoryId,
this.datatypeId,
this.documentId,
this.entityName,
this.fileContentType,
this.fileData,
this.fileId,
this.fileName,
this.pk1Value,
this.pk2Value,
this.pk3Value,
this.pk4Value,
this.pk5Value,
this.seqNum,
});
factory GetEitAttachmentList.fromRawJson(String str) => GetEitAttachmentList.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory GetEitAttachmentList.fromJson(Map<String, dynamic> json) => GetEitAttachmentList(
attachedDocumentId: json["ATTACHED_DOCUMENT_ID"],
categoryId: json["CATEGORY_ID"],
datatypeId: json["DATATYPE_ID"],
documentId: json["DOCUMENT_ID"],
entityName: json["ENTITY_NAME"],
fileContentType: json["FILE_CONTENT_TYPE"],
fileData: json["FILE_DATA"],
fileId: json["FILE_ID"],
fileName: json["FILE_NAME"],
pk1Value: json["PK1_VALUE"],
pk2Value: json["PK2_VALUE"],
pk3Value: json["PK3_VALUE"],
pk4Value: json["PK4_VALUE"],
pk5Value: json["PK5_VALUE"],
seqNum: json["SEQ_NUM"],
);
Map<String, dynamic> toJson() => {
"ATTACHED_DOCUMENT_ID": attachedDocumentId,
"CATEGORY_ID": categoryId,
"DATATYPE_ID": datatypeId,
"DOCUMENT_ID": documentId,
"ENTITY_NAME": entityName,
"FILE_CONTENT_TYPE": fileContentType,
"FILE_DATA": fileData,
"FILE_ID": fileId,
"FILE_NAME": fileName,
"PK1_VALUE": pk1Value,
"PK2_VALUE": pk2Value,
"PK3_VALUE": pk3Value,
"PK4_VALUE": pk4Value,
"PK5_VALUE": pk5Value,
"SEQ_NUM": seqNum,
};
}

@ -398,7 +398,6 @@ class GenericResponseModel {
bool? isActiveCode; bool? isActiveCode;
bool? isSMSSent; bool? isSMSSent;
PortalDirectionData? portalDirectionData; PortalDirectionData? portalDirectionData;
String? Mohemm_ENSAT_GetItgToken_Response;
GenericResponseModel({ GenericResponseModel({
this.date, this.date,
@ -670,8 +669,7 @@ class GenericResponseModel {
this.ePharmacyGetItemOnHandList, this.ePharmacyGetItemOnHandList,
this.isActiveCode, this.isActiveCode,
this.isSMSSent, this.isSMSSent,
this.getFADisposalNtfDetails, this.getFADisposalNtfDetails
this.Mohemm_ENSAT_GetItgToken_Response,
}); });
GenericResponseModel.fromJson(Map<String, dynamic> json) { GenericResponseModel.fromJson(Map<String, dynamic> json) {
@ -945,6 +943,7 @@ class GenericResponseModel {
getFADisposalNtfDetails = json['GetFADisposalNtfDetails'] != null ? GetFaDisposalNtfDetails.fromJson(json['GetFADisposalNtfDetails']) : null; getFADisposalNtfDetails = json['GetFADisposalNtfDetails'] != null ? GetFaDisposalNtfDetails.fromJson(json['GetFADisposalNtfDetails']) : null;
if (json['GetEarningsList'] != null) { if (json['GetEarningsList'] != null) {
getEarningsList = <GetEarningsList>[]; getEarningsList = <GetEarningsList>[];
json['GetEarningsList'].forEach((v) { json['GetEarningsList'].forEach((v) {
@ -1465,7 +1464,6 @@ class GenericResponseModel {
ePharmacyGetItemOnHandList = json['ePharmacy_GetItemOnHandList']; ePharmacyGetItemOnHandList = json['ePharmacy_GetItemOnHandList'];
isActiveCode = json['isActiveCode']; isActiveCode = json['isActiveCode'];
isSMSSent = json['isSMSSent']; isSMSSent = json['isSMSSent'];
Mohemm_ENSAT_GetItgToken_Response = json['Mohemm_ENSAT_GetItgToken_Response'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -1563,7 +1561,7 @@ class GenericResponseModel {
if (this.getActionHistoryList != null) { if (this.getActionHistoryList != null) {
data['GetActionHistoryList'] = this.getActionHistoryList!.map((v) => v.toJson()).toList(); data['GetActionHistoryList'] = this.getActionHistoryList!.map((v) => v.toJson()).toList();
} }
data['GetFADisposalNtfDetails'] = this.getFADisposalNtfDetails; data['GetFADisposalNtfDetails'] =this.getFADisposalNtfDetails;
data['GetAddressDffStructureList'] = this.getAddressDffStructureList; data['GetAddressDffStructureList'] = this.getAddressDffStructureList;
data['GetAddressNotificationBodyList'] = this.getAddressNotificationBodyList; data['GetAddressNotificationBodyList'] = this.getAddressNotificationBodyList;
@ -1951,7 +1949,6 @@ class GenericResponseModel {
data['ePharmacy_GetItemOnHandList'] = this.ePharmacyGetItemOnHandList; data['ePharmacy_GetItemOnHandList'] = this.ePharmacyGetItemOnHandList;
data['isActiveCode'] = this.isActiveCode; data['isActiveCode'] = this.isActiveCode;
data['isSMSSent'] = this.isSMSSent; data['isSMSSent'] = this.isSMSSent;
data['Mohemm_ENSAT_GetItgToken_Response'] = this.Mohemm_ENSAT_GetItgToken_Response;
return data; return data;
} }
} }

@ -12,7 +12,12 @@ MohemmItgResponseItem mohemmItgResponseItemFromJson(String str) => MohemmItgResp
String mohemmItgResponseItemToJson(MohemmItgResponseItem data) => json.encode(data.toJson()); String mohemmItgResponseItemToJson(MohemmItgResponseItem data) => json.encode(data.toJson());
class MohemmItgResponseItem { class MohemmItgResponseItem {
MohemmItgResponseItem({this.statusCode, this.message, this.originalErrMsg, this.result}); MohemmItgResponseItem({
this.statusCode,
this.message,
this.originalErrMsg,
this.result,
});
final int? statusCode; final int? statusCode;
final dynamic? message; final dynamic? message;
@ -20,64 +25,77 @@ class MohemmItgResponseItem {
final ItgResponseResult? result; final ItgResponseResult? result;
factory MohemmItgResponseItem.fromJson(Map<String, dynamic> json) => MohemmItgResponseItem( factory MohemmItgResponseItem.fromJson(Map<String, dynamic> json) => MohemmItgResponseItem(
statusCode: json["statusCode"] == null ? null : json["statusCode"], statusCode: json["statusCode"] == null ? null : json["statusCode"],
message: json["message"], message: json["message"],
originalErrMsg: json["originalErrMsg"], originalErrMsg: json["originalErrMsg"],
result: json["result"] == null ? null : ItgResponseResult.fromJson(json["result"]), result: json["result"] == null ? null : ItgResponseResult.fromJson(json["result"]),
); );
Map<String, dynamic> toJson() => {"statusCode": statusCode == null ? null : statusCode, "message": message, "originalErrMsg": originalErrMsg, "result": result == null ? null : result!.toJson()}; Map<String, dynamic> toJson() => {
"statusCode": statusCode == null ? null : statusCode,
"message": message,
"originalErrMsg": originalErrMsg,
"result": result == null ? null : result!.toJson(),
};
} }
class ItgResponseResult { class ItgResponseResult {
ItgResponseResult({this.totalItemsCount, this.data, this.errormsg}); ItgResponseResult({
this.totalItemsCount,
// this.data,
// final dynamic totalItemsCount; this.errormsg,
// final ItgResponseData? data; });
// final dynamic errormsg; //
// // final dynamic totalItemsCount;
// factory ItgResponseResult.fromJson(Map<String, dynamic> json) => ItgResponseResult( // final ItgResponseData? data;
// totalItemsCount: json["totalItemsCount"], // final dynamic errormsg;
// data: json["data"] == null ? null : ItgResponseData.fromJson(json["data"]), //
// errormsg: json["errormsg"], // factory ItgResponseResult.fromJson(Map<String, dynamic> json) => ItgResponseResult(
// ); // totalItemsCount: json["totalItemsCount"],
// // data: json["data"] == null ? null : ItgResponseData.fromJson(json["data"]),
// Map<String, dynamic> toJson() => { // errormsg: json["errormsg"],
// "totalItemsCount": totalItemsCount, // );
// "data": data == null ? null : data!.toJson(), //
// "errormsg": errormsg, // Map<String, dynamic> toJson() => {
// }; // "totalItemsCount": totalItemsCount,
// } // "data": data == null ? null : data!.toJson(),
// "errormsg": errormsg,
// todo these lines, for ERM new change on UAT // };
dynamic totalItemsCount; // }
List<ItgResponseData>? data;
dynamic errormsg; // todo these lines, for ERM new change on UAT
dynamic totalItemsCount;
ItgResponseResult.fromJson(Map<String, dynamic> json) { List<ItgResponseData>? data;
totalItemsCount = json['totalItemsCount']; dynamic errormsg;
if (json['data'] != null) {
data = []; ItgResponseResult.fromJson(Map<String, dynamic> json) {
if (json['data'] is List) { totalItemsCount = json['totalItemsCount'];
json['data'].forEach((v) { if (json['data'] != null) {
data!.add(ItgResponseData.fromJson(v)); data = [];
}); if(json['data'] is List) {
} else { json['data'].forEach((v) {
data!.add(ItgResponseData.fromJson(json['data'])); data!.add(ItgResponseData.fromJson(v));
} });
} else {
data!.add(ItgResponseData.fromJson(json['data']));
} }
errormsg = json['errormsg'];
}
// }
// factory ItgResponseResult.fromJson(Map<String, dynamic> json) => ItgResponseResult( errormsg = json['errormsg'];
// totalItemsCount: json["totalItemsCount"], }
// data: json["data"] == null ? null : ItgResponseData.fromJson(json["data"]),
// errormsg: json["errormsg"],
// );
Map<String, dynamic> toJson() => {"totalItemsCount": totalItemsCount, "data": data == null ? null : data!.map((v) => v.toJson()).toList(), "errormsg": errormsg}; //
// factory ItgResponseResult.fromJson(Map<String, dynamic> json) => ItgResponseResult(
// totalItemsCount: json["totalItemsCount"],
// data: json["data"] == null ? null : ItgResponseData.fromJson(json["data"]),
// errormsg: json["errormsg"],
// );
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.map((v) => v.toJson()).toList(),
"errormsg": errormsg,
};
} }
class ItgResponseData { class ItgResponseData {
@ -103,7 +121,6 @@ class ItgResponseData {
this.pageSize, this.pageSize,
this.pageNo, this.pageNo,
this.languageId, this.languageId,
this.deadline,
}); });
final String? notificationMasterId; final String? notificationMasterId;
@ -127,55 +144,52 @@ class ItgResponseData {
final dynamic pageSize; final dynamic pageSize;
final dynamic pageNo; final dynamic pageNo;
final dynamic languageId; final dynamic languageId;
dynamic deadline;
factory ItgResponseData.fromJson(Map<String, dynamic> json) => ItgResponseData( factory ItgResponseData.fromJson(Map<String, dynamic> json) => ItgResponseData(
notificationMasterId: json["notificationMasterId"] == null ? null : json["notificationMasterId"], notificationMasterId: json["notificationMasterId"] == null ? null : json["notificationMasterId"],
notificationType: json["notificationType"] == null ? null : json["notificationType"], notificationType: json["notificationType"] == null ? null : json["notificationType"],
referenceItemId: json["referenceItemId"] == null ? null : json["referenceItemId"], referenceItemId: json["referenceItemId"] == null ? null : json["referenceItemId"],
notificationTitle: json["notificationTitle"] == null ? null : json["notificationTitle"], notificationTitle: json["notificationTitle"] == null ? null : json["notificationTitle"],
enableAt: json["enableAt"] == null ? null : json["enableAt"], enableAt: json["enableAt"] == null ? null : json["enableAt"],
applicationItemId: json["applicationItemId"], applicationItemId: json["applicationItemId"],
startDate: json["startDate"], startDate: json["startDate"],
endDate: json["endDate"], endDate: json["endDate"],
deadline: json["deadline"] == null ? null : json["deadline"], isRepeat: json["isRepeat"] == null ? null : json["isRepeat"],
isRepeat: json["isRepeat"] == null ? null : json["isRepeat"], channelId: json["channelId"] == null ? null : json["channelId"],
channelId: json["channelId"] == null ? null : json["channelId"], serviceId: json["serviceId"] == null ? null : json["serviceId"],
serviceId: json["serviceId"] == null ? null : json["serviceId"], channelName: json["channelName"] == null ? null : json["channelName"],
channelName: json["channelName"] == null ? null : json["channelName"], serviceName: json["serviceName"] == null ? null : json["serviceName"],
serviceName: json["serviceName"] == null ? null : json["serviceName"], isDeleted: json["isDeleted"] == null ? null : json["isDeleted"],
isDeleted: json["isDeleted"] == null ? null : json["isDeleted"], showDelete: json["showDelete"] == null ? null : json["showDelete"],
showDelete: json["showDelete"] == null ? null : json["showDelete"], advertisement: json["advertisement"] == null ? null : Advertisement.fromJson(json["advertisement"]),
advertisement: json["advertisement"] == null ? null : Advertisement.fromJson(json["advertisement"]), survey: json["survey"] == null ? null : SurveyModel.fromJson(json["survey"]),
survey: json["survey"] == null ? null : SurveyModel.fromJson(json["survey"]), isActive: json["isActive"],
isActive: json["isActive"], pageSize: json["pageSize"],
pageSize: json["pageSize"], pageNo: json["pageNo"],
pageNo: json["pageNo"], languageId: json["languageId"],
languageId: json["languageId"], );
);
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"notificationMasterId": notificationMasterId == null ? null : notificationMasterId, "notificationMasterId": notificationMasterId == null ? null : notificationMasterId,
"notificationType": notificationType == null ? null : notificationType, "notificationType": notificationType == null ? null : notificationType,
"referenceItemId": referenceItemId == null ? null : referenceItemId, "referenceItemId": referenceItemId == null ? null : referenceItemId,
"notificationTitle": notificationTitle == null ? null : notificationTitle, "notificationTitle": notificationTitle == null ? null : notificationTitle,
"enableAt": enableAt == null ? null : enableAt, "enableAt": enableAt == null ? null : enableAt,
"applicationItemId": applicationItemId, "applicationItemId": applicationItemId,
"startDate": startDate, "startDate": startDate,
"endDate": endDate, "endDate": endDate,
"deadline": deadline == null ? null : deadline , "isRepeat": isRepeat == null ? null : isRepeat,
"isRepeat": isRepeat == null ? null : isRepeat, "channelId": channelId == null ? null : channelId,
"channelId": channelId == null ? null : channelId, "serviceId": serviceId == null ? null : serviceId,
"serviceId": serviceId == null ? null : serviceId, "channelName": channelName == null ? null : channelName,
"channelName": channelName == null ? null : channelName, "serviceName": serviceName == null ? null : serviceName,
"serviceName": serviceName == null ? null : serviceName, "isDeleted": isDeleted == null ? null : isDeleted,
"isDeleted": isDeleted == null ? null : isDeleted, "showDelete": showDelete == null ? null : showDelete,
"showDelete": showDelete == null ? null : showDelete, "advertisement": advertisement,
"advertisement": advertisement, "survey": survey,
"survey": survey, "isActive": isActive,
"isActive": isActive, "pageSize": pageSize,
"pageSize": pageSize, "pageNo": pageNo,
"pageNo": pageNo, "languageId": languageId,
"languageId": languageId, };
};
} }

@ -21,7 +21,6 @@ import 'package:mohem_flutter_app/models/dashboard/menus.dart';
import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_responseitem.dart'; import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_responseitem.dart';
import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart'; import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart';
import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
import 'package:mohem_flutter_app/models/eit_attachment_ticket_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart'; import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
@ -350,7 +349,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
try { try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getTicketBookingRedirection(); GenericResponseModel? genericResponseModel = await DashboardApiClient().getTicketBookingRedirection();
if (genericResponseModel?.portalDirectionData?.pRedirection!.toLowerCase() == "alma") { if (genericResponseModel?.portalDirectionData?.pRedirection!.toLowerCase() == "alma") {
// ticketBookingResponse = TicketBookingResult(true, "a9f4d1a0596d4aea8f830992ec4bdac1");
ticketBookingResponse = TicketBookingResult(true, genericResponseModel?.portalDirectionData?.clientID); ticketBookingResponse = TicketBookingResult(true, genericResponseModel?.portalDirectionData?.clientID);
return; return;
} }
@ -360,7 +358,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
isEventLoadingLoading = false; isEventLoadingLoading = false;
notifyListeners(); notifyListeners();
Utils.handleException(ex, null, null); Utils.handleException(ex, null, null);
ticketBookingResponse = TicketBookingResult(false, null); ticketBookingResponse = TicketBookingResult(false, null); // Ensure a return value in case of an exception
} }
} }
@ -408,23 +406,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
} }
Future<GetEitAttachmentTicket?> getTicketEitPDFDownload({String? peiExtraInfoId}) async {
try {
GetEitAttachmentTicket? res = await DashboardApiClient().getTicketEitPDFDownload(peiExtraInfoId: peiExtraInfoId!);
if (res?.getEitAttachmentList != null && res?.getEitAttachmentList!.length! != 0 && res!.getEitAttachmentList!.first.fileData != null) {
return res;
} else {
return null;
}
} catch (ex) {
logger.wtf(ex);
isEventLoadingLoading = false;
notifyListeners();
Utils.handleException(ex, null, null);
return null; // Ensure a return value in case of an exception
}
}
List<Menus> parseMenus(List<GetMenuEntriesList> getMenuEntriesList) { List<Menus> parseMenus(List<GetMenuEntriesList> getMenuEntriesList) {
List<Menus> menus = []; List<Menus> menus = [];
for (int i = 0; i < getMenuEntriesList.length; i++) { for (int i = 0; i < getMenuEntriesList.length; i++) {
@ -458,11 +439,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
return res; return res;
} }
Future<String?> getENSATItgToken() async {
String? res = await DashboardApiClient().getENSATItgToken();
return res;
}
//Courses API's & Methods //Courses API's & Methods
Future<void> fetchCourses(BuildContext context) async { Future<void> fetchCourses(BuildContext context) async {
try { try {

@ -301,6 +301,7 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
monthCellBuilder: (build, details) { monthCellBuilder: (build, details) {
if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) { if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) {
int val = details.date.day; int val = details.date.day;
int index = val-1;
//check day is off //check day is off
// if (getDayHoursTypeDetailsList.isNotEmpty) { // if (getDayHoursTypeDetailsList.isNotEmpty) {
// bool isDayIsOff = getDayHoursTypeDetailsList[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[val - 1].dAYTYPE == 'OFF'; // bool isDayIsOff = getDayHoursTypeDetailsList[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[val - 1].dAYTYPE == 'OFF';
@ -310,13 +311,12 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
getDayHoursTypeDetailsList.where((GetDayHoursTypeDetailsList element) => DateFormat("MM/dd/yyyy", "en_US").parse(element.sCHEDULEDATE!).day == details.date.day).toList(); getDayHoursTypeDetailsList.where((GetDayHoursTypeDetailsList element) => DateFormat("MM/dd/yyyy", "en_US").parse(element.sCHEDULEDATE!).day == details.date.day).toList();
if (getDayHours.isNotEmpty) { if (getDayHours.isNotEmpty) {
GetDayHoursTypeDetailsList dayData = getDayHours.first; bool isDayIsOff = getDayHoursTypeDetailsList[index].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[index].dAYTYPE == 'OFF';
bool isDayIsOff = dayData.aTTENDEDFLAG == 'N' && dayData.dAYTYPE == 'OFF'; bool isDayIsPresent = getDayHoursTypeDetailsList[index].aTTENDEDFLAG == 'Y';
bool isDayIsPresent = dayData.aTTENDEDFLAG == 'Y'; bool isDayIsAbsent = getDayHoursTypeDetailsList[index].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[index].aBSENTFLAG == 'Y';
bool isDayIsAbsent = dayData.aTTENDEDFLAG == 'N' && dayData.aBSENTFLAG == 'Y';
// Get leave type code and corresponding color // Get leave type code and corresponding color
String? leaveTypeCode = dayData.lEAVETYPECODE; String? leaveTypeCode = getDayHoursTypeDetailsList[index].lEAVETYPECODE;
Color? leaveTypeColor; Color? leaveTypeColor;
bool useGradient = false; bool useGradient = false;
@ -428,18 +428,12 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
} }
void calendarTapped(CalendarTapDetails details) async { void calendarTapped(CalendarTapDetails details) async {
if (details.date == null) return; dynamic index = details.date?.day;
if (index != null) {
// Filter to find the matching day data index = index - 1;
List<GetDayHoursTypeDetailsList> getDayHours = }
getDayHoursTypeDetailsList.where((GetDayHoursTypeDetailsList element) => pRTPID = getDayHoursTypeDetailsList[index].rTPID;
DateFormat("MM/dd/yyyy", "en_US").parse(element.sCHEDULEDATE!).day == details.date!.day).toList(); await getScheduleShiftsDetails(index, pRTPID);
if (getDayHours.isEmpty) return;
GetDayHoursTypeDetailsList dayData = getDayHours.first;
pRTPID = dayData.rTPID;
await getScheduleShiftsDetails(details.date!.day, pRTPID);
dynamic value = getScheduleShiftsDetailsList!.pERCENTAGE; dynamic value = getScheduleShiftsDetailsList!.pERCENTAGE;
dynamic percentage; dynamic percentage;
if (value!.indexOf('%') == 3) { if (value!.indexOf('%') == 3) {
@ -452,7 +446,8 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
percentage = 0; percentage = 0;
} }
if (details.date!.month == formattedDate.month && details.date!.year == formattedDate.year) { if (details.date!.month == formattedDate.month && details.date!.year == formattedDate.year) {
dayData.aTTENDEDFLAG == 'Y' int val = details.date!.day;
getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'Y'
? showModalBottomSheet( ? showModalBottomSheet(
context: context, context: context,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
@ -597,7 +592,7 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
LocaleKeys.lateIn.tr().toText11( LocaleKeys.lateIn.tr().toText11(
color: MyColors.grey67Color, color: MyColors.grey67Color,
), ),
"${dayData.lATEINHRS}".toText22(color: MyColors.redColor, isBold: true), "${getDayHoursTypeDetailsList[index].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true),
], ],
).expanded, ).expanded,
Column( Column(
@ -606,7 +601,7 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
LocaleKeys.excess.tr().toText11( LocaleKeys.excess.tr().toText11(
color: MyColors.grey67Color, color: MyColors.grey67Color,
), ),
"${dayData.eXCESSHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true), "${getDayHoursTypeDetailsList[index].eXCESSHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
], ],
).expanded, ).expanded,
], ],
@ -626,7 +621,7 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
LocaleKeys.shortage.tr().toText11( LocaleKeys.shortage.tr().toText11(
color: MyColors.grey67Color, color: MyColors.grey67Color,
), ),
"${dayData.sHORTAGEHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true), "${getDayHoursTypeDetailsList[index].sHORTAGEHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
], ],
).expanded, ).expanded,
Column( Column(
@ -635,7 +630,7 @@ class _MonthlyAttendanceScreenState extends State<MonthlyAttendanceScreen> {
LocaleKeys.earlyOut.tr().toText11( LocaleKeys.earlyOut.tr().toText11(
color: MyColors.grey67Color, color: MyColors.grey67Color,
), ),
"${dayData.eARLYOUTHRS}".toText22(color: Colors.black, isBold: true), "${getDayHoursTypeDetailsList[index].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true),
], ],
).expanded, ).expanded,
], ],

@ -110,20 +110,15 @@ class _EtqanOvrCreateRequestState extends State<EtqanOvrCreateRequest> {
if (ticketInfo != null) { if (ticketInfo != null) {
String ticketNumber = ticketInfo['ticketNumber'] ?? ''; String ticketNumber = ticketInfo['ticketNumber'] ?? '';
String ticketId = ticketInfo['id'] ?? ''; String ticketId = ticketInfo['id'] ?? '';
// String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber\n${LocaleKeys.ticketId.tr()}: $ticketId'; String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber\n${LocaleKeys.ticketId.tr()}: $ticketId';
String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber';
Utils.showErrorDialog( Utils.showErrorDialog(
context: context, context: context,
message: successMessage, message: successMessage,
onOkTapped: () { onOkTapped: () {
Navigator.pop(context); Navigator.popAndPushNamed(context, AppRoutes.etqanOvr);
Navigator.pop(context);
// Navigator.popAndPushNamed(context, AppRoutes.etqanOvr);
}, },
onCloseTap: () { onCloseTap: () {
Navigator.pop(context); Navigator.popAndPushNamed(context, AppRoutes.etqanOvr);
Navigator.pop(context);
// Navigator.popAndPushNamed(context, AppRoutes.etqanOvr);
}, },
); );
} }

@ -155,8 +155,8 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchLeaveTicketBalance(context, DateTime.now()); data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries(); data.fetchMenuEntries();
data.fetchEventActivity(); data.fetchEventActivity();
data.getCategoryOffersListAPI(context);
data.fetchGreetingCards(); data.fetchGreetingCards();
data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
marathonProvider.getMarathonTutorial(); marathonProvider.getMarathonTutorial();
if (isFromInit) { if (isFromInit) {
@ -165,7 +165,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon();
_refreshController.refreshCompleted(); _refreshController.refreshCompleted();
await data.fetchTicketBooking(); // await data.fetchTicketBooking();
// if (data.ticketBookingResponse != null && !data.ticketBookingResponse!.success) { // if (data.ticketBookingResponse != null && !data.ticketBookingResponse!.success) {
// data.fetchTicketBalance(); // data.fetchTicketBalance();
@ -185,18 +185,13 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
ItgMainRes? response = await DashboardApiClient().getAdvertisementDetail(list[ermIndex].notificationMasterId ?? ""); ItgMainRes? response = await DashboardApiClient().getAdvertisementDetail(list[ermIndex].notificationMasterId ?? "");
// Utils.hideLoading(context); // Utils.hideLoading(context);
if (response!.mohemmItgResponseItem!.result!.data != null) { if (response!.mohemmItgResponseItem!.result!.data != null) {
for (ItgResponseData payload in response.mohemmItgResponseItem!.result!.data!) {
if (payload.notificationMasterId == list[ermIndex].notificationMasterId) {
payload.deadline = list[ermIndex].deadline;
}
}
if (list[ermIndex].notificationType == "Survey") { if (list[ermIndex].notificationType == "Survey") {
await Navigator.pushNamed(context, AppRoutes.survey, arguments: response.mohemmItgResponseItem!.result!.data!.first); await Navigator.pushNamed(context, AppRoutes.survey, arguments: response.mohemmItgResponseItem!.result!.data!.first);
} else { } else {
await Navigator.pushNamed( await Navigator.pushNamed(
context, context,
AppRoutes.advertisement, AppRoutes.advertisement,
arguments: {"masterId": list[ermIndex].notificationMasterId, "advertisement": response.mohemmItgResponseItem!.result!.data!.first}, arguments: {"masterId": list[ermIndex].notificationMasterId, "advertisement": response.mohemmItgResponseItem!.result!.data!.first.advertisement},
); );
} }
} }
@ -290,9 +285,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
}); });
}, },
), ),
Image Image.asset("assets/images/logos/main_mohemm_logo.png", width: 134, height: 28).expanded,
.asset("assets/images/logos/main_mohemm_logo.png", width: 134, height: 28)
.expanded,
SvgPicture.asset("assets/images/announcements.svg", matchTextDirection: true).onPress(() async { SvgPicture.asset("assets/images/announcements.svg", matchTextDirection: true).onPress(() async {
await Navigator.pushNamed(context, AppRoutes.announcements); await Navigator.pushNamed(context, AppRoutes.announcements);
}), }),
@ -324,103 +317,103 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
child: Consumer<DashboardProviderModel>( child: Consumer<DashboardProviderModel>(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) { builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return (model.isAttendanceTrackingLoading return (model.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer() ? GetAttendanceTrackingShimmer()
: Container( : Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient( gradient: const LinearGradient(
transform: GradientRotation(.46), transform: GradientRotation(.46),
begin: Alignment.topRight, begin: Alignment.topRight,
end: Alignment.bottomLeft, end: Alignment.bottomLeft,
colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor], colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor],
), ),
), ),
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
if (model.isTimeRemainingInSeconds == 0) DateTime.now().toString().split(" ")[0].toText12(color: Colors.white), if (model.isTimeRemainingInSeconds == 0) DateTime.now().toString().split(" ")[0].toText12(color: Colors.white),
if (model.isTimeRemainingInSeconds != 0) if (model.isTimeRemainingInSeconds != 0)
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [
9.height,
Directionality(
textDirection: ui.TextDirection.ltr,
child: CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(20)),
child: LinearProgressIndicator(
value: model.progress,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [ children: [
9.height, Expanded(
Directionality( child: Column(
textDirection: ui.TextDirection.ltr, mainAxisSize: MainAxisSize.min,
child: CountdownTimer( crossAxisAlignment: CrossAxisAlignment.start,
endTime: model.endTime, children: [
onEnd: null, LocaleKeys.checkIn.tr().toText12(color: Colors.white),
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), color: Colors.white,
), isBold: true,
),
4.height,
],
).paddingOnly(left: 12, right: 12),
), ),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), Container(
9.height, margin: EdgeInsets.only(top: AppState().isArabic(context) ? 6 : 0),
ClipRRect( width: 45,
borderRadius: const BorderRadius.all(Radius.circular(20)), height: 45,
child: LinearProgressIndicator( padding: const EdgeInsets.only(left: 10, right: 10),
value: model.progress, decoration: BoxDecoration(
minHeight: 8, color: const Color(0xff259EA4),
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white), borderRadius: BorderRadius.only(
backgroundColor: const Color(0xff196D73), bottomRight: AppState().isArabic(context) ? const Radius.circular(0) : const Radius.circular(15),
bottomLeft: AppState().isArabic(context) ? const Radius.circular(15) : const Radius.circular(0),
),
), ),
), child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/biometrics.svg" : "assets/images/biometrics.svg"),
).onPress(() {
showMyBottomSheet(context, callBackFunc: () {}, child: MarkAttendanceWidget(model, isFromDashboard: true));
}),
], ],
), ),
], ],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(
color: Colors.white,
isBold: true,
),
4.height,
],
).paddingOnly(left: 12, right: 12),
), ),
Container(
margin: EdgeInsets.only(top: AppState().isArabic(context) ? 6 : 0),
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 10, right: 10),
decoration: BoxDecoration(
color: const Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: AppState().isArabic(context) ? const Radius.circular(0) : const Radius.circular(15),
bottomLeft: AppState().isArabic(context) ? const Radius.circular(15) : const Radius.circular(0),
),
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/biometrics.svg" : "assets/images/biometrics.svg"),
).onPress(() {
showMyBottomSheet(context, callBackFunc: () {}, child: MarkAttendanceWidget(model, isFromDashboard: true));
}),
], ],
), ),
], ).onPress(() {
), Navigator.pushNamed(context, AppRoutes.todayAttendance);
], }))
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.todayAttendance);
}))
.animatedSwither(); .animatedSwither();
}, },
), ),
@ -438,22 +431,95 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
return const GreetingCardShimmer(); return const GreetingCardShimmer();
} else if (model.isDisplayEidGreetings && model.greetingCardsList != null && model.greetingCardsList!.isNotEmpty) { } else if (model.isDisplayEidGreetings && model.greetingCardsList != null && model.greetingCardsList!.isNotEmpty) {
return SizedBox( return SizedBox(
width: double.infinity, height: 120,
child: SvgPicture.network( child: ListView.separated(
AppState().isArabic(context) shrinkWrap: true,
? (model.greetingCardsList!.first.backgroundImageUrlAr ?? "https://www.hmg.com/Lists/CS_Greeting_Cards/Attachments/5/CS_Ramadan_26.jpg") scrollDirection: Axis.horizontal,
: (model.greetingCardsList!.first.backgroundImageUrlEn ?? "https://www.hmg.com/Lists/CS_Greeting_Cards/Attachments/5/CS_Ramadan_26.jpg"), padding: const EdgeInsets.symmetric(horizontal: 21),
fit: BoxFit.cover, itemCount: model.greetingCardsList!.length,
placeholderBuilder: (context) => ClipRRect(borderRadius: BorderRadius.circular(18), child: Container(height: 80, color: Colors.white).toShimmer()), separatorBuilder: (context, index) => const SizedBox(width: 12),
).onPress(() { itemBuilder: (context, index) {
launchUrl(Uri.parse(AppState().isArabic(context) ? model.greetingCardsList!.first.urlAr! : model.greetingCardsList!.first.urlEn!)); var card = model.greetingCardsList![index];
}), return SizedBox(
); width: MediaQuery.of(context).size.width - 42,
child: Directionality(
textDirection: AppState().isArabic(context) ? ui.TextDirection.rtl : ui.TextDirection.ltr,
child: Stack(
children: [
Transform.flip(
flipX: !AppState().isArabic(context),
child: SvgPicture.network(
AppState().isArabic(context)
? (card.backgroundImageUrlAr ?? "http://meena-health-care-1.s3.eu-north-1.amazonaws.com/eid_banner.svg")
: (card.backgroundImageUrlEn ?? "http://meena-health-care-1.s3.eu-north-1.amazonaws.com/eid_banner.svg"),
fit: BoxFit.contain,
placeholderBuilder: (context) => ClipRRect(borderRadius: BorderRadius.circular(18), child: Container(height: 80, color: Colors.white).toShimmer()),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(width: AppState().isArabic(context) ? 10 : 40),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
AppState().isArabic(context) ? card.titleAr ?? '' : card.titleEn ?? '',
style: TextStyle(
fontSize: AppState().isArabic(context) ? 20 : 18,
letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700,
height: 24 / 16,
color: const Color(0xFF3B3E4F),
),
),
const SizedBox(height: 4),
Text(
AppState().isArabic(context) ? card.descriptionAr ?? '' : card.descriptionEn ?? '',
style: TextStyle(
fontSize: AppState().isArabic(context) ? 16 : 14,
letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w500,
color: const Color(0xFF3B3E4F),
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
(AppState().isArabic(context)
? card.buttonTextN!.toText12(isUnderLine: true, color: const Color(0xFF3B3D4A))
: card.buttonText!.toText12(isUnderLine: true, color: const Color(0xFF3B3D4A)))
.onPress(() {
launchUrl(Uri.parse(AppState().isArabic(context) ? card.urlAr! : card.urlEn!));
}),
],
).paddingOnly(bottom: 10, right: 15, left: 15),
],
).paddingOnly(left: AppState().isArabic(context) ? 10 : 36, right: AppState().isArabic(context) ? 66 : 10, top: 6, bottom: 40),
],
),
),
);
},
),
).paddingOnly(bottom: 0);
} else { } else {
return const SizedBox(); return const SizedBox();
} }
}, },
).paddingOnly(bottom: 24, left: 24, right: 24), ),
// eventActivityWidget(context), // eventActivityWidget(context),
if (isDisplayMazaya) ...[ if (isDisplayMazaya) ...[
Column( Column(
@ -490,70 +556,70 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
flex: 2, flex: 2,
child: RichText( child: RichText(
text: text:
AppState().isArabic(context) AppState().isArabic(context)
? TextSpan( ? TextSpan(
children: [ children: [
TextSpan( TextSpan(
text: 'اطلع على مميزات', text: 'اطلع على مميزات',
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins', fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: const Color(0xFF5D5E5E), color: const Color(0xFF5D5E5E),
), ),
), ),
TextSpan( TextSpan(
text: ' مزايا', text: ' مزايا',
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins', fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
letterSpacing: -0.2, letterSpacing: -0.2,
height: 24 / 16, height: 24 / 16,
color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
), ),
), ),
], ],
) )
: TextSpan( : TextSpan(
children: [ children: [
TextSpan( TextSpan(
text: LocaleKeys.explore.tr() + ' ', text: LocaleKeys.explore.tr() + ' ',
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: Color(0xFF5D5E5E), color: Color(0xFF5D5E5E),
), ),
), ),
TextSpan( TextSpan(
text: LocaleKeys.mazaya.tr(), text: LocaleKeys.mazaya.tr(),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
fontFamily: 'Poppins', fontFamily: 'Poppins',
letterSpacing: -0.2, letterSpacing: -0.2,
height: 24 / 16, height: 24 / 16,
color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
), ),
), ),
TextSpan( TextSpan(
text: ' ' + LocaleKeys.benefits.tr(), text: ' ' + LocaleKeys.benefits.tr(),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: Color(0xFF5D5E5E), color: Color(0xFF5D5E5E),
), ),
), ),
], ],
), ),
), ),
), ),
const Expanded(flex: 1, child: SizedBox()), const Expanded(flex: 1, child: SizedBox()),
@ -633,42 +699,42 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
return model.isOffersLoading return model.isOffersLoading
? const OffersShimmerWidget() ? const OffersShimmerWidget()
: InkWell( : InkWell(
onTap: () { onTap: () {
navigateToDetails(data.getOffersList[index]); navigateToDetails(data.getOffersList[index]);
}, },
child: SizedBox( child: SizedBox(
width: 73, width: 73,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
width: 73, width: 73,
height: 73, height: 73,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: const BorderRadius.all(Radius.circular(100)), borderRadius: const BorderRadius.all(Radius.circular(100)),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1), border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
), ),
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)), borderRadius: const BorderRadius.all(Radius.circular(50)),
child: Hero( child: Hero(
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!, tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
transitionOnUserGestures: true, transitionOnUserGestures: true,
child: Image.network(data.getOffersList[index].logo ?? "", fit: BoxFit.contain), child: Image.network(data.getOffersList[index].logo ?? "", fit: BoxFit.contain),
),
),
), ),
), 4.height,
), Expanded(
4.height, child:
Expanded( AppState().isArabic(context)
child: ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
AppState().isArabic(context) : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) ),
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1), ],
), ),
], ),
), );
),
);
}, },
separatorBuilder: (BuildContext cxt, int index) => 8.width, separatorBuilder: (BuildContext cxt, int index) => 8.width,
itemCount: 9, itemCount: 9,
@ -691,9 +757,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
ServicesWidget(), ServicesWidget(),
context context.watch<MarathonProvider>().isLoading ? const MarathonBannerShimmer().paddingAll(20) : const MarathonBanner().paddingOnly(left: 21, right: 21, bottom: 8, top: 8),
.watch<MarathonProvider>()
.isLoading ? const MarathonBannerShimmer().paddingAll(20) : const MarathonBanner().paddingOnly(left: 21, right: 21, bottom: 8, top: 8),
// context.watch<MarathonProvider>().isTutorialLoading // context.watch<MarathonProvider>().isTutorialLoading
// ? const MarathonBannerShimmer().paddingAll(20) // ? const MarathonBannerShimmer().paddingAll(20)
// : Container( // : Container(
@ -797,28 +861,28 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
SvgPicture.asset( SvgPicture.asset(
"assets/icons/chat/chat.svg", "assets/icons/chat/chat.svg",
color: color:
!checkIfPrivilegedForChat() !checkIfPrivilegedForChat()
? MyColors.lightGreyE3Color ? MyColors.lightGreyE3Color
: currentIndex == 4 : currentIndex == 4
? MyColors.grey3AColor ? MyColors.grey3AColor
: cProvider.disbaleChatForThisUser : cProvider.disbaleChatForThisUser
? MyColors.lightGreyE3Color ? MyColors.lightGreyE3Color
: MyColors.grey98Color, : MyColors.grey98Color,
).paddingAll(4), ).paddingAll(4),
Consumer<ChatProviderModel>( Consumer<ChatProviderModel>(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { builder: (BuildContext cxt, ChatProviderModel data, Widget? child) {
return !checkIfPrivilegedForChat() return !checkIfPrivilegedForChat()
? const SizedBox() ? const SizedBox()
: Positioned( : Positioned(
right: 0, right: 0,
top: 0, top: 0,
child: Container( child: Container(
padding: const EdgeInsets.only(left: 4, right: 4), padding: const EdgeInsets.only(left: 4, right: 4),
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)), decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)),
child: data.chatUConvCounter.toString().toText10(color: Colors.white), child: data.chatUConvCounter.toString().toText10(color: Colors.white),
), ),
); );
}, },
), ),
], ],
@ -854,16 +918,9 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
} }
Widget eventActivityWidget(BuildContext context) { Widget eventActivityWidget(BuildContext context) {
return (context return (context.watch<DashboardProviderModel>().isEventLoadingLoading)
.watch<DashboardProviderModel>()
.isEventLoadingLoading)
? const MarathonBannerShimmer().paddingOnly(left: 21, right: 21, bottom: 21, top: 0) ? const MarathonBannerShimmer().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: (context : (context.watch<DashboardProviderModel>().eventActivity != null && context.watch<DashboardProviderModel>().eventActivity!.isActive == true)
.watch<DashboardProviderModel>()
.eventActivity != null && context
.watch<DashboardProviderModel>()
.eventActivity!
.isActive == true)
? const EventActivityBanner().paddingOnly(left: 21, right: 21, bottom: 21, top: 0) ? const EventActivityBanner().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: const SizedBox(); : const SizedBox();
} }

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/index.dart'; import 'package:flutter_countdown_timer/index.dart';
import 'package:jiffy/jiffy.dart';
import 'package:lottie/lottie.dart'; import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -14,14 +13,12 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads; import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads;
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart' as itgres;
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/my_video_progress_indicator.dart'; import 'package:mohem_flutter_app/widgets/my_video_progress_indicator.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:sizer/sizer.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:video_player/video_player.dart'; import 'package:video_player/video_player.dart';
@ -45,7 +42,6 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
// late File imageFile; // late File imageFile;
late String imageUrl; late String imageUrl;
itgres.ItgResponseData? advertisementPayload;
ads.Advertisement? advertisementData; ads.Advertisement? advertisementData;
dynamic data; dynamic data;
String? masterID; String? masterID;
@ -56,7 +52,6 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
final ValueNotifier<bool> hasTimerEnded = ValueNotifier(false); final ValueNotifier<bool> hasTimerEnded = ValueNotifier(false);
late CountdownTimerController timerController; late CountdownTimerController timerController;
CountdownTimerController? deadlineTimerController;
void checkFileType() { void checkFileType() {
if (advertisementData!.viewAttachFileColl!.first.contentType!.toLowerCase() == "text") { if (advertisementData!.viewAttachFileColl!.first.contentType!.toLowerCase() == "text") {
@ -133,227 +128,34 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
}); });
} }
String getDeadlineText() {
if (advertisementPayload?.deadline == null) {
return "";
}
try {
// Parse the deadline string using Jiffy (format: MM/dd/yyyy hh:mm:ss aa)
Jiffy deadlineJiffy = Jiffy.parse(advertisementPayload!.deadline!, pattern: "MM/dd/yyyy hh:mm:ss aa");
Jiffy nowJiffy = Jiffy.now();
// Calculate days left
int daysLeft = deadlineJiffy.diff(nowJiffy, unit: Unit.day).toInt();
if (daysLeft < 0) {
// Deadline has passed
int daysAgo = daysLeft.abs();
if (AppState().isArabic(context)) {
return "انتهى الموعد النهائي منذ $daysAgo ${daysAgo == 1 ? 'يوم' : 'أيام'}";
} else {
return "Deadline passed $daysAgo ${daysAgo == 1 ? 'day' : 'days'} ago";
}
} else if (daysLeft == 0) {
// Deadline is today
if (AppState().isArabic(context)) {
return "الموعد النهائي اليوم!";
} else {
return "Deadline is today!";
}
} else if (daysLeft == 1) {
// Deadline is tomorrow
if (AppState().isArabic(context)) {
return "الموعد النهائي غداً";
} else {
return "Deadline is tomorrow";
}
} else {
// Deadline is in the future
if (AppState().isArabic(context)) {
return "متبقي $daysLeft ${daysLeft <= 10 ? 'أيام' : 'يوم'}";
} else {
return "$daysLeft ${daysLeft == 1 ? 'day' : 'days'} left";
}
}
} catch (e) {
logger.e("Error parsing deadline: $e");
return "Deadline: ${Utils.formatDate(advertisementPayload!.deadline)}";
}
}
void initDeadlineTimer() {
if (advertisementPayload?.deadline == null) return;
try {
// Parse the deadline string using Jiffy (format: MM/dd/yyyy hh:mm:ss aa)
Jiffy deadlineJiffy = Jiffy.parse(advertisementPayload!.deadline!, pattern: "MM/dd/yyyy hh:mm:ss aa");
DateTime deadlineDate = deadlineJiffy.dateTime;
int endTime = deadlineDate.millisecondsSinceEpoch;
int currentTime = DateTime.now().millisecondsSinceEpoch;
// Only create timer if deadline is in the future
if (endTime > currentTime) {
deadlineTimerController = CountdownTimerController(
endTime: endTime,
onEnd: () {
// Timer ended, could trigger a refresh or notification
logger.d("Deadline timer ended");
},
);
}
} catch (e) {
logger.e("Error initializing deadline timer: $e");
}
}
@override @override
void dispose() { void dispose() {
_controller?.dispose(); _controller?.dispose();
deadlineTimerController?.dispose();
super.dispose(); super.dispose();
} }
// Helper method to get localized text
String _getLocalizedText(String arabic, String english) {
return AppState().isArabic(context) ? arabic : english;
}
// Build advertisement content text
Widget _buildAdvertisementContent() {
String content = AppState().isArabic(context) ? advertisementData!.viewAttachFileColl![0].base64String! : advertisementData!.viewAttachFileColl![1].base64String!;
return content.toText16(color: MyColors.darkTextColor);
}
// Build deadline section with timer
Widget _buildDeadlineSection() {
if (deadlineTimerController != null) {
return Center(
child: Column(crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [_buildEndDateText(), 4.height, _buildTimeRemainingRow(), 8.height]),
);
} else {
return Center(child: _buildEndDateText(isLargeText: true));
}
}
// Build end date text
Widget _buildEndDateText({bool isLargeText = false}) {
String label = _getLocalizedText("تاريخ الانتهاء: ", "End Date: ");
String fullText = label + advertisementPayload!.deadline ?? "";
return isLargeText ? fullText.toText16(color: MyColors.darkTextColor) : fullText.toText14(color: MyColors.darkTextColor);
}
// Build time remaining row with timer
Widget _buildTimeRemainingRow() {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [_getLocalizedText("الوقت المتبقي", "Time Remaining").toText16(color: MyColors.darkTextColor, isBold: true), 8.width, _buildCountdownTimer()],
);
}
// Build countdown timer widget
Widget _buildCountdownTimer() {
return CountdownTimer(
controller: deadlineTimerController,
endWidget: _getLocalizedText("انتهى الموعد النهائي!", "Deadline Expired!").toText16(color: MyColors.redColor, isBold: true),
textStyle: const TextStyle(color: MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold),
);
}
// Build action buttons list
Widget _buildActionButtons() {
return ListView.separated(
itemCount: advertisementData!.actionButtonsColl?.length ?? 0,
separatorBuilder: (cxt, index) => 16.height,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
itemBuilder: (cxt, index) {
var actionButton = advertisementData!.actionButtonsColl![index];
String btnText = _getLocalizedText(actionButton.btnTextAr, actionButton.btnTextEn);
return DefaultButton(btnText, () => _handleButtonAction(actionButton));
},
);
}
// Handle button action based on type
Future<void> _handleButtonAction(actionButton) async {
String actionValue = actionButton.actionValue.toLowerCase();
if (actionValue == "skip") {
Navigator.pop(context);
return;
}
String actionType = actionButton.actionType?.toLowerCase() ?? '';
if (actionType == 'redirect' && actionValue == 'external') {
await _handleExternalRedirect(actionButton.url);
} else if (actionType == 'redirect' && actionValue == 'internal') {
await _handleInternalRedirect(actionButton.url);
} else if (actionType == 'eit' && actionValue == 'internal') {
await _handleEitInternal(actionButton.url);
} else {
await _handleExternalRedirect(actionButton.iconOrImage);
}
}
// Handle external URL redirect
Future<void> _handleExternalRedirect(String url) async {
Uri uri = Uri.parse(url);
await launchUrl(uri, mode: LaunchMode.externalApplication).catchError((err) {
Utils.showToast('Could not launch');
});
Navigator.pop(context);
}
// Handle internal route navigation
Future<void> _handleInternalRedirect(String url) async {
await Navigator.pushNamed(context, url);
}
// Handle EIT internal navigation
Future<void> _handleEitInternal(String url) async {
var pro = Provider.of<DashboardProviderModel>(context, listen: false);
List<GetMenuEntriesList> menuList =
pro.getMenuEntriesList?.where((element) => element.parentMenuName == url && (element.menuEntryType == "FUNCTION" || element.menuEntryType == "MENU")).toList() ?? [];
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(advertisementData!.advertisementTitle!, menuList));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
data = ModalRoute.of(context)!.settings.arguments; data = ModalRoute.of(context)!.settings.arguments;
advertisementPayload ??= data["advertisement"] as itgres.ItgResponseData; advertisementData ??= data["advertisement"] as ads.Advertisement;
advertisementData = advertisementPayload!.advertisement;
masterID ??= data["masterId"]; masterID ??= data["masterId"];
if (advertisementData != null) { if (advertisementData != null) {
checkFileType(); checkFileType();
if (isTextURL) { videoDuration = advertisementData?.durationInSeconds ?? 0;
if (advertisementPayload?.deadline != null && deadlineTimerController == null) { timerController = CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: onTimerEnd);
initDeadlineTimer();
}
} else {
videoDuration = advertisementData?.durationInSeconds ?? 0;
timerController = CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: onTimerEnd);
}
} }
return Scaffold( return Scaffold(
backgroundColor: isTextURL ? Colors.white : Colors.black, backgroundColor: isTextURL ? Colors.white : Colors.black,
appBar: appBar: isTextURL
isTextURL ? AppBar(
? AppBar( centerTitle: true,
centerTitle: true, automaticallyImplyLeading: false,
automaticallyImplyLeading: false, backgroundColor: Colors.white,
backgroundColor: Colors.white, title: (AppState().isArabic(context) ? advertisementData!.advertisementTitleAr! : advertisementData!.advertisementTitle!).toText24(color: MyColors.darkTextColor, isBold: true),
title: (AppState().isArabic(context) ? advertisementData!.advertisementTitleAr! : advertisementData!.advertisementTitle!).toText24(color: MyColors.darkTextColor, isBold: true),
) //advertisementData!.viewAttachFileColl!.first.base64String!.toText24(color: MyColors.darkTextColor, isBold: true),
: null, )
: null,
body: Stack( body: Stack(
children: [ children: [
if (isVideo) if (isVideo)
@ -366,33 +168,38 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Center( Center(
child: child: isAudio
isAudio ? Lottie.asset(MyLottieConsts.audioPlaybackLottie)
? Lottie.asset(MyLottieConsts.audioPlaybackLottie) : AspectRatio(
: AspectRatio( aspectRatio: _controller!.value.aspectRatio,
aspectRatio: _controller!.value.aspectRatio, child: Stack(
child: Stack( alignment: Alignment.bottomCenter,
alignment: Alignment.bottomCenter, children: [
children: [ VideoPlayer(_controller!),
VideoPlayer(_controller!), if (advertisementData?.isOptional ?? false)
if (advertisementData?.isOptional ?? false) Positioned(
Positioned( top: 4,
top: 4, right: 8,
right: 8, child: Container(
child: Container( padding: const EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4),
padding: const EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4), decoration: BoxDecoration(color: Colors.white.withOpacity(0.5), borderRadius: BorderRadius.circular(30)),
decoration: BoxDecoration(color: Colors.white.withOpacity(0.5), borderRadius: BorderRadius.circular(30)), child: Row(
child: Row(mainAxisSize: MainAxisSize.min, children: [Text(AppState().isArabic(context) ? "يتخطى" : "Skip"), Icon(Icons.skip_next)]), mainAxisSize: MainAxisSize.min,
).onPress(() { children: [
Navigator.pop(context); Text(AppState().isArabic(context) ? "يتخطى" : "Skip"),
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) { Icon(Icons.skip_next),
logger.d(value); ],
}); ),
}), ).onPress(() {
), Navigator.pop(context);
], DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) {
), logger.d(value);
});
}),
),
],
), ),
),
), ),
30.height, 30.height,
CountdownTimer( CountdownTimer(
@ -436,13 +243,13 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
btnText!, btnText!,
hasTimerEndedBool hasTimerEndedBool
? () async { ? () async {
Navigator.pop(context); Navigator.pop(context);
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then(( DashboardApiClient()
value, .setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue)
) { .then((value) {
logger.d(value); logger.d(value);
}); });
} }
: null, : null,
disabledColor: Colors.transparent, disabledColor: Colors.transparent,
textColor: !hasTimerEndedBool ? Colors.white.withOpacity(.5) : Colors.white, textColor: !hasTimerEndedBool ? Colors.white.withOpacity(.5) : Colors.white,
@ -450,12 +257,15 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
], ],
); );
} }
return DefaultButton(btnText!, () async { return DefaultButton(
Navigator.pop(context); btnText!,
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then((value) { () async {
logger.d(value); Navigator.pop(context);
}); DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then((value) {
}).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8); logger.d(value);
});
},
).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8);
}, },
// gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
// crossAxisCount: 1, // crossAxisCount: 1,
@ -528,7 +338,9 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
], ],
); );
} else { } else {
return const Center(child: CircularProgressIndicator()); return const Center(
child: CircularProgressIndicator(),
);
} }
}, },
), ),
@ -541,17 +353,19 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
children: [ children: [
Image.network(imageUrl), Image.network(imageUrl),
50.height, 50.height,
Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)).onPress(() { Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)).onPress(
try { () {
Navigator.pop(context); try {
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) { Navigator.pop(context);
logger.d(value); DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) {
}); logger.d(value);
} catch (ex) { });
logger.wtf(ex); } catch (ex) {
Utils.handleException(ex, context, null); logger.wtf(ex);
} Utils.handleException(ex, context, null);
}), }
},
),
], ],
), ),
), ),
@ -562,11 +376,58 @@ class _ITGAdsScreenState extends State<ITGAdsScreen> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_buildAdvertisementContent(), (AppState().isArabic(context) ? advertisementData!.viewAttachFileColl![0].base64String! : advertisementData!.viewAttachFileColl![1].base64String!)
.toText16(color: MyColors.darkTextColor),
24.height, 24.height,
if (advertisementPayload != null && advertisementPayload!.deadline != null) _buildDeadlineSection(), ListView.separated(
if (advertisementPayload != null && advertisementPayload!.deadline != null) 24.height, itemCount: advertisementData!.actionButtonsColl?.length ?? 0,
_buildActionButtons(), separatorBuilder: (cxt, index) => 16.height,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
itemBuilder: (cxt, index) => DefaultButton(
AppState().isArabic(context) ? advertisementData!.actionButtonsColl![index].btnTextAr : advertisementData!.actionButtonsColl![index].btnTextEn,
() async {
if (advertisementData!.actionButtonsColl![index].actionValue.toLowerCase() == "skip") {
Navigator.pop(context);
} else {
if (advertisementData!.actionButtonsColl![index].actionType!.toLowerCase() == 'redirect' && advertisementData!.actionButtonsColl![index].actionValue!.toLowerCase() ==
'external') {
Uri uri = Uri.parse(advertisementData!.actionButtonsColl![index].url!);
await launchUrl(uri, mode: LaunchMode.externalApplication).catchError((err) {
// print(err);
Utils.showToast('Could not launch');
});
Navigator.pop(context);
} else if (advertisementData!.actionButtonsColl![index].actionType!.toLowerCase() == 'redirect' && advertisementData!.actionButtonsColl![index].actionValue!.toLowerCase() ==
'internal') {
await Navigator.pushNamed(context, advertisementData!.actionButtonsColl![index].url!);
} else if(advertisementData!.actionButtonsColl![index].actionType!.toLowerCase() == 'eit' && advertisementData!.actionButtonsColl![index].actionValue!.toLowerCase() ==
'internal'){
var pro = Provider.of<DashboardProviderModel>(context, listen: false);
List<GetMenuEntriesList> _menuList =
pro.getMenuEntriesList?.where((element) => element.parentMenuName == advertisementData!.actionButtonsColl![index].url && (element.menuEntryType == "FUNCTION" || element.menuEntryType == "MENU")).toList() ?? [];
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(advertisementData!.advertisementTitle!, _menuList));
}
else{
Uri uri = Uri.parse(advertisementData!.actionButtonsColl![index].iconOrImage);
// if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication).catchError((err) {
// print(err);
Utils.showToast('Could not launch');
});
Navigator.pop(context);
// } else {
// Utils.showToast('Could not launch');
// }
}
}
},
),
),
], ],
), ),
), ),

@ -58,15 +58,15 @@ class _AppDrawerState extends State<AppDrawer> {
children: [ children: [
AppState().memberInformationList!.eMPLOYEEIMAGE == null AppState().memberInformationList!.eMPLOYEEIMAGE == null
? SvgPicture.asset( ? SvgPicture.asset(
"assets/images/user.svg", "assets/images/user.svg",
height: 52, height: 52,
width: 52, width: 52,
) )
: CircleAvatar( : CircleAvatar(
radius: 52 / 2, radius: 52 / 2,
backgroundImage: MemoryImage(Utils.dataFromBase64String(AppState().memberInformationList!.eMPLOYEEIMAGE!)), backgroundImage: MemoryImage(Utils.dataFromBase64String(AppState().memberInformationList!.eMPLOYEEIMAGE!)),
backgroundColor: Colors.black, backgroundColor: Colors.black,
), ),
12.width, 12.width,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -119,7 +119,7 @@ class _AppDrawerState extends State<AppDrawer> {
}), }),
menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())), menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())),
if (AppState().businessCardPrivilege) if (AppState().businessCardPrivilege)
menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog(), isBusniessCard: true)), menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog(), isBusniessCard: true)),
menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: (){Utils.performLogout(context, chatData);}), menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: (){Utils.performLogout(context, chatData);}),
// menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,); // menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,);
], ],
@ -156,9 +156,9 @@ class _AppDrawerState extends State<AppDrawer> {
], ],
).paddingOnly(left: 21, top: 10, bottom: 10, right: 21).onPress(closeDrawer ).paddingOnly(left: 21, top: 10, bottom: 10, right: 21).onPress(closeDrawer
? () async { ? () async {
Navigator.pop(context); Navigator.pop(context);
Future.delayed(const Duration(microseconds: 200), onPress); Future.delayed(const Duration(microseconds: 200), onPress);
} }
: onPress!); : onPress!);
} }
@ -171,13 +171,13 @@ class _AppDrawerState extends State<AppDrawer> {
setState(() {}); setState(() {});
} }
// void performLogout() async { // void performLogout() async {
// // AppState().isAuthenticated = false; // // AppState().isAuthenticated = false;
// // AppState().isLogged = false; // // AppState().isLogged = false;
// // AppState().setPostParamsInitConfig(); // // AppState().setPostParamsInitConfig();
// // chatData.disposeData(); // // chatData.disposeData();
// // // SharedPreferences prefs = await SharedPreferences.getInstance(); // // // SharedPreferences prefs = await SharedPreferences.getInstance();
// // // await prefs.clear(); // // // await prefs.clear();
// // Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route<dynamic> route) => false, arguments: null); // // Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route<dynamic> route) => false, arguments: null);
// } // }
} }

@ -8,7 +8,6 @@ import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart'; import 'package:mohem_flutter_app/models/sso_auth_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
@ -123,28 +122,28 @@ class MenusWidget extends StatelessWidget {
], ],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
).onPress(() async { ).onPress(() async {
// Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS")); Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS"));
var pro = Provider.of<DashboardProviderModel>(context, listen: false); // var pro = Provider.of<DashboardProviderModel>(context, listen: false);
//
// if (menuEntry.menuName == "HMG_TICKET_REQUESTS") { // // if (menuEntry.menuName == "HMG_TICKET_REQUESTS") {
Utils.showLoading(context); // Utils.showLoading(context);
//Ticket Work // //Ticket Work
if (pro.ticketBookingResponse != null && pro.ticketBookingResponse!.success) { // if (pro.ticketBookingResponse != null && pro.ticketBookingResponse!.success) {
SSOAuthModel? ssoToken = await pro.fetchSSOAuthRedirection(clientID: pro.ticketBookingResponse!.clientId); // SSOAuthModel? ssoToken = await pro.fetchSSOAuthRedirection(clientID: pro.ticketBookingResponse!.clientId);
if (ssoToken != null) { // if (ssoToken != null) {
dynamic url = await pro.fetchURLRedirection(token: ssoToken.data!.accessToken!); // dynamic url = await pro.fetchURLRedirection(token: ssoToken.data!.accessToken!);
await pro.fetchTicketAccuralBalance(context, DateTime.now()); // await pro.fetchTicketAccuralBalance(context, DateTime.now());
pro.ticketHistoryTransactionList = await EITApiClient().getEITTransactions("HMG_TICKET_ITENARY_HR_EIT_SS", isCompleteList: true); // pro.ticketHistoryTransactionList = await EITApiClient().getEITTransactions("HMG_TICKET_ITENARY_HR_EIT_SS", isCompleteList: true);
//
Utils.hideLoading(context); // Utils.hideLoading(context);
// Here Need Work // // Here Need Work
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => TicketDetailedScreen(url: url, jwtToken: ssoToken.data!.accessToken))); // Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => TicketDetailedScreen(url: url, jwtToken: ssoToken.data!.accessToken)));
} // }
//} // //}
} else { // } else {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS")); // Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS"));
} // }
}), }),
], ],
); );

@ -295,7 +295,7 @@ class _CoursesScreenState extends State<CoursesScreen> {
void _openCourse(String? url, String? jwtToken) { void _openCourse(String? url, String? jwtToken) {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: url, jwtToken: jwtToken, ssoType: SsoType.forCourses))); Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: url, jwtToken: jwtToken)));
//Utils.showToast(LocaleKeys.courseUrlNotAvailable.tr()); //Utils.showToast(LocaleKeys.courseUrlNotAvailable.tr());

@ -192,78 +192,10 @@ class _MowadhafhiHRRequestState extends State<MowadhafhiHRRequest> {
title.toText16().expanded, title.toText16().expanded,
6.width, 6.width,
SimpleButton(LocaleKeys.add.tr(), () async { SimpleButton(LocaleKeys.add.tr(), () async {
FilePickerResult? result = await FilePicker.platform.pickFiles( FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
allowMultiple: true,
);
if (result != null) { if (result != null) {
// Maximum file size: 2 MB (in bytes) attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList();
const int maxFileSizeInBytes = 2 * 1024 * 1024; // 2 MB = 2097152 bytes attachmentFiles = attachmentFiles.toSet().toList();
List<File> newFiles = [];
List<String> oversizedFiles = [];
for (PlatformFile platformFile in result.files) {
if (platformFile.path != null) {
File file = File(platformFile.path!);
// Get file size - check multiple sources for iOS compatibility
int fileSize = 0;
// Method 1: Check platformFile.size first
if (platformFile.size > 0) {
fileSize = platformFile.size;
debugPrint('Using platformFile.size: $fileSize bytes');
}
// Method 2: Always verify with file.length() as well
try {
int fileLengthSize = await file.length();
debugPrint('Using file.length(): $fileLengthSize bytes');
// Use the maximum of both to ensure we catch the real size
if (fileLengthSize > fileSize) {
fileSize = fileLengthSize;
debugPrint('Using larger value from file.length()');
}
} catch (e) {
debugPrint('Error getting file.length(): $e');
// If file.length() fails, rely on platformFile.size
if (fileSize == 0) {
debugPrint('Cannot determine file size, rejecting file: ${platformFile.name}');
oversizedFiles.add('${platformFile.name} (unknown size)');
continue;
}
}
double fileSizeMB = fileSize / (1024 * 1024);
debugPrint('Final file size - ${platformFile.name}: $fileSize bytes (${fileSizeMB.toStringAsFixed(2)} MB)');
// STRICT validation: Only accept files that are 2 MB or less
if (fileSize > 0 && fileSize <= maxFileSizeInBytes) {
debugPrint('✓ File accepted: ${platformFile.name}');
newFiles.add(file);
} else if (fileSize > maxFileSizeInBytes) {
debugPrint('✗ File REJECTED (too large): ${platformFile.name} - ${fileSizeMB.toStringAsFixed(2)} MB');
oversizedFiles.add('${platformFile.name} (${fileSizeMB.toStringAsFixed(2)} MB)');
} else {
debugPrint('✗ File REJECTED (invalid size): ${platformFile.name}');
oversizedFiles.add('${platformFile.name} (invalid)');
}
}
}
// Only add valid files
if (newFiles.isNotEmpty) {
attachmentFiles = attachmentFiles + newFiles;
attachmentFiles = attachmentFiles.toSet().toList();
debugPrint('Total files attached: ${attachmentFiles.length}');
}
// Show error message for rejected files
if (oversizedFiles.isNotEmpty) {
String fileList = oversizedFiles.join('\n');
Utils.showToast('Max 2MB File allowed.');
debugPrint('Total rejected files: ${oversizedFiles.length}');
}
setState(() {}); setState(() {});
} }
}, fontSize: 14), }, fontSize: 14),

@ -5,17 +5,15 @@ import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/file_process.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accural_ticket_balance_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accural_ticket_balance_model.dart';
import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
import 'package:mohem_flutter_app/models/eit_attachment_ticket_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart';
import 'package:mohem_flutter_app/widgets/sso_webview_widget.dart'; import 'package:mohem_flutter_app/widgets/sso_webview_widget.dart';
@ -58,7 +56,7 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget(context, title: LocaleKeys.ticketDetails.tr()), appBar: AppBarWidget(context, title:LocaleKeys.ticketDetails.tr()),
body: Column( body: Column(
children: <Widget>[ children: <Widget>[
ListView( ListView(
@ -77,7 +75,7 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
children: <Widget>[ children: <Widget>[
Row( Row(
children: <Widget>[ children: <Widget>[
LocaleKeys.currentTicketBalance.tr().toText20().expanded, LocaleKeys.currentTicketBalance.tr().toText20().expanded,
Row( Row(
children: <Widget>[ children: <Widget>[
const Icon(Icons.calendar_month_rounded, color: MyColors.darkIconColor, size: 16), const Icon(Icons.calendar_month_rounded, color: MyColors.darkIconColor, size: 16),
@ -115,8 +113,9 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
), ),
), ),
const SizedBox(height: 21), const SizedBox(height: 21),
(dashboardProviderModel != null && dashboardProviderModel!.ticketHistoryTransactionList != null && dashboardProviderModel!.ticketHistoryTransactionList!.isNotEmpty) dashboardProviderModel == null && dashboardProviderModel!.ticketHistoryTransactionList == null
? ListView( ? const SizedBox()
: ListView(
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
children: <Widget>[ children: <Widget>[
@ -127,8 +126,8 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemBuilder: (BuildContext cxt, int cardIndex) { itemBuilder: (BuildContext cxt, int cardIndex) {
List<CollectionTransaction> transactionDetails = dashboardProviderModel!.ticketHistoryTransactionList![cardIndex]; var transactionDetails = dashboardProviderModel!.ticketHistoryTransactionList![cardIndex];
const Set<String> allowedSegmentNames = <String>{ const allowedSegmentNames = <String>{
"TICKETS_ROUTE", "TICKETS_ROUTE",
"TRAVELER_NAME", "TRAVELER_NAME",
"TICKETS_EFFECTIVE_DATE", "TICKETS_EFFECTIVE_DATE",
@ -137,22 +136,11 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
"TICKET_COMP_SHARE", "TICKET_COMP_SHARE",
"TICKET_EMP_SHARE", "TICKET_EMP_SHARE",
}; };
// Get items for display var uniqueDetails =
List<CollectionTransaction> uniqueDetails =
transactionDetails transactionDetails
.where( .where((item) => item.dISPLAYFLAG != 'N' && item.sEGMENTPROMPT != null && item.sEGMENTPROMPT!.isNotEmpty && allowedSegmentNames.contains(item.sEGMENTNAME))
(CollectionTransaction item) =>
item.dISPLAYFLAG != 'N' && item.sEGMENTPROMPT != null && item.sEGMENTPROMPT!.isNotEmpty && allowedSegmentNames.contains(item.sEGMENTNAME),
)
.toList(); .toList();
// Get PEI_EXTRA_INFO_ID value for View PDF
CollectionTransaction? peiExtraInfoItem = transactionDetails.firstWhere(
(CollectionTransaction item) => item.aPPLICATIONCOLUMNNAME == "PEI_EXTRA_INFO_ID",
orElse: () => CollectionTransaction(),
);
num? peiExtraInfoId = peiExtraInfoItem.nUMBERVALUE;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -161,15 +149,15 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemCount: (uniqueDetails.length / 2).ceil(), itemCount: (uniqueDetails.length / 2).ceil(),
itemBuilder: (BuildContext context, int rowIndex) { itemBuilder: (context, rowIndex) {
int firstIndex = rowIndex * 2; int firstIndex = rowIndex * 2;
int? secondIndex = (firstIndex + 1 < uniqueDetails.length) ? firstIndex + 1 : null; int? secondIndex = (firstIndex + 1 < uniqueDetails.length) ? firstIndex + 1 : null;
bool isLastRow = (rowIndex == (uniqueDetails.length / 2).ceil() - 1); bool isLastRow = (rowIndex == (uniqueDetails.length / 2).ceil() - 1);
CollectionTransaction item1 = uniqueDetails[firstIndex]; var item1 = uniqueDetails[firstIndex];
ItemDetailViewCol child1 = ItemDetailViewCol(item1.sEGMENTPROMPT!, item1.vARCHAR2VALUE ?? item1.nUMBERVALUE?.toString() ?? ""); var child1 = ItemDetailViewCol(item1.sEGMENTPROMPT!, item1.vARCHAR2VALUE ?? item1.nUMBERVALUE?.toString() ?? "");
Widget child2; Widget child2;
if (secondIndex != null) { if (secondIndex != null) {
CollectionTransaction item2 = uniqueDetails[secondIndex]; var item2 = uniqueDetails[secondIndex];
child2 = ItemDetailViewCol(item2.sEGMENTPROMPT!, item2.vARCHAR2VALUE ?? item2.nUMBERVALUE?.toString() ?? ""); child2 = ItemDetailViewCol(item2.sEGMENTPROMPT!, item2.vARCHAR2VALUE ?? item2.nUMBERVALUE?.toString() ?? "");
} else { } else {
child2 = const SizedBox(); // Empty widget if there is no second item child2 = const SizedBox(); // Empty widget if there is no second item
@ -177,40 +165,6 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
return ItemDetailGrid(child1, child2, isItLast: isLastRow); return ItemDetailGrid(child1, child2, isItLast: isLastRow);
}, },
), ),
// View PDF link at the bottom
if (peiExtraInfoId != null) ...[
const SizedBox(height: 5),
Align(
alignment: Alignment.centerRight,
child: GestureDetector(
onTap: () async {
Utils.showLoading(context);
try {
GetEitAttachmentTicket? result = await dashboardProviderModel!.getTicketEitPDFDownload(peiExtraInfoId: peiExtraInfoId.toString());
if (result != null && result.getEitAttachmentList != null && result.getEitAttachmentList!.isNotEmpty) {
String? base64Data = result.getEitAttachmentList!.first.fileData;
if (base64Data != null && base64Data.isNotEmpty) {
String fileName = result.getEitAttachmentList!.first.fileName!;
await FileProcess.downloadFile(base64Data, fileName);
Utils.hideLoading(context);
FileProcess.openFile(fileName);
} else {
Utils.hideLoading(context);
Utils.showToast("PDF data not available");
}
} else {
Utils.hideLoading(context);
Utils.showToast("No attachment found");
}
} catch (e) {
Utils.hideLoading(context);
Utils.showToast("Something Went Wrong");
}
},
child: Padding(padding: const EdgeInsets.only(top: 8.0, left: 0.0, bottom: 8.0), child: "View PDF".toText14(isUnderLine: true, isBold: true)),
),
),
],
], ],
).objectContainerView(); ).objectContainerView();
}, },
@ -218,14 +172,13 @@ class _TicketDetailedScreenState extends State<TicketDetailedScreen> {
itemCount: dashboardProviderModel!.ticketHistoryTransactionList!.length, itemCount: dashboardProviderModel!.ticketHistoryTransactionList!.length,
), ),
], ],
) ),
: const SizedBox(),
], ],
], ],
).expanded, ).expanded,
DefaultButton(LocaleKeys.proceedBooking.tr(), () { DefaultButton(LocaleKeys.proceedBooking.tr(), () {
if (widget.url != null && widget.jwtToken != null) { if (widget.url != null && widget.jwtToken != null) {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: widget.url, jwtToken: widget.jwtToken, ssoType: SsoType.forTicket))); Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: widget.url, jwtToken: widget.jwtToken)));
} }
}).insideContainer, }).insideContainer,
], ],

@ -5,7 +5,6 @@ import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -22,7 +21,6 @@ import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/sso_webview_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
@ -109,13 +107,13 @@ class _WorkListScreenState extends State<WorkListScreen> {
), ),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, value: 0,
name: 'ENSAT', name: 'COC',
fullName: LocaleKeys.itemCreation.tr(), fullName: LocaleKeys.itemCreation.tr(),
active: false, active: false,
color: [const Color(0xff787299), Color(0xff1AB170)], color: [Color(0xff787299), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg", icon: "assets/images/miss_swipe.svg",
key: 'COC', key: 'COC',
disable: false, disable: true,
), ),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, value: 0,
@ -137,6 +135,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
key: 'HMG_FA_D', key: 'HMG_FA_D',
disable: false, disable: false,
), ),
]; ];
int? workListItemIndex; int? workListItemIndex;
@ -232,12 +231,6 @@ class _WorkListScreenState extends State<WorkListScreen> {
if ((itgFormsModel?.requestType?.length ?? 0) > 0) { if ((itgFormsModel?.requestType?.length ?? 0) > 0) {
itgRequestTypeIndex = 0; itgRequestTypeIndex = 0;
} }
} else if (workListItemTypes[workListItemIndex!].key == "COC") {
String? enSAToken = await DashboardProviderModel().getENSATItgToken();
Utils.hideLoading(context);
dynamic url = "${ApiConsts.enSATLiveURL}?empId=${AppState().getUserName}&token=$enSAToken";
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: url, jwtToken: enSAToken, ssoType: SsoType.forEnsat)));
} else { } else {
itgRequestTypeIndex = null; itgRequestTypeIndex = null;
List<WorkListResponseModel>? _list = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex!].key, pNotificationType.toString()); List<WorkListResponseModel>? _list = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex!].key, pNotificationType.toString());

@ -19,7 +19,13 @@ class GetAttendanceTrackingShimmer extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
boxShadow: [BoxShadow(color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3))], boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
), ),
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
@ -40,8 +46,15 @@ class GetAttendanceTrackingShimmer extends StatelessWidget {
LocaleKeys.timeLeftToday.tr().toText10(color: Colors.white).toShimmer(), LocaleKeys.timeLeftToday.tr().toText10(color: Colors.white).toShimmer(),
9.height, 9.height,
const ClipRRect( const ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(20)), borderRadius: BorderRadius.all(
child: LinearProgressIndicator(value: 0.7, minHeight: 8, valueColor: const AlwaysStoppedAnimation<Color>(Colors.white), backgroundColor: const Color(0xff196D73)), Radius.circular(20),
),
child: LinearProgressIndicator(
value: 0.7,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
).toShimmer(), ).toShimmer(),
], ],
).paddingOnly(top: 12, right: 15, left: 12), ).paddingOnly(top: 12, right: 15, left: 12),
@ -52,7 +65,9 @@ class GetAttendanceTrackingShimmer extends StatelessWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [LocaleKeys.checkIn.tr().toText12(color: Colors.white).toShimmer()], children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white).toShimmer(),
],
).paddingOnly(left: 12), ).paddingOnly(left: 12),
), ),
Container( Container(
@ -81,7 +96,13 @@ class MenuShimmer extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
boxShadow: [BoxShadow(color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3))], boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
), ),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -90,11 +111,14 @@ class MenuShimmer extends StatelessWidget {
LocaleKeys.workList.tr().toText12(color: Colors.white).toShimmer(), LocaleKeys.workList.tr().toText12(color: Colors.white).toShimmer(),
Row( Row(
children: [ children: [
Expanded(flex: 3, child: 123.toString().toText10(color: Colors.white, isBold: true).toShimmer()), Expanded(
flex: 3,
child: 123.toString().toText10(color: Colors.white, isBold: true).toShimmer(),
),
12.width, 12.width,
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white).toShimmer(), SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white).toShimmer()
], ],
), )
], ],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
); );
@ -113,7 +137,11 @@ class ServicesHeaderShimmer extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [LocaleKeys.otherCharges.tr().toText10().toShimmer(), 6.height, LocaleKeys.services.tr().toText12(isBold: true).toShimmer()], children: [
LocaleKeys.otherCharges.tr().toText10().toShimmer(),
6.height,
LocaleKeys.services.tr().toText12(isBold: true).toShimmer(),
],
), ),
), ),
LocaleKeys.viewAllServices.tr().toText12(isUnderLine: true).toShimmer(), LocaleKeys.viewAllServices.tr().toText12(isUnderLine: true).toShimmer(),
@ -131,7 +159,13 @@ class ServicesMenuShimmer extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
boxShadow: [BoxShadow(color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3))], boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
), ),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -147,13 +181,15 @@ class ServicesMenuShimmer extends StatelessWidget {
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Expanded(child: LocaleKeys.attendance.tr().toText11(isBold: false).toShimmer()), Expanded(
child: LocaleKeys.attendance.tr().toText11(isBold: false).toShimmer(),
),
6.width, 6.width,
SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4).toShimmer(), SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4).toShimmer()
], ],
), ),
], ],
), )
], ],
).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12),
); );
@ -166,35 +202,69 @@ class GreetingCardShimmer extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: 140, height: 100,
decoration: BoxDecoration(color: const Color(0xFFFAF4E7), border: Border.all(width: 2, color: const Color(0xFFE7E7E7)), borderRadius: BorderRadius.circular(20)), decoration: BoxDecoration(
color: const Color(0xFFFAF4E7),
border: Border.all(width: 2, color: const Color(0xFFE7E7E7)),
borderRadius: BorderRadius.circular(20),
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(width: 10), Container(
Container(width: 65, height: 100, decoration: BoxDecoration(color: Colors.grey[300], borderRadius: BorderRadius.circular(10))).toShimmer().paddingOnly(top: 10), width: 65,
height: 81,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(10),
),
).toShimmer(),
const SizedBox(width: 10), const SizedBox(width: 10),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container(width: 150, height: 16, decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(4))).toShimmer(), Container(
width: 150,
height: 16,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
const SizedBox(height: 8), const SizedBox(height: 8),
Container(width: 120, height: 16, decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(4))).toShimmer(), Container(
width: 120,
height: 16,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
], ],
).expanded, ).expanded,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [Container(width: 60, height: 12, decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(4))).toShimmer()], children: [
Container(
width: 60,
height: 12,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
],
), ),
], ],
).paddingOnly(left: 8, right: 8, top: 6, bottom: 12), ).paddingOnly(left: 8, right: 8, top: 6, bottom: 12),
).paddingOnly(top: 14, bottom: 14); ).paddingOnly(left: 21, right: 21, top: 14, bottom: 14);
} }
} }
class MarathonBannerShimmer extends StatelessWidget { class MarathonBannerShimmer extends StatelessWidget {
const MarathonBannerShimmer({Key? key}) : super(key: key); const MarathonBannerShimmer({Key? key}) : super(key: key);
@ -204,7 +274,13 @@ class MarathonBannerShimmer extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
boxShadow: [BoxShadow(color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3))], boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
), ),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -220,13 +296,15 @@ class MarathonBannerShimmer extends StatelessWidget {
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Expanded(child: LocaleKeys.attendance.tr().toText11(isBold: false).toShimmer()), Expanded(
child: LocaleKeys.attendance.tr().toText11(isBold: false).toShimmer(),
),
6.width, 6.width,
SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4).toShimmer(), SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4).toShimmer()
], ],
), ),
], ],
), )
], ],
).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12),
); );
@ -242,43 +320,66 @@ class ChatHomeShimmer extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0), padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0),
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: Shimmer.fromColors( child: Shimmer.fromColors(
baseColor: Colors.white, baseColor: Colors.white,
highlightColor: Colors.grey.shade100, highlightColor: Colors.grey.shade100,
child: ListView.builder( child: ListView.builder(
itemBuilder: itemBuilder: (_, __) => Padding(
(_, __) => Padding( padding: const EdgeInsets.only(bottom: 8.0),
padding: const EdgeInsets.only(bottom: 8.0), child: Row(
child: Row( crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
children: <Widget>[ if (!isDetailedScreen)
if (!isDetailedScreen) Container(width: 48.0, height: 48.0, decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(40)))), Container(
if (!isDetailedScreen) const Padding(padding: EdgeInsets.symmetric(horizontal: 8.0)), width: 48.0,
Column( height: 48.0,
crossAxisAlignment: CrossAxisAlignment.start, decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(40))),
children: <Widget>[ ),
Container(width: double.infinity, height: 20.0, color: Colors.white), if (!isDetailedScreen)
const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)), const Padding(
Container(width: double.infinity, height: 15.0, color: Colors.white), padding: EdgeInsets.symmetric(horizontal: 8.0),
const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)), ),
Container(width: 40.0, height: 10.0, color: Colors.white), Column(
], crossAxisAlignment: CrossAxisAlignment.start,
).expanded, children: <Widget>[
], Container(
), width: double.infinity,
height: 20.0,
color: Colors.white,
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 2.0),
),
Container(
width: double.infinity,
height: 15.0,
color: Colors.white,
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 2.0),
),
Container(
width: 40.0,
height: 10.0,
color: Colors.white,
),
],
).expanded
],
), ),
itemCount: 6, ),
itemCount: 6,
),
), ),
), ),
), ],
], ));
),
);
} }
} }

@ -1,17 +1,13 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
// Enum for SSO types
enum SsoType { forTicket, forEnsat, forCourses }
class SsoLoginWebView extends StatefulWidget { class SsoLoginWebView extends StatefulWidget {
final String? url; final String? url;
final String? jwtToken; final String? jwtToken;
final SsoType ssoType;
const SsoLoginWebView({Key? key, required this.url, this.jwtToken, required this.ssoType}) : super(key: key); SsoLoginWebView({this.url, this.jwtToken});
@override @override
State<SsoLoginWebView> createState() => _SsoLoginWebViewState(); State<SsoLoginWebView> createState() => _SsoLoginWebViewState();
@ -20,26 +16,13 @@ class SsoLoginWebView extends StatefulWidget {
class _SsoLoginWebViewState extends State<SsoLoginWebView> { class _SsoLoginWebViewState extends State<SsoLoginWebView> {
late final WebViewController _controller; late final WebViewController _controller;
String? url; String? url;
bool _isTicketLoadingVisible = false;
void _showTicketLoading() {
if (widget.ssoType != SsoType.forTicket || _isTicketLoadingVisible || !mounted) return;
_isTicketLoadingVisible = true;
Utils.showLoading(context);
}
void _hideTicketLoading() {
if (widget.ssoType != SsoType.forTicket || !_isTicketLoadingVisible || !mounted) return;
_isTicketLoadingVisible = false;
Utils.hideLoading(context);
}
@override @override
void initState() { void initState() {
super.initState(); // TODO: implement initState
url = widget.url ?? ""; url = widget.url ?? "https://Paxes-release.techmaster.in/SSO/HMG";
super.initState();
_controller = _controller =
WebViewController() WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted) ..setJavaScriptMode(JavaScriptMode.unrestricted)
@ -47,72 +30,35 @@ class _SsoLoginWebViewState extends State<SsoLoginWebView> {
NavigationDelegate( NavigationDelegate(
onProgress: (int progress) { onProgress: (int progress) {
print("WebView is loading (progress: $progress%)"); print("WebView is loading (progress: $progress%)");
if (widget.ssoType == SsoType.forEnsat && progress == 100) {
Utils.hideLoading(context);
}
}, },
onPageStarted: (String url) { onPageStarted: (String url) {
print("Page started loading: $url"); print("Page started loading: $url");
_showTicketLoading();
}, },
onPageFinished: (String url) { onPageFinished: (String url) {
print("Page finished loading: $url"); print("Page finished loading: $url");
_hideTicketLoading();
}, },
onHttpError: (HttpResponseError error) { onHttpError: (HttpResponseError error) {
print("HTTP error: ${error.toString()} for URL: ${error.response!.statusCode}"); print("HTTP error: ${error.toString()} for URL: ${error.response!.statusCode}");
_hideTicketLoading();
}, },
onWebResourceError: (WebResourceError error) { onWebResourceError: (WebResourceError error) {
print("Web resource error: ${error.description} for URL: ${error.errorType}"); print("Web resource error: ${error.description} for URL: ${error.errorType}");
_hideTicketLoading();
}, },
), ),
); )
..loadHtmlString('''
// Load content based on SSO type
if (widget.ssoType == SsoType.forEnsat) {
// For ENSAT, just load the URL directly (GET request)
_controller.loadRequest(Uri.parse(url!));
} else {
if (widget.ssoType == SsoType.forTicket) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_showTicketLoading();
});
}
// For Paxes (Ticket, Courses), use HTML form POST
_controller.loadHtmlString(_buildHtmlContent());
}
}
// Build HTML content for the SSO form
String _buildHtmlContent() {
String formAction;
if (widget.ssoType == SsoType.forTicket) {
formAction = "https://www.paxes.com/sso/hmg";
} else {
formAction = url ?? "";
}
return '''
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<body onload="document.forms[0].submit()"> <body onload="document.forms[0].submit()">
<form method="POST" action="$formAction"> <form method="POST" action="$url">
<input type="hidden" name="JWTToken" value="${widget.jwtToken}" /> <input type="hidden" name="JWTToken" value="${widget.jwtToken}" />
</form> </form>
<h1></h1> <h1>Redirecting...</h1>
</body> </body>
</html>'''; </html>''');
}
@override
void dispose() {
_hideTicketLoading();
super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold(appBar: AppBarWidget(context, title: "MoheM", showWorkListSettingButton: false), body: SafeArea(child: WebViewWidget(controller: _controller))); return Scaffold(appBar: null, body:SafeArea(child: WebViewWidget(controller: _controller)));
} }
} }

@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 3.7.2+300082 version: 3.7.1+300081
#version: 3.9.3+1 #version: 3.9.3+1
environment: environment:
@ -112,7 +112,6 @@ dependencies:
just_audio: ^0.9.30 just_audio: ^0.9.30
# safe_device: ^1.1.2 # safe_device: ^1.1.2
flutter_layout_grid: ^2.0.1 flutter_layout_grid: ^2.0.1
jiffy: ^6.4.4
#Huawei Dependencies #Huawei Dependencies
# huawei_hmsavailability: ^6.6.0+300 # huawei_hmsavailability: ^6.6.0+300

Loading…
Cancel
Save