Merge branch 'greeting_card' into Courses-CR#-7150

* greeting_card:
  Greeting
  Greeting Card

# Conflicts:
#	assets/langs/ar-SA.json
#	assets/langs/en-US.json
#	lib/api/dashboard_api_client.dart
#	lib/generated/codegen_loader.g.dart
#	lib/provider/dashboard_provider_model.dart
master
Sultan khan 1 day ago
commit 5da81968d7

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.2 MiB

@ -533,7 +533,7 @@
"noWinner": "حزين! لم يفز أحد اليوم.", "noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam": "فريقي", "myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض", "youCanPlayDemo": "لكن يمكنك لعب العرض",
"group" : "مجموعة", "group": "مجموعة",
"searchGroup": "مجموعة البحث", "searchGroup": "مجموعة البحث",
"connectHmgWifi": "قم بتوصيل HMG WIFI", "connectHmgWifi": "قم بتوصيل HMG WIFI",
"connectedHmgWifi": "اتصال HMG WIFI", "connectedHmgWifi": "اتصال HMG WIFI",
@ -577,20 +577,20 @@
"versionStatus": "حالة الإصدار", "versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد", "supplierNo": "رقم المورد",
"general": "عام", "general": "عام",
"requesterOperatingUnit":"وحدة تشغيل مقدم الطلب", "requesterOperatingUnit": "وحدة تشغيل مقدم الطلب",
"prepareEmpNum":"إعداد رقم الموظف", "prepareEmpNum": "إعداد رقم الموظف",
"supplierInfo" : "معلومات المورد", "supplierInfo": "معلومات المورد",
"supplierAcNo": "رقم حساب المورد", "supplierAcNo": "رقم حساب المورد",
"supplierAcName": "اسم حساب المورد", "supplierAcName": "اسم حساب المورد",
"supplierIBAN" : "رقم IBAN للمورد", "supplierIBAN": "رقم IBAN للمورد",
"supplierCRNo" :"رقم السجل التجاري", "supplierCRNo": "رقم السجل التجاري",
"suppliedAcNo" : "رقم الحساب المقدم", "suppliedAcNo": "رقم الحساب المقدم",
"patientRefundInvoice" : "فاتورة استرداد الأموال للمريض", "patientRefundInvoice": "فاتورة استرداد الأموال للمريض",
"patientNumber" : "رقم المريض", "patientNumber": "رقم المريض",
"patientName" : "اسم المريض", "patientName": "اسم المريض",
"invoiceDate" : "تاريخ الفاتورة", "invoiceDate": "تاريخ الفاتورة",
"refundInvoice" :"فاتورة الاسترجاع", "refundInvoice": "فاتورة الاسترجاع",
"hospitalClinic" : "عيادة المستشفى", "hospitalClinic": "عيادة المستشفى",
"graphicalAnalysis": "التحليل الرسومي", "graphicalAnalysis": "التحليل الرسومي",
"itemHistoryAnalysis": "تحليل تاريخ العنصر", "itemHistoryAnalysis": "تحليل تاريخ العنصر",
"pOno": "امر شراء #", "pOno": "امر شراء #",
@ -616,23 +616,23 @@
"members": "الأعضاء", "members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم", "searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة", "shareScreen": "مشاركة الشاشة",
"start":"يبدأ", "start": "يبدأ",
"about":"عن", "about": "عن",
"explore": "يستكشف", "explore": "يستكشف",
"mazaya": "مازيا", "mazaya": "مازيا",
"benefits": "فوائد", "benefits": "فوائد",
"mazayaDesc": "اكتشف الخصومات والعروض الخاصة المتاحة للموظفين", "mazayaDesc": "اكتشف الخصومات والعروض الخاصة المتاحة للموظفين",
"viewallofferMazaya" : "أعرض كل المزايا", "viewallofferMazaya": "أعرض كل المزايا",
"buyerName": "اسم المشتري", "buyerName": "اسم المشتري",
"buyerNumber": "رقم المشتري", "buyerNumber": "رقم المشتري",
"highestBidder": "أعلى مزايد", "highestBidder": "أعلى مزايد",
"remarks": "ملاحظات", "remarks": "ملاحظات",
"faHeader": "تفاصيل رأس الصفحة FA", "faHeader": "تفاصيل رأس الصفحة FA",
"bookTypeCode": "رمز نوع الكتاب", "bookTypeCode": "رمز نوع الكتاب",
"categoryCode": "رمز الفئة", "categoryCode": "رمز الفئة",
"categoryGroup": "مجموعة الفئات", "categoryGroup": "مجموعة الفئات",
"faLINES": "تفاصيل الأصول", "faLINES": "تفاصيل الأصول",
"assetNumber": "رقم الأصول", "assetNumber": "رقم الأصول",
"assetDescription": "وصف الأصول", "assetDescription": "وصف الأصول",
"barCodeNumber": "رقم الباركود", "barCodeNumber": "رقم الباركود",
"datePlaceInService": "تاريخ وضعه في الخدمة", "datePlaceInService": "تاريخ وضعه في الخدمة",
@ -640,7 +640,7 @@
"disposedDate": "تاريخ التخلص", "disposedDate": "تاريخ التخلص",
"netBookValue": "القيمة الدفترية الصافية", "netBookValue": "القيمة الدفترية الصافية",
"purchasedPrice": "سعر الشراء", "purchasedPrice": "سعر الشراء",
"usefulLife": "العمر الإنتاجي", "usefulLife": "العمر الإنتاجي",
"yearsUsed": "سنوات الاستخدام", "yearsUsed": "سنوات الاستخدام",
"faRequest": "طلب التخلص من FA", "faRequest": "طلب التخلص من FA",
"showMore": "عرض المزيد", "showMore": "عرض المزيد",
@ -669,6 +669,7 @@
"ticketId": "معرف التذكرة", "ticketId": "معرف التذكرة",
"pleaseSelectProject": "الرجاء اختيار مشروع", "pleaseSelectProject": "الرجاء اختيار مشروع",
"viewAttachment" : "عرض المرفق", "viewAttachment" : "عرض المرفق",
"parkingQr": "وقوف السيارات QR" "parkingQr": "وقوف السيارات QR",
"startNow": "ابدأ الآن"
} }

