Merge branch 'wala_plus_with_dialog_removal' of http://34.17.182.140/Haroon6138/mohemm-flutter-app into wala_plus_with_dialog_removal

* 'wala_plus_with_dialog_removal' of http://34.17.182.140/Haroon6138/mohemm-flutter-app:
  Fav Tab Changes and SearchBar Fix
  icons
wala_plus_with_dialog_removal
Sultan khan 2 weeks ago
commit ae1bd7f0c5

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="arrow-right">
<path id="Vector" d="M3.1245 7.5H11.8755M7.5 11.8755L11.8755 7.5L7.5 3.1245" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 337 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="arrow-up-right">
<path id="Vector" d="M14.166 14.166V5.834H5.834M14.166 5.834L5.834 14.166" stroke-width="1.7" stroke-linecap="round" stroke="#143F36"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 338 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="chevron-down">
<path id="Vector" d="M3 4.5L6 7.5L9 4.5" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 302 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="chevron-left">
<path id="Vector" d="M12.5 15L7.5 10L12.5 5" stroke-width="1.7" stroke-linecap="round" stroke="#202F32"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 306 B

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="compass" clip-path="url(#clip0_0_24)">
<path id="Vector" d="M20.1674 11C20.1674 16.063 16.063 20.1674 11 20.1674C5.93698 20.1674 1.8326 16.063 1.8326 11C1.8326 5.93698 5.93698 1.8326 11 1.8326C16.063 1.8326 20.1674 5.93698 20.1674 11ZM14.8868 7.11281L13.233 12.0733C13.143 12.3433 12.9913 12.5887 12.79 12.79C12.5887 12.9913 12.3433 13.143 12.0733 13.233L7.11281 14.8868L8.76661 9.92628C8.85661 9.65623 9.00827 9.41084 9.20955 9.20955C9.41084 9.00827 9.65623 8.85661 9.92628 8.76661L14.8868 7.11281Z" stroke-width="1.7" stroke-linecap="round" stroke="#147D6B"/>
</g>
<defs>
<clipPath id="clip0_0_24">
<rect width="22" height="22" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 845 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="heart">
<path id="Vector" d="M1.2495 5.93763C1.24951 5.24212 1.46051 4.56298 1.85463 3.9899C2.24875 3.41682 2.80744 2.97676 3.45693 2.72785C4.10641 2.47893 4.81612 2.43287 5.49233 2.59575C6.16855 2.75863 6.77944 3.12278 7.24434 3.64011C7.27708 3.67512 7.31667 3.70303 7.36064 3.72211C7.40462 3.74119 7.45204 3.75104 7.49998 3.75104C7.54792 3.75104 7.59534 3.74119 7.63932 3.72211C7.68329 3.70303 7.72288 3.67512 7.75563 3.64011C8.21906 3.11941 8.8301 2.7522 9.50741 2.58735C10.1847 2.42249 10.8962 2.46781 11.5471 2.71728C12.198 2.96674 12.7575 3.40851 13.1511 3.9838C13.5447 4.55909 13.7538 5.2406 13.7505 5.93763C13.7505 7.36889 12.8129 8.43765 11.8753 9.37516L8.44255 12.6958C8.32609 12.8296 8.18249 12.937 8.0213 13.011C7.86011 13.085 7.68502 13.1239 7.50766 13.125C7.3303 13.1261 7.15473 13.0895 6.99262 13.0175C6.83051 12.9456 6.68556 12.84 6.56741 12.7077L3.12464 9.37516C2.18707 8.43765 1.2495 7.37514 1.2495 5.93763Z" stroke-width="1.7" stroke-linecap="round" stroke="#202F32"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="heart">
<path id="Vector" d="M1.8326 8.70852C1.83262 7.68845 2.14208 6.69237 2.72012 5.85185C3.29816 5.01134 4.11758 4.36592 5.07016 4.00084C6.02273 3.63577 7.06365 3.56821 8.05542 3.8071C9.0472 4.04598 9.94318 4.58007 10.625 5.33882C10.6731 5.39017 10.7311 5.43111 10.7956 5.45909C10.8601 5.48708 10.9297 5.50152 11 5.50152C11.0703 5.50152 11.1398 5.48708 11.2043 5.45909C11.2688 5.43111 11.3269 5.39017 11.3749 5.33882C12.0546 4.57514 12.9508 4.03656 13.9442 3.79478C14.9376 3.55299 15.9811 3.61946 16.9357 3.98534C17.8904 4.35122 18.711 4.99915 19.2883 5.8429C19.8656 6.68666 20.1722 7.68621 20.1673 8.70852C20.1673 10.8077 18.7922 12.3752 17.4171 13.7502L12.3824 18.6205C12.2116 18.8167 12.001 18.9743 11.7646 19.0828C11.5282 19.1913 11.2714 19.2483 11.0112 19.25C10.7511 19.2516 10.4936 19.1979 10.2558 19.0924C10.0181 18.9869 9.80549 18.8319 9.6322 18.638L4.58281 13.7502C3.20771 12.3752 1.8326 10.8169 1.8326 8.70852Z" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="map-pin">
<path id="Vector" d="M9.9996 4.99997C9.9996 7.4967 7.23038 10.0969 6.30047 10.9C6.21384 10.9652 6.10839 11.0004 6 11.0004C5.89161 11.0004 5.78616 10.9652 5.69953 10.9C4.76962 10.0969 2.0004 7.4967 2.0004 4.99997C2.0004 3.93901 2.42179 2.9215 3.17186 2.17128C3.92193 1.42107 4.93924 0.9996 6 0.9996C7.06076 0.9996 8.07807 1.42107 8.82814 2.17128C9.57822 2.9215 9.9996 3.93901 9.9996 4.99997ZM7.49985 4.99997C7.49985 5.82847 6.82834 6.50011 6 6.50011C5.17166 6.50011 4.50015 5.82847 4.50015 4.99997C4.50015 4.17147 5.17166 3.49983 6 3.49983C6.82834 3.49983 7.49985 4.17147 7.49985 4.99997Z" stroke-linecap="round" stroke="#147D6B"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 826 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="search">
<path id="Vector" d="M15.7501 15.7501L12.4951 12.4951M14.25 8.25C14.25 11.5637 11.5637 14.25 8.25 14.25C4.93629 14.25 2.25 11.5637 2.25 8.25C2.25 4.93629 4.93629 2.25 8.25 2.25C11.5637 2.25 14.25 4.93629 14.25 8.25Z" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 472 B

@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" overflow="visible" style="display: block;" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="user-round">
<path id="Vector" d="M11 11.9167C13.5311 11.9167 15.5829 9.86464 15.5829 7.33333C15.5829 4.80203 13.5311 2.75 11 2.75C8.46895 2.75 6.41712 4.80203 6.41712 7.33333C6.41712 9.86464 8.46895 11.9167 11 11.9167ZM11 11.9167C12.9447 11.9167 14.8098 12.6893 16.1849 14.0646C17.5601 15.4398 18.3326 17.3051 18.3326 19.25M11 11.9167C9.05527 11.9167 7.1902 12.6893 5.81507 14.0646C4.43994 15.4398 3.6674 17.3051 3.6674 19.25" stroke-width="1.7" stroke-linecap="round" stroke="#78817F"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 674 B

@ -831,6 +831,7 @@
"locationServicesRequiredForNearestOffers": "فعّل خدمات الموقع لعرض العروض القريبة منك", "locationServicesRequiredForNearestOffers": "فعّل خدمات الموقع لعرض العروض القريبة منك",
"locationPermissionRequiredForNearestOffers": "اسمح للتطبيق بالوصول إلى موقعك لعرض العروض القريبة منك", "locationPermissionRequiredForNearestOffers": "اسمح للتطبيق بالوصول إلى موقعك لعرض العروض القريبة منك",
"mazayaDeals": "عروض مزايا", "mazayaDeals": "عروض مزايا",
"helloName": "مرحباً، {}",
"findABrandOrSomething": "ابحث عن علامة تجارية أو شيء بسيط", "findABrandOrSomething": "ابحث عن علامة تجارية أو شيء بسيط",
"exploreYourBenefits": "استكشف مزاياك", "exploreYourBenefits": "استكشف مزاياك",
"theMazayaEdit": "اختيارات مزايا", "theMazayaEdit": "اختيارات مزايا",

@ -832,6 +832,7 @@
"locationServicesRequiredForNearestOffers": "You need to enable location services to show nearest offers", "locationServicesRequiredForNearestOffers": "You need to enable location services to show nearest offers",
"locationPermissionRequiredForNearestOffers": "You need to give location permission to show nearest offers", "locationPermissionRequiredForNearestOffers": "You need to give location permission to show nearest offers",
"mazayaDeals": "Mazaya Deals", "mazayaDeals": "Mazaya Deals",
"helloName": "Hello, {}",
"findABrandOrSomething": "Find a brand or a little something", "findABrandOrSomething": "Find a brand or a little something",
"exploreYourBenefits": "Explore your benefits", "exploreYourBenefits": "Explore your benefits",
"theMazayaEdit": "The Mazaya Edit", "theMazayaEdit": "The Mazaya Edit",

