diff --git a/assets/images/greeting.svg b/assets/images/greeting.svg
new file mode 100644
index 0000000..0682c60
--- /dev/null
+++ b/assets/images/greeting.svg
@@ -0,0 +1,605 @@
+
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index f09dfb4..f3552d5 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -533,7 +533,7 @@
"noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض",
- "group" : "مجموعة",
+ "group": "مجموعة",
"searchGroup": "مجموعة البحث",
"connectHmgWifi": "قم بتوصيل HMG WIFI",
"connectedHmgWifi": "اتصال HMG WIFI",
@@ -577,20 +577,20 @@
"versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد",
"general": "عام",
- "requesterOperatingUnit":"وحدة تشغيل مقدم الطلب",
- "prepareEmpNum":"إعداد رقم الموظف",
- "supplierInfo" : "معلومات المورد",
+ "requesterOperatingUnit": "وحدة تشغيل مقدم الطلب",
+ "prepareEmpNum": "إعداد رقم الموظف",
+ "supplierInfo": "معلومات المورد",
"supplierAcNo": "رقم حساب المورد",
"supplierAcName": "اسم حساب المورد",
- "supplierIBAN" : "رقم IBAN للمورد",
- "supplierCRNo" :"رقم السجل التجاري",
- "suppliedAcNo" : "رقم الحساب المقدم",
- "patientRefundInvoice" : "فاتورة استرداد الأموال للمريض",
- "patientNumber" : "رقم المريض",
- "patientName" : "اسم المريض",
- "invoiceDate" : "تاريخ الفاتورة",
- "refundInvoice" :"فاتورة الاسترجاع",
- "hospitalClinic" : "عيادة المستشفى",
+ "supplierIBAN": "رقم IBAN للمورد",
+ "supplierCRNo": "رقم السجل التجاري",
+ "suppliedAcNo": "رقم الحساب المقدم",
+ "patientRefundInvoice": "فاتورة استرداد الأموال للمريض",
+ "patientNumber": "رقم المريض",
+ "patientName": "اسم المريض",
+ "invoiceDate": "تاريخ الفاتورة",
+ "refundInvoice": "فاتورة الاسترجاع",
+ "hospitalClinic": "عيادة المستشفى",
"graphicalAnalysis": "التحليل الرسومي",
"itemHistoryAnalysis": "تحليل تاريخ العنصر",
"pOno": "امر شراء #",
@@ -616,23 +616,23 @@
"members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة",
- "start":"يبدأ",
- "about":"عن",
+ "start": "يبدأ",
+ "about": "عن",
"explore": "يستكشف",
"mazaya": "مازيا",
"benefits": "فوائد",
"mazayaDesc": "اكتشف الخصومات والعروض الخاصة المتاحة للموظفين",
- "viewallofferMazaya" : "أعرض كل المزايا",
+ "viewallofferMazaya": "أعرض كل المزايا",
"buyerName": "اسم المشتري",
"buyerNumber": "رقم المشتري",
"highestBidder": "أعلى مزايد",
"remarks": "ملاحظات",
"faHeader": "تفاصيل رأس الصفحة FA",
- "bookTypeCode": "رمز نوع الكتاب",
+ "bookTypeCode": "رمز نوع الكتاب",
"categoryCode": "رمز الفئة",
"categoryGroup": "مجموعة الفئات",
- "faLINES": "تفاصيل الأصول",
- "assetNumber": "رقم الأصول",
+ "faLINES": "تفاصيل الأصول",
+ "assetNumber": "رقم الأصول",
"assetDescription": "وصف الأصول",
"barCodeNumber": "رقم الباركود",
"datePlaceInService": "تاريخ وضعه في الخدمة",
@@ -640,7 +640,7 @@
"disposedDate": "تاريخ التخلص",
"netBookValue": "القيمة الدفترية الصافية",
"purchasedPrice": "سعر الشراء",
- "usefulLife": "العمر الإنتاجي",
+ "usefulLife": "العمر الإنتاجي",
"yearsUsed": "سنوات الاستخدام",
"faRequest": "طلب التخلص من FA",
"showMore": "عرض المزيد",
@@ -669,6 +669,7 @@
"ticketId": "معرف التذكرة",
"pleaseSelectProject": "الرجاء اختيار مشروع",
"viewAttachment" : "عرض المرفق",
- "parkingQr": "وقوف السيارات QR"
+ "parkingQr": "وقوف السيارات QR",
+ "startNow": "ابدأ الآن"
}
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index 216fe85..a227a73 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -567,7 +567,7 @@
"addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "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",
"generate": "Generate",
"paymentRequest": "Pay Request",
"paymentDetails": "Payment Details",
@@ -593,19 +593,19 @@
"versionStatus": "Version Status",
"supplierNo": "Supplier No",
"general": "General",
- "prepareEmpNum":"Prepare Employee Num",
- "supplierInfo" : "Supplier Information",
+ "prepareEmpNum": "Prepare Employee Num",
+ "supplierInfo": "Supplier Information",
"supplierAcNo": "Supplier Account No",
- "supplierAcName":"Supplier Account Name",
- "supplierIBAN" : "Supplier IBAN",
- "supplierCRNo" : "CR Number",
- "suppliedAcNo" : "Supplied Account No.",
- "patientRefundInvoice" : "Patient Refund Invoice",
- "patientNumber" : "Patient Number",
- "patientName" : "Patient Name",
- "invoiceDate" : "Invoice Date",
- "refundInvoice" :"Refund Invoice",
- "hospitalClinic" : "Hospital Clinic",
+ "supplierAcName": "Supplier Account Name",
+ "supplierIBAN": "Supplier IBAN",
+ "supplierCRNo": "CR Number",
+ "suppliedAcNo": "Supplied Account No.",
+ "patientRefundInvoice": "Patient Refund Invoice",
+ "patientNumber": "Patient Number",
+ "patientName": "Patient Name",
+ "invoiceDate": "Invoice Date",
+ "refundInvoice": "Refund Invoice",
+ "hospitalClinic": "Hospital Clinic",
"graphicalAnalysis": "Graphical Analysis",
"itemHistoryAnalysis": "Item History Analysis",
"pOno": "P.O #",
@@ -614,23 +614,23 @@
"qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty.",
- "start":"Start",
- "about":"About",
+ "start": "Start",
+ "about": "About",
"explore": "Explore",
"mazaya": "MAZAYA",
"benefits": "Benefits",
"mazayaDesc": "Discover special Discounts and offers available to Employees",
- "viewallofferMazaya" : "View All Offers",
+ "viewallofferMazaya": "View All Offers",
"buyerName": "Buyer Name",
"buyerNumber": "Buyer Number",
"highestBidder": "Highest Bidder",
"remarks": "Remarks",
"faHeader": "FA Header Details",
- "bookTypeCode": "Book Type Code",
+ "bookTypeCode": "Book Type Code",
"categoryCode": "Category Code",
"categoryGroup": "Category Group",
- "faLINES": "Asset Details",
- "assetNumber": "Asset Number",
+ "faLINES": "Asset Details",
+ "assetNumber": "Asset Number",
"assetDescription": "Asset Description",
"barCodeNumber": "BarCode Number",
"datePlaceInService": "Date place In Service",
@@ -638,9 +638,9 @@
"disposedDate": "Disposed Date",
"netBookValue": "Net Book Value",
"purchasedPrice": "Purchased Price",
- "usefulLife": "Useful Life",
+ "usefulLife": "Useful Life",
"yearsUsed": "Years Used",
- "faRequest":"FA Disposal Request",
+ "faRequest": "FA Disposal Request",
"showMore": "Show More",
"ticketDetails": "Ticket Details",
"currentTicketBalance": "Current Ticket Balance",
@@ -667,5 +667,6 @@
"ticketId": "Ticket ID",
"pleaseSelectProject": "Please select a project",
"viewAttachment" : "View Attachment",
- "parkingQr": "Parking QR"
+ "parkingQr": "Parking QR",
+ "startNow": "Start Now"
}
\ No newline at end of file
diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart
index 27fe289..87025f2 100644
--- a/lib/api/dashboard_api_client.dart
+++ b/lib/api/dashboard_api_client.dart
@@ -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/generic_response_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_response_model.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart';
@@ -456,4 +457,18 @@ class DashboardApiClient {
isFormData: false,
);
}
+
+ Future getGreetingCards() async {
+ String url = "${ApiConsts.erpRest}Get_GreetingCards";
+ Map postParams = {};
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject(
+ (json) {
+ GetGreetingCardsModelResponse responseData = GetGreetingCardsModelResponse.fromJson(json);
+ return responseData;
+ },
+ url,
+ postParams,
+ );
+ }
}
diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart
index 9ef43c9..f186a22 100644
--- a/lib/generated/codegen_loader.g.dart
+++ b/lib/generated/codegen_loader.g.dart
@@ -682,7 +682,8 @@ class CodegenLoader extends AssetLoader{
"ticketId": "معرف التذكرة",
"pleaseSelectProject": "الرجاء اختيار مشروع",
"viewAttachment": "عرض المرفق",
- "parkingQr": "وقوف السيارات QR"
+ "parkingQr": "وقوف السيارات QR",
+ "startNow": "ابدأ الآن"
};
static const Map _en_US = {
"mohemm": "Mohemm",
@@ -1352,7 +1353,8 @@ static const Map _en_US = {
"ticketId": "Ticket ID",
"pleaseSelectProject": "Please select a project",
"viewAttachment": "View Attachment",
- "parkingQr": "Parking QR"
+ "parkingQr": "Parking QR",
+ "startNow": "Start Now"
};
static const Map> mapLocales = {"ar_SA": _ar_SA, "en_US": _en_US};
}
diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart
index a9f4584..972583a 100644
--- a/lib/generated/locale_keys.g.dart
+++ b/lib/generated/locale_keys.g.dart
@@ -655,5 +655,6 @@ abstract class LocaleKeys {
static const pleaseSelectProject = 'pleaseSelectProject';
static const viewAttachment = 'viewAttachment';
static const parkingQr = 'parkingQr';
+ static const startNow = 'startNow';
}
diff --git a/lib/models/greetings/greeting_card_model.dart b/lib/models/greetings/greeting_card_model.dart
new file mode 100644
index 0000000..486aa8f
--- /dev/null
+++ b/lib/models/greetings/greeting_card_model.dart
@@ -0,0 +1,142 @@
+import 'dart:convert';
+
+class GetGreetingCardsModelResponse {
+ List? getGreetingCardsModelResponse;
+
+ GetGreetingCardsModelResponse({
+ this.getGreetingCardsModelResponse,
+ });
+
+ factory GetGreetingCardsModelResponse.fromRawJson(String str) => GetGreetingCardsModelResponse.fromJson(json.decode(str));
+
+ String toRawJson() => json.encode(toJson());
+
+ factory GetGreetingCardsModelResponse.fromJson(Map json) => GetGreetingCardsModelResponse(
+ getGreetingCardsModelResponse: json["Get_GreetingCardsModel_Response"] == null ? [] : List.from(json["Get_GreetingCardsModel_Response"]!.map((x) => GetGreetingCardsModelResponseElement.fromJson(x))),
+ );
+
+ Map toJson() => {
+ "Get_GreetingCardsModel_Response": getGreetingCardsModelResponse == null ? [] : List.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 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 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,
+ };
+}
+
diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart
index be8617d..e9c6678 100644
--- a/lib/provider/dashboard_provider_model.dart
+++ b/lib/provider/dashboard_provider_model.dart
@@ -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/eit/get_eit_transaction_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/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart';
@@ -73,6 +74,10 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
CoursesResponseModel? coursesResponse;
List coursesList = [];
+ bool isGreetingCardsLoading = true;
+ bool isDisplayEidGreetings = false;
+ List? greetingCardsList;
+
//Attendance Tracking API's & Methods
Future fetchAttendanceTracking(context) async {
try {
@@ -121,6 +126,8 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
getMenuEntriesList = null;
isOffersLoading = true;
getOffersList = [];
+ isGreetingCardsLoading = true;
+ isDisplayEidGreetings = false;
drawerMenuItemList = [
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 fetchTicketBooking() async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getTicketBookingRedirection();
diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart
index deb3131..0ff22ae 100644
--- a/lib/ui/landing/dashboard_screen.dart
+++ b/lib/ui/landing/dashboard_screen.dart
@@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:io';
import 'dart:ui' as ui;
-
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.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:pull_to_refresh/pull_to_refresh.dart';
import 'package:signalr_netcore/signalr_client.dart';
+import 'package:url_launcher/url_launcher.dart';
late HubConnection chatHubConnection;
@@ -155,6 +155,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb
data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries();
data.fetchEventActivity();
+ data.fetchGreetingCards();
data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi();
marathonProvider.getMarathonTutorial();
@@ -316,103 +317,103 @@ class _DashboardScreenState extends State with WidgetsBindingOb
child: Consumer(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return (model.isAttendanceTrackingLoading
- ? GetAttendanceTrackingShimmer()
- : Container(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(15),
- gradient: const LinearGradient(
- transform: GradientRotation(.46),
- begin: Alignment.topRight,
- end: Alignment.bottomLeft,
- colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor],
- ),
- ),
- child: Stack(
- alignment: Alignment.center,
- children: [
- if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- 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)
- Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.start,
+ ? GetAttendanceTrackingShimmer()
+ : Container(
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(15),
+ gradient: const LinearGradient(
+ transform: GradientRotation(.46),
+ begin: Alignment.topRight,
+ end: Alignment.bottomLeft,
+ colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor],
+ ),
+ ),
+ child: Stack(
+ alignment: Alignment.center,
+ children: [
+ if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ 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)
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ 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(Colors.white),
+ backgroundColor: const Color(0xff196D73),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ).paddingOnly(top: 12, right: 15, left: 12),
+ ),
+ Row(
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),
- ),
+ 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),
),
- 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(Colors.white),
- backgroundColor: const Color(0xff196D73),
+ 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));
+ }),
],
),
- ],
- ).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();
},
),
@@ -424,8 +425,102 @@ class _DashboardScreenState extends State with WidgetsBindingOb
),
],
).paddingOnly(left: 21, right: 21, top: 7, bottom: 21),
- eventActivityWidget(context),
+ Consumer(
+ 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) ...[
Column(
mainAxisSize: MainAxisSize.min,
@@ -461,70 +556,70 @@ class _DashboardScreenState extends State with WidgetsBindingOb
flex: 2,
child: RichText(
text:
- AppState().isArabic(context)
- ? TextSpan(
- children: [
- TextSpan(
- text: 'اطلع على مميزات',
- style: TextStyle(
- fontSize: 16,
- letterSpacing: -0.2,
- fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
- fontWeight: FontWeight.w700,
- height: 24 / 16,
- color: Color(0xFF5D5E5E),
- ),
- ),
- TextSpan(
- text: ' مزايا',
- style: TextStyle(
- fontSize: 16,
- fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
- fontWeight: FontWeight.w700,
- letterSpacing: -0.2,
- height: 24 / 16,
- color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
- ),
- ),
- ],
- )
- : TextSpan(
- children: [
- TextSpan(
- text: LocaleKeys.explore.tr() + ' ',
- style: const TextStyle(
- fontSize: 16,
- letterSpacing: -0.2,
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- height: 24 / 16,
- color: Color(0xFF5D5E5E),
- ),
- ),
- TextSpan(
- text: LocaleKeys.mazaya.tr(),
- style: const TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w700,
- fontFamily: 'Poppins',
- letterSpacing: -0.2,
- height: 24 / 16,
- color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
- ),
- ),
- TextSpan(
- text: ' ' + LocaleKeys.benefits.tr(),
- style: const TextStyle(
- fontSize: 16,
- letterSpacing: -0.2,
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- height: 24 / 16,
- color: Color(0xFF5D5E5E),
- ),
- ),
- ],
- ),
+ AppState().isArabic(context)
+ ? TextSpan(
+ children: [
+ TextSpan(
+ text: 'اطلع على مميزات',
+ style: TextStyle(
+ fontSize: 16,
+ letterSpacing: -0.2,
+ fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
+ fontWeight: FontWeight.w700,
+ height: 24 / 16,
+ color: const Color(0xFF5D5E5E),
+ ),
+ ),
+ TextSpan(
+ text: ' مزايا',
+ style: TextStyle(
+ fontSize: 16,
+ fontFamily: AppState().isArabic(context) ? 'Cairo' : 'Poppins',
+ fontWeight: FontWeight.w700,
+ letterSpacing: -0.2,
+ height: 24 / 16,
+ color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
+ ),
+ ),
+ ],
+ )
+ : TextSpan(
+ children: [
+ TextSpan(
+ text: LocaleKeys.explore.tr() + ' ',
+ style: const TextStyle(
+ fontSize: 16,
+ letterSpacing: -0.2,
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ height: 24 / 16,
+ color: Color(0xFF5D5E5E),
+ ),
+ ),
+ TextSpan(
+ text: LocaleKeys.mazaya.tr(),
+ style: const TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w700,
+ fontFamily: 'Poppins',
+ letterSpacing: -0.2,
+ height: 24 / 16,
+ color: MyColors.mazayaRedColor, // Use your MAZAYA red color here if defined, e.g. MyColors.mazayaRed
+ ),
+ ),
+ TextSpan(
+ text: ' ' + LocaleKeys.benefits.tr(),
+ style: const TextStyle(
+ fontSize: 16,
+ letterSpacing: -0.2,
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ height: 24 / 16,
+ color: Color(0xFF5D5E5E),
+ ),
+ ),
+ ],
+ ),
),
),
const Expanded(flex: 1, child: SizedBox()),
@@ -577,12 +672,10 @@ class _DashboardScreenState extends State with WidgetsBindingOb
LocaleKeys.discounts.tr().toText24(isBold: true),
6.width,
Container(
- padding: const EdgeInsets.only(left: 8, right: 8),
- decoration: BoxDecoration(
- color: MyColors.yellowColor,
- borderRadius: BorderRadius.circular(10),
- ),
- child: LocaleKeys.newString.tr().toText10(isBold: true)),
+ padding: const EdgeInsets.only(left: 8, right: 8),
+ decoration: BoxDecoration(color: MyColors.yellowColor, borderRadius: BorderRadius.circular(10)),
+ child: LocaleKeys.newString.tr().toText10(isBold: true),
+ ),
],
),
],
@@ -590,7 +683,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb
),
LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
- })
+ }),
],
).paddingOnly(left: 21, right: 21),
Consumer(
@@ -598,59 +691,54 @@ class _DashboardScreenState extends State with WidgetsBindingOb
return SizedBox(
height: 103 + 33,
child: ListView.separated(
- shrinkWrap: true,
- physics: const BouncingScrollPhysics(),
- padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
- scrollDirection: Axis.horizontal,
- itemBuilder: (BuildContext cxt, int index) {
- return model.isOffersLoading
- ? const OffersShimmerWidget()
- : InkWell(
- onTap: () {
- navigateToDetails(data.getOffersList[index]);
- },
- child: SizedBox(
- width: 73,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- width: 73,
- height: 73,
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: const BorderRadius.all(
- Radius.circular(100),
- ),
- border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
- ),
- child: ClipRRect(
- borderRadius: const BorderRadius.all(
- Radius.circular(50),
+ shrinkWrap: true,
+ physics: const BouncingScrollPhysics(),
+ padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
+ scrollDirection: Axis.horizontal,
+ itemBuilder: (BuildContext cxt, int index) {
+ return model.isOffersLoading
+ ? const OffersShimmerWidget()
+ : InkWell(
+ onTap: () {
+ navigateToDetails(data.getOffersList[index]);
+ },
+ child: SizedBox(
+ width: 73,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Container(
+ width: 73,
+ height: 73,
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: const BorderRadius.all(Radius.circular(100)),
+ border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
- child: Hero(
- tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
- transitionOnUserGestures: true,
- child: Image.network(
- data.getOffersList[index].logo ?? "",
- fit: BoxFit.contain,
+ child: ClipRRect(
+ borderRadius: const BorderRadius.all(Radius.circular(50)),
+ child: Hero(
+ tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
+ transitionOnUserGestures: true,
+ child: Image.network(data.getOffersList[index].logo ?? "", fit: BoxFit.contain),
),
),
),
- ),
- 4.height,
- Expanded(
- child: AppState().isArabic(context)
- ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
- : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
- ),
- ],
+ 4.height,
+ Expanded(
+ child:
+ AppState().isArabic(context)
+ ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
+ : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
+ ),
+ ],
+ ),
),
- ),
- );
- },
- separatorBuilder: (BuildContext cxt, int index) => 8.width,
- itemCount: 9),
+ );
+ },
+ separatorBuilder: (BuildContext cxt, int index) => 8.width,
+ itemCount: 9,
+ ),
);
},
),
@@ -773,28 +861,28 @@ class _DashboardScreenState extends State with WidgetsBindingOb
SvgPicture.asset(
"assets/icons/chat/chat.svg",
color:
- !checkIfPrivilegedForChat()
- ? MyColors.lightGreyE3Color
- : currentIndex == 4
- ? MyColors.grey3AColor
- : cProvider.disbaleChatForThisUser
- ? MyColors.lightGreyE3Color
- : MyColors.grey98Color,
+ !checkIfPrivilegedForChat()
+ ? MyColors.lightGreyE3Color
+ : currentIndex == 4
+ ? MyColors.grey3AColor
+ : cProvider.disbaleChatForThisUser
+ ? MyColors.lightGreyE3Color
+ : MyColors.grey98Color,
).paddingAll(4),
Consumer(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) {
return !checkIfPrivilegedForChat()
? const SizedBox()
: Positioned(
- right: 0,
- top: 0,
- child: Container(
- padding: const EdgeInsets.only(left: 4, right: 4),
- alignment: Alignment.center,
- decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)),
- child: data.chatUConvCounter.toString().toText10(color: Colors.white),
- ),
- );
+ right: 0,
+ top: 0,
+ child: Container(
+ padding: const EdgeInsets.only(left: 4, right: 4),
+ alignment: Alignment.center,
+ decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)),
+ child: data.chatUConvCounter.toString().toText10(color: Colors.white),
+ ),
+ );
},
),
],
@@ -865,4 +953,4 @@ class _DashboardScreenState extends State with WidgetsBindingOb
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart
index 879173b..0a30857 100644
--- a/lib/ui/landing/widget/services_widget.dart
+++ b/lib/ui/landing/widget/services_widget.dart
@@ -92,7 +92,7 @@ class ServicesWidget extends StatelessWidget {
aspectRatio: 105 / 105,
child:
data.isServicesMenusLoading
- ? ServicesMenuShimmer()
+ ? const ServicesMenuShimmer()
: Container(
decoration: BoxDecoration(
color: Colors.white,
@@ -266,7 +266,6 @@ class ServicesWidget extends StatelessWidget {
await pro.fetchTicketAccuralBalance(context, DateTime.now());
pro.ticketHistoryTransactionList = await EITApiClient().getEITTransactions("HMG_TICKET_ITENARY_HR_EIT_SS", isCompleteList: true);
-
Utils.hideLoading(context);
// Here Need Work
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),
scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) {
- return AspectRatio(aspectRatio: 105 / 105, child: ServicesMenuShimmer());
+ return AspectRatio(aspectRatio: 105 / 105, child: const ServicesMenuShimmer());
},
separatorBuilder: (cxt, index) => 9.width,
itemCount: 4,
diff --git a/lib/widgets/shimmer/dashboard_shimmer_widget.dart b/lib/widgets/shimmer/dashboard_shimmer_widget.dart
index c11cf16..7d59899 100644
--- a/lib/widgets/shimmer/dashboard_shimmer_widget.dart
+++ b/lib/widgets/shimmer/dashboard_shimmer_widget.dart
@@ -8,6 +8,8 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:shimmer/shimmer.dart';
class GetAttendanceTrackingShimmer extends StatelessWidget {
+ const GetAttendanceTrackingShimmer({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
return Container(
@@ -85,6 +87,8 @@ class GetAttendanceTrackingShimmer extends StatelessWidget {
}
class MenuShimmer extends StatelessWidget {
+ const MenuShimmer({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
return Container(
@@ -122,6 +126,8 @@ class MenuShimmer extends StatelessWidget {
}
class ServicesHeaderShimmer extends StatelessWidget {
+ const ServicesHeaderShimmer({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
return Row(
@@ -145,6 +151,8 @@ class ServicesHeaderShimmer extends StatelessWidget {
}
class ServicesMenuShimmer extends StatelessWidget {
+ const ServicesMenuShimmer({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
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 {
const MarathonBannerShimmer({Key? key}) : super(key: key);
@@ -305,3 +382,4 @@ class ChatHomeShimmer extends StatelessWidget {
));
}
}
+