@ -567,7 +567,7 @@
"addAtLeastOneAttachment": "Please add at least one attachment.", "addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", "pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.",
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.", "youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.",
"requesterOperatingUnit":"Requester Operating Unit", "requesterOperatingUnit": "Requester Operating Unit",
"generate": "Generate", "generate": "Generate",
"paymentRequest": "Pay Request", "paymentRequest": "Pay Request",
"paymentDetails": "Payment Details", "paymentDetails": "Payment Details",
@ -593,19 +593,19 @@
"versionStatus": "Version Status", "versionStatus": "Version Status",
"supplierNo": "Supplier No", "supplierNo": "Supplier No",
"general": "General", "general": "General",
"prepareEmpNum":"Prepare Employee Num", "prepareEmpNum": "Prepare Employee Num",
"supplierInfo" : "Supplier Information", "supplierInfo": "Supplier Information",
"supplierAcNo": "Supplier Account No", "supplierAcNo": "Supplier Account No",
"supplierAcName":"Supplier Account Name", "supplierAcName": "Supplier Account Name",
"supplierIBAN" : "Supplier IBAN", "supplierIBAN": "Supplier IBAN",
"supplierCRNo" : "CR Number", "supplierCRNo": "CR Number",
"suppliedAcNo" : "Supplied Account No.", "suppliedAcNo": "Supplied Account No.",
"patientRefundInvoice" : "Patient Refund Invoice", "patientRefundInvoice": "Patient Refund Invoice",
"patientNumber" : "Patient Number", "patientNumber": "Patient Number",
"patientName" : "Patient Name", "patientName": "Patient Name",
"invoiceDate" : "Invoice Date", "invoiceDate": "Invoice Date",
"refundInvoice" :"Refund Invoice", "refundInvoice": "Refund Invoice",
"hospitalClinic" : "Hospital Clinic", "hospitalClinic": "Hospital Clinic",
"graphicalAnalysis": "Graphical Analysis", "graphicalAnalysis": "Graphical Analysis",
"itemHistoryAnalysis": "Item History Analysis", "itemHistoryAnalysis": "Item History Analysis",
"pOno": "P.O #", "pOno": "P.O #",
@ -614,23 +614,23 @@
"qtyReceived": "Qty. Received", "qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.", "bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty.", "balQty": "Bal. Qty.",
"start":"Start", "start": "Start",
"about":"About", "about": "About",
"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",
"highestBidder": "Highest Bidder", "highestBidder": "Highest Bidder",
"remarks": "Remarks", "remarks": "Remarks",
"faHeader": "FA Header Details", "faHeader": "FA Header Details",
"bookTypeCode": "Book Type Code", "bookTypeCode": "Book Type Code",
"categoryCode": "Category Code", "categoryCode": "Category Code",
"categoryGroup": "Category Group", "categoryGroup": "Category Group",
"faLINES": "Asset Details", "faLINES": "Asset Details",
"assetNumber": "Asset Number", "assetNumber": "Asset Number",
"assetDescription": "Asset Description", "assetDescription": "Asset Description",
"barCodeNumber": "BarCode Number", "barCodeNumber": "BarCode Number",
"datePlaceInService": "Date place In Service", "datePlaceInService": "Date place In Service",
@ -638,9 +638,9 @@
"disposedDate": "Disposed Date", "disposedDate": "Disposed Date",
"netBookValue": "Net Book Value", "netBookValue": "Net Book Value",
"purchasedPrice": "Purchased Price", "purchasedPrice": "Purchased Price",
"usefulLife": "Useful Life", "usefulLife": "Useful Life",
"yearsUsed": "Years Used", "yearsUsed": "Years Used",
"faRequest":"FA Disposal Request", "faRequest": "FA Disposal Request",
"showMore": "Show More", "showMore": "Show More",
"ticketDetails": "Ticket Details", "ticketDetails": "Ticket Details",
"currentTicketBalance": "Current Ticket Balance", "currentTicketBalance": "Current Ticket Balance",
@ -667,5 +667,6 @@
"ticketId": "Ticket ID", "ticketId": "Ticket ID",
"pleaseSelectProject": "Please select a project", "pleaseSelectProject": "Please select a project",
"viewAttachment" : "View Attachment", "viewAttachment" : "View Attachment",
"parkingQr": "Parking QR" "parkingQr": "Parking QR",
"startNow": "Start Now"
} }