@ -15,7 +15,8 @@ import 'package:mohem_flutter_app/models/offers_and_discounts/wala_plus_retailer
import 'package:mohem_flutter_app/widgets/location/Location.dart' as location; import 'package:mohem_flutter_app/widgets/location/Location.dart' as location;
class OffersAndDiscountsApiClient { class OffersAndDiscountsApiClient {
static final OffersAndDiscountsApiClient _instance = OffersAndDiscountsApiClient._internal(); static final OffersAndDiscountsApiClient _instance =
OffersAndDiscountsApiClient._internal();
static List<WalaPlusCategoryModel>? cachedCategories; static List<WalaPlusCategoryModel>? cachedCategories;
OffersAndDiscountsApiClient._internal(); OffersAndDiscountsApiClient._internal();
@ -26,7 +27,12 @@ class OffersAndDiscountsApiClient {
List<GetCategoriesList> getSaleCategoriesList = []; List<GetCategoriesList> getSaleCategoriesList = [];
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetCategories"; String url = "${ApiConsts.cocRest}Mohemm_ITG_GetCategories";
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgPageSize": 100, "ItgPageNo": 1, "ItgIsActive": true}; Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER,
"ItgPageSize": 100,
"ItgPageNo": 1,
"ItgIsActive": true,
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
@ -53,11 +59,19 @@ class OffersAndDiscountsApiClient {
); );
} }
Future<List<OffersListModel>> getOffersList(int categoryID, int pageSize) async { Future<List<OffersListModel>> getOffersList(
int categoryID,
int pageSize,
) async {
List<OffersListModel> getSaleCategoriesList = []; List<OffersListModel> getSaleCategoriesList = [];
String url = "${ApiConsts.cocRest}GetOfferDiscountsConfigData"; String url = "${ApiConsts.cocRest}GetOfferDiscountsConfigData";
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgPageSize": pageSize, "ItgPageNo": 1, "ItgCategoryID": categoryID}; Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER,
"ItgPageSize": pageSize,
"ItgPageNo": 1,
"ItgCategoryID": categoryID,
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
@ -81,7 +95,10 @@ class OffersAndDiscountsApiClient {
String _resolveUserName() { String _resolveUserName() {
String? pUserName = AppState().getUserName; String? pUserName = AppState().getUserName;
if (pUserName == null || pUserName.isEmpty) { if (pUserName == null || pUserName.isEmpty) {
pUserName = AppState().postParamsObject?.userName ?? AppState().postParamsObject?.pUserName ?? AppState().memberInformationList?.eMPLOYEENUMBER; pUserName =
AppState().postParamsObject?.userName ??
AppState().postParamsObject?.pUserName ??
AppState().memberInformationList?.eMPLOYEENUMBER;
} }
return pUserName ?? ""; return pUserName ?? "";
} }
@ -97,12 +114,15 @@ class OffersAndDiscountsApiClient {
if (!enabledCompleter.isCompleted) enabledCompleter.complete(isEnabled); if (!enabledCompleter.isCompleted) enabledCompleter.complete(isEnabled);
}); });
bool isEnabled = await enabledCompleter.future; bool isEnabled = await enabledCompleter.future;
debugPrint("_getCurrentPositionSilently: location service isEnabled=$isEnabled"); debugPrint(
"_getCurrentPositionSilently: location service isEnabled=$isEnabled",
);
if (!isEnabled) return null; if (!isEnabled) return null;
Completer<bool> permissionCompleter = Completer<bool>(); Completer<bool> permissionCompleter = Completer<bool>();
location.Location.havePermission((bool hasPermission) { location.Location.havePermission((bool hasPermission) {
if (!permissionCompleter.isCompleted) permissionCompleter.complete(hasPermission); if (!permissionCompleter.isCompleted)
permissionCompleter.complete(hasPermission);
}); });
bool hasPermission = await permissionCompleter.future; bool hasPermission = await permissionCompleter.future;
debugPrint("_getCurrentPositionSilently: havePermission=$hasPermission"); debugPrint("_getCurrentPositionSilently: havePermission=$hasPermission");
@ -111,11 +131,16 @@ class OffersAndDiscountsApiClient {
Completer<Position?> positionCompleter = Completer<Position?>(); Completer<Position?> positionCompleter = Completer<Position?>();
location.Location.getCurrentLocation( location.Location.getCurrentLocation(
(Position position, bool isMocked) { (Position position, bool isMocked) {
debugPrint("_getCurrentPositionSilently: got position lat=${position.latitude}, lng=${position.longitude}, isMocked=$isMocked"); debugPrint(
if (!positionCompleter.isCompleted) positionCompleter.complete(position); "_getCurrentPositionSilently: got position lat=${position.latitude}, lng=${position.longitude}, isMocked=$isMocked",
);
if (!positionCompleter.isCompleted)
positionCompleter.complete(position);
}, },
() { () {
debugPrint("_getCurrentPositionSilently: getCurrentLocation error callback fired"); debugPrint(
"_getCurrentPositionSilently: getCurrentLocation error callback fired",
);
if (!positionCompleter.isCompleted) positionCompleter.complete(null); if (!positionCompleter.isCompleted) positionCompleter.complete(null);
}, },
context, context,
@ -134,6 +159,19 @@ class OffersAndDiscountsApiClient {
if (overrideMobile != null && overrideMobile.trim().isNotEmpty) { if (overrideMobile != null && overrideMobile.trim().isNotEmpty) {
return overrideMobile.trim(); return overrideMobile.trim();
} }
// postParamsObject.mobileNumber/memberInformationList/memberLoginList are only ever set by
// the employee login flow and never cleared on logout - for a dependent session, the only
// legitimate source is the sponsor's mobile captured at dependent login (walaplusDepInfoModel),
// same reasoning as _resolveUserReference above.
if (ApiConsts.isDependetLogin) {
String? depMobile = AppState().walaplusDepInfoModel?.pEmpMobileNumber;
if (depMobile != null && depMobile.trim().isNotEmpty) {
return depMobile.trim();
}
return "";
}
String? mobile = AppState().postParamsObject?.mobileNumber; String? mobile = AppState().postParamsObject?.mobileNumber;
if (mobile != null && mobile.trim().isNotEmpty) { if (mobile != null && mobile.trim().isNotEmpty) {
return mobile.trim(); return mobile.trim();
@ -161,7 +199,9 @@ class OffersAndDiscountsApiClient {
Map<String, dynamic> base = {}; Map<String, dynamic> base = {};
base.addAll(AppState().postParamsJson); base.addAll(AppState().postParamsJson);
if (ApiConsts.isDependetLogin) { if (ApiConsts.isDependetLogin) {
String? token = AppState().postParamsObject?.tokenID ?? AppState().authenticationTokenID; String? token =
AppState().postParamsObject?.tokenID ??
AppState().authenticationTokenID;
if (token != null && token.isNotEmpty) { if (token != null && token.isNotEmpty) {
base["TokenID"] = token; base["TokenID"] = token;
} }
@ -185,7 +225,11 @@ class OffersAndDiscountsApiClient {
// Pass parentId to fetch the subcategories under a given main category (WP_ParentId) - // Pass parentId to fetch the subcategories under a given main category (WP_ParentId) -
// omit it (the default) to fetch the top-level main categories, same as before. // omit it (the default) to fetch the top-level main categories, same as before.
Future<List<WalaPlusCategoryModel>> getWalaPlusCategories({BuildContext? context, String? mobileNumber, String? parentId}) async { Future<List<WalaPlusCategoryModel>> getWalaPlusCategories({
BuildContext? context,
String? mobileNumber,
String? parentId,
}) async {
String url = ApiConsts.walaPlusCategories; String url = ApiConsts.walaPlusCategories;
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber); String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber);
@ -209,7 +253,11 @@ class OffersAndDiscountsApiClient {
(response) { (response) {
List<WalaPlusCategoryModel> categories = []; List<WalaPlusCategoryModel> categories = [];
if (response != null) { if (response != null) {
dynamic cats = response['WalaPlus_Categories'] ?? response['walaPlus_Categories'] ?? response['WalaPlusCategories'] ?? response['result']; dynamic cats =
response['WalaPlus_Categories'] ??
response['walaPlus_Categories'] ??
response['WalaPlusCategories'] ??
response['result'];
if (cats is String) { if (cats is String) {
try { try {
cats = json.decode(cats); cats = json.decode(cats);
@ -222,7 +270,9 @@ class OffersAndDiscountsApiClient {
if (v is Map<String, dynamic>) { if (v is Map<String, dynamic>) {
categories.add(WalaPlusCategoryModel.fromJson(v)); categories.add(WalaPlusCategoryModel.fromJson(v));
} else if (v is Map) { } else if (v is Map) {
categories.add(WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(v))); categories.add(
WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(v)),
);
} }
}); });
} }
@ -279,7 +329,10 @@ class OffersAndDiscountsApiClient {
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber); String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber);
String pDepNationalId = _resolveDepNationalId(); String pDepNationalId = _resolveDepNationalId();
String effectiveCatId = (categoryId == "all" || categoryId == "0" || categoryId == null) ? "" : categoryId; String effectiveCatId =
(categoryId == "all" || categoryId == "0" || categoryId == null)
? ""
: categoryId;
Map<String, dynamic> postParams = _getBaseWalaPlusParams(); Map<String, dynamic> postParams = _getBaseWalaPlusParams();
postParams["UserName"] = pUserName; postParams["UserName"] = pUserName;
@ -315,7 +368,8 @@ class OffersAndDiscountsApiClient {
try { try {
Position? position = await _getCurrentPositionSilently(context); Position? position = await _getCurrentPositionSilently(context);
if (position != null) { if (position != null) {
postParams["WP_Geo_Location"] = "${position.latitude},${position.longitude}"; postParams["WP_Geo_Location"] =
"${position.latitude},${position.longitude}";
} }
} catch (e) { } catch (e) {
debugPrint("getWalaPlusRetailers: unable to get current location: $e"); debugPrint("getWalaPlusRetailers: unable to get current location: $e");
@ -333,7 +387,12 @@ class OffersAndDiscountsApiClient {
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(response) { (response) {
if (response != null) { if (response != null) {
dynamic val = response['WalaPlus_Retailers'] ?? response['walaPlus_Retailers'] ?? response['WalaPlusRetailers'] ?? response['WP_Retailers'] ?? response['result']; dynamic val =
response['WalaPlus_Retailers'] ??
response['walaPlus_Retailers'] ??
response['WalaPlusRetailers'] ??
response['WP_Retailers'] ??
response['result'];
if (val is String) { if (val is String) {
try { try {
val = json.decode(val); val = json.decode(val);
@ -344,17 +403,26 @@ class OffersAndDiscountsApiClient {
if (val is Map<String, dynamic>) { if (val is Map<String, dynamic>) {
return WalaPlusRetailersResponse.fromJson(val); return WalaPlusRetailersResponse.fromJson(val);
} else if (val is Map) { } else if (val is Map) {
return WalaPlusRetailersResponse.fromJson(Map<String, dynamic>.from(val)); return WalaPlusRetailersResponse.fromJson(
Map<String, dynamic>.from(val),
);
} else if (val is List) { } else if (val is List) {
List<WalaPlusRetailerModel> retailers = []; List<WalaPlusRetailerModel> retailers = [];
for (var v in val) { for (var v in val) {
if (v is Map<String, dynamic>) { if (v is Map<String, dynamic>) {
retailers.add(WalaPlusRetailerModel.fromJson(v)); retailers.add(WalaPlusRetailerModel.fromJson(v));
} else if (v is Map) { } else if (v is Map) {
retailers.add(WalaPlusRetailerModel.fromJson(Map<String, dynamic>.from(v))); retailers.add(
WalaPlusRetailerModel.fromJson(Map<String, dynamic>.from(v)),
);
} }
} }
return WalaPlusRetailersResponse(retailers: retailers, page: 1, pagesCount: 1, perPage: retailers.length); return WalaPlusRetailersResponse(
retailers: retailers,
page: 1,
pagesCount: 1,
perPage: retailers.length,
);
} }
} }
return null; return null;
@ -364,12 +432,19 @@ class OffersAndDiscountsApiClient {
); );
} }
Future<WalaPlusRetailerModel?> getWalaPlusRetailerById({required String retailerId, BuildContext? context, String? mobileNumber, String? userReference}) async { Future<WalaPlusRetailerModel?> getWalaPlusRetailerById({
required String retailerId,
BuildContext? context,
String? mobileNumber,
String? userReference,
}) async {
String url = ApiConsts.walaPlusRetailersByID; String url = ApiConsts.walaPlusRetailersByID;
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber); String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber);
String pDepNationalId = _resolveDepNationalId(); String pDepNationalId = _resolveDepNationalId();
String pUserReference = _resolveUserReference(overrideUserReference: userReference); String pUserReference = _resolveUserReference(
overrideUserReference: userReference,
);
Map<String, dynamic> postParams = _getBaseWalaPlusParams(); Map<String, dynamic> postParams = _getBaseWalaPlusParams();
postParams["WP_RetailerID"] = retailerId; postParams["WP_RetailerID"] = retailerId;
@ -390,10 +465,13 @@ class OffersAndDiscountsApiClient {
log("context position: $position"); log("context position: $position");
if (position != null) { if (position != null) {
postParams["WP_Geo_Location"] = "${position.latitude},${position.longitude}"; postParams["WP_Geo_Location"] =
"${position.latitude},${position.longitude}";
} }
} catch (e) { } catch (e) {
debugPrint("getWalaPlusRetailerById: unable to get current location: $e"); debugPrint(
"getWalaPlusRetailerById: unable to get current location: $e",
);
} }
} }
@ -406,18 +484,29 @@ class OffersAndDiscountsApiClient {
postParams["WP_User_Reference"] = null; postParams["WP_User_Reference"] = null;
} }
debugPrint("getWalaPlusRetailerById: calling $url with params: $postParams"); debugPrint(
"getWalaPlusRetailerById: calling $url with params: $postParams",
);
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(response) { (response) {
if (response != null) { if (response != null) {
debugPrint("getWalaPlusRetailerById response keys: ${response is Map ? response.keys.toList() : 'non-map'}"); debugPrint(
dynamic val = response['WalaPlus_RetailersByID'] ?? response['walaPlus_RetailersByID'] ?? response['WalaPlusRetailersByID'] ?? response['WP_RetailersByID'] ?? response['result']; "getWalaPlusRetailerById response keys: ${response is Map ? response.keys.toList() : 'non-map'}",
);
dynamic val =
response['WalaPlus_RetailersByID'] ??
response['walaPlus_RetailersByID'] ??
response['WalaPlusRetailersByID'] ??
response['WP_RetailersByID'] ??
response['result'];
if (val is String) { if (val is String) {
try { try {
val = json.decode(val); val = json.decode(val);
} catch (e) { } catch (e) {
debugPrint("Error decoding WalaPlus_RetailersByID JSON string: $e"); debugPrint(
"Error decoding WalaPlus_RetailersByID JSON string: $e",
);
} }
} }
WalaPlusRetailerModel? model; WalaPlusRetailerModel? model;
@ -426,47 +515,106 @@ class OffersAndDiscountsApiClient {
if (item is Map<String, dynamic>) { if (item is Map<String, dynamic>) {
model = WalaPlusRetailerModel.fromJson(item); model = WalaPlusRetailerModel.fromJson(item);
} else if (item is Map) { } else if (item is Map) {
model = WalaPlusRetailerModel.fromJson(Map<String, dynamic>.from(item)); model = WalaPlusRetailerModel.fromJson(
Map<String, dynamic>.from(item),
);
} }
} else if (val is Map) { } else if (val is Map) {
Map<String, dynamic> map = (val is Map<String, dynamic>) ? val : Map<String, dynamic>.from(val); Map<String, dynamic> map =
(val is Map<String, dynamic>)
? val
: Map<String, dynamic>.from(val);
if (map.containsKey('retailer')) { if (map.containsKey('retailer')) {
var byIdResponse = WalaPlusRetailersByIDResponse.fromJson(map); var byIdResponse = WalaPlusRetailersByIDResponse.fromJson(map);
model = byIdResponse.primaryRetailer ?? WalaPlusRetailerModel.fromJson(map); model =
byIdResponse.primaryRetailer ??
WalaPlusRetailerModel.fromJson(map);
} else { } else {
model = WalaPlusRetailerModel.fromJson(map); model = WalaPlusRetailerModel.fromJson(map);
} }
if (model?.isFavorite == null) { if (model?.isFavorite == null) {
if (map.containsKey('isfavorite')) { if (map.containsKey('isfavorite')) {
model?.isFavorite = map['isfavorite'] == true || map['isfavorite'] == 1 || map['isfavorite'] == 'true' || map['isfavorite'] == '1'; model?.isFavorite =
map['isfavorite'] == true ||
map['isfavorite'] == 1 ||
map['isfavorite'] == 'true' ||
map['isfavorite'] == '1';
} else if (map.containsKey('is_favorite')) { } else if (map.containsKey('is_favorite')) {
model?.isFavorite = map['is_favorite'] == true || map['is_favorite'] == 1 || map['is_favorite'] == 'true' || map['is_favorite'] == '1'; model?.isFavorite =
map['is_favorite'] == true ||
map['is_favorite'] == 1 ||
map['is_favorite'] == 'true' ||
map['is_favorite'] == '1';
} }
} }
if ((model?.offers == null || model!.offers!.isEmpty) && (map.containsKey('offers') || map.containsKey('Offers'))) { if ((model?.offers == null || model!.offers!.isEmpty) &&
model?.offers = WalaPlusRetailerModel.parseOffersList(map['offers'] ?? map['Offers']); (map.containsKey('offers') || map.containsKey('Offers'))) {
model?.offers = WalaPlusRetailerModel.parseOffersList(
map['offers'] ?? map['Offers'],
);
} }
if ((model?.locations == null || model!.locations!.isEmpty) && if ((model?.locations == null || model!.locations!.isEmpty) &&
(map.containsKey('locations') || map.containsKey('Locations') || map.containsKey('location') || map.containsKey('Location'))) { (map.containsKey('locations') ||
model?.locations = WalaPlusRetailerModel.parseLocationsList(map['locations'] ?? map['Locations'] ?? map['location'] ?? map['Location']); map.containsKey('Locations') ||
map.containsKey('location') ||
map.containsKey('Location'))) {
model?.locations = WalaPlusRetailerModel.parseLocationsList(
map['locations'] ??
map['Locations'] ??
map['location'] ??
map['Location'],
);
} }
if ((model?.website == null || model!.website!.isEmpty || model!.website == "null")) { if ((model?.website == null ||
String? web = (map['website'] ?? map['merchant_website'] ?? map['website_url'] ?? map['url'] ?? map['merchant_url'])?.toString(); model!.website!.isEmpty ||
model!.website == "null")) {
String? web =
(map['website'] ??
map['merchant_website'] ??
map['website_url'] ??
map['url'] ??
map['merchant_url'])
?.toString();
if (web != null && web.trim().isNotEmpty && web != "null") { if (web != null && web.trim().isNotEmpty && web != "null") {
model?.website = web.trim(); model?.website = web.trim();
} }
} }
if ((model?.categories == null || model!.categories!.isEmpty) && (map.containsKey('categories') || map.containsKey('Categories') || map.containsKey('category') || map.containsKey('Category'))) { if ((model?.categories == null || model!.categories!.isEmpty) &&
dynamic catData = map['categories'] ?? map['Categories'] ?? map['category'] ?? map['Category']; (map.containsKey('categories') ||
map.containsKey('Categories') ||
map.containsKey('category') ||
map.containsKey('Category'))) {
dynamic catData =
map['categories'] ??
map['Categories'] ??
map['category'] ??
map['Category'];
if (catData is List) { if (catData is List) {
model?.categories = catData.map((c) => c is Map ? WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(c)) : WalaPlusCategoryModel(name: c.toString())).toList(); model?.categories =
catData
.map(
(c) =>
c is Map
? WalaPlusCategoryModel.fromJson(
Map<String, dynamic>.from(c),
)
: WalaPlusCategoryModel(name: c.toString()),
)
.toList();
} else if (catData is Map) { } else if (catData is Map) {
model?.categories = [WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(catData))]; model?.categories = [
WalaPlusCategoryModel.fromJson(
Map<String, dynamic>.from(catData),
),
];
} else if (catData is String && catData.trim().isNotEmpty) { } else if (catData is String && catData.trim().isNotEmpty) {
model?.categories = [WalaPlusCategoryModel(name: catData.trim())]; model?.categories = [
WalaPlusCategoryModel(name: catData.trim()),
];
} }
} }
} else if (response is Map<String, dynamic> && response.containsKey('name')) { } else if (response is Map<String, dynamic> &&
response.containsKey('name')) {
model = WalaPlusRetailerModel.fromJson(response); model = WalaPlusRetailerModel.fromJson(response);
} }
@ -474,36 +622,90 @@ class OffersAndDiscountsApiClient {
if (response is Map) { if (response is Map) {
if (model.isFavorite == null) { if (model.isFavorite == null) {
if (response.containsKey('isfavorite')) { if (response.containsKey('isfavorite')) {
model.isFavorite = response['isfavorite'] == true || response['isfavorite'] == 1 || response['isfavorite'] == 'true' || response['isfavorite'] == '1'; model.isFavorite =
response['isfavorite'] == true ||
response['isfavorite'] == 1 ||
response['isfavorite'] == 'true' ||
response['isfavorite'] == '1';
} else if (response.containsKey('is_favorite')) { } else if (response.containsKey('is_favorite')) {
model.isFavorite = response['is_favorite'] == true || response['is_favorite'] == 1 || response['is_favorite'] == 'true' || response['is_favorite'] == '1'; model.isFavorite =
} response['is_favorite'] == true ||
} response['is_favorite'] == 1 ||
if (model.website == null || model.website!.isEmpty || model.website == "null") { response['is_favorite'] == 'true' ||
String? web = (response['website'] ?? response['merchant_website'] ?? response['website_url'] ?? response['url'] ?? response['merchant_url'])?.toString(); response['is_favorite'] == '1';
}
}
if (model.website == null ||
model.website!.isEmpty ||
model.website == "null") {
String? web =
(response['website'] ??
response['merchant_website'] ??
response['website_url'] ??
response['url'] ??
response['merchant_url'])
?.toString();
if (web != null && web.trim().isNotEmpty && web != "null") { if (web != null && web.trim().isNotEmpty && web != "null") {
model.website = web.trim(); model.website = web.trim();
} }
} }
if ((model.offers == null || model.offers!.isEmpty) && (response.containsKey('offers') || response.containsKey('Offers'))) { if ((model.offers == null || model.offers!.isEmpty) &&
model.offers = WalaPlusRetailerModel.parseOffersList(response['offers'] ?? response['Offers']); (response.containsKey('offers') ||
response.containsKey('Offers'))) {
model.offers = WalaPlusRetailerModel.parseOffersList(
response['offers'] ?? response['Offers'],
);
} }
if ((model.locations == null || model.locations!.isEmpty) && if ((model.locations == null || model.locations!.isEmpty) &&
(response.containsKey('locations') || response.containsKey('Locations') || response.containsKey('location') || response.containsKey('Location'))) { (response.containsKey('locations') ||
model.locations = WalaPlusRetailerModel.parseLocationsList(response['locations'] ?? response['Locations'] ?? response['location'] ?? response['Location']); response.containsKey('Locations') ||
response.containsKey('location') ||
response.containsKey('Location'))) {
model.locations = WalaPlusRetailerModel.parseLocationsList(
response['locations'] ??
response['Locations'] ??
response['location'] ??
response['Location'],
);
} }
if ((model.categories == null || model.categories!.isEmpty) && (response.containsKey('categories') || response.containsKey('Categories') || response.containsKey('category') || response.containsKey('Category'))) { if ((model.categories == null || model.categories!.isEmpty) &&
dynamic catData = response['categories'] ?? response['Categories'] ?? response['category'] ?? response['Category']; (response.containsKey('categories') ||
response.containsKey('Categories') ||
response.containsKey('category') ||
response.containsKey('Category'))) {
dynamic catData =
response['categories'] ??
response['Categories'] ??
response['category'] ??
response['Category'];
if (catData is List) { if (catData is List) {
model.categories = catData.map((c) => c is Map ? WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(c)) : WalaPlusCategoryModel(name: c.toString())).toList(); model.categories =
catData
.map(
(c) =>
c is Map
? WalaPlusCategoryModel.fromJson(
Map<String, dynamic>.from(c),
)
: WalaPlusCategoryModel(name: c.toString()),
)
.toList();
} else if (catData is Map) { } else if (catData is Map) {
model.categories = [WalaPlusCategoryModel.fromJson(Map<String, dynamic>.from(catData))]; model.categories = [
WalaPlusCategoryModel.fromJson(
Map<String, dynamic>.from(catData),
),
];
} else if (catData is String && catData.trim().isNotEmpty) { } else if (catData is String && catData.trim().isNotEmpty) {
model.categories = [WalaPlusCategoryModel(name: catData.trim())]; model.categories = [
WalaPlusCategoryModel(name: catData.trim()),
];
} }
} }
} }
debugPrint("getWalaPlusRetailerById: parsed retailer '${model.name}', isFavorite: ${model.isFavorite}, offers: ${model.offers?.length ?? 0}, locations: ${model.locations?.length ?? 0}"); debugPrint(
"getWalaPlusRetailerById: parsed retailer '${model.name}', isFavorite: ${model.isFavorite}, offers: ${model.offers?.length ?? 0}, locations: ${model.locations?.length ?? 0}",
);
return model; return model;
} }
} }
@ -519,9 +721,24 @@ class OffersAndDiscountsApiClient {
} }
String _resolveUserReference({String? overrideUserReference}) { String _resolveUserReference({String? overrideUserReference}) {
if (overrideUserReference != null && overrideUserReference.trim().isNotEmpty) { if (overrideUserReference != null &&
overrideUserReference.trim().isNotEmpty) {
return overrideUserReference.trim(); return overrideUserReference.trim();
} }
// AppState().memberInformationList is never cleared on logout, so after logging out of an
// employee session and logging back in as a dependent (without a full app restart) it can
// still be sitting there from the previous session. Checking the CURRENT session type first
// - rather than just whichever field happens to be non-empty - prevents a dependent session
// from ever resolving to the previous employee's number.
if (ApiConsts.isDependetLogin) {
String? depRef = AppState().getUserName;
if (depRef != null && depRef.trim().isNotEmpty) {
return depRef.trim();
}
return "";
}
String? ref = AppState().memberInformationList?.eMPLOYEENUMBER?.toString(); String? ref = AppState().memberInformationList?.eMPLOYEENUMBER?.toString();
if (ref != null && ref.trim().isNotEmpty) { if (ref != null && ref.trim().isNotEmpty) {
return ref.trim(); return ref.trim();
@ -533,15 +750,25 @@ class OffersAndDiscountsApiClient {
return ""; return "";
} }
Future<Map<String, dynamic>?> redeemWalaPlusOffer({required String offerId, String? offerType, String? userReference, BuildContext? context}) async { Future<Map<String, dynamic>?> redeemWalaPlusOffer({
required String offerId,
String? offerType,
String? userReference,
BuildContext? context,
}) async {
String url = ApiConsts.walaPlusOfferRedeem; String url = ApiConsts.walaPlusOfferRedeem;
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pUserReference = _resolveUserReference(overrideUserReference: userReference); String pUserReference = _resolveUserReference(
overrideUserReference: userReference,
);
Map<String, dynamic> postParams = _getBaseWalaPlusParams(); Map<String, dynamic> postParams = _getBaseWalaPlusParams();
postParams["WP_User_Reference"] = pUserReference; postParams["WP_User_Reference"] = pUserReference;
postParams["WP_Offer_Id"] = offerId; postParams["WP_Offer_Id"] = offerId;
postParams["WP_Offer_Type"] = (offerType != null && offerType.trim().isNotEmpty) ? offerType.trim() : "promo"; postParams["WP_Offer_Type"] =
(offerType != null && offerType.trim().isNotEmpty)
? offerType.trim()
: "promo";
postParams["UserName"] = pUserName; postParams["UserName"] = pUserName;
postParams["P_USER_NAME"] = pUserName; postParams["P_USER_NAME"] = pUserName;
@ -563,7 +790,11 @@ class OffersAndDiscountsApiClient {
(response) { (response) {
if (response != null) { if (response != null) {
debugPrint("redeemWalaPlusOffer response: $response"); debugPrint("redeemWalaPlusOffer response: $response");
dynamic val = response['WalaPlus_OfferRedeem'] ?? response['walaPlus_OfferRedeem'] ?? response['WalaPlusOfferRedeem'] ?? response['result']; dynamic val =
response['WalaPlus_OfferRedeem'] ??
response['walaPlus_OfferRedeem'] ??
response['WalaPlusOfferRedeem'] ??
response['result'];
if (val is String) { if (val is String) {
try { try {
val = json.decode(val); val = json.decode(val);
@ -584,11 +815,19 @@ class OffersAndDiscountsApiClient {
); );
} }
Future<GenericResponseModel?> addWalaPlusFavorite({Object? retailerId, List<String>? retailerIds, BuildContext? context, String? mobileNumber, String? userReference}) async { Future<GenericResponseModel?> addWalaPlusFavorite({
Object? retailerId,
List<String>? retailerIds,
BuildContext? context,
String? mobileNumber,
String? userReference,
}) async {
String url = ApiConsts.walaPlusFavoritesAdd; String url = ApiConsts.walaPlusFavoritesAdd;
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber); String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber);
String pUserReference = _resolveUserReference(overrideUserReference: userReference); String pUserReference = _resolveUserReference(
overrideUserReference: userReference,
);
List<String> ids = []; List<String> ids = [];
if (retailerIds != null && retailerIds.isNotEmpty) { if (retailerIds != null && retailerIds.isNotEmpty) {
@ -643,11 +882,19 @@ class OffersAndDiscountsApiClient {
); );
} }
Future<GenericResponseModel?> removeWalaPlusFavorite({Object? retailerId, List<String>? retailerIds, BuildContext? context, String? mobileNumber, String? userReference}) async { Future<GenericResponseModel?> removeWalaPlusFavorite({
Object? retailerId,
List<String>? retailerIds,
BuildContext? context,
String? mobileNumber,
String? userReference,
}) async {
String url = ApiConsts.walaPlusFavoritesRemove; String url = ApiConsts.walaPlusFavoritesRemove;
String pUserName = _resolveUserName(); String pUserName = _resolveUserName();
String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber); String pMobileNumber = _resolveMobileNumber(overrideMobile: mobileNumber);
String pUserReference = _resolveUserReference(overrideUserReference: userReference); String pUserReference = _resolveUserReference(
overrideUserReference: userReference,
);
List<String> ids = []; List<String> ids = [];
if (retailerIds != null && retailerIds.isNotEmpty) { if (retailerIds != null && retailerIds.isNotEmpty) {

@ -6,7 +6,7 @@ import 'dart:ui';
import 'package:easy_localization/easy_localization.dart' show AssetLoader; import 'package:easy_localization/easy_localization.dart' show AssetLoader;
class CodegenLoader extends AssetLoader{ class CodegenLoader extends AssetLoader {
const CodegenLoader(); const CodegenLoader();
@override @override
@ -14,7 +14,7 @@ class CodegenLoader extends AssetLoader{
return Future.value(mapLocales[locale.toString()]); return Future.value(mapLocales[locale.toString()]);
} }
static const Map<String,dynamic> _ar_SA = { static const Map<String, dynamic> _ar_SA = {
"mohemm": "MoheM", "mohemm": "MoheM",
"english": "English", "english": "English",
"arabic": "عربي", "arabic": "عربي",
@ -26,17 +26,20 @@ class CodegenLoader extends AssetLoader{
"userSearch": "البحث عن مستخدم", "userSearch": "البحث عن مستخدم",
"password": "كلمة المرور", "password": "كلمة المرور",
"welcomeBack": "مرحبا بعودتك", "welcomeBack": "مرحبا بعودتك",
"wouldYouLikeToLoginWithCurrentUsername": "هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟", "wouldYouLikeToLoginWithCurrentUsername":
"هل ترغب في تسجيل الدخول باسم المستخدم الحالي؟",
"lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:",
"verificationType": "نوع التحقق:", "verificationType": "نوع التحقق:",
"pleaseVerify": "يرجى التحقق", "pleaseVerify": "يرجى التحقق",
"pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات", "pleaseVerifyForBio":
"الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات",
"verifyThroughFace": "التحقق بالتعرف على الوجه", "verifyThroughFace": "التحقق بالتعرف على الوجه",
"verifyThroughFingerprint": "التحقق ببصمة الإصبع", "verifyThroughFingerprint": "التحقق ببصمة الإصبع",
"verifyThroughSMS": "التحقق عبر رسالة نصية", "verifyThroughSMS": "التحقق عبر رسالة نصية",
"verifyThroughWhatsapp": "التحقق عبر واتساب", "verifyThroughWhatsapp": "التحقق عبر واتساب",
"useAnotherAccount": "استخدم حسابا آخر", "useAnotherAccount": "استخدم حسابا آخر",
"pleaseEnterTheVerificationCodeSentTo": "الرجاء إدخال رمز التحقق المرسل إلى ", "pleaseEnterTheVerificationCodeSentTo":
"الرجاء إدخال رمز التحقق المرسل إلى ",
"theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ", "theVerificationCodeWillExpireIn": "ستنتهي صلاحية رمز التحقق في ",
"goodMorning": "صباح الخير", "goodMorning": "صباح الخير",
"markAttendance": "تسجيل الحضور", "markAttendance": "تسجيل الحضور",
@ -62,7 +65,8 @@ class CodegenLoader extends AssetLoader{
"newString": "جديد", "newString": "جديد",
"setTheNewPassword": "قم بتعيين كلمة المرور الجديدة", "setTheNewPassword": "قم بتعيين كلمة المرور الجديدة",
"typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه", "typeYourNewPasswordBelow": "اكتب كلمة المرور الجديدة أدناه",
"typeYourNewActiveDirectoryPasswordBelow": "اكتب كلمة مرور الدليل النشط الجديدة أدناه", "typeYourNewActiveDirectoryPasswordBelow":
"اكتب كلمة مرور الدليل النشط الجديدة أدناه",
"confirmPassword": "تأكيد كلمة المرور", "confirmPassword": "تأكيد كلمة المرور",
"update": "تحديث", "update": "تحديث",
"title": "عنوان", "title": "عنوان",
@ -71,7 +75,8 @@ class CodegenLoader extends AssetLoader{
"createRequest": "إنشاء طلب", "createRequest": "إنشاء طلب",
"forgotPassword": "هل نسيت كلمة المرور؟", "forgotPassword": "هل نسيت كلمة المرور؟",
"employeeId": "الرقم الوظيفي", "employeeId": "الرقم الوظيفي",
"loginCodeWillSentToMobileNumber": "الرجاء إدخال رقم الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المسجل", "loginCodeWillSentToMobileNumber":
"الرجاء إدخال رقم الموظف الخاص بك ، وسيتم إرسال رمز تسجيل الدخول إلى رقم هاتفك المسجل",
"changePassword": "تغيير كلمة المرور", "changePassword": "تغيير كلمة المرور",
"ok": "موافق", "ok": "موافق",
"confirm": "تأكيد", "confirm": "تأكيد",
@ -299,7 +304,8 @@ class CodegenLoader extends AssetLoader{
"amount": "المبلغ", "amount": "المبلغ",
"correctCurrentDatails": "تصحيح البيانات الحالية أو استكمالها", "correctCurrentDatails": "تصحيح البيانات الحالية أو استكمالها",
"selectType": " حدد نوع التغيير الذي تريد القيام به", "selectType": " حدد نوع التغيير الذي تريد القيام به",
"enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", "enterNewInfo":
" أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية",
"endDate": "تاريخ الانتهاء", "endDate": "تاريخ الانتهاء",
"removeThisMember": "هل أنت متأكد من إزالة هذا الفرد؟", "removeThisMember": "هل أنت متأكد من إزالة هذا الفرد؟",
"wantUpdateThisMember ": "هل أنت متأكد من تحديث بيانات هذا الفرد؟", "wantUpdateThisMember ": "هل أنت متأكد من تحديث بيانات هذا الفرد؟",
@ -349,7 +355,8 @@ class CodegenLoader extends AssetLoader{
"mark": "تسجيل", "mark": "تسجيل",
"selectMethodOfAttendance": "اختر طريقة تسجيل الحضور", "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور",
"comeNearHMGWifi": "يرجى الاقتراب من شبكة Wi-Fi الخاصة بالمجموعة", "comeNearHMGWifi": "يرجى الاقتراب من شبكة Wi-Fi الخاصة بالمجموعة",
"deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة", "deliverNotificationToMeRegardless":
"تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة",
"close": "أغلق", "close": "أغلق",
"respond": "رد", "respond": "رد",
"vacationRuleAdded": "تمت إضافة قاعدة الإجازة", "vacationRuleAdded": "تمت إضافة قاعدة الإجازة",
@ -414,7 +421,8 @@ class CodegenLoader extends AssetLoader{
"itemPhotos": "صور السلعة", "itemPhotos": "صور السلعة",
"itemInfo": "معلومات العنصر", "itemInfo": "معلومات العنصر",
"uploadAttachment": "تحميل المرفق", "uploadAttachment": "تحميل المرفق",
"selectFromGalleryOrOpenCamera": "اختر صورة من المعرض أو التقط صورة بالكاميرا", "selectFromGalleryOrOpenCamera":
"اختر صورة من المعرض أو التقط صورة بالكاميرا",
"openCamera": "فتح\nالكاميرا", "openCamera": "فتح\nالكاميرا",
"uploadFromGallery": "تحميل من\nملفات الجهاز", "uploadFromGallery": "تحميل من\nملفات الجهاز",
"name": "الأسم", "name": "الأسم",
@ -457,7 +465,7 @@ class CodegenLoader extends AssetLoader{
"reset_password": { "reset_password": {
"label": "إعادة تعيين كلمة المرور", "label": "إعادة تعيين كلمة المرور",
"username": "اسم المستخدم", "username": "اسم المستخدم",
"password": "كلمة المرور" "password": "كلمة المرور",
}, },
"profileCompletionPer": "استكمال الملف الشخصي", "profileCompletionPer": "استكمال الملف الشخصي",
"completeProfile": "استكمال الملف الشخصي", "completeProfile": "استكمال الملف الشخصي",
@ -467,7 +475,7 @@ class CodegenLoader extends AssetLoader{
"contactDetails": "بيانات التواصل", "contactDetails": "بيانات التواصل",
"familyDetails": "تفاصيل عائلية", "familyDetails": "تفاصيل عائلية",
"effectiveDate": "تاريخ سريان التغيير", "effectiveDate": "تاريخ سريان التغيير",
"country": "دولة" "country": "دولة",
}, },
"clicked": { "clicked": {
"zero": "You clicked {} times!", "zero": "You clicked {} times!",
@ -475,15 +483,12 @@ class CodegenLoader extends AssetLoader{
"two": "You clicked {} times!", "two": "You clicked {} times!",
"few": "You clicked {} times!", "few": "You clicked {} times!",
"many": "You clicked {} times!", "many": "You clicked {} times!",
"other": "You clicked {} times!" "other": "You clicked {} times!",
}, },
"gender": { "gender": {
"male": "Hi man ;) ", "male": "Hi man ;) ",
"female": "Hello girl :)", "female": "Hello girl :)",
"with_arg": { "with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"},
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
}, },
"reset_locale": "إعادة ضبط اللغة", "reset_locale": "إعادة ضبط اللغة",
"chat": "دردشة", "chat": "دردشة",
@ -510,7 +515,8 @@ class CodegenLoader extends AssetLoader{
"minutes": "الدقائق", "minutes": "الدقائق",
"seconds": "ثواني", "seconds": "ثواني",
"note": "ملحوظة:", "note": "ملحوظة:",
"demoMarathonNoteP1": "يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون", "demoMarathonNoteP1":
"يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون",
"demoMarathonNoteP2": "خمس دقائق", "demoMarathonNoteP2": "خمس دقائق",
"demoMarathonNoteP3": "قبل الوقت الفعلي.", "demoMarathonNoteP3": "قبل الوقت الفعلي.",
"sponsoredBy": "برعاية:", "sponsoredBy": "برعاية:",
@ -534,11 +540,14 @@ class CodegenLoader extends AssetLoader{
"favorite": "مفضلتي", "favorite": "مفضلتي",
"searchfromchat": "البحث من الدردشة", "searchfromchat": "البحث من الدردشة",
"yourAnswerCorrect": "إجابتك صحيحة", "yourAnswerCorrect": "إجابتك صحيحة",
"youMissedTheQuestion": "نفد منك الوقت. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", "youMissedTheQuestion":
"wrongAnswer": "إجابتك غير صحيحة. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", "نفد منك الوقت. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.",
"wrongAnswer":
"إجابتك غير صحيحة. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.",
"oops": "أوه!!!", "oops": "أوه!!!",
"winner": "الفائز", "winner": "الفائز",
"youWantToLeaveMarathon": "هل أنت متأكد أنك تريد العودة؟ سوف تخرج من المسابقة.", "youWantToLeaveMarathon":
"هل أنت متأكد أنك تريد العودة؟ سوف تخرج من المسابقة.",
"ourSponsor": "راعينا:", "ourSponsor": "راعينا:",
"startingIn": "يبدأ في", "startingIn": "يبدأ في",
"youAreOutOfContest": "أنت خارج المسابقة.", "youAreOutOfContest": "أنت خارج المسابقة.",
@ -547,7 +556,8 @@ class CodegenLoader extends AssetLoader{
"oneWeek": "أسبوع واحد", "oneWeek": "أسبوع واحد",
"twoWeek": "أسبوعان", "twoWeek": "أسبوعان",
"noUpcoming": "لا توجد مسابقات قادمة", "noUpcoming": "لا توجد مسابقات قادمة",
"fakeLocation": "تم رصد محاولة استخدام موقع جغرافي غير حقيقي. يُعد ذلك مخالفة، وقد تم إشعار إدارة الموارد البشرية.", "fakeLocation":
"تم رصد محاولة استخدام موقع جغرافي غير حقيقي. يُعد ذلك مخالفة، وقد تم إشعار إدارة الموارد البشرية.",
"noWinner": "لم يفز أحد اليوم.", "noWinner": "لم يفز أحد اليوم.",
"myTeam": "فريقي", "myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض", "youCanPlayDemo": "لكن يمكنك لعب العرض",
@ -565,8 +575,10 @@ class CodegenLoader extends AssetLoader{
"missingDocuments": "مستندات مفقودة", "missingDocuments": "مستندات مفقودة",
"uploadedDocuments": "المستندات التي تم تحميلها", "uploadedDocuments": "المستندات التي تم تحميلها",
"addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.", "addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.",
"pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون", "pleaseClickButtonToJoinMarathon":
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني", "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
"youCannotJoinTheMarathon":
"لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
"open": "فتح", "open": "فتح",
"paymentRequest": "طلب الدفع", "paymentRequest": "طلب الدفع",
"paymentDetails": "تفاصيل الدفع", "paymentDetails": "تفاصيل الدفع",
@ -618,13 +630,18 @@ class CodegenLoader extends AssetLoader{
"addUsers": "إضافة مستخدمين إلى المجموعة", "addUsers": "إضافة مستخدمين إلى المجموعة",
"admin": "مشرف", "admin": "مشرف",
"areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟", "areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟",
"confirmGrantMazayaAccess": "هل أنت متأكد أنك تريد منح صلاحية مزايا لـ \"{}\"؟", "confirmGrantMazayaAccess":
"confirmRevokeMazayaAccess": "هل أنت متأكد أنك تريد إلغاء صلاحية مزايا لـ \"{}\"؟", "هل أنت متأكد أنك تريد منح صلاحية مزايا لـ \"{}\"؟",
"confirmRevokeMazayaAccess":
"هل أنت متأكد أنك تريد إلغاء صلاحية مزايا لـ \"{}\"؟",
"yes": "نعم", "yes": "نعم",
"no": "لا", "no": "لا",
"mazayaInviteInstructions": "يرجى تحميل تطبيق مهمم من الرابط أعلاه واستخدام بيانات الاعتماد التالية لتسجيل الدخول", "mazayaInviteInstructions":
"cameraPermissionRequiredToScan": "يرجى منح صلاحية الكاميرا لمسح رمز الاستجابة السريعة", "يرجى تحميل تطبيق مهمم من الرابط أعلاه واستخدام بيانات الاعتماد التالية لتسجيل الدخول",
"cameraPermissionPermanentlyDenied": "يرجى تفعيل صلاحية الكاميرا من إعدادات التطبيق > الصلاحيات", "cameraPermissionRequiredToScan":
"يرجى منح صلاحية الكاميرا لمسح رمز الاستجابة السريعة",
"cameraPermissionPermanentlyDenied":
"يرجى تفعيل صلاحية الكاميرا من إعدادات التطبيق > الصلاحيات",
"openSettings": "فتح الإعدادات", "openSettings": "فتح الإعدادات",
"nationalIdOrIqamaFallback": "رقم الهوية الوطنية أو رقم الإقامة الخاص بك", "nationalIdOrIqamaFallback": "رقم الهوية الوطنية أو رقم الإقامة الخاص بك",
"Attendance": "الحضور", "Attendance": "الحضور",
@ -704,21 +721,26 @@ class CodegenLoader extends AssetLoader{
"amuLastThreeMonths": "AMU (آخر 3 أشهر)", "amuLastThreeMonths": "AMU (آخر 3 أشهر)",
"mazayaTitle": "مزايا", "mazayaTitle": "مزايا",
"mazayaAccessGranted": "تم منح صلاحية الوصول إلى مزايا", "mazayaAccessGranted": "تم منح صلاحية الوصول إلى مزايا",
"mazayaAccessGrantedDesc": "أصبح لدى {} حق وصول نشط الآن. شارك رابط التنزيل أدناه ليتمكن من تثبيت تطبيق مهم وإكمال الإعداد.", "mazayaAccessGrantedDesc":
"أصبح لدى {} حق وصول نشط الآن. شارك رابط التنزيل أدناه ليتمكن من تثبيت تطبيق مهم وإكمال الإعداد.",
"accessIsNowActive": "تم تفعيل صلاحية الوصول", "accessIsNowActive": "تم تفعيل صلاحية الوصول",
"accessIsNowActiveDesc": "يمكن لـ {} استخدام الرابط المرفق لتنزيل تطبيق مزايا ومتابعة الإعداد على جهازه.", "accessIsNowActiveDesc":
"يمكن لـ {} استخدام الرابط المرفق لتنزيل تطبيق مزايا ومتابعة الإعداد على جهازه.",
"dependentAccessActive": "صلاحية التابع مفعّلة", "dependentAccessActive": "صلاحية التابع مفعّلة",
"shareableAppDownloadLink": "رابط تنزيل التطبيق للمشاركة", "shareableAppDownloadLink": "رابط تنزيل التطبيق للمشاركة",
"shareableAppDownloadLinkDesc": "أرسل هذا الرابط إلى {} ليتمكن من تنزيل تطبيق مزايا ومتابعة الإعداد.", "shareableAppDownloadLinkDesc":
"أرسل هذا الرابط إلى {} ليتمكن من تنزيل تطبيق مزايا ومتابعة الإعداد.",
"downloadLink": "رابط التنزيل", "downloadLink": "رابط التنزيل",
"shareDownloadLink": "مشاركة رابط التنزيل", "shareDownloadLink": "مشاركة رابط التنزيل",
"copyLink": "نسخ الرابط", "copyLink": "نسخ الرابط",
"done": "تم", "done": "تم",
"linkCopied": "تم نسخ الرابط بنجاح", "linkCopied": "تم نسخ الرابط بنجاح",
"mazayaAccessRevoked": "تم إلغاء صلاحية الوصول إلى مزايا", "mazayaAccessRevoked": "تم إلغاء صلاحية الوصول إلى مزايا",
"mazayaAccessRevokedDesc": "تم إلغاء صلاحية وصول التابع إلى مزايا. لم يعد بإمكانه استخدام العروض أو تسجيل الدخول بالبصمة.", "mazayaAccessRevokedDesc":
"تم إلغاء صلاحية وصول التابع إلى مزايا. لم يعد بإمكانه استخدام العروض أو تسجيل الدخول بالبصمة.",
"contactYourSponsor": "تواصل مع الموظف المسؤول عن التابع", "contactYourSponsor": "تواصل مع الموظف المسؤول عن التابع",
"contactYourSponsorDesc": "اطلب من الموظف المسؤول عن التابع إعادة تفعيل صلاحية الوصول إلى مزايا من صفحة بيانات التابعين.", "contactYourSponsorDesc":
"اطلب من الموظف المسؤول عن التابع إعادة تفعيل صلاحية الوصول إلى مزايا من صفحة بيانات التابعين.",
"dependentAccessBlocked": "تم تعطيل صلاحية التابع", "dependentAccessBlocked": "تم تعطيل صلاحية التابع",
"returnToSignIn": "العودة إلى تسجيل الدخول", "returnToSignIn": "العودة إلى تسجيل الدخول",
"allowMazayaAccess": "السماح باستخدام مزايا", "allowMazayaAccess": "السماح باستخدام مزايا",
@ -747,7 +769,8 @@ class CodegenLoader extends AssetLoader{
"searchFamilyMembers": "البحث في أفراد العائلة", "searchFamilyMembers": "البحث في أفراد العائلة",
"addAnotherUser": "إضافة مستخدم آخر", "addAnotherUser": "إضافة مستخدم آخر",
"joinMazaya": "انضم إلى مزايا", "joinMazaya": "انضم إلى مزايا",
"joinMazayaSubtitle": "استفد من العروض والخصومات الحصرية للموظفين في المطاعم والتسوق وغيرها.", "joinMazayaSubtitle":
"استفد من العروض والخصومات الحصرية للموظفين في المطاعم والتسوق وغيرها.",
"continueAsEmployee": "المتابعة كموظف", "continueAsEmployee": "المتابعة كموظف",
"continueAsEmployeeSubtitle": "سجّل الدخول باستخدام بيانات حسابك الوظيفي.", "continueAsEmployeeSubtitle": "سجّل الدخول باستخدام بيانات حسابك الوظيفي.",
"pleaseEnterNationalId": "الرجاء إدخال رقم الهوية الوطنية", "pleaseEnterNationalId": "الرجاء إدخال رقم الهوية الوطنية",
@ -761,14 +784,17 @@ class CodegenLoader extends AssetLoader{
"stepBasic": "البيانات الأساسية", "stepBasic": "البيانات الأساسية",
"stepAdditional": "بيانات إضافية", "stepAdditional": "بيانات إضافية",
"findYourDependent": "البحث عن أحد التابعين", "findYourDependent": "البحث عن أحد التابعين",
"findYourDependentDesc": "أدخل التفاصيل تماماً كما تظهر في الهوية الوطنية. سنقوم باسترداد السجل بأمان من مركز المعلومات الوطني (NHIC).", "findYourDependentDesc":
"أدخل التفاصيل تماماً كما تظهر في الهوية الوطنية. سنقوم باسترداد السجل بأمان من مركز المعلومات الوطني (NHIC).",
"enter10DigitNationalId": "أدخل رقم الهوية المكون من 10 أرقام", "enter10DigitNationalId": "أدخل رقم الهوية المكون من 10 أرقام",
"nationalIdMustBe10Digits": "يجب أن يتكون رقم الهوية من 10 أرقام", "nationalIdMustBe10Digits": "يجب أن يتكون رقم الهوية من 10 أرقام",
"dateFormatPlaceholder": "يوم / شهر / سنة", "dateFormatPlaceholder": "يوم / شهر / سنة",
"searchUser": "بحث عن المستخدم", "searchUser": "بحث عن المستخدم",
"dependentNotFoundNhic": "لم يتم العثور على سجل لهذا التابع في مركز المعلومات الوطني", "dependentNotFoundNhic":
"لم يتم العثور على سجل لهذا التابع في مركز المعلومات الوطني",
"basicInfo": "المعلومات الأساسية", "basicInfo": "المعلومات الأساسية",
"basicInfoDesc": "بيانات الهوية المطلوبة المستردة من مركز المعلومات الوطني.", "basicInfoDesc":
"بيانات الهوية المطلوبة المستردة من مركز المعلومات الوطني.",
"additionalInfo": "معلومات إضافية", "additionalInfo": "معلومات إضافية",
"additionalInfoDesc": "إضافة أو مراجعة بيانات الكفالة والأهلية.", "additionalInfoDesc": "إضافة أو مراجعة بيانات الكفالة والأهلية.",
"select": "اختر", "select": "اختر",
@ -776,7 +802,8 @@ class CodegenLoader extends AssetLoader{
"requiredField": "الحقل المطلوب", "requiredField": "الحقل المطلوب",
"pleaseFillField": "الرجاء إدخال {}", "pleaseFillField": "الرجاء إدخال {}",
"reviewAndSubmit": "المراجعة والإرسال", "reviewAndSubmit": "المراجعة والإرسال",
"reviewAndSubmitDesc": "يرجى مراجعة تفاصيل التابع بعناية قبل تأكيد الإرسال.", "reviewAndSubmitDesc":
"يرجى مراجعة تفاصيل التابع بعناية قبل تأكيد الإرسال.",
"arabicName": "الاسم بالعربية", "arabicName": "الاسم بالعربية",
"relationship": "صلة القرابة", "relationship": "صلة القرابة",
"sponsor": "الموظف المسؤول عن التابع", "sponsor": "الموظف المسؤول عن التابع",
@ -811,15 +838,20 @@ class CodegenLoader extends AssetLoader{
"startDependentFlowsDesc": "بدء إجراءات التابع وإدارة الوصول من مكان واحد.", "startDependentFlowsDesc": "بدء إجراءات التابع وإدارة الوصول من مكان واحد.",
"mazayaAccess": "الوصول إلى مزايا", "mazayaAccess": "الوصول إلى مزايا",
"accessOff": "معطل", "accessOff": "معطل",
"allowDependentMazayaOffersDesc": "السماح لـ {} باستخدام عروض مزايا بعد التحقق من هويته.", "allowDependentMazayaOffersDesc":
"السماح لـ {} باستخدام عروض مزايا بعد التحقق من هويته.",
"loginMethod": "طريقة تسجيل الدخول", "loginMethod": "طريقة تسجيل الدخول",
"nationalIdAndDob": "الهوية الوطنية وتاريخ الميلاد", "nationalIdAndDob": "الهوية الوطنية وتاريخ الميلاد",
"sponsorOtp": "رمز التحقق المرسل إلى الموظف المسؤول عن التابع", "sponsorOtp": "رمز التحقق المرسل إلى الموظف المسؤول عن التابع",
"revokingPreventsAccessDesc": "إلغاء الوصول يمنع التابع من استخدام المزايا حتى تعيد السماح به مرة أخرى.", "revokingPreventsAccessDesc":
"locationPermissionRequiredForAttendance": "يجب منح إذن الموقع لتسجيل الحضور", "إلغاء الوصول يمنع التابع من استخدام المزايا حتى تعيد السماح به مرة أخرى.",
"locationServicesRequiredForAttendance": "يجب تفعيل خدمة الموقع لتسجيل الحضور", "locationPermissionRequiredForAttendance":
"يجب منح إذن الموقع لتسجيل الحضور",
"locationServicesRequiredForAttendance":
"يجب تفعيل خدمة الموقع لتسجيل الحضور",
"pleaseProvideLocationPermission": "الرجاء منح إذن الموقع", "pleaseProvideLocationPermission": "الرجاء منح إذن الموقع",
"microphoneAccessRequired": "يحتاج التطبيق إلى إذن الوصول إلى الميكروفون لتسجيل الصوت.", "microphoneAccessRequired":
"يحتاج التطبيق إلى إذن الوصول إلى الميكروفون لتسجيل الصوت.",
"shareAccessGuide": "مشاركة دليل الوصول", "shareAccessGuide": "مشاركة دليل الوصول",
"nationalIdOrIqamaNumber": "رقم الهوية الوطنية أو الإقامة", "nationalIdOrIqamaNumber": "رقم الهوية الوطنية أو الإقامة",
"multipleCities": "مدن متعددة", "multipleCities": "مدن متعددة",
@ -844,9 +876,12 @@ class CodegenLoader extends AssetLoader{
"favoriteRemovedSuccess": "تمت إزالة التاجر من المفضلة بنجاح", "favoriteRemovedSuccess": "تمت إزالة التاجر من المفضلة بنجاح",
"favoriteError": "تعذّر تحديث المفضلة. يُرجى المحاولة مرة أخرى.", "favoriteError": "تعذّر تحديث المفضلة. يُرجى المحاولة مرة أخرى.",
"merchantWebsiteNotAvailable": "الموقع الإلكتروني للتاجر غير متاح", "merchantWebsiteNotAvailable": "الموقع الإلكتروني للتاجر غير متاح",
"locationServicesRequiredForNearestOffers": "فعّل خدمات الموقع لعرض العروض القريبة منك", "locationServicesRequiredForNearestOffers":
"locationPermissionRequiredForNearestOffers": "اسمح للتطبيق بالوصول إلى موقعك لعرض العروض القريبة منك", "فعّل خدمات الموقع لعرض العروض القريبة منك",
"locationPermissionRequiredForNearestOffers":
"اسمح للتطبيق بالوصول إلى موقعك لعرض العروض القريبة منك",
"mazayaDeals": "عروض مزايا", "mazayaDeals": "عروض مزايا",
"helloName": "مرحباً، {}",
"findABrandOrSomething": "ابحث عن علامة تجارية أو شيء بسيط", "findABrandOrSomething": "ابحث عن علامة تجارية أو شيء بسيط",
"exploreYourBenefits": "استكشف مزاياك", "exploreYourBenefits": "استكشف مزاياك",
"theMazayaEdit": "اختيارات مزايا", "theMazayaEdit": "اختيارات مزايا",
@ -856,7 +891,8 @@ class CodegenLoader extends AssetLoader{
"latestOnMazaya": "أحدث ما في مزايا", "latestOnMazaya": "أحدث ما في مزايا",
"goodFoodGreatCompanyEvenBetterPerks": "طعام رائع. رفقة ممتعة. مزايا أفضل.", "goodFoodGreatCompanyEvenBetterPerks": "طعام رائع. رفقة ممتعة. مزايا أفضل.",
"travelEssentials": "أساسيات السفر", "travelEssentials": "أساسيات السفر",
"fromEverydayCareToYourNextAdventure": "من العناية اليومية إلى مغامرتك القادمة.", "fromEverydayCareToYourNextAdventure":
"من العناية اليومية إلى مغامرتك القادمة.",
"homeAndKitchen": "المنزل والمطبخ", "homeAndKitchen": "المنزل والمطبخ",
"curatedPicksForYourHomeAndKitchen": "اختيارات مميزة لمنزلك ومطبخك.", "curatedPicksForYourHomeAndKitchen": "اختيارات مميزة لمنزلك ومطبخك.",
"discover": "اكتشف", "discover": "اكتشف",
@ -870,7 +906,8 @@ class CodegenLoader extends AssetLoader{
"favoriteMerchant": "العروض المفضلة", "favoriteMerchant": "العروض المفضلة",
"favoriteOffers": "العروض المفضلة", "favoriteOffers": "العروض المفضلة",
"goodToKnow": "معلومات مهمة", "goodToKnow": "معلومات مهمة",
"goodToKnowDesc": "احتفظ بعضوية مزايا في متناول يدك. تحقق من توفر التاجر والأنشطة المؤهلة والشروط الكاملة قبل الحجز.", "goodToKnowDesc":
"احتفظ بعضوية مزايا في متناول يدك. تحقق من توفر التاجر والأنشطة المؤهلة والشروط الكاملة قبل الحجز.",
"termsAndConditions": "الشروط والأحكام", "termsAndConditions": "الشروط والأحكام",
"haveAQuestionAboutOffer": "هل لديك سؤال حول هذا العرض؟", "haveAQuestionAboutOffer": "هل لديك سؤال حول هذا العرض؟",
"getHelp": "الحصول على المساعدة", "getHelp": "الحصول على المساعدة",
@ -887,8 +924,8 @@ class CodegenLoader extends AssetLoader{
"mazayaExclusive": "حصري لمزايا", "mazayaExclusive": "حصري لمزايا",
"youAreAllCaughtUp": "لقد شاهدت كل العروض. المزيد قريباً.", "youAreAllCaughtUp": "لقد شاهدت كل العروض. المزيد قريباً.",
"selectCity": "اختر المدينة", "selectCity": "اختر المدينة",
}; };
static const Map<String,dynamic> _en_US = { static const Map<String, dynamic> _en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "عربي", "arabic": "عربي",
@ -897,17 +934,20 @@ static const Map<String,dynamic> _en_US = {
"username": "Username", "username": "Username",
"password": "Password", "password": "Password",
"welcomeBack": "Welcome back", "welcomeBack": "Welcome back",
"wouldYouLikeToLoginWithCurrentUsername": "Would you like to login with current Username?", "wouldYouLikeToLoginWithCurrentUsername":
"Would you like to login with current Username?",
"lastLoginDetails": "Last Login Details:", "lastLoginDetails": "Last Login Details:",
"verificationType": "Verification Type:", "verificationType": "Verification Type:",
"pleaseVerify": "Please Verify", "pleaseVerify": "Please Verify",
"pleaseVerifyForBio": "Please verify login with one of the following options", "pleaseVerifyForBio":
"Please verify login with one of the following options",
"verifyThroughFace": "Verify Through Face", "verifyThroughFace": "Verify Through Face",
"verifyThroughFingerprint": "Verify Through Fingerprint", "verifyThroughFingerprint": "Verify Through Fingerprint",
"verifyThroughSMS": "Verify Through SMS", "verifyThroughSMS": "Verify Through SMS",
"verifyThroughWhatsapp": "Verify Through Whatsapp", "verifyThroughWhatsapp": "Verify Through Whatsapp",
"useAnotherAccount": "Use Another Account", "useAnotherAccount": "Use Another Account",
"pleaseEnterTheVerificationCodeSentTo": "Please enter the verification code sent to ", "pleaseEnterTheVerificationCodeSentTo":
"Please enter the verification code sent to ",
"theVerificationCodeWillExpireIn": "The verification code will expire in ", "theVerificationCodeWillExpireIn": "The verification code will expire in ",
"goodMorning": "Good Morning", "goodMorning": "Good Morning",
"markAttendance": "Mark Attendance", "markAttendance": "Mark Attendance",
@ -933,7 +973,8 @@ static const Map<String,dynamic> _en_US = {
"newString": "New", "newString": "New",
"setTheNewPassword": "Set the new password", "setTheNewPassword": "Set the new password",
"typeYourNewPasswordBelow": "Type your new password below", "typeYourNewPasswordBelow": "Type your new password below",
"typeYourNewActiveDirectoryPasswordBelow": "Type new active directory password below", "typeYourNewActiveDirectoryPasswordBelow":
"Type new active directory password below",
"confirmPassword": "Confirm Password", "confirmPassword": "Confirm Password",
"update": "Update", "update": "Update",
"title": "Title", "title": "Title",
@ -942,7 +983,8 @@ static const Map<String,dynamic> _en_US = {
"createRequest": "Create Request", "createRequest": "Create Request",
"forgotPassword": "Forgot Password", "forgotPassword": "Forgot Password",
"employeeId": "Employee ID", "employeeId": "Employee ID",
"loginCodeWillSentToMobileNumber": "Please Enter your Employee ID, A login code will be sent to your mobile number", "loginCodeWillSentToMobileNumber":
"Please Enter your Employee ID, A login code will be sent to your mobile number",
"changePassword": "Change Password", "changePassword": "Change Password",
"ok": "OK", "ok": "OK",
"confirm": "Confirm", "confirm": "Confirm",
@ -975,7 +1017,8 @@ static const Map<String,dynamic> _en_US = {
"atLeastOneNumeric": "At least one numeric", "atLeastOneNumeric": "At least one numeric",
"minimum8Characters": "Minimum 8 characters", "minimum8Characters": "Minimum 8 characters",
"doNotAddRepeatingLetters": "Do not add repeating letters", "doNotAddRepeatingLetters": "Do not add repeating letters",
"itShouldContainSpecialCharacter": "It should not contain special characters", "itShouldContainSpecialCharacter":
"It should not contain special characters",
"confirmPasswordMustMatch": "Confirm password must match", "confirmPasswordMustMatch": "Confirm password must match",
"sms": "SMS", "sms": "SMS",
"fingerPrint": "Fingerprint", "fingerPrint": "Fingerprint",
@ -1018,7 +1061,8 @@ static const Map<String,dynamic> _en_US = {
"category": "Category", "category": "Category",
"employeeEmailAddress": "Employee Email Address", "employeeEmailAddress": "Employee Email Address",
"payrollBranch": "Payroll Branch", "payrollBranch": "Payroll Branch",
"yourChangeHasBeenSavedSuccessfully": "Your change has been saved successfully", "yourChangeHasBeenSavedSuccessfully":
"Your change has been saved successfully",
"code": "Code", "code": "Code",
"unit": "Unit", "unit": "Unit",
"quantity": "Quantity", "quantity": "Quantity",
@ -1116,7 +1160,8 @@ static const Map<String,dynamic> _en_US = {
"templateName": "Template Name", "templateName": "Template Name",
"itemCreationStatus": "Item Creation Status", "itemCreationStatus": "Item Creation Status",
"standardizationApprovalStatus": "Standardization Approval Status", "standardizationApprovalStatus": "Standardization Approval Status",
"standardizationApprovalRejectionReason": "Standardization Approval Rejection Reason", "standardizationApprovalRejectionReason":
"Standardization Approval Rejection Reason",
"analyzedBy": "Analyzed By", "analyzedBy": "Analyzed By",
"approvedDate": "Approved Date", "approvedDate": "Approved Date",
"itemType": "Item Type", "itemType": "Item Type",
@ -1152,7 +1197,8 @@ static const Map<String,dynamic> _en_US = {
"comments": "Comments", "comments": "Comments",
"writeComment": "Write a comment", "writeComment": "Write a comment",
"approversList": "Approvers List", "approversList": "Approvers List",
"yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", "yourRequestHasBeenSubmittedForApprovals":
"Your request has been submitted for approvals",
"monthlyPaySlip": "Monthly Pay Slip", "monthlyPaySlip": "Monthly Pay Slip",
"particular": "Particular", "particular": "Particular",
"earnings": "Earnings", "earnings": "Earnings",
@ -1167,7 +1213,8 @@ static const Map<String,dynamic> _en_US = {
"amount": "Amount", "amount": "Amount",
"correctCurrentDatails": "correct or complete the current details", "correctCurrentDatails": "correct or complete the current details",
"selectType": "Select the type of change you want to make", "selectType": "Select the type of change you want to make",
"enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", "enterNewInfo":
"Enter new Information because of a real change to the current details (e.g because of a change in marital status)",
"endDate": "*End Date", "endDate": "*End Date",
"removeThisMember": "Are You Sure You Want to Remove this Member?", "removeThisMember": "Are You Sure You Want to Remove this Member?",
"wantUpdateThisMember": "Are You Sure You Want to Update this Member?", "wantUpdateThisMember": "Are You Sure You Want to Update this Member?",
@ -1221,7 +1268,8 @@ static const Map<String,dynamic> _en_US = {
"logout": "Logout", "logout": "Logout",
"selectMethodOfAttendance": "Select the method to mark the attendance", "selectMethodOfAttendance": "Select the method to mark the attendance",
"comeNearHMGWifi": "Please come near to HMG wifi", "comeNearHMGWifi": "Please come near to HMG wifi",
"deliverNotificationToMeRegardless": "Deliver notifications to me regardless of any general rules", "deliverNotificationToMeRegardless":
"Deliver notifications to me regardless of any general rules",
"close": "Close", "close": "Close",
"respond": "Respond", "respond": "Respond",
"vacationRuleAdded": "Vacation rule added", "vacationRuleAdded": "Vacation rule added",
@ -1241,7 +1289,8 @@ static const Map<String,dynamic> _en_US = {
"searchForEmployee": "Search for Employee", "searchForEmployee": "Search for Employee",
"pleaseSpecifyEndTime": "Please specify End Time", "pleaseSpecifyEndTime": "Please specify End Time",
"pleaseSelectNotificationReassign": "Please select notification reassign", "pleaseSelectNotificationReassign": "Please select notification reassign",
"pleaseSelectEmployeeForReplacement": "Please select employee for replacement", "pleaseSelectEmployeeForReplacement":
"Please select employee for replacement",
"pleaseSelectAction": "Please select action", "pleaseSelectAction": "Please select action",
"pleaseSelectDate": "Please select date", "pleaseSelectDate": "Please select date",
"todayAttendance": "Today's Attendance", "todayAttendance": "Today's Attendance",
@ -1300,7 +1349,8 @@ static const Map<String,dynamic> _en_US = {
"itemCreation": "Item Creation", "itemCreation": "Item Creation",
"stamp": "Stamp", "stamp": "Stamp",
"addFavoriteList": "Do you want to add {name} in your favorite list", "addFavoriteList": "Do you want to add {name} in your favorite list",
"feedbackUserExperience": "This is to get the feedback about the user experience", "feedbackUserExperience":
"This is to get the feedback about the user experience",
"rateUI": "How would you like to rate", "rateUI": "How would you like to rate",
"rateUI2": "How do you satisfied with this application", "rateUI2": "How do you satisfied with this application",
"submitSurvey": "Submit Survey", "submitSurvey": "Submit Survey",
@ -1329,7 +1379,7 @@ static const Map<String,dynamic> _en_US = {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",
"username": "Username", "username": "Username",
"password": "password" "password": "password",
}, },
"profileCompletionPer": "Profile Completion", "profileCompletionPer": "Profile Completion",
"completeProfile": "Complete Profile", "completeProfile": "Complete Profile",
@ -1339,7 +1389,7 @@ static const Map<String,dynamic> _en_US = {
"contactDetails": "Contact Details", "contactDetails": "Contact Details",
"familyDetails": "Family Members", "familyDetails": "Family Members",
"effectiveDate": "Effective Date", "effectiveDate": "Effective Date",
"country": "Country" "country": "Country",
}, },
"clicked": { "clicked": {
"zero": "You clicked {} times!", "zero": "You clicked {} times!",
@ -1347,15 +1397,12 @@ static const Map<String,dynamic> _en_US = {
"two": "You clicked {} times!", "two": "You clicked {} times!",
"few": "You clicked {} times!", "few": "You clicked {} times!",
"many": "You clicked {} times!", "many": "You clicked {} times!",
"other": "You clicked {} times!" "other": "You clicked {} times!",
}, },
"gender": { "gender": {
"male": "Hi man ;) ", "male": "Hi man ;) ",
"female": "Hello girl :)", "female": "Hello girl :)",
"with_arg": { "with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"},
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
}, },
"reset_locale": "Reset Language", "reset_locale": "Reset Language",
"chat": "Chat", "chat": "Chat",
@ -1371,7 +1418,8 @@ static const Map<String,dynamic> _en_US = {
"minutes": "Minutes", "minutes": "Minutes",
"seconds": "Seconds", "seconds": "Seconds",
"note": "Note:", "note": "Note:",
"demoMarathonNoteP1": "You can play the demo Marathon to learn how it works. You can join the Marathon", "demoMarathonNoteP1":
"You can play the demo Marathon to learn how it works. You can join the Marathon",
"demoMarathonNoteP2": "5 Minutes", "demoMarathonNoteP2": "5 Minutes",
"demoMarathonNoteP3": "before the actual time.", "demoMarathonNoteP3": "before the actual time.",
"sponsoredBy": "Sponsored By:", "sponsoredBy": "Sponsored By:",
@ -1394,7 +1442,8 @@ static const Map<String,dynamic> _en_US = {
"qualifiers": "Qualifiers", "qualifiers": "Qualifiers",
"qualifier": "Qualifier", "qualifier": "Qualifier",
"getReadyForContest": "Get Ready for the coming contest:", "getReadyForContest": "Get Ready for the coming contest:",
"winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "winnerSelectedRandomly":
"The winner will be selected randomly among the qualifiers.",
"fingersCrossed": "Fingers Crossed!!!", "fingersCrossed": "Fingers Crossed!!!",
"congrats": "Congratulations!!!", "congrats": "Congratulations!!!",
"otp": "OTP", "otp": "OTP",
@ -1406,11 +1455,14 @@ static const Map<String,dynamic> _en_US = {
"favorite": "My Favorites", "favorite": "My Favorites",
"searchfromchat": "Search from chat", "searchfromchat": "Search from chat",
"yourAnswerCorrect": "Your answer is correct", "yourAnswerCorrect": "Your answer is correct",
"youMissedTheQuestion": "You ran out of time. You are out of the game. But you can continue as a viewer.", "youMissedTheQuestion":
"wrongAnswer": "Your answer is Incorrect. You are out of the game. But you can continue as a viewer.", "You ran out of time. You are out of the game. But you can continue as a viewer.",
"wrongAnswer":
"Your answer is Incorrect. You are out of the game. But you can continue as a viewer.",
"oops": "Ooopsss!!!!", "oops": "Ooopsss!!!!",
"winner": "WINNER", "winner": "WINNER",
"youWantToLeaveMarathon": "Are you sure you want to go back? You will be out of the contest.", "youWantToLeaveMarathon":
"Are you sure you want to go back? You will be out of the contest.",
"ourSponsor": "Our Sponsor:", "ourSponsor": "Our Sponsor:",
"startingIn": "Starting in", "startingIn": "Starting in",
"youAreOutOfContest": "You are out of the contest.", "youAreOutOfContest": "You are out of the contest.",
@ -1419,7 +1471,8 @@ static const Map<String,dynamic> _en_US = {
"oneWeek": "1 Week", "oneWeek": "1 Week",
"twoWeek": "2 Week", "twoWeek": "2 Week",
"noUpcoming": "There is no upcoming", "noUpcoming": "There is no upcoming",
"fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.", "fakeLocation":
"We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.",
"noWinner": "Sad! No one won today.", "noWinner": "Sad! No one won today.",
"myTeam": "My Team", "myTeam": "My Team",
"youCanPlayDemo": "But you can play demo", "youCanPlayDemo": "But you can play demo",
@ -1439,13 +1492,18 @@ static const Map<String,dynamic> _en_US = {
"manage": "Manage", "manage": "Manage",
"members": "Members", "members": "Members",
"areYouSureWantTodelete": "Are you sure want to delete?", "areYouSureWantTodelete": "Are you sure want to delete?",
"confirmGrantMazayaAccess": "Are you sure you want to grant Mazaya access to \"{}\"?", "confirmGrantMazayaAccess":
"confirmRevokeMazayaAccess": "Are you sure you want to revoke Mazaya access to \"{}\"?", "Are you sure you want to grant Mazaya access to \"{}\"?",
"confirmRevokeMazayaAccess":
"Are you sure you want to revoke Mazaya access to \"{}\"?",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"mazayaInviteInstructions": "Please download the MoheM app from the above link and use the following credentials to login", "mazayaInviteInstructions":
"cameraPermissionRequiredToScan": "Please grant camera permission to scan the QR code", "Please download the MoheM app from the above link and use the following credentials to login",
"cameraPermissionPermanentlyDenied": "Please allow camera permission from the app settings > Permissions", "cameraPermissionRequiredToScan":
"Please grant camera permission to scan the QR code",
"cameraPermissionPermanentlyDenied":
"Please allow camera permission from the app settings > Permissions",
"openSettings": "Open Settings", "openSettings": "Open Settings",
"nationalIdOrIqamaFallback": "Your National ID or Iqama Number", "nationalIdOrIqamaFallback": "Your National ID or Iqama Number",
"groupMembers": "Group Members", "groupMembers": "Group Members",
@ -1466,8 +1524,10 @@ static const Map<String,dynamic> _en_US = {
"userId": "UserID", "userId": "UserID",
"open": "open", "open": "open",
"addAtLeastOneAttachment": "Please add at least one attachment.", "addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", "pleaseClickButtonToJoinMarathon":
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.", "Press the button below to join the Marathon.",
"youCannotJoinTheMarathon":
"You cannot join the Marathon because you have exceeded the time limit.",
"requesterOperatingUnit": "Requester Operating Unit", "requesterOperatingUnit": "Requester Operating Unit",
"paymentRequest": "Pay Request", "paymentRequest": "Pay Request",
"paymentDetails": "Payment Details", "paymentDetails": "Payment Details",
@ -1519,7 +1579,8 @@ static const Map<String,dynamic> _en_US = {
"explore": "Explore", "explore": "Explore",
"mazaya": "MAZAYA", "mazaya": "MAZAYA",
"benefits": "Benefits", "benefits": "Benefits",
"mazayaDesc": "Discover special Discounts and offers available to Employees", "mazayaDesc":
"Discover special Discounts and offers available to Employees",
"viewallofferMazaya": "View All Offers", "viewallofferMazaya": "View All Offers",
"buyerName": "Buyer Name", "buyerName": "Buyer Name",
"buyerNumber": "Buyer Number", "buyerNumber": "Buyer Number",
@ -1578,21 +1639,26 @@ static const Map<String,dynamic> _en_US = {
"amuLastThreeMonths": "AMU (Last 3 months)", "amuLastThreeMonths": "AMU (Last 3 months)",
"mazayaTitle": "Mazaya", "mazayaTitle": "Mazaya",
"mazayaAccessGranted": "Mazaya access granted", "mazayaAccessGranted": "Mazaya access granted",
"mazayaAccessGrantedDesc": "{} now has active access. Share the download link below so they can install the Mohem app and complete setup.", "mazayaAccessGrantedDesc":
"{} now has active access. Share the download link below so they can install the Mohem app and complete setup.",
"accessIsNowActive": "Access is now active", "accessIsNowActive": "Access is now active",
"accessIsNowActiveDesc": "{} can use the provided link to download the Mazaya app and continue setup on their device.", "accessIsNowActiveDesc":
"{} can use the provided link to download the Mazaya app and continue setup on their device.",
"dependentAccessActive": "Dependent access active", "dependentAccessActive": "Dependent access active",
"shareableAppDownloadLink": "Shareable app-download link", "shareableAppDownloadLink": "Shareable app-download link",
"shareableAppDownloadLinkDesc": "Send this link to {} so they can download the Mazaya app and continue setup.", "shareableAppDownloadLinkDesc":
"Send this link to {} so they can download the Mazaya app and continue setup.",
"downloadLink": "Download link", "downloadLink": "Download link",
"shareDownloadLink": "Share Download Link", "shareDownloadLink": "Share Download Link",
"copyLink": "Copy Link", "copyLink": "Copy Link",
"done": "Done", "done": "Done",
"linkCopied": "Link copied to clipboard", "linkCopied": "Link copied to clipboard",
"mazayaAccessRevoked": "Mazaya Access", "mazayaAccessRevoked": "Mazaya Access",
"mazayaAccessRevokedDesc": "You are not authorized to access the Mazaya Program.", "mazayaAccessRevokedDesc":
"You are not authorized to access the Mazaya Program.",
"contactYourSponsor": "Contact your sponsor", "contactYourSponsor": "Contact your sponsor",
"contactYourSponsorDesc": "Ask your sponsor to allow Mazaya access again from Dependent Details. Only the sponsor can restore access.", "contactYourSponsorDesc":
"Ask your sponsor to allow Mazaya access again from Dependent Details. Only the sponsor can restore access.",
"dependentAccessBlocked": "Dependent access blocked", "dependentAccessBlocked": "Dependent access blocked",
"returnToSignIn": "Return to Sign In", "returnToSignIn": "Return to Sign In",
"allowMazayaAccess": "Allow Mazaya Access", "allowMazayaAccess": "Allow Mazaya Access",
@ -1621,9 +1687,11 @@ static const Map<String,dynamic> _en_US = {
"searchFamilyMembers": "Search family members", "searchFamilyMembers": "Search family members",
"addAnotherUser": "Add another user", "addAnotherUser": "Add another user",
"joinMazaya": "Join Mazaya", "joinMazaya": "Join Mazaya",
"joinMazayaSubtitle": "Get the best offers and exclusive deals across dining, shopping, and lifestyle rewards.", "joinMazayaSubtitle":
"Get the best offers and exclusive deals across dining, shopping, and lifestyle rewards.",
"continueAsEmployee": "Continue as an employee", "continueAsEmployee": "Continue as an employee",
"continueAsEmployeeSubtitle": "Sign in with your employee username and password.", "continueAsEmployeeSubtitle":
"Sign in with your employee username and password.",
"pleaseEnterNationalId": "Please enter National ID", "pleaseEnterNationalId": "Please enter National ID",
"pleaseSelectDob": "Please select Date of Birth", "pleaseSelectDob": "Please select Date of Birth",
"unableToRetrieveDependentInfo": "Unable to retrieve dependent information", "unableToRetrieveDependentInfo": "Unable to retrieve dependent information",
@ -1635,12 +1703,14 @@ static const Map<String,dynamic> _en_US = {
"stepBasic": "Basic", "stepBasic": "Basic",
"stepAdditional": "Additional", "stepAdditional": "Additional",
"findYourDependent": "Find your dependent", "findYourDependent": "Find your dependent",
"findYourDependentDesc": "Enter the details exactly as they appear on the National ID. We'll securely retrieve the record from NHIC.", "findYourDependentDesc":
"Enter the details exactly as they appear on the National ID. We'll securely retrieve the record from NHIC.",
"enter10DigitNationalId": "Enter 10-digit National ID", "enter10DigitNationalId": "Enter 10-digit National ID",
"nationalIdMustBe10Digits": "National ID must be 10 digits", "nationalIdMustBe10Digits": "National ID must be 10 digits",
"dateFormatPlaceholder": "DD / MM / YYYY", "dateFormatPlaceholder": "DD / MM / YYYY",
"searchUser": "Search User", "searchUser": "Search User",
"dependentNotFoundNhic": "Sorry, error while getting dependent info from NHIC", "dependentNotFoundNhic":
"Sorry, error while getting dependent info from NHIC",
"basicInfo": "Basic Info", "basicInfo": "Basic Info",
"basicInfoDesc": "Required identity details fetched from NHIC.", "basicInfoDesc": "Required identity details fetched from NHIC.",
"additionalInfo": "Additional Info", "additionalInfo": "Additional Info",
@ -1650,7 +1720,8 @@ static const Map<String,dynamic> _en_US = {
"requiredField": "Required field", "requiredField": "Required field",
"pleaseFillField": "Please fill {}", "pleaseFillField": "Please fill {}",
"reviewAndSubmit": "Review & Submit", "reviewAndSubmit": "Review & Submit",
"reviewAndSubmitDesc": "Please review the dependent details carefully before submitting.", "reviewAndSubmitDesc":
"Please review the dependent details carefully before submitting.",
"arabicName": "Arabic Name", "arabicName": "Arabic Name",
"relationship": "Relationship", "relationship": "Relationship",
"sponsor": "Sponsor", "sponsor": "Sponsor",
@ -1663,8 +1734,10 @@ static const Map<String,dynamic> _en_US = {
"religionIslam": "Islam", "religionIslam": "Islam",
"back": "Back", "back": "Back",
"submitRequest": "Submit", "submitRequest": "Submit",
"enterDependentDetailsToContinue": "Enter the dependent details to continue.", "enterDependentDetailsToContinue":
"enterBasicDetailsDesc": "Please enter the dependent's basic identity details.", "Enter the dependent details to continue.",
"enterBasicDetailsDesc":
"Please enter the dependent's basic identity details.",
"locations": "Locations", "locations": "Locations",
"availableOffers": "Available Offers", "availableOffers": "Available Offers",
"selectOfferToRedeem": "Select an offer to use", "selectOfferToRedeem": "Select an offer to use",
@ -1682,18 +1755,24 @@ static const Map<String,dynamic> _en_US = {
"verified": "Verified", "verified": "Verified",
"idEnding": "ID ending {}", "idEnding": "ID ending {}",
"servicesAndActions": "Services & actions", "servicesAndActions": "Services & actions",
"startDependentFlowsDesc": "Start dependent flows and manage access from one place.", "startDependentFlowsDesc":
"Start dependent flows and manage access from one place.",
"mazayaAccess": "Mazaya access", "mazayaAccess": "Mazaya access",
"accessOff": "Off", "accessOff": "Off",
"allowDependentMazayaOffersDesc": "Allow {} to use Mazaya offers with her verified identity.", "allowDependentMazayaOffersDesc":
"Allow {} to use Mazaya offers with her verified identity.",
"loginMethod": "Login method", "loginMethod": "Login method",
"nationalIdAndDob": "National ID & Date of Birth", "nationalIdAndDob": "National ID & Date of Birth",
"sponsorOtp": "Sponsor OTP", "sponsorOtp": "Sponsor OTP",
"revokingPreventsAccessDesc": "Revoking prevents all future dependent access until you allow it again.", "revokingPreventsAccessDesc":
"locationPermissionRequiredForAttendance": "You need to give location permission to mark attendance", "Revoking prevents all future dependent access until you allow it again.",
"locationServicesRequiredForAttendance": "You need to enable location services to mark attendance", "locationPermissionRequiredForAttendance":
"You need to give location permission to mark attendance",
"locationServicesRequiredForAttendance":
"You need to enable location services to mark attendance",
"pleaseProvideLocationPermission": "Please provide location permission", "pleaseProvideLocationPermission": "Please provide location permission",
"microphoneAccessRequired": "The app needs microphone access to be able to record audio.", "microphoneAccessRequired":
"The app needs microphone access to be able to record audio.",
"shareAccessGuide": "Share Access Guide", "shareAccessGuide": "Share Access Guide",
"nationalIdOrIqamaNumber": "National ID or Iqama Number", "nationalIdOrIqamaNumber": "National ID or Iqama Number",
"multipleCities": "Multi-city", "multipleCities": "Multi-city",
@ -1715,21 +1794,28 @@ static const Map<String,dynamic> _en_US = {
"discountPercentPlus": "{}%+", "discountPercentPlus": "{}%+",
"visitMerchantWebsite": "Visit Merchant Website", "visitMerchantWebsite": "Visit Merchant Website",
"merchantWebsiteNotAvailable": "Merchant website not available", "merchantWebsiteNotAvailable": "Merchant website not available",
"locationServicesRequiredForNearestOffers": "You need to enable location services to show nearest offers", "locationServicesRequiredForNearestOffers":
"locationPermissionRequiredForNearestOffers": "You need to give location permission to show nearest offers", "You need to enable location services to show nearest offers",
"locationPermissionRequiredForNearestOffers":
"You need to give location permission to show nearest offers",
"mazayaDeals": "Mazaya Deals", "mazayaDeals": "Mazaya Deals",
"helloName": "Hello, {}",
"findABrandOrSomething": "Find a brand or a little something", "findABrandOrSomething": "Find a brand or a little something",
"exploreYourBenefits": "Explore your benefits", "exploreYourBenefits": "Explore your benefits",
"theMazayaEdit": "The Mazaya Edit", "theMazayaEdit": "The Mazaya Edit",
"exclusivelyYours": "Exclusively yours", "exclusivelyYours": "Exclusively yours",
"aLittleExtraJustForMazayaMembers": "A little extra, just for Mazaya members.", "aLittleExtraJustForMazayaMembers":
"A little extra, just for Mazaya members.",
"seeAll": "See all", "seeAll": "See all",
"latestOnMazaya": "Latest on Mazaya", "latestOnMazaya": "Latest on Mazaya",
"goodFoodGreatCompanyEvenBetterPerks": "Good food. Great company. Even better perks.", "goodFoodGreatCompanyEvenBetterPerks":
"Good food. Great company. Even better perks.",
"travelEssentials": "Travel Essentials", "travelEssentials": "Travel Essentials",
"fromEverydayCareToYourNextAdventure": "From everyday care to your next adventure.", "fromEverydayCareToYourNextAdventure":
"From everyday care to your next adventure.",
"homeAndKitchen": "Home & Kitchen", "homeAndKitchen": "Home & Kitchen",
"curatedPicksForYourHomeAndKitchen": "Curated picks for your home and kitchen.", "curatedPicksForYourHomeAndKitchen":
"Curated picks for your home and kitchen.",
"discover": "Discover", "discover": "Discover",
"saved": "Saved", "saved": "Saved",
"myFamily": "My Family", "myFamily": "My Family",
@ -1744,7 +1830,8 @@ static const Map<String,dynamic> _en_US = {
"favoriteMerchant": "Favorite Offers", "favoriteMerchant": "Favorite Offers",
"favoriteOffers": "Favorite Offers", "favoriteOffers": "Favorite Offers",
"goodToKnow": "Good to know", "goodToKnow": "Good to know",
"goodToKnowDesc": "Keep your Mazaya membership handy. Check the merchant's availability, eligible activities and full terms before you book.", "goodToKnowDesc":
"Keep your Mazaya membership handy. Check the merchant's availability, eligible activities and full terms before you book.",
"termsAndConditions": "Terms & conditions", "termsAndConditions": "Terms & conditions",
"haveAQuestionAboutOffer": "Have a question about this offer?", "haveAQuestionAboutOffer": "Have a question about this offer?",
"getHelp": "Get help", "getHelp": "Get help",
@ -1761,6 +1848,9 @@ static const Map<String,dynamic> _en_US = {
"mazayaExclusive": "MAZAYA EXCLUSIVE", "mazayaExclusive": "MAZAYA EXCLUSIVE",
"youAreAllCaughtUp": "You're all caught up. More little extras soon.", "youAreAllCaughtUp": "You're all caught up. More little extras soon.",
"selectCity": "Select City", "selectCity": "Select City",
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US}; static const Map<String, Map<String, dynamic>> mapLocales = {
"ar_SA": _ar_SA,
"en_US": _en_US,
};
} }

@ -14,7 +14,8 @@ abstract class LocaleKeys {
static const userSearch = 'userSearch'; static const userSearch = 'userSearch';
static const password = 'password'; static const password = 'password';
static const welcomeBack = 'welcomeBack'; static const welcomeBack = 'welcomeBack';
static const wouldYouLikeToLoginWithCurrentUsername = 'wouldYouLikeToLoginWithCurrentUsername'; static const wouldYouLikeToLoginWithCurrentUsername =
'wouldYouLikeToLoginWithCurrentUsername';
static const lastLoginDetails = 'lastLoginDetails'; static const lastLoginDetails = 'lastLoginDetails';
static const verificationType = 'verificationType'; static const verificationType = 'verificationType';
static const pleaseVerify = 'pleaseVerify'; static const pleaseVerify = 'pleaseVerify';
@ -24,8 +25,10 @@ abstract class LocaleKeys {
static const verifyThroughSMS = 'verifyThroughSMS'; static const verifyThroughSMS = 'verifyThroughSMS';
static const verifyThroughWhatsapp = 'verifyThroughWhatsapp'; static const verifyThroughWhatsapp = 'verifyThroughWhatsapp';
static const useAnotherAccount = 'useAnotherAccount'; static const useAnotherAccount = 'useAnotherAccount';
static const pleaseEnterTheVerificationCodeSentTo = 'pleaseEnterTheVerificationCodeSentTo'; static const pleaseEnterTheVerificationCodeSentTo =
static const theVerificationCodeWillExpireIn = 'theVerificationCodeWillExpireIn'; 'pleaseEnterTheVerificationCodeSentTo';
static const theVerificationCodeWillExpireIn =
'theVerificationCodeWillExpireIn';
static const goodMorning = 'goodMorning'; static const goodMorning = 'goodMorning';
static const markAttendance = 'markAttendance'; static const markAttendance = 'markAttendance';
static const timeLeftToday = 'timeLeftToday'; static const timeLeftToday = 'timeLeftToday';
@ -49,7 +52,8 @@ abstract class LocaleKeys {
static const newString = 'newString'; static const newString = 'newString';
static const setTheNewPassword = 'setTheNewPassword'; static const setTheNewPassword = 'setTheNewPassword';
static const typeYourNewPasswordBelow = 'typeYourNewPasswordBelow'; static const typeYourNewPasswordBelow = 'typeYourNewPasswordBelow';
static const typeYourNewActiveDirectoryPasswordBelow = 'typeYourNewActiveDirectoryPasswordBelow'; static const typeYourNewActiveDirectoryPasswordBelow =
'typeYourNewActiveDirectoryPasswordBelow';
static const confirmPassword = 'confirmPassword'; static const confirmPassword = 'confirmPassword';
static const update = 'update'; static const update = 'update';
static const title = 'title'; static const title = 'title';
@ -58,7 +62,8 @@ abstract class LocaleKeys {
static const createRequest = 'createRequest'; static const createRequest = 'createRequest';
static const forgotPassword = 'forgotPassword'; static const forgotPassword = 'forgotPassword';
static const employeeId = 'employeeId'; static const employeeId = 'employeeId';
static const loginCodeWillSentToMobileNumber = 'loginCodeWillSentToMobileNumber'; static const loginCodeWillSentToMobileNumber =
'loginCodeWillSentToMobileNumber';
static const changePassword = 'changePassword'; static const changePassword = 'changePassword';
static const ok = 'ok'; static const ok = 'ok';
static const confirm = 'confirm'; static const confirm = 'confirm';
@ -94,7 +99,8 @@ abstract class LocaleKeys {
static const atLeastOneNumeric = 'atLeastOneNumeric'; static const atLeastOneNumeric = 'atLeastOneNumeric';
static const minimum8Characters = 'minimum8Characters'; static const minimum8Characters = 'minimum8Characters';
static const doNotAddRepeatingLetters = 'doNotAddRepeatingLetters'; static const doNotAddRepeatingLetters = 'doNotAddRepeatingLetters';
static const itShouldContainSpecialCharacter = 'itShouldContainSpecialCharacter'; static const itShouldContainSpecialCharacter =
'itShouldContainSpecialCharacter';
static const confirmPasswordMustMatch = 'confirmPasswordMustMatch'; static const confirmPasswordMustMatch = 'confirmPasswordMustMatch';
static const sms = 'sms'; static const sms = 'sms';
static const fingerPrint = 'fingerPrint'; static const fingerPrint = 'fingerPrint';
@ -137,7 +143,8 @@ abstract class LocaleKeys {
static const category = 'category'; static const category = 'category';
static const employeeEmailAddress = 'employeeEmailAddress'; static const employeeEmailAddress = 'employeeEmailAddress';
static const payrollBranch = 'payrollBranch'; static const payrollBranch = 'payrollBranch';
static const yourChangeHasBeenSavedSuccessfully = 'yourChangeHasBeenSavedSuccessfully'; static const yourChangeHasBeenSavedSuccessfully =
'yourChangeHasBeenSavedSuccessfully';
static const code = 'code'; static const code = 'code';
static const unit = 'unit'; static const unit = 'unit';
static const quantity = 'quantity'; static const quantity = 'quantity';
@ -232,7 +239,8 @@ abstract class LocaleKeys {
static const templateName = 'templateName'; static const templateName = 'templateName';
static const itemCreationStatus = 'itemCreationStatus'; static const itemCreationStatus = 'itemCreationStatus';
static const standardizationApprovalStatus = 'standardizationApprovalStatus'; static const standardizationApprovalStatus = 'standardizationApprovalStatus';
static const standardizationApprovalRejectionReason = 'standardizationApprovalRejectionReason'; static const standardizationApprovalRejectionReason =
'standardizationApprovalRejectionReason';
static const analyzedBy = 'analyzedBy'; static const analyzedBy = 'analyzedBy';
static const approvedDate = 'approvedDate'; static const approvedDate = 'approvedDate';
static const itemType = 'itemType'; static const itemType = 'itemType';
@ -267,7 +275,8 @@ abstract class LocaleKeys {
static const comments = 'comments'; static const comments = 'comments';
static const writeComment = 'writeComment'; static const writeComment = 'writeComment';
static const approversList = 'approversList'; static const approversList = 'approversList';
static const yourRequestHasBeenSubmittedForApprovals = 'yourRequestHasBeenSubmittedForApprovals'; static const yourRequestHasBeenSubmittedForApprovals =
'yourRequestHasBeenSubmittedForApprovals';
static const monthlyPaySlip = 'monthlyPaySlip'; static const monthlyPaySlip = 'monthlyPaySlip';
static const particular = 'particular'; static const particular = 'particular';
static const earnings = 'earnings'; static const earnings = 'earnings';
@ -336,7 +345,8 @@ abstract class LocaleKeys {
static const mark = 'mark'; static const mark = 'mark';
static const selectMethodOfAttendance = 'selectMethodOfAttendance'; static const selectMethodOfAttendance = 'selectMethodOfAttendance';
static const comeNearHMGWifi = 'comeNearHMGWifi'; static const comeNearHMGWifi = 'comeNearHMGWifi';
static const deliverNotificationToMeRegardless = 'deliverNotificationToMeRegardless'; static const deliverNotificationToMeRegardless =
'deliverNotificationToMeRegardless';
static const close = 'close'; static const close = 'close';
static const respond = 'respond'; static const respond = 'respond';
static const vacationRuleAdded = 'vacationRuleAdded'; static const vacationRuleAdded = 'vacationRuleAdded';
@ -355,8 +365,10 @@ abstract class LocaleKeys {
static const searchEmployeeForReplacement = 'searchEmployeeForReplacement'; static const searchEmployeeForReplacement = 'searchEmployeeForReplacement';
static const searchForEmployee = 'searchForEmployee'; static const searchForEmployee = 'searchForEmployee';
static const pleaseSpecifyEndTime = 'pleaseSpecifyEndTime'; static const pleaseSpecifyEndTime = 'pleaseSpecifyEndTime';
static const pleaseSelectNotificationReassign = 'pleaseSelectNotificationReassign'; static const pleaseSelectNotificationReassign =
static const pleaseSelectEmployeeForReplacement = 'pleaseSelectEmployeeForReplacement'; 'pleaseSelectNotificationReassign';
static const pleaseSelectEmployeeForReplacement =
'pleaseSelectEmployeeForReplacement';
static const pleaseSelectAction = 'pleaseSelectAction'; static const pleaseSelectAction = 'pleaseSelectAction';
static const pleaseSelectDate = 'pleaseSelectDate'; static const pleaseSelectDate = 'pleaseSelectDate';
static const todayAttendance = 'todayAttendance'; static const todayAttendance = 'todayAttendance';
@ -441,8 +453,10 @@ abstract class LocaleKeys {
static const CorrectAddress = 'CorrectAddress'; static const CorrectAddress = 'CorrectAddress';
static const SelectChangeWantToMake = 'SelectChangeWantToMake'; static const SelectChangeWantToMake = 'SelectChangeWantToMake';
static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_label = 'profile.reset_password.label';
static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_username =
static const profile_reset_password_password = 'profile.reset_password.password'; 'profile.reset_password.username';
static const profile_reset_password_password =
'profile.reset_password.password';
static const profile_reset_password = 'profile.reset_password'; static const profile_reset_password = 'profile.reset_password';
static const profile_profileCompletionPer = 'profile.profileCompletionPer'; static const profile_profileCompletionPer = 'profile.profileCompletionPer';
static const profile_completeProfile = 'profile.completeProfile'; static const profile_completeProfile = 'profile.completeProfile';
@ -537,7 +551,8 @@ abstract class LocaleKeys {
static const missingDocuments = 'missingDocuments'; static const missingDocuments = 'missingDocuments';
static const uploadedDocuments = 'uploadedDocuments'; static const uploadedDocuments = 'uploadedDocuments';
static const addAtLeastOneAttachment = 'addAtLeastOneAttachment'; static const addAtLeastOneAttachment = 'addAtLeastOneAttachment';
static const pleaseClickButtonToJoinMarathon = 'pleaseClickButtonToJoinMarathon'; static const pleaseClickButtonToJoinMarathon =
'pleaseClickButtonToJoinMarathon';
static const youCannotJoinTheMarathon = 'youCannotJoinTheMarathon'; static const youCannotJoinTheMarathon = 'youCannotJoinTheMarathon';
static const open = 'open'; static const open = 'open';
static const paymentRequest = 'paymentRequest'; static const paymentRequest = 'paymentRequest';
@ -595,8 +610,10 @@ abstract class LocaleKeys {
static const yes = 'yes'; static const yes = 'yes';
static const no = 'no'; static const no = 'no';
static const mazayaInviteInstructions = 'mazayaInviteInstructions'; static const mazayaInviteInstructions = 'mazayaInviteInstructions';
static const cameraPermissionRequiredToScan = 'cameraPermissionRequiredToScan'; static const cameraPermissionRequiredToScan =
static const cameraPermissionPermanentlyDenied = 'cameraPermissionPermanentlyDenied'; 'cameraPermissionRequiredToScan';
static const cameraPermissionPermanentlyDenied =
'cameraPermissionPermanentlyDenied';
static const openSettings = 'openSettings'; static const openSettings = 'openSettings';
static const nationalIdOrIqamaFallback = 'nationalIdOrIqamaFallback'; static const nationalIdOrIqamaFallback = 'nationalIdOrIqamaFallback';
static const Attendance = 'Attendance'; static const Attendance = 'Attendance';
@ -761,7 +778,8 @@ abstract class LocaleKeys {
static const religionIslam = 'religionIslam'; static const religionIslam = 'religionIslam';
static const back = 'back'; static const back = 'back';
static const submitRequest = 'submitRequest'; static const submitRequest = 'submitRequest';
static const enterDependentDetailsToContinue = 'enterDependentDetailsToContinue'; static const enterDependentDetailsToContinue =
'enterDependentDetailsToContinue';
static const enterBasicDetailsDesc = 'enterBasicDetailsDesc'; static const enterBasicDetailsDesc = 'enterBasicDetailsDesc';
static const locations = 'locations'; static const locations = 'locations';
static const availableOffers = 'availableOffers'; static const availableOffers = 'availableOffers';
@ -783,14 +801,18 @@ abstract class LocaleKeys {
static const startDependentFlowsDesc = 'startDependentFlowsDesc'; static const startDependentFlowsDesc = 'startDependentFlowsDesc';
static const mazayaAccess = 'mazayaAccess'; static const mazayaAccess = 'mazayaAccess';
static const accessOff = 'accessOff'; static const accessOff = 'accessOff';
static const allowDependentMazayaOffersDesc = 'allowDependentMazayaOffersDesc'; static const allowDependentMazayaOffersDesc =
'allowDependentMazayaOffersDesc';
static const loginMethod = 'loginMethod'; static const loginMethod = 'loginMethod';
static const nationalIdAndDob = 'nationalIdAndDob'; static const nationalIdAndDob = 'nationalIdAndDob';
static const sponsorOtp = 'sponsorOtp'; static const sponsorOtp = 'sponsorOtp';
static const revokingPreventsAccessDesc = 'revokingPreventsAccessDesc'; static const revokingPreventsAccessDesc = 'revokingPreventsAccessDesc';
static const locationPermissionRequiredForAttendance = 'locationPermissionRequiredForAttendance'; static const locationPermissionRequiredForAttendance =
static const locationServicesRequiredForAttendance = 'locationServicesRequiredForAttendance'; 'locationPermissionRequiredForAttendance';
static const pleaseProvideLocationPermission = 'pleaseProvideLocationPermission'; static const locationServicesRequiredForAttendance =
'locationServicesRequiredForAttendance';
static const pleaseProvideLocationPermission =
'pleaseProvideLocationPermission';
static const microphoneAccessRequired = 'microphoneAccessRequired'; static const microphoneAccessRequired = 'microphoneAccessRequired';
static const shareAccessGuide = 'shareAccessGuide'; static const shareAccessGuide = 'shareAccessGuide';
static const nationalIdOrIqamaNumber = 'nationalIdOrIqamaNumber'; static const nationalIdOrIqamaNumber = 'nationalIdOrIqamaNumber';
@ -816,21 +838,28 @@ abstract class LocaleKeys {
static const favoriteRemovedSuccess = 'favoriteRemovedSuccess'; static const favoriteRemovedSuccess = 'favoriteRemovedSuccess';
static const favoriteError = 'favoriteError'; static const favoriteError = 'favoriteError';
static const merchantWebsiteNotAvailable = 'merchantWebsiteNotAvailable'; static const merchantWebsiteNotAvailable = 'merchantWebsiteNotAvailable';
static const locationServicesRequiredForNearestOffers = 'locationServicesRequiredForNearestOffers'; static const locationServicesRequiredForNearestOffers =
static const locationPermissionRequiredForNearestOffers = 'locationPermissionRequiredForNearestOffers'; 'locationServicesRequiredForNearestOffers';
static const locationPermissionRequiredForNearestOffers =
'locationPermissionRequiredForNearestOffers';
static const mazayaDeals = 'mazayaDeals'; static const mazayaDeals = 'mazayaDeals';
static const helloName = 'helloName';
static const findABrandOrSomething = 'findABrandOrSomething'; static const findABrandOrSomething = 'findABrandOrSomething';
static const exploreYourBenefits = 'exploreYourBenefits'; static const exploreYourBenefits = 'exploreYourBenefits';
static const theMazayaEdit = 'theMazayaEdit'; static const theMazayaEdit = 'theMazayaEdit';
static const exclusivelyYours = 'exclusivelyYours'; static const exclusivelyYours = 'exclusivelyYours';
static const aLittleExtraJustForMazayaMembers = 'aLittleExtraJustForMazayaMembers'; static const aLittleExtraJustForMazayaMembers =
'aLittleExtraJustForMazayaMembers';
static const seeAll = 'seeAll'; static const seeAll = 'seeAll';
static const latestOnMazaya = 'latestOnMazaya'; static const latestOnMazaya = 'latestOnMazaya';
static const goodFoodGreatCompanyEvenBetterPerks = 'goodFoodGreatCompanyEvenBetterPerks'; static const goodFoodGreatCompanyEvenBetterPerks =
'goodFoodGreatCompanyEvenBetterPerks';
static const travelEssentials = 'travelEssentials'; static const travelEssentials = 'travelEssentials';
static const fromEverydayCareToYourNextAdventure = 'fromEverydayCareToYourNextAdventure'; static const fromEverydayCareToYourNextAdventure =
'fromEverydayCareToYourNextAdventure';
static const homeAndKitchen = 'homeAndKitchen'; static const homeAndKitchen = 'homeAndKitchen';
static const curatedPicksForYourHomeAndKitchen = 'curatedPicksForYourHomeAndKitchen'; static const curatedPicksForYourHomeAndKitchen =
'curatedPicksForYourHomeAndKitchen';
static const discover = 'discover'; static const discover = 'discover';
static const saved = 'saved'; static const saved = 'saved';
static const myFamily = 'myFamily'; static const myFamily = 'myFamily';
@ -859,5 +888,4 @@ abstract class LocaleKeys {
static const mazayaExclusive = 'mazayaExclusive'; static const mazayaExclusive = 'mazayaExclusive';
static const youAreAllCaughtUp = 'youAreAllCaughtUp'; static const youAreAllCaughtUp = 'youAreAllCaughtUp';
static const selectCity = 'selectCity'; static const selectCity = 'selectCity';
} }

@ -237,6 +237,19 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
} }
} }
// AppState().dependentName sometimes comes back with stray " - " separators (e.g.
// "John - Smith") - collapse those into plain spaces for display.
String? get _dependentGreetingName {
String? raw = AppState().dependentName;
if (raw == null || raw.trim().isEmpty) return null;
String cleaned =
raw
.replaceAll(RegExp(r'\s*-\s*'), ' ')
.replaceAll(RegExp(r'\s+'), ' ')
.trim();
return cleaned.isEmpty ? null : cleaned;
}
void _openRetailer(WalaPlusRetailerModel item) { void _openRetailer(WalaPlusRetailerModel item) {
Navigator.pushNamed( Navigator.pushNamed(
context, context,
@ -264,6 +277,23 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
); );
} }
// Tapping the search field opens the same "all categories / newest" data as "Latest on
// Mazaya"'s See all, but with the category hero hidden and the search bar auto-focused with
// the keyboard open (see RetailersListScreen's isSearchMode) instead of landing on Travel.
void _openSearchGrid() {
Navigator.pushNamed(
context,
AppRoutes.retailersListScreen,
arguments: <String, dynamic>{
'category': WalaPlusCategoryModel(
id: 'all',
name: LocaleKeys.allCategories.tr(),
),
'searchMode': true,
},
);
}
Future<void> _onRefresh() async { Future<void> _onRefresh() async {
await Future.wait<void>(<Future<void>>[ await Future.wait<void>(<Future<void>>[
_fetchCategories(), _fetchCategories(),
@ -366,11 +396,13 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
context, context,
title: LocaleKeys.mazayaDeals.tr(), title: LocaleKeys.mazayaDeals.tr(),
showHomeButton: false, showHomeButton: false,
// Discover is the dependent-login landing page - no back button there (logout is still
// reachable via the explicit logout action below). Employees reaching Discover from the
// regular dashboard can still pop back normally.
showBackButton: !ApiConsts.isDependetLogin,
onBackTapped: () { onBackTapped: () {
if (Navigator.canPop(context)) { if (Navigator.canPop(context)) {
Navigator.pop(context); Navigator.pop(context);
} else if (ApiConsts.isDependetLogin) {
_performLogout();
} }
}, },
actions: actions:
@ -407,6 +439,13 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
if (ApiConsts.isDependetLogin && _dependentGreetingName != null)
Padding(
padding: const EdgeInsets.fromLTRB(22, 16, 22, 0),
child: LocaleKeys.helloName
.tr(args: [_dependentGreetingName!])
.toText20(isBold: true, color: const Color(0xFF202F31)),
),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(22, 16, 22, 0), padding: const EdgeInsets.fromLTRB(22, 16, 22, 0),
child: _buildSearchField(), child: _buildSearchField(),
@ -506,7 +545,7 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
), ),
), ),
style: const TextStyle(fontSize: 12, color: Color(0xFF202F32)), style: const TextStyle(fontSize: 12, color: Color(0xFF202F32)),
onTap: _openRetailersGrid, onTap: _openSearchGrid,
readOnly: true, readOnly: true,
), ),
), ),
@ -669,6 +708,7 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
} }
Widget _buildExclusiveOffersSection() { Widget _buildExclusiveOffersSection() {
bool isAr = AppState().isArabic(context);
return Container( return Container(
width: double.infinity, width: double.infinity,
color: const Color(0xFF143F36), color: const Color(0xFF143F36),
@ -705,7 +745,9 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
weight: FontWeight.w500, weight: FontWeight.w500,
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( RotatedBox(
quarterTurns: isAr ? 2 : 0,
child: SvgPicture.asset(
"assets/icons/mazaya_arrow_right.svg", "assets/icons/mazaya_arrow_right.svg",
width: 15, width: 15,
height: 15, height: 15,
@ -714,6 +756,7 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
BlendMode.srcIn, BlendMode.srcIn,
), ),
), ),
),
], ],
), ),
), ),
@ -868,6 +911,7 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
required VoidCallback onSeeAll, required VoidCallback onSeeAll,
}) { }) {
if (!isLoading && retailers.isEmpty) return const SizedBox.shrink(); if (!isLoading && retailers.isEmpty) return const SizedBox.shrink();
bool isAr = AppState().isArabic(context);
return Container( return Container(
width: double.infinity, width: double.infinity,
color: backgroundColor, color: backgroundColor,
@ -897,7 +941,9 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
weight: FontWeight.w500, weight: FontWeight.w500,
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
SvgPicture.asset( RotatedBox(
quarterTurns: isAr ? 2 : 0,
child: SvgPicture.asset(
"assets/icons/mazaya_arrow_right.svg", "assets/icons/mazaya_arrow_right.svg",
width: 15, width: 15,
height: 15, height: 15,
@ -906,6 +952,7 @@ class _MazayaDiscoverScreenState extends State<MazayaDiscoverScreen> {
BlendMode.srcIn, BlendMode.srcIn,
), ),
), ),
),
], ],
), ),
), ),

@ -52,6 +52,13 @@ class _RetailersListScreenState extends State<RetailersListScreen> {
bool isExclusiveMode = false; bool isExclusiveMode = false;
List<WalaPlusRetailerModel> _exclusiveOffers = <WalaPlusRetailerModel>[]; List<WalaPlusRetailerModel> _exclusiveOffers = <WalaPlusRetailerModel>[];
// Reached by tapping Discover's search field - same "all categories / newest" data as the
// "Latest on Mazaya" See all, but the category hero is hidden (there's no specific category
// context, it's a pure search entry point) and the search bar auto-focuses with the keyboard
// open instead.
bool isSearchMode = false;
final FocusNode _searchFocusNode = FocusNode();
// Subcategories of whichever main category is currently selected - fetched via // Subcategories of whichever main category is currently selected - fetched via
// getWalaPlusCategories(parentId: ...) whenever a main category card is tapped. Empty/cleared // getWalaPlusCategories(parentId: ...) whenever a main category card is tapped. Empty/cleared
// when "All Categories" (or nothing) is selected, since there's no specific parent to ask for. // when "All Categories" (or nothing) is selected, since there's no specific parent to ask for.
@ -112,6 +119,12 @@ class _RetailersListScreenState extends State<RetailersListScreen> {
selectedCategory = args['category'] as WalaPlusCategoryModel; selectedCategory = args['category'] as WalaPlusCategoryModel;
currentCategoryId = selectedCategory?.id ?? ""; currentCategoryId = selectedCategory?.id ?? "";
} }
if (args is Map && args['searchMode'] == true) {
isSearchMode = true;
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) _searchFocusNode.requestFocus();
});
}
} }
} }
@ -193,6 +206,7 @@ class _RetailersListScreenState extends State<RetailersListScreen> {
_scrollController.removeListener(_scrollListener); _scrollController.removeListener(_scrollListener);
_scrollController.dispose(); _scrollController.dispose();
_searchController.dispose(); _searchController.dispose();
_searchFocusNode.dispose();
super.dispose(); super.dispose();
} }
@ -994,8 +1008,10 @@ class _RetailersListScreenState extends State<RetailersListScreen> {
// 1. Sub-header: "Explore your benefits" | "📍 Riyadh" // 1. Sub-header: "Explore your benefits" | "📍 Riyadh"
_buildSubHeaderRow(isAr), _buildSubHeaderRow(isAr),
// 2. Category Hero Section: Title, Subtitle, Category image // 2. Category Hero Section: Title, Subtitle, Category image - hidden when
_buildCategoryHero(isAr), // reached from Discover's search field, since there's no specific category
// context there and the search bar should be the first thing on screen.
if (!isSearchMode) _buildCategoryHero(isAr),
// 3. Search Bar: "Find an escape or an experience" // 3. Search Bar: "Find an escape or an experience"
_buildSearchBar(isAr), _buildSearchBar(isAr),
@ -1239,6 +1255,7 @@ class _RetailersListScreenState extends State<RetailersListScreen> {
Expanded( Expanded(
child: TextField( child: TextField(
controller: _searchController, controller: _searchController,
focusNode: _searchFocusNode,
onChanged: _onSearchChanged, onChanged: _onSearchChanged,
onSubmitted: (String val) { onSubmitted: (String val) {
_debounceTimer?.cancel(); _debounceTimer?.cancel();

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/offers_and_discounts_api_client.dart'; import 'package:mohem_flutter_app/api/offers_and_discounts_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/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';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -257,6 +258,9 @@ class _SavedRetailersScreenState extends State<SavedRetailersScreen> {
context, context,
title: LocaleKeys.favoriteOffers.tr(), title: LocaleKeys.favoriteOffers.tr(),
showHomeButton: false, showHomeButton: false,
// Reached from the Mazaya bottom nav - same as Discover, no back button for a
// dependent-login session since this is one of their root tabs, not a pushed screen.
showBackButton: !ApiConsts.isDependetLogin,
), ),
bottomNavigationBar: const MazayaBottomNav(currentTab: MazayaTab.saved), bottomNavigationBar: const MazayaBottomNav(currentTab: MazayaTab.saved),
body: Column( body: Column(

@ -1,6 +1,7 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_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/ui/mazaya/mazaya_discover_screen.dart'; import 'package:mohem_flutter_app/ui/mazaya/mazaya_discover_screen.dart';
@ -34,21 +35,33 @@ class MazayaBottomNav extends StatelessWidget {
break; break;
case MazayaTab.myFamily: case MazayaTab.myFamily:
targetScreen = const FamilyMembers(); targetScreen = const FamilyMembers();
settings = const RouteSettings(arguments: <String, dynamic>{'fromMazaya': true}); settings = const RouteSettings(
arguments: <String, dynamic>{'fromMazaya': true},
);
break; break;
} }
Navigator.pushReplacement( Navigator.pushReplacement(
context, context,
PageRouteBuilder<void>( PageRouteBuilder<void>(
settings: settings, settings: settings,
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) => targetScreen, pageBuilder:
(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) => targetScreen,
transitionDuration: Duration.zero, transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero, reverseTransitionDuration: Duration.zero,
), ),
); );
} }
Widget _buildItem(BuildContext context, {required MazayaTab tab, required String svgAsset, required String label}) { Widget _buildItem(
BuildContext context, {
required MazayaTab tab,
required String svgAsset,
required String label,
}) {
bool isActive = tab == currentTab; bool isActive = tab == currentTab;
return Expanded( return Expanded(
child: InkWell( child: InkWell(
@ -56,9 +69,20 @@ class MazayaBottomNav extends StatelessWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
SvgPicture.asset(svgAsset, width: 22, height: 22, colorFilter: ColorFilter.mode(isActive ? _activeColor : _inactiveColor, BlendMode.srcIn)), SvgPicture.asset(
svgAsset,
width: 22,
height: 22,
colorFilter: ColorFilter.mode(
isActive ? _activeColor : _inactiveColor,
BlendMode.srcIn,
),
),
const SizedBox(height: 5), const SizedBox(height: 5),
label.toText11(weight: isActive ? FontWeight.w600 : FontWeight.w400, color: isActive ? _activeColor : _inactiveColor), label.toText11(
weight: isActive ? FontWeight.w600 : FontWeight.w400,
color: isActive ? _activeColor : _inactiveColor,
),
], ],
), ),
), ),
@ -70,13 +94,34 @@ class MazayaBottomNav extends StatelessWidget {
return SafeArea( return SafeArea(
top: false, top: false,
child: Container( child: Container(
decoration: const BoxDecoration(color: Colors.white, border: Border(top: BorderSide(color: Color(0xFFE8EAE4)))), decoration: const BoxDecoration(
color: Colors.white,
border: Border(top: BorderSide(color: Color(0xFFE8EAE4))),
),
padding: const EdgeInsets.only(top: 13, bottom: 9), padding: const EdgeInsets.only(top: 13, bottom: 9),
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
_buildItem(context, tab: MazayaTab.discover, svgAsset: "assets/icons/mazaya_compass.svg", label: LocaleKeys.discover.tr()), _buildItem(
_buildItem(context, tab: MazayaTab.saved, svgAsset: "assets/icons/mazaya_heart_outline.svg", label: LocaleKeys.saved.tr()), context,
_buildItem(context, tab: MazayaTab.myFamily, svgAsset: "assets/icons/mazaya_user_round.svg", label: LocaleKeys.myFamily.tr()), tab: MazayaTab.discover,
svgAsset: "assets/icons/mazaya_compass.svg",
label: LocaleKeys.discover.tr(),
),
_buildItem(
context,
tab: MazayaTab.saved,
svgAsset: "assets/icons/mazaya_heart_outline.svg",
label: LocaleKeys.saved.tr(),
),
// My Family lets the account holder manage their dependents' Mazaya access - not
// applicable (and not shown) when a dependent is the one logged in.
if (!ApiConsts.isDependetLogin)
_buildItem(
context,
tab: MazayaTab.myFamily,
svgAsset: "assets/icons/mazaya_user_round.svg",
label: LocaleKeys.myFamily.tr(),
),
], ],
), ),
), ),

@ -1,9 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:intl/intl.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/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -81,7 +79,8 @@ class MazayaAccessResultScreen extends StatelessWidget {
final String? dateOfBirth; final String? dateOfBirth;
final String? message; final String? message;
const MazayaAccessResultScreen({Key? key, this.isGranted = true, this.dependentName = "", this.dependentInitials, this.downloadUrl, this.nationalId, this.dateOfBirth, this.message}) : super(key: key); const MazayaAccessResultScreen({Key? key, this.isGranted = true, this.dependentName = "", this.dependentInitials, this.downloadUrl, this.nationalId, this.dateOfBirth, this.message})
: super(key: key);
static String getDownloadLink() { static String getDownloadLink() {
int channel = AppState().postParamsObject?.channel ?? 31; int channel = AppState().postParamsObject?.channel ?? 31;
@ -187,7 +186,9 @@ class MazayaAccessResultScreen extends StatelessWidget {
child: SingleChildScrollView( child: SingleChildScrollView(
padding: const EdgeInsets.fromLTRB(20, 16, 20, 20), padding: const EdgeInsets.fromLTRB(20, 16, 20, 20),
child: child:
effectiveGranted ? _buildGrantedContent(context, isAr, fontFamily, effectiveName, initials, linkToShare) : _buildRevokedContent(context, isAr, fontFamily, effectiveName, initials, effectiveMessage), effectiveGranted
? _buildGrantedContent(context, isAr, fontFamily, effectiveName, initials, linkToShare)
: _buildRevokedContent(context, isAr, fontFamily, effectiveName, initials, effectiveMessage),
), ),
), ),
_buildBottomButtons(context, isAr, fontFamily, effectiveGranted, linkToShare, effectiveNationalId ?? "", effectiveDateOfBirth ?? ""), _buildBottomButtons(context, isAr, fontFamily, effectiveGranted, linkToShare, effectiveNationalId ?? "", effectiveDateOfBirth ?? ""),
@ -497,6 +498,8 @@ class MazayaAccessResultScreen extends StatelessWidget {
} catch (_) {} } catch (_) {}
} }
Widget _buildBottomButtons(BuildContext context, bool isAr, String fontFamily, bool granted, String linkToShare, String nationalId, String dateOfBirth) { Widget _buildBottomButtons(BuildContext context, bool isAr, String fontFamily, bool granted, String linkToShare, String nationalId, String dateOfBirth) {
if (granted) { if (granted) {
return Container( return Container(

@ -11,6 +11,7 @@ AppBar AppBarWidget(
BuildContext context, { BuildContext context, {
required String title, required String title,
bool showHomeButton = true, bool showHomeButton = true,
bool showBackButton = true,
bool showLogo = false, bool showLogo = false,
String? logoPath, String? logoPath,
bool showWorkListSettingButton = false, bool showWorkListSettingButton = false,
@ -25,6 +26,7 @@ AppBar AppBarWidget(
surfaceTintColor: Colors.transparent, surfaceTintColor: Colors.transparent,
title: Row( title: Row(
children: [ children: [
if (showBackButton)
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: Feedback.wrapForTap(() { onTap: Feedback.wrapForTap(() {

Loading…
Cancel
Save