@ -18,6 +18,7 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart'; import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart'; import 'package:mohem_flutter_app/models/get_employee_parking_details_model.dart';
import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart'; import 'package:mohem_flutter_app/models/sso_auth_model.dart';
@ -456,4 +457,18 @@ class DashboardApiClient {
isFormData: false, isFormData: false,
); );
} }
Future<GetGreetingCardsModelResponse?> getGreetingCards() async {
String url = "${ApiConsts.erpRest}Get_GreetingCards";
Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject(
(json) {
GetGreetingCardsModelResponse responseData = GetGreetingCardsModelResponse.fromJson(json);
return responseData;
},
url,
postParams,
);
}
} }

@ -682,7 +682,8 @@ class CodegenLoader extends AssetLoader{
"ticketId": "معرف التذكرة", "ticketId": "معرف التذكرة",
"pleaseSelectProject": "الرجاء اختيار مشروع", "pleaseSelectProject": "الرجاء اختيار مشروع",
"viewAttachment": "عرض المرفق", "viewAttachment": "عرض المرفق",
"parkingQr": "وقوف السيارات QR" "parkingQr": "وقوف السيارات QR",
"startNow": "ابدأ الآن"
}; };
static const Map<String,dynamic> _en_US = { static const Map<String,dynamic> _en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
@ -1352,7 +1353,8 @@ static const Map<String,dynamic> _en_US = {
"ticketId": "Ticket ID", "ticketId": "Ticket ID",
"pleaseSelectProject": "Please select a project", "pleaseSelectProject": "Please select a project",
"viewAttachment": "View Attachment", "viewAttachment": "View Attachment",
"parkingQr": "Parking QR" "parkingQr": "Parking QR",
"startNow": "Start Now"
}; };
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};
} }

@ -655,5 +655,6 @@ abstract class LocaleKeys {
static const pleaseSelectProject = 'pleaseSelectProject'; static const pleaseSelectProject = 'pleaseSelectProject';
static const viewAttachment = 'viewAttachment'; static const viewAttachment = 'viewAttachment';
static const parkingQr = 'parkingQr'; static const parkingQr = 'parkingQr';
static const startNow = 'startNow';
} }

@ -0,0 +1,142 @@
import 'dart:convert';
class GetGreetingCardsModelResponse {
List<GetGreetingCardsModelResponseElement>? getGreetingCardsModelResponse;
GetGreetingCardsModelResponse({
this.getGreetingCardsModelResponse,
});
factory GetGreetingCardsModelResponse.fromRawJson(String str) => GetGreetingCardsModelResponse.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory GetGreetingCardsModelResponse.fromJson(Map<String, dynamic> json) => GetGreetingCardsModelResponse(
getGreetingCardsModelResponse: json["Get_GreetingCardsModel_Response"] == null ? [] : List<GetGreetingCardsModelResponseElement>.from(json["Get_GreetingCardsModel_Response"]!.map((x) => GetGreetingCardsModelResponseElement.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"Get_GreetingCardsModel_Response": getGreetingCardsModelResponse == null ? [] : List<dynamic>.from(getGreetingCardsModelResponse!.map((x) => x.toJson())),
};
}
class GetGreetingCardsModelResponseElement {
String? backgroundImageUrlAr;
String? backgroundImageUrlEn;
String? buttonBgColor;
String? buttonText;
String? buttonTextN;
int? cardType;
int? categoryId;
String? categoryNameAr;
String? categoryNameEn;
int? channel;
String? createdOn;
String? descriptionAr;
String? descriptionEn;
String? endDate;
bool? hasButton;
int? id;
bool? isActive;
int? moduleId;
String? moduleName;
String? moduleNameN;
String? startDate;
String? textColor;
String? titleAr;
String? titleEn;
String? urlAr;
String? urlEn;
GetGreetingCardsModelResponseElement({
this.backgroundImageUrlAr,
this.backgroundImageUrlEn,
this.buttonBgColor,
this.buttonText,
this.buttonTextN,
this.cardType,
this.categoryId,
this.categoryNameAr,
this.categoryNameEn,
this.channel,
this.createdOn,
this.descriptionAr,
this.descriptionEn,
this.endDate,
this.hasButton,
this.id,
this.isActive,
this.moduleId,
this.moduleName,
this.moduleNameN,
this.startDate,
this.textColor,
this.titleAr,
this.titleEn,
this.urlAr,
this.urlEn,
});
factory GetGreetingCardsModelResponseElement.fromRawJson(String str) => GetGreetingCardsModelResponseElement.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory GetGreetingCardsModelResponseElement.fromJson(Map<String, dynamic> json) => GetGreetingCardsModelResponseElement(
backgroundImageUrlAr: json["BackgroundImageUrlAr"],
backgroundImageUrlEn: json["BackgroundImageUrlEn"],
buttonBgColor: json["ButtonBgColor"],
buttonText: json["ButtonText"],
buttonTextN: json["ButtonTextN"],
cardType: json["CardType"],
categoryId: json["CategoryID"],
categoryNameAr: json["CategoryNameAr"],
categoryNameEn: json["CategoryNameEn"],
channel: json["Channel"],
createdOn: json["CreatedOn"],
descriptionAr: json["DescriptionAr"],
descriptionEn: json["DescriptionEn"],
endDate: json["EndDate"],
hasButton: json["HasButton"],
id: json["ID"],
isActive: json["IsActive"],
moduleId: json["ModuleID"],
moduleName: json["ModuleName"],
moduleNameN: json["ModuleNameN"],
startDate: json["StartDate"],
textColor: json["TextColor"],
titleAr: json["TitleAr"],
titleEn: json["TitleEn"],
urlAr: json["UrlAr"],
urlEn: json["UrlEn"],
);
Map<String, dynamic> toJson() => {
"BackgroundImageUrlAr": backgroundImageUrlAr,
"BackgroundImageUrlEn": backgroundImageUrlEn,
"ButtonBgColor": buttonBgColor,
"ButtonText": buttonText,
"ButtonTextN": buttonTextN,
"CardType": cardType,
"CategoryID": categoryId,
"CategoryNameAr": categoryNameAr,
"CategoryNameEn": categoryNameEn,
"Channel": channel,
"CreatedOn": createdOn,
"DescriptionAr": descriptionAr,
"DescriptionEn": descriptionEn,
"EndDate": endDate,
"HasButton": hasButton,
"ID": id,
"IsActive": isActive,
"ModuleID": moduleId,
"ModuleName": moduleName,
"ModuleNameN": moduleNameN,
"StartDate": startDate,
"TextColor": textColor,
"TitleAr": titleAr,
"TitleEn": titleEn,
"UrlAr": urlAr,
"UrlEn": urlEn,
};
}

@ -22,6 +22,7 @@ import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_respo
import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart'; import 'package:mohem_flutter_app/models/dashboard/courses_response_model.dart';
import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart'; import 'package:mohem_flutter_app/models/sso_auth_model.dart';
@ -73,6 +74,10 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
CoursesResponseModel? coursesResponse; CoursesResponseModel? coursesResponse;
List<CourseStatus> coursesList = []; List<CourseStatus> coursesList = [];
bool isGreetingCardsLoading = true;
bool isDisplayEidGreetings = false;
List<GetGreetingCardsModelResponseElement>? greetingCardsList;
//Attendance Tracking API's & Methods //Attendance Tracking API's & Methods
Future<bool> fetchAttendanceTracking(context) async { Future<bool> fetchAttendanceTracking(context) async {
try { try {
@ -121,6 +126,8 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
getMenuEntriesList = null; getMenuEntriesList = null;
isOffersLoading = true; isOffersLoading = true;
getOffersList = []; getOffersList = [];
isGreetingCardsLoading = true;
isDisplayEidGreetings = false;
drawerMenuItemList = [ drawerMenuItemList = [
DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile), DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile),
@ -316,6 +323,28 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
} }
} }
void fetchGreetingCards() async {
isGreetingCardsLoading = true;
notifyListeners();
try {
GetGreetingCardsModelResponse? response = await DashboardApiClient().getGreetingCards();
greetingCardsList = response?.getGreetingCardsModelResponse ?? [];
if (greetingCardsList != null && greetingCardsList!.isNotEmpty) {
isDisplayEidGreetings = greetingCardsList!.any((card) => card.isActive == true);
} else {
isDisplayEidGreetings = false;
}
isGreetingCardsLoading = false;
notifyListeners();
} catch (ex) {
logger.wtf(ex);
isDisplayEidGreetings = false;
greetingCardsList = [];
isGreetingCardsLoading = false;
notifyListeners();
}
}
Future<void> fetchTicketBooking() async { Future<void> fetchTicketBooking() async {
try { try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getTicketBookingRedirection(); GenericResponseModel? genericResponseModel = await DashboardApiClient().getTicketBookingRedirection();

@ -1,7 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:ui' as ui; import 'dart:ui' as ui;
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_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
@ -34,6 +33,7 @@ import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:signalr_netcore/signalr_client.dart'; import 'package:signalr_netcore/signalr_client.dart';
import 'package:url_launcher/url_launcher.dart';
late HubConnection chatHubConnection; late HubConnection chatHubConnection;
@ -155,6 +155,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchLeaveTicketBalance(context, DateTime.now()); data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries(); data.fetchMenuEntries();
data.fetchEventActivity(); data.fetchEventActivity();
data.fetchGreetingCards();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
marathonProvider.getMarathonTutorial(); marathonProvider.getMarathonTutorial();
@ -316,103 +317,103 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
child: Consumer<DashboardProviderModel>( child: Consumer<DashboardProviderModel>(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) { builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return (model.isAttendanceTrackingLoading return (model.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer() ? GetAttendanceTrackingShimmer()
: Container( : Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient( gradient: const LinearGradient(
transform: GradientRotation(.46), transform: GradientRotation(.46),
begin: Alignment.topRight, begin: Alignment.topRight,
end: Alignment.bottomLeft, end: Alignment.bottomLeft,
colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor], colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor],
), ),
), ),
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
if (model.isTimeRemainingInSeconds == 0) DateTime.now().toString().split(" ")[0].toText12(color: Colors.white), if (model.isTimeRemainingInSeconds == 0) DateTime.now().toString().split(" ")[0].toText12(color: Colors.white),
if (model.isTimeRemainingInSeconds != 0) if (model.isTimeRemainingInSeconds != 0)
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [
9.height,
Directionality(
textDirection: ui.TextDirection.ltr,
child: CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(20)),
child: LinearProgressIndicator(
value: model.progress,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [ children: [
9.height, Expanded(
Directionality( child: Column(
textDirection: ui.TextDirection.ltr, mainAxisSize: MainAxisSize.min,
child: CountdownTimer( crossAxisAlignment: CrossAxisAlignment.start,
endTime: model.endTime, children: [
onEnd: null, LocaleKeys.checkIn.tr().toText12(color: Colors.white),
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), color: Colors.white,
), isBold: true,
),
4.height,
],
).paddingOnly(left: 12, right: 12),
), ),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), Container(
9.height, margin: EdgeInsets.only(top: AppState().isArabic(context) ? 6 : 0),
ClipRRect( width: 45,
borderRadius: const BorderRadius.all(Radius.circular(20)), height: 45,
child: LinearProgressIndicator( padding: const EdgeInsets.only(left: 10, right: 10),
value: model.progress, decoration: BoxDecoration(
minHeight: 8, color: const Color(0xff259EA4),
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white), borderRadius: BorderRadius.only(
backgroundColor: const Color(0xff196D73), bottomRight: AppState().isArabic(context) ? const Radius.circular(0) : const Radius.circular(15),
bottomLeft: AppState().isArabic(context) ? const Radius.circular(15) : const Radius.circular(0),
),
), ),
), child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/biometrics.svg" : "assets/images/biometrics.svg"),
).onPress(() {
showMyBottomSheet(context, callBackFunc: () {}, child: MarkAttendanceWidget(model, isFromDashboard: true));
}),
], ],
), ),
], ],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(
color: Colors.white,
isBold: true,
),
4.height,
],
).paddingOnly(left: 12, right: 12),
), ),
Container(
margin: EdgeInsets.only(top: AppState().isArabic(context) ? 6 : 0),
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 10, right: 10),
decoration: BoxDecoration(
color: const Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: AppState().isArabic(context) ? const Radius.circular(0) : const Radius.circular(15),
bottomLeft: AppState().isArabic(context) ? const Radius.circular(15) : const Radius.circular(0),
),
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/biometrics.svg" : "assets/images/biometrics.svg"),
).onPress(() {
showMyBottomSheet(context, callBackFunc: () {}, child: MarkAttendanceWidget(model, isFromDashboard: true));
}),
], ],
), ),
], ).onPress(() {
), Navigator.pushNamed(context, AppRoutes.todayAttendance);
], }))
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.todayAttendance);
}))
.animatedSwither(); .animatedSwither();
}, },
), ),
@ -424,8 +425,102 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
), ),
], ],
).paddingOnly(left: 21, right: 21, top: 7, bottom: 21), ).paddingOnly(left: 21, right: 21, top: 7, bottom: 21),
eventActivityWidget(context), Consumer<DashboardProviderModel>(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
if (model.isGreetingCardsLoading) {
return const GreetingCardShimmer();
} else if (model.isDisplayEidGreetings && model.greetingCardsList != null && model.greetingCardsList!.isNotEmpty) {
return SizedBox(
height: 120,
child: ListView.separated(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 21),
itemCount: model.greetingCardsList!.length,
separatorBuilder: (context, index) => const SizedBox(width: 12),
itemBuilder: (context, index) {
var card = model.greetingCardsList![index];
return SizedBox(
width: MediaQuery.of(context).size.width - 42,
child: Directionality(
textDirection: AppState().isArabic(context) ? ui.TextDirection.rtl : ui.TextDirection.ltr,
child: Stack(
children: [
Transform.flip(
flipX: !AppState().isArabic(context),
child: SvgPicture.network(
AppState().isArabic(context)
? (card.backgroundImageUrlAr ?? "http://meena-health-care-1.s3.eu-north-1.amazonaws.com/eid_banner.svg")
: (card.backgroundImageUrlEn ?? "http://meena-health-care-1.s3.eu-north-1.amazonaws.com/eid_banner.svg"),
fit: BoxFit.contain,
placeholderBuilder: (context) => ClipRRect(borderRadius: BorderRadius.circular(18), child: Container(height: 80, color: Colors.white).toShimmer()),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(width: AppState().isArabic(context) ? 10 : 40),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
AppState().isArabic(context) ? card.titleAr ?? '' : card.titleEn ?? '',
style: TextStyle(
fontSize: AppState().isArabic(context) ? 20 : 18,
letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700,
height: 24 / 16,
color: const Color(0xFF3B3E4F),
),
),
const SizedBox(height: 4),
Text(
AppState().isArabic(context) ? card.descriptionAr ?? '' : card.descriptionEn ?? '',
style: TextStyle(
fontSize: AppState().isArabic(context) ? 16 : 14,
letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w500,
color: const Color(0xFF3B3E4F),
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
(AppState().isArabic(context)
? card.buttonTextN!.toText12(isUnderLine: true, color: const Color(0xFF3B3D4A))
: card.buttonText!.toText12(isUnderLine: true, color: const Color(0xFF3B3D4A)))
.onPress(() {
launchUrl(Uri.parse(AppState().isArabic(context) ? card.urlAr! : card.urlEn!));
}),
],
).paddingOnly(bottom: 10, right: 15, left: 15),
],
).paddingOnly(left: AppState().isArabic(context) ? 10 : 36, right: AppState().isArabic(context) ? 66 : 10, top: 6, bottom: 40),
],
),
),
);
},
),
).paddingOnly(bottom: 0);
} else {
return const SizedBox();
}
},
),
// eventActivityWidget(context),
if (isDisplayMazaya) ...[ if (isDisplayMazaya) ...[
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -461,70 +556,70 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
flex: 2, flex: 2,
child: RichText( child: RichText(
text: text:
AppState().isArabic(context) AppState().isArabic(context)
? TextSpan( ? TextSpan(
children: [ children: [
TextSpan( TextSpan(
text: 'اطلع على مميزات', text: 'اطلع على مميزات',
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins', fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: Color(0xFF5D5E5E), color: const Color(0xFF5D5E5E),
), ),
), ),
TextSpan( TextSpan(
text: ' مزايا', text: ' مزايا',
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins', fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
letterSpacing: -0.2, letterSpacing: -0.2,
height: 24 / 16, height: 24 / 16,
color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
), ),
), ),
], ],
) )
: TextSpan( : TextSpan(
children: [ children: [
TextSpan( TextSpan(
text: LocaleKeys.explore.tr() + ' ', text: LocaleKeys.explore.tr() + ' ',
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: Color(0xFF5D5E5E), color: Color(0xFF5D5E5E),
), ),
), ),
TextSpan( TextSpan(
text: LocaleKeys.mazaya.tr(), text: LocaleKeys.mazaya.tr(),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
fontFamily: 'Poppins', fontFamily: 'Poppins',
letterSpacing: -0.2, letterSpacing: -0.2,
height: 24 / 16, height: 24 / 16,
color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
), ),
), ),
TextSpan( TextSpan(
text: ' ' + LocaleKeys.benefits.tr(), text: ' ' + LocaleKeys.benefits.tr(),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.2, letterSpacing: -0.2,
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
height: 24 / 16, height: 24 / 16,
color: Color(0xFF5D5E5E), color: Color(0xFF5D5E5E),
), ),
), ),
], ],
), ),
), ),
), ),
const Expanded(flex: 1, child: SizedBox()), const Expanded(flex: 1, child: SizedBox()),
@ -577,12 +672,10 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
LocaleKeys.discounts.tr().toText24(isBold: true), LocaleKeys.discounts.tr().toText24(isBold: true),
6.width, 6.width,
Container( Container(
padding: const EdgeInsets.only(left: 8, right: 8), padding: const EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration( decoration: BoxDecoration(color: MyColors.yellowColor, borderRadius: BorderRadius.circular(10)),
color: MyColors.yellowColor, child: LocaleKeys.newString.tr().toText10(isBold: true),
borderRadius: BorderRadius.circular(10), ),
),
child: LocaleKeys.newString.tr().toText10(isBold: true)),
], ],
), ),
], ],
@ -590,7 +683,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
), ),
LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() { LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
Navigator.pushNamed(context, AppRoutes.offersAndDiscounts); Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
}) }),
], ],
).paddingOnly(left: 21, right: 21), ).paddingOnly(left: 21, right: 21),
Consumer<DashboardProviderModel>( Consumer<DashboardProviderModel>(
@ -598,59 +691,54 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
return SizedBox( return SizedBox(
height: 103 + 33, height: 103 + 33,
child: ListView.separated( child: ListView.separated(
shrinkWrap: true, shrinkWrap: true,
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13), padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext cxt, int index) { itemBuilder: (BuildContext cxt, int index) {
return model.isOffersLoading return model.isOffersLoading
? const OffersShimmerWidget() ? const OffersShimmerWidget()
: InkWell( : InkWell(
onTap: () { onTap: () {
navigateToDetails(data.getOffersList[index]); navigateToDetails(data.getOffersList[index]);
}, },
child: SizedBox( child: SizedBox(
width: 73, width: 73,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
width: 73, width: 73,
height: 73, height: 73,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: const BorderRadius.all( borderRadius: const BorderRadius.all(Radius.circular(100)),
Radius.circular(100), border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
), ),
child: Hero( child: ClipRRect(
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!, borderRadius: const BorderRadius.all(Radius.circular(50)),
transitionOnUserGestures: true, child: Hero(
child: Image.network( tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
data.getOffersList[index].logo ?? "", transitionOnUserGestures: true,
fit: BoxFit.contain, child: Image.network(data.getOffersList[index].logo ?? "", fit: BoxFit.contain),
), ),
), ),
), ),
), 4.height,
4.height, Expanded(
Expanded( child:
child: AppState().isArabic(context) AppState().isArabic(context)
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1), : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
), ),
], ],
),
), ),
), );
); },
}, separatorBuilder: (BuildContext cxt, int index) => 8.width,
separatorBuilder: (BuildContext cxt, int index) => 8.width, itemCount: 9,
itemCount: 9), ),
); );
}, },
), ),
@ -773,28 +861,28 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
SvgPicture.asset( SvgPicture.asset(
"assets/icons/chat/chat.svg", "assets/icons/chat/chat.svg",
color: color:
!checkIfPrivilegedForChat() !checkIfPrivilegedForChat()
? MyColors.lightGreyE3Color ? MyColors.lightGreyE3Color
: currentIndex == 4 : currentIndex == 4
? MyColors.grey3AColor ? MyColors.grey3AColor
: cProvider.disbaleChatForThisUser : cProvider.disbaleChatForThisUser
? MyColors.lightGreyE3Color ? MyColors.lightGreyE3Color
: MyColors.grey98Color, : MyColors.grey98Color,
).paddingAll(4), ).paddingAll(4),
Consumer<ChatProviderModel>( Consumer<ChatProviderModel>(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { builder: (BuildContext cxt, ChatProviderModel data, Widget? child) {
return !checkIfPrivilegedForChat() return !checkIfPrivilegedForChat()
? const SizedBox() ? const SizedBox()
: Positioned( : Positioned(
right: 0, right: 0,
top: 0, top: 0,
child: Container( child: Container(
padding: const EdgeInsets.only(left: 4, right: 4), padding: const EdgeInsets.only(left: 4, right: 4),
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)), decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)),
child: data.chatUConvCounter.toString().toText10(color: Colors.white), child: data.chatUConvCounter.toString().toText10(color: Colors.white),
), ),
); );
}, },
), ),
], ],
@ -865,4 +953,4 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
} }
return false; return false;
} }
} }

@ -92,7 +92,7 @@ class ServicesWidget extends StatelessWidget {
aspectRatio: 105 / 105, aspectRatio: 105 / 105,
child: child:
data.isServicesMenusLoading data.isServicesMenusLoading
? ServicesMenuShimmer() ? const ServicesMenuShimmer()
: Container( : Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
@ -266,7 +266,6 @@ class ServicesWidget extends StatelessWidget {
await pro.fetchTicketAccuralBalance(context, DateTime.now()); await pro.fetchTicketAccuralBalance(context, DateTime.now());
pro.ticketHistoryTransactionList = await EITApiClient().getEITTransactions("HMG_TICKET_ITENARY_HR_EIT_SS", isCompleteList: true); pro.ticketHistoryTransactionList = await EITApiClient().getEITTransactions("HMG_TICKET_ITENARY_HR_EIT_SS", isCompleteList: true);
Utils.hideLoading(context); Utils.hideLoading(context);
// Here Need Work // Here Need Work
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => TicketDetailedScreen(url: url, jwtToken: ssoToken.data!.accessToken))); Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => TicketDetailedScreen(url: url, jwtToken: ssoToken.data!.accessToken)));
@ -311,7 +310,7 @@ class ServicesWidget extends StatelessWidget {
padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13), padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13),
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) { itemBuilder: (cxt, index) {
return AspectRatio(aspectRatio: 105 / 105, child: ServicesMenuShimmer()); return AspectRatio(aspectRatio: 105 / 105, child: const ServicesMenuShimmer());
}, },
separatorBuilder: (cxt, index) => 9.width, separatorBuilder: (cxt, index) => 9.width,
itemCount: 4, itemCount: 4,

@ -8,6 +8,8 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:shimmer/shimmer.dart'; import 'package:shimmer/shimmer.dart';
class GetAttendanceTrackingShimmer extends StatelessWidget { class GetAttendanceTrackingShimmer extends StatelessWidget {
const GetAttendanceTrackingShimmer({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -85,6 +87,8 @@ class GetAttendanceTrackingShimmer extends StatelessWidget {
} }
class MenuShimmer extends StatelessWidget { class MenuShimmer extends StatelessWidget {
const MenuShimmer({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -122,6 +126,8 @@ class MenuShimmer extends StatelessWidget {
} }
class ServicesHeaderShimmer extends StatelessWidget { class ServicesHeaderShimmer extends StatelessWidget {
const ServicesHeaderShimmer({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
@ -145,6 +151,8 @@ class ServicesHeaderShimmer extends StatelessWidget {
} }
class ServicesMenuShimmer extends StatelessWidget { class ServicesMenuShimmer extends StatelessWidget {
const ServicesMenuShimmer({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -188,6 +196,75 @@ class ServicesMenuShimmer extends StatelessWidget {
} }
} }
class GreetingCardShimmer extends StatelessWidget {
const GreetingCardShimmer({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
height: 100,
decoration: BoxDecoration(
color: const Color(0xFFFAF4E7),
border: Border.all(width: 2, color: const Color(0xFFE7E7E7)),
borderRadius: BorderRadius.circular(20),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 65,
height: 81,
decoration: BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadius.circular(10),
),
).toShimmer(),
const SizedBox(width: 10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: 150,
height: 16,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
const SizedBox(height: 8),
Container(
width: 120,
height: 16,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
],
).expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
width: 60,
height: 12,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
).toShimmer(),
],
),
],
).paddingOnly(left: 8, right: 8, top: 6, bottom: 12),
).paddingOnly(left: 21, right: 21, top: 14, bottom: 14);
}
}
class MarathonBannerShimmer extends StatelessWidget { class MarathonBannerShimmer extends StatelessWidget {
const MarathonBannerShimmer({Key? key}) : super(key: key); const MarathonBannerShimmer({Key? key}) : super(key: key);
@ -305,3 +382,4 @@ class ChatHomeShimmer extends StatelessWidget {
)); ));
} }
} }

Loading…
Cancel
Save