Compare commits

..

No commits in common. 'master' and 'localization_aamir' have entirely different histories.

1
.gitignore vendored

@ -1,4 +1,3 @@
# Miscellaneous
*.class
*.log

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,5 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="9.688" viewBox="0 0 13 9.688">
<g id="Group" transform="translate(6 17.688) rotate(180)">
<path id="Vector" d="M13,4.844a.781.781,0,0,1-.781.781H2.674L5.414,8.352a.781.781,0,0,1-1.1,1.108L.23,5.4h0a.782.782,0,0,1,0-1.106h0L4.312.227a.781.781,0,0,1,1.1,1.108L2.674,4.062h9.545A.781.781,0,0,1,13,4.844Z" transform="translate(-7 8)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

@ -12,7 +12,6 @@
"verify": "تحقق",
"verified": "تم التحقق",
"signOut": "تسجيل خروج",
"accessDenied": "الوصول مرفوض",
"enterEmail": "ادخل الايميل",
"enterNewEmail": "ادخل ايميل جديد",
"enterCurrentPassword": "كلمة المرور الحاليه",
@ -64,8 +63,6 @@
"imageUploaded": "تم تحميل الصوره",
"fileLarger": "1KB حجم الملف اكبر من",
"account": "الحساب",
"role": "الدور",
"userType": "نوع المستخدم",
"edit": "تعديل",
"imageDeleted": "تم حذف الصوره",
"dashboard": "الصفحه الرئيسيه",
@ -79,7 +76,7 @@
"userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل",
"english": "عربي",
"english": "English",
"title": "مرحبًا",
"msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language",
@ -135,14 +132,14 @@
"insert_otp_code": "ادخل الرمز",
"type_code": "الرجاء كتابة الرمز الذي أرسلناه إلى",
"resend_code": "أعد إرسال الرمز",
"check_code": "التحقق من الرمز",
"check_code": "التحقق من الشفرة",
"time_will_expire": "إعادة إرسال الرمز بتنسيق",
"sec": "ثانية",
"providers": "الموفرون",
"appointments": "المواعيد",
"appointments": "تعيينات",
"home": "بيت",
"ads": "إعلانات",
"settings": "الإعدادات",
"settings": "إعدادات",
"view_all": "مشاهدة الكل",
"my_active_Ads": "إعلاناتي النشطة",
"recommended_ads": "الإعلانات الموصى بها",
@ -150,7 +147,6 @@
"my_service_providers": "مزودي الخدمة الجدد",
"appointment_details": "تفاصيل الموعد",
"no_city_available": "لا توجد مدينة متاحة لهذا البلد",
"noDataAvailable": "لا توجد بيانات متاحة",
"branch_created": "تم إنشاء الفرع بنجاح",
"branch_updated": "تم تحديث الفرع بنجاح",
"branch_deleted": "تم حذف الفرع بنجاح",
@ -190,7 +186,7 @@
"updateBranch": "تحديث فرع",
"branches": "الفروع",
"requests": "الطلبات",
"noBranchFound": "لم يتم العثور على فرع",
"noBranchFound" : "لم يتم العثور على فرع",
"onlyProviderApp": "نأسف هذا التطبيق فقط لمقدمي الخدمات",
"pickAddress": "اختر العنوان",
"pickLocation": "اختر الموقع",
@ -206,19 +202,19 @@
"completeProfile2": "اكمل الملف الشخصي 2/3",
"completeProfile3": "اكمل الملف الشخصي 3/3",
"provider": "مزود",
"noRequeststoShow": "لا توجد طلبات للعرض",
"noRequeststoShow" : "لا توجد طلبات للعرض",
"myBranches": "فروعي",
"mergeAppointments": "دمج المواعيد",
"addService": "أضف الخدمة",
"selectServicestoAdd": "حدد الخدمات التي تريد إضافتها",
"mergeAppointments" : "دمج المواعيد",
"addService" : "أضف الخدمة",
"selectServicestoAdd" : "حدد الخدمات التي تريد إضافتها",
"noServiceFound": "لم يتم العثور على الخدمة",
"selectItems": "اختيار العناصر",
"noItemSelectedYet": "لم يتم تحديد أي عنصر بعد",
"totalAdditionalAmount": "إجمالي المبلغ الإضافي",
"sar": "ريال سعودي",
"cancel": "الغاء",
"add": "اضافه",
"itemsAddedSuccessfully": "تمت إضافة العناصر بنجاح",
"selectItems" : "اختيار العناصر",
"noItemSelectedYet" : "لم يتم تحديد أي عنصر بعد",
"totalAdditionalAmount" : "إجمالي المبلغ الإضافي",
"sar" : "ريال سعودي",
"cancel" : "يلغي",
"add" : "يضيف",
"itemsAddedSuccessfully" : "تمت إضافة العناصر بنجاح",
"pleaseSelectItems": "يرجى اختيار العناصر",
"totalAmount": "المبلغ الإجمالي",
"searchItems": "البحث عن العناصر",
@ -230,10 +226,10 @@
"typeHere": "اكتب هنا...",
"pleaseSelectReason": "يرجى تحديد السبب",
"noAppointmentFound": "لم يتم العثور على مواعيد",
"slotsOverview": "نظرة عامة على الحجوزات",
"slotsOverview": "نظرة عامة على الفتحات",
"empty": "فارغ",
"occupied": "محجوز",
"totalSlots": "إجمالي الحجوزات",
"totalSlots": "إجمالي الفتحات",
"selectAppointments": "اختيار المواعيد",
"appointmentMergeSuccessfully": "دمج المواعيد تم بنجاح",
"updateAppointment": "تحديث الموعد",
@ -242,11 +238,10 @@
"appointmentisCompleted": "تم اكتمال الموعد",
"workStart": "بدء العمل",
"payNow": "ادفع الآن",
"arrived": "تم الوصول",
"arrived": "وصل",
"payLater": "ادفع لاحقًا",
"complete": "اكتمل",
"makeAnOffer": "قدم عرضًا",
"provideOffer": "تقديم عرض",
"enterAmount": "أدخل المبلغ",
"submit": "إرسال",
"viewChat": "عرض الدردشة",
@ -258,9 +253,6 @@
"sendOTP": "إرسال رمز OTP",
"noUserAddedYet": "لم يتم إضافة مستخدم بعد",
"assignDealerUser": "تعيين مستخدم تاجر",
"confirmAssignDealerUser": "هل أنت متأكد من رغبتك في تعيين مستخدم التاجر هذا للفرع؟",
"removeDealerUser": "إزالة مستخدم تاجر",
"confirmRemoveDealerUser": "هل أنت متأكد من رغبتك في إزالة مستخدم التاجر هذا من الفرع؟",
"createNewUser": "إنشاء مستخدم جديد",
"dealerUser": "مستخدم تاجر",
"setorEditBranchSchedule": "تعيين أو تحرير جدول الفروع",
@ -335,11 +327,8 @@
"vehiclePictures": "صور المركبة",
"vehiclePart": "جزء المركبة",
"damagePartPictures": "صور الأجزاء المتضررة",
"qrCode": "رمز الاستجابة السريعة",
"downgradeAppliedAfterExpiry": "سيتم تطبيق هذه الباقة تلقائيًا بعد انتهاء صلاحية باقتك الحالية.",
"downgradeDeactivateInstruction": "لتحديد هذا الاشتراك، يجب عليك إلغاء تفعيل الفروع والمستخدمين حيث أن هذه الباقة تدعم فقط {branches} و {users}. يمكنك إعادة تفعيل هذه الفروع لاحقًا بعد ترقية الباقة",
"vehicleDamagePart": "جزء المركبة المتضرر",
"duration": "المدة",
"duration": ":المدة",
"specialServices": "الخدمات الخاصة",
"specialService": "خدمة خاصة",
"adContactDetails": "تفاصيل الاتصال بالإعلان",
@ -367,7 +356,7 @@
"setupTouchID": "يرجى إعداد معرف اللمس",
"reenableTouchID": "يرجى إعادة تمكين معرف اللمس",
"scanFaceIDAuthenticate": "امسح بصمة الإصبع أو معرف الوجه للتحقق",
"adDeletedSuccessfully": "تم حذف الإعلان بنجاح!",
"AdDeletedSuccessfully": "تم حذف الإعلان بنجاح!",
"yourReservationCancelled": "تم إلغاء حجزك.",
"adDeactivatedSuccessfully": "تم إلغاء تفعيل الإعلان بنجاح!",
"vehicle": {
@ -389,9 +378,7 @@
"error": "خطأ",
"appointmentBookedSuccessfully": "تم حجز موعدك بنجاح",
"appointmentStatusUpdated": "تم تحديث حالة الموعد",
"appointmentStatusLabel": "حالة الموعد",
"paymentStatusUpdated": "تم تحديث حالة الدفع",
"serviceStatusUpdated": "تم تحديث حالة الخدمة",
"selectOneSubService": "يرجى اختيار خدمة فرعية واحدة على الأقل",
"chargesBreakdown": "تفاصيل الرسوم",
"services": "الخدمات",
@ -418,25 +405,13 @@
"passwordIsStrong": "كلمة المرور الخاصة بك قوية",
"passwordVeryStrong": "كلمة المرور الخاصة بك قوية جدًا",
"selectDuration": "اختر المدة",
"daysVar": "يوم",
"daysVar": "الأيام",
"adCharges": "رسوم الإعلان",
"select": "اختر",
"selectOption": "اختر خيار",
"deleteAdConfirmation": "هل تريد حذف الإعلان؟",
"deleteAdConfirmationMessage": "سيتم حذف إعلانك نهائيًا ولا يمكنك التراجع عن هذا الإجراء",
"mileage": "المسافة المقطوعة",
"transmission": "ناقل الحركة",
"odometer": "عداد المسافات",
"accidentFree": "خالية من الحوادث",
"brandNew": "جديدة",
"used": "مستعملة",
"all": "الكل",
"newSparePart": "قطع غيار جديدة",
"usedSparePart": "قطع غيار مستعملة",
"hasYourCarHadAccident": "هل تعرضت سيارتك لأي حادث؟",
"odometerReading": "قراءة عداد المسافات (كم)",
"canMileageIncrease": "هل يمكن زيادة المسافة المقطوعة عند الفحص؟",
"currentlyInUse": "قيد الاستخدام حاليًا",
"demand": "الطلب",
"adDurationExpired": "انتهت مدة عرض الإعلان الخاص بك",
"bankDetails": "تفاصيل البنك",
@ -464,8 +439,6 @@
"bookAndPay": "الحجز والدفع",
"reservationAmounts": "مبالغ الحجز",
"tax": "الضريبة",
"requester": "مقدم الطلب",
"mowaterAdvertisement": "شركة مواتر",
"adsFilter": "تصفية الإعلانات",
"searchByCity": "البحث حسب المدينة",
"selectCity": "اختر المدينة",
@ -489,7 +462,6 @@
"completeDeal": "إتمام الصفقة",
"uploadBankReceipt": "تحميل إيصال البنك",
"notesForAdmin": "ملاحظات للإدارة",
"note": "ملاحظة:",
"extendAd": "تمديد الإعلان",
"updateAdDetails": "هل تريد تحديث تفاصيل الإعلان",
"durationExtendingAd": "يمكنك تغيير مدة الإعلان والتفاصيل قبل تمديد الإعلان",
@ -519,7 +491,8 @@
"submitAd": "إرسال الإعلان",
"selectAdType": "اختر نوع الإعلان",
"validUntilSubscriptionExpiration": "صالح حتى انتهاء الاشتراك",
"youLeftAdsGivenSubscription": "لقد تركت مع إعلانات محدودة الواردة في الاشتراك.",
"adsRemaining": "الإعلانات المتبقية",
"youLeftAdsGivenSubscription": "لقد بقي لديك 05 من 50 إعلانًا في الاشتراك.",
"updateSubscription": "تحديث الاشتراك",
"workInProgress": "العمل جارٍ",
"visitCompleted": "تمت الزيارة",
@ -543,6 +516,7 @@
"itemsSelected": "العناصر المحددة",
"workshopFullAccessServices": "بعض الخدمات غير متوفرة في الموقع المنزلي. قم بتغيير الموقع إلى ورشة العمل للوصول الكامل إلى الخدمات",
"changeLocationService": "تغيير الموقع أو الخدمة:",
"noItemstoShow": "لا توجد عناصر لعرضها.",
"someDescriptionSubServices": "بعض الوصف عن الخدمات الفرعية",
"selectServicesYouWant": "اختر الخدمات التي تريدها",
"selectServiceType": "اختر نوع الخدمة",
@ -587,361 +561,20 @@
"inviteFriends": "دعوة الأصدقاء",
"more": "المزيد",
"language": "اللغة",
"mySubscription": "اشتراكاتي",
"mySubscriptions": "اشتراكاتي",
"subscriptions": "الاشتراكات",
"defineLicenses": "تحديد التراخيص",
"logOut": "تسجيل الخروج",
"customer": "العميل",
"amountVAR": "كمية",
"accept": "قبول",
"nowVar": "الآن",
"whendoyouWanttoUpgrade": "متى تريد الترقية",
"yourSubscriptionUpgradeAffectingFrom": "سيتم ترقية اشتراكك الآن. ساري المفعول من",
"upgradeAfterCurrentExpiry": "الترقية بعد انتهاء الاشتراك الحالي",
"yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom": "سيتم ترقية اشتراكك بعد انتهاء اشتراكك الحالي. ساري المفعول من",
"upgradeVar": "ترقية",
"whendoyouWanttoRenew": "متى تريد التجديد",
"renewVar": "تجديد",
"requestAlreadyInProgress": "هذا الطلب قيد التقدم بالفعل.",
"acceptOfferConfirmation": "هل تريد قبول هذا العرض؟",
"acceptOfferConfirmationMessage": "سيتم قبول هذا العرض وستدفع المبلغ المطلوب للمشتري في وقت معين وإلا سيتم إلغاء هذا العرض.",
"noUpcomingAppointments": "لا توجد مواعيد قادمه..",
"addNewAppointment": "إضافة موعد جديد",
"myNearbyBranches": "فروعي القريبة",
"myRecentBranches": "فروعي الأخيرة",
"favoriteList": "قائمة المفضلة",
"myFavouriteProviders": "مزودي الخدمة المفضلين",
"myFavouriteAds": "إعلاناتي المفضلة",
"noFavouriteAds": "لا توجد إعلانات مفضلة",
"noReviewsBranch": "هذا الفرع لا يوجد لديه تعليقات.",
"readLess": "اقرأ أقل",
"readMoreReviews": "اقرأ المزيد من التقييمات",
"noProvidersInFav": "ليس لديك أي مقدمي خدمات في المفضلة.",
"providerHasNoBranches": "هذا المزود ليس لديه فروع حتى الآن.",
"totalBranches": "إجمالي الفروع",
"memberSince": "عضو منذ",
"reserved": "محجوز",
"delete": "يمسح",
"deleteBranchConfirmation": "هل تريد حذف الفرع؟",
"deleteBranchConfirmationMessage": "سيتم حذف فرعك بشكل دائم ولن تتمكن من التراجع عن هذا الإجراء",
"reviewAndPayment": "المراجعة والدفع",
"awaitingPaymentFromCustomer": "في انتظار الدفع من العميل",
"awaitingResponseFromProvider": "في انتظار الرد من المزود",
"offerNoLongerAvailable": "العرض لم يعد متاحاً",
"doYouWantToCompleteThisDeal": "هل تريد إكمال هذه الصفقة؟",
"customerCompletingDealMeansThat": "إكمال هذه الصفقة يعني أن الطلب الذي قمت بنشره قد تم استلامه بنجاح ولا يمكن التراجع عن هذا الإجراء.",
"providerCompletingDealMeansThat": "إكمال هذه الصفقة يعني أنك قد قدمت الخدمة للعميل بنجاح وفقاً لطلبه ولا يمكن التراجع عن هذا الإجراء.",
"offerSummary": "ملخص العرض",
"personalInformation": "المعلومات الشخصية",
"name": "الاسم",
"phone": "الهاتف",
"serviceInformation": "معلومات الخدمة",
"locationInformation": "معلومات الموقع",
"additionalAddressDetails": "تفاصيل العنوان الإضافية",
"serviceName": "اسم الخدمة",
"serviceCategory": "فئة الخدمة",
"offerPrice": "سعر العرض",
"totalPrice": "السعر الإجمالي",
"providerName": "اسم المزود",
"createdOn": "تم الإنشاء في",
"manufacturedBy": "صُنع بواسطة",
"manufacturedOn": "تاريخ الصنع",
"shipping": "الشحن",
"delivery": "التسليم",
"selectDeliveryType": "اختر نوع التسليم",
"shippingManagementInstruction": "يرجى الذهاب إلى الإعدادات > شاشة إدارة الشحن لإدارة عناصر الشحن/التسليم بشكل أكبر.",
"withdrawOffer": "سحب العرض",
"manufacturer": "الصانع",
"priceRange": "نطاق السعر",
"cancelOffer": "إلغاء العرض",
"pleaseSpecify": "يرجى التحديد",
"customerNotResponding": "العميل غير متجاوب",
"cancelRequestPrompt": "هل تريد إلغاء هذا الطلب؟",
"requestPermanentlyCancelled": "سيتم إلغاء طلبك بشكل نهائي. لا يمكنك التراجع عن هذا الإجراء.",
"awaitingResponseFromCustomer": "في انتظار الرد من العميل",
"acknowledgePaymentToMowater": "أقر بأنه عند إكمال هذه الصفقة، سأدفع 2٪ من إجمالي هذه الصفقة لشركة مواتر مقابل خدماتهم.",
"requestsFilter": "تصفية الطلبات",
"searchByCondition": "البحث حسب الحالة",
"selectCondition": "حدد الحالة",
"searchByRequestType": "البحث حسب نوع الطلب",
"searchByCustomerName": "البحث حسب اسم العميل",
"searchByProviderName": "البحث حسب اسم المزود",
"searchByRequestStatus": "البحث حسب حالة الطلب",
"selectRequestType": "اختر نوع الطلب",
"selectRequestStatus": "اختر حالة الطلب",
"searchByRequestedDate": "البحث حسب تاريخ الطلب",
"selectDate": "اختر التاريخ",
"searchByVehicleModel": "البحث حسب طراز المركبة",
"selectVehicleModel": "اختر طراز المركبة",
"customerCarePrompt": "هل لديك أي استفسار؟ نحن هنا لخدمتك. انقر هنا للتحدث مع خدمة العملاء لدينا الآن.",
"callNow": "اتصل الآن",
"condition": "الحالة",
"newCondition": "جديد",
"servicesNotAvailableHomeLocation": "بعض الخدمات غير متوفرة في الموقع المنزلي.",
"additionalChargesNotice": "هذه الرسوم إضافية على رسوم الخدمة الفعلية. قد تختلف الرسوم للعناصر الثقيلة.",
"selectServiceLocation": "اختر موقع الخدمة",
"apptOn": "الموعد في",
"merged": "مُدمج",
"date": "التاريخ",
"selectAll": "اختر الكل",
"unselectAll": "إلغاء اختيار الكل",
"copySelectedServices": "نسخ الخدمات المحددة",
"pictures": "الصور",
"noChatMessage": "لا توجد رسائل بعد. أرسل رسالة لبدء المحادثة!",
"shippingManagement": "إدارة الشحن",
"appointmentCancelled": "تم إلغاء الموعد",
"appointmentsPerSlot": "المواعيد لكل فترة زمنية",
"createSchedule": "إنشاء الجدول الزمني",
"addItems": "إضافة عناصر",
"itemName": "اسم العنصر",
"itemDescription": "وصف العنصر",
"itemPrice": "سعر العنصر",
"bookAppointmentForServices": "سيسمح هذا الخيار للعميل بحجز موعد لهذه الخدمات.",
"showServiceAvailability": "سيظهر هذا الخيار للعميل ما إذا كان بإمكانه الحصول على هذه الخدمة في الورشة أم لا.",
"bookAppointmentAtLocation": "سيسمح هذا الخيار للعميل بحجز موعد في الموقع الذي يرغب فيه.",
"appointmentBookingOption": "سيسمح هذا الخيار للعميل بحجز موعد لهذه الخدمات.",
"workshopAvailabilityOption": "سيظهر هذا الخيار للعميل إذا كان يمكنه الحصول على هذه الخدمة في الورشة أم لا.",
"appointmentLocationOption": "سيسمح هذا الخيار للعميل بحجز موعد في الموقع الذي يختاره.",
"deleteScheduleConfirmation": "هل أنت متأكد أنك تريد حذف هذا الجدول؟",
"deleteScheduleAdConfirmationMessage": "سيتم إزالة جميع فترات المواعيد ولن يتمكن العملاء من حجز مواعيد لهذا الجدول.",
"branchSchedules": "جداول الفرع",
"noSchedulesFound": "لم تقم بإضافة أي جدول لهذا الفرع.",
"inviteFriendsBySMS": "دعوة الأصدقاء عبر الرسائل القصيرة",
"inviteFriendsByWhatsApp": "دعوة الأصدقاء عبر واتساب",
"inviteFriendsByEmail": "دعوة الأصدقاء عبر البريد الإلكتروني",
"noFAQsToShow": "لا توجد أسئلة شائعة في الوقت الحالي. يرجى الاتصال بنا إذا كان لديك أي استفسار.",
"appInfo": "معلومات التطبيق",
"users": "المستخدمين",
"adsRemaining": "الإعلانات المتبقية",
"attachPDF": "إرفاق PDF",
"noItemsToShow": "لا توجد عناصر لعرضها.",
"serviceItem": "عنصر الخدمة",
"createdBy": "تم الإنشاء بواسطة",
"createGroupServices": "إنشاء خدمات المجموعة",
"logoutConfirmation": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
"logoutConfirmationMessage": "سيتم تسجيل خروجك من التطبيق وسيتعين عليك إضافة اسم المستخدم وكلمة المرور مرة أخرى لتسجيل الدخول.",
"addToFavoritesOn": "تمت الإضافة إلى المفضلة في:",
"subscriptionDate": "تاريخ الاشتراك",
"expiresOn": "تنتهي صلاحيته",
"expired": "منتهي الصلاحية",
"upgradeBranches": "قم بترقية اشتراكك لإضافة المزيد من الفروع.",
"upgradeAds": "قم بترقية اشتراكك لإضافة المزيد من الإعلانات.",
"upgradeSubUsers": "قم بترقية اشتراكك لإضافة المزيد من المستخدمين الفرعيين.",
"explore": "استكشاف",
"manageRequests": "إدارة الطلبات",
"serviceNotAvailableAtHomeLocation": "الخدمة المختارة غير متوفرة في الموقع المحدد.",
"wantToRescheduleAppointment": "أرغب في إعادة جدولة الموعد.",
"noNeedForService": "لا أحتاج هذه الخدمة بعد الآن.",
"testTheService": "اختبر الخدمة.",
"companyLocation": "موقع الشركة",
"customerLocation": "موقع العميل",
"deliveryAvailable": "التوصيل متاح",
"viewed": "تم المشاهدة",
"read": "تمت القراءة",
"sent": "تم الإرسال",
"updateUserDetails": "تحديث تفاصيل المستخدم",
"enterNewFirstName": "أدخل الاسم الأول",
"enterNewLastName": "أدخل الاسم الأخير",
"userDetailsUpdated": "يتم تحديث تفاصيل المستخدم",
"itemNoLongerAvailable": "لم يعد هذا العنصر متاحًا.",
"reactivateAd": "إعادة تنشيط الإعلان",
"dealOutsideApp": "تمت الصفقة خارج التطبيق مع عميل آخر.",
"noAgreementCustomer": "لا يوجد اتفاق من جانب العميل.",
"dealNotCompleted": "لم تكتمل الصفقة",
"changedDesireToSell": "غيرت رغبتي في بيع المركبة.",
"vehicleDealOutsideApp": "تمت صفقة المركبة خارج التطبيق.",
"markAdAsSoldDesc": "سيتم وضع علامة 'تم البيع' على هذا الإعلان، ولن يتمكن المستخدمون الآخرون من التواصل معك.",
"ownerInformation": "معلومات المالك",
"acceptedRequests": "الطلبات المقبولة",
"specialRequests": "الطلبات الخاصة",
"specialRequestChat": "دردشة الطلب الخاص",
"sparePartRequestChat": "دردشة طلب قطع الغيار",
"specialCarRequestChat": "دردشة طلب السيارة الخاصة",
"companyName": "اسم الشركة",
"noAvailableItems": "لا توجد عناصر متاحة.",
"serviceDeliveryType": "نوع تقديم الخدمة",
"noImagesToShow": "لا توجد صور للعرض",
"updateGroupServices": "تحديث خدمات المجموعة",
"addCommentsHere": "أضف التعليقات هنا",
"waitForBranchVerification": "يرجى الانتظار حتى يتم التحقق من الفرع.",
"reportComplaint": "تقديم شكوى",
"descriptionCannotBeEmpty": "وصف لا يمكن أن يكون فارغًا.",
"adMarkedAsSold": "تم وسم الإعلان كـ 'مباع' بنجاح!",
"chargesAndServiceRangeGreaterThanZero": "يجب أن تكون الرسوم ونطاق الخدمة أكبر من الصفر.",
"cannotSelectAllDaysAsOff": "لا يمكنك اختيار جميع الأيام كأيام عطلة.",
"endDateAfterStartDate": "يجب أن تكون تاريخ النهاية بعد تاريخ البدء.",
"pleaseEnterStartDateFirst": "من فضلك أدخل تاريخ البدء أولاً.",
"endTimeAfterStartTime": "يجب أن يكون وقت الانتهاء بعد وقت البدء.",
"pickedLocationNotice": "سيتم استخدام هذا الموقع لجميع الخدمات المنزلية في هذه الموعد",
"serviceNotProvided": "لسوء الحظ، هذه الخدمة غير متوفرة في الفرع الذي اخترته في هذا الموقع المحدد",
"pleaseSelectService": "يرجى اختيار خدمة واحدة على الأقل",
"operationalIssue": "مشكلة تشغيلية",
"materialIssue": "مشكلة في المواد",
"selectReasonBeforeCancel": "يرجى اختيار سبب قبل إلغاء هذا الموعد. لا يمكن التراجع عن هذا الإجراء.",
"blockedByAdmin": "تم حظرها من قبل المسؤول",
"active": "نشط",
"paymentType": "نوع الدفع",
"searchByCreatedDate": "البحث حسب تاريخ الإنشاء",
"cityNameMandatory": "المدينة إلزامية",
"genderMandatory": "الجنس إلزامي",
"updateCity": "تحديث المدينة",
"userGender": "جنس",
"userMale": "ذكر",
"userFemale": "أنثى",
"maxFileSelection": "يمكنك تحديد الحد الأقصى لملفات 7",
"maxFileSize": "يجب أن يكون حجم كل ملف أقل من 2 ميغابايت",
"onlyJPGandPNG": "يُسمح فقط بملفات JPG وPNG",
"expiryDate": "تاريخ انتهاء الصلاحية",
"dealCompleted": "تم إتمام الصفقة",
"theDealNotCompleted": "لم تكتمل الصفقة",
"cancelRequest": "أريد إلغاء الطلب.",
"highPrice": "سعر مرتفع",
"offerNotMatched": "العرض لم يتطابق مع الطلب.",
"offerRejected": "تم رفض العرض.",
"offerAccepted": "تم قبول العرض.",
"you": "أنتم",
"youCannotDeactivateThisServiceRightNow": "لا يمكنك تعطيل هذه الخدمة الآن لأن لديك مواعيد معلقة لهذه الخدمة. تفاصيل آخر موعد هي:",
"done": "تم",
"notice": "إشعار",
"serviceDeactivated": "تم تعطيل الخدمة",
"totalNumberOfServices": "عدد الخدمات:",
"noAvailableOfficesInCity": "لا توجد مكاتب متاحة في مدينتك لخدمتك.",
"searchByItem": "البحث حسب العنصر",
"selectBranchToCopyServices": "حدد الفرع لنسخ العناصر الخاصة بهم إلى هذا الفرع. يمكنك تعديل الاختيار في أي وقت.",
"tapToSeeItems": "اضغط لرؤية العناصر",
"tapToSelect": "اضغط للاختيار",
"noteCopyItemsExplanation": "ملاحظة: ستتمكن من نسخ العناصر من خدمة إلى أخرى في الفئة المحددة. يجب عليك إنشاء الخدمات أولاً ويجب أن تكون معتمدة. ثم ستتمكن من الحصول على الخدمات المتاحة التي يمكنك نسخ جميع العناصر منها أو تحديد العناصر التي تريد نسخها.",
"requestCreatedOn": "تم إنشاء الطلب في",
"online": "عبر الإنترنت",
"deliveryStatus": "حالة توصيلك / الشحن هي:",
"markAsCompleted": "ضع علامة كمكتمل",
"searchByServiceDelivery": "البحث حسب خدمة التوصيل",
"searchByMobileNumber": "البحث بواسطة رقم الجوال",
"enterMobileNumber": "أدخل رقم الجوال",
"enterCustomerName": "أدخل اسم العميل",
"tapToView": "انقر لعرض",
"noServicesAvailableToCopy": "لا توجد خدمات متاحة في هذا الفرع لنسخها.",
"copySelectedItems": "نسخ العناصر المحددة",
"noOfInvites": "عدد الدعوات",
"noSpecialServicesAvailable": "لا توجد خدمات خاصة متاحة للمنطقة المحددة.",
"customService": "الخدمة المخصصة",
"selectServiceDetails": "اختر تفاصيل الخدمة",
"addServiceDetails": "أضف تفاصيل الخدمة",
"companyNameMandatory": "اسم الشركة إلزامي",
"connectionProblem": "مشكلة في الاتصال",
"pleaseCheckConnection": "يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى",
"ok": "نعم",
"continueAsGuest": "الاستمرار كضيف",
"loginToViewAppointments": "الرجاء تسجيل الدخول لعرض المواعيد",
"itemType": "غرض",
"upgradeSubscription": "قم بترقية اشتراكك",
"searchByAdID": "البحث برقم الإعلان",
"enterAdID": "أدخل رقم الإعلان",
"searchByDemandPrice": "البحث حسب سعر الطلب",
"enterStartPrice": "أدخل سعر البداية",
"enterEndPrice": "أدخل سعر النهاية",
"searchByVehicleType": "البحث حسب نوع المركبة",
"selectVehicleType": "اختر نوع المركبة",
"specialRequestsChats": "دردشات الطلبات الخاصة",
"selectDeliveryOption": "اختر خيار التوصيل",
"deliveryOptions": "خيارات التوصيل",
"selfPickup": "استلام ذاتي",
"updateYourLocationInfo": "قم بتحديث معلومات موقعك",
"initiateSelfPickup": "بدء الاستلام الذاتي",
"selfPickupStatus": "حالة الاستلام الذاتي",
"myDraftAds": "مسودتي للإعلانات",
"scheduleDeletedSuccessfully": "تم حذف الجدول بنجاح",
"addValidAddress": "رجى إضافة عنوان صالح",
"pleaseAddAtLeastOneImage": "يرجى إضافة صورة واحدة على الأقل لطلبك",
"termsPrivacyPolicy": "الشروط وسياسة الخصوصية",
"pendingApproval": "قيد الموافقة",
"inReview": "قيد المراجعة",
"rejected": "مرفوض",
"deactivated": "معطل",
"blocked": "محظور",
"allRequests": "جميع الطلبات",
"pending": "قيد الانتظار",
"preparingToCollect": "جاري التحضير للاستلام",
"readyToCollect": "جاهز للاستلام",
"collected": "تم الاستلام",
"initiated": "تم البدء",
"inTransit": "قيد النقل",
"outForDelivery": "قيد التسليم",
"delivered": "تم التسليم",
"negotiate": "تفاوض",
"accepted": "مقبول",
"cancelled": "ملغى",
"loginToAnotherAccount": "تسجيل الدخول إلى حساب آخر",
"silver": "فضي",
"phoneWithoutCountryCode": "رقم الهاتف بدون رمز الدوله",
"sunday": "الأحد",
"monday": "الإثنين",
"tuesday": "الثلاثاء",
"wednesday": "الأربعاء",
"thursday": "الخميس",
"friday": "الجمعة",
"saturday": "السبت",
"adsWith": "الإعلانات:",
"usersWith": "المستخدمون:",
"branchesWith": "الفروع:",
"subscribed": "مشترك",
"expires": "تنتهي",
"renew": "تجديد",
"km": "كم",
"items": "عناصر",
"no_items": "لا توجد عناصر",
"allAds": "جميع الاعلانات",
"reserveCancel": "الغاء الحجز",
"pendingForReview": "قيد المراجعة",
"pendingForPayment": "قيد الدفع",
"rejected_n": "مرفوض",
"canceled": "ملغى",
"pendingForPost": "قيد النشر",
"active_n": "نشط",
"expired_n": "منتهي الصلاحية",
"sold_n": "مباع",
"reserved_n": "محجوز",
"buyingService": "خدمة الشراء",
"deActive": "غير نشط",
"pendingForActive": "قيد التفعيل",
"updateItem": "تحديث العنصر",
"createItem": "إنشاء عنصر",
"pleaseAddAtLeastOneItemImage": "يرجى إضافة صورة واحدة على الأقل للعنصر",
"pleaseAddValidItemName": "يرجى إضافة اسم عنصر صحيح",
"pleaseAddValidItemDescription": "يرجى إضافة وصف عنصر صحيح",
"pleaseAddValidItemPrice": "يرجى إضافة سعر عنصر صحيح",
"remaining": "متبقي",
"month": "شهر",
"currentPackage": "الحزمة الحالية",
"forVar": "لمدة",
"branch": "الفرع",
"shareAd": "مشاركة الإعلان",
"checkOutThisAd": "تفقد هذه السيارة الرائعة!",
"downloadApp": "تحميل تطبيق موّاتر:",
"androidApp": "أندرويد",
"iosApp": "آيفون",
"pleaseWait": "يرجى الانتظار...",
"numberOfShipping": "عدد الشحنات",
"loading": "جار التحميل...",
"pleaseSelectAccidentFree": "يرجى تحديد ما إذا كانت المركبة خالية من الحوادث",
"pleaseSelectMileageIncrease": "يرجى تحديد ما إذا كان يمكن زيادة المسافة المقطوعة",
"formatNeedsUpdate": "تنسيق الاعلان يحتاج الى تحديث",
"noAdsMatchesYourSearch" :"لا توجد اعلانات تطابق بحثك",
"upgrade": "ترقية",
"downgrade": "تخفيض الباقة",
"current": "الحالية",
"adActiveDuration": "سيبقى إعلانك نشطًا لمدة {} يومًا، وبعد ذلك ستحتاج إلى تمديده ليبقى نشطًا.",
"discountOff": "خصم {} ٪",
"booked": "محجوز",
"confirmed": "مؤكد",
"rescheduled": "تمت إعادة الجدولة",
"upcoming": "قادم",
"workStarted": "بدأ العمل",
"past": "سابق",
"today": "اليوم",
"noAppointmentsMatchSearch": "لا توجد مواعيد تطابق بحثك",
"appts": "مواعيد",
"approvalPending": "بانتظار الموافقة",
"activateNow": "تفعيل الآن"
"accept": "قبول"
}

@ -12,7 +12,6 @@
"verify": "Verify",
"verified": "Verified",
"signOut": "Sign Out",
"accessDenied": "Access Denied",
"enterEmail": "Enter Email",
"enterNewEmail": "Enter New Email",
"enterNewPassword": "Enter New Password",
@ -23,9 +22,6 @@
"enterNewPhoneNumber": "Enter New Phone Number",
"enterPhoneNumber": "Enter Phone Number",
"continu": "Continue",
"loading": "Loading...",
"pleaseSelectAccidentFree": "Please select if the vehicle is accident free",
"pleaseSelectMileageIncrease": "Please select if mileage could increase",
"confirmPassword": "Confirm Password",
"createPassword": "Create Password",
"email": "Email",
@ -44,7 +40,7 @@
"forgetPass": "Forget Password ?",
"phoneNumberVerified": "Phone Number Verified",
"verifyNewPassword": "Verify New Password",
"EnterPass": "Enter Password",
"EnterPass": "Enter Password ?",
"alreadySigned": " Already Signed Up and Logged In",
"emailChangedSuccessfully": "Email is Changed Successfully",
"passwordIsUpdated": "Password is Updated",
@ -67,8 +63,6 @@
"imageUploaded": "Image is uploaded",
"fileLarger": "File is larger then 1KB",
"account": "Account",
"role": "Role",
"userType": "User Type",
"edit": "EDIT",
"imageDeleted": "Image is Deleted",
"dashboard": "Dashboard/Main Page",
@ -82,7 +76,7 @@
"userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email",
"number": "Number",
"english": "English",
"english": "عربي",
"title": "Hello",
"msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language",
@ -153,7 +147,6 @@
"my_service_providers": "My Recent Service Providers",
"appointment_details": "Appointment Details",
"no_city_available": "No City Available for this country",
"noDataAvailable": "No Data Available",
"branch_created": "Branch is successfully created",
"branch_updated": "Branch is successfully Updated",
"branch_deleted": "Branch is successfully Deleted",
@ -249,7 +242,6 @@
"payLater": "Pay Later",
"complete": "Complete",
"makeAnOffer": "Make an offer",
"provideOffer": "Provide Offer",
"enterAmount": "Enter amount",
"submit": "Submit",
"viewChat": "View Chat",
@ -261,9 +253,6 @@
"sendOTP": "Send OTP",
"noUserAddedYet": "No User Added Yet",
"assignDealerUser": "Assign Dealer User",
"confirmAssignDealerUser": "Are you sure you want to assign this dealer user to the branch?",
"removeDealerUser": "Remove Dealer User",
"confirmRemoveDealerUser": "Are you sure you want to remove this dealer user from the branch?",
"createNewUser": "Create New User",
"dealerUser": "Dealer User",
"setorEditBranchSchedule": "Set or Edit Branch Schedule",
@ -338,11 +327,8 @@
"vehiclePictures": "Vehicle Pictures",
"vehiclePart": "Vehicle Part",
"damagePartPictures": "Damage Part Pictures",
"qrCode": "QR Code",
"downgradeAppliedAfterExpiry": "This package will be applied automatically after your current package expires.",
"downgradeDeactivateInstruction": "To select this subscription you need to deactivate your branches and users as this package only supports {branches} and {users}. You can reactivate these branches later after upgrading the package",
"vehicleDamagePart": "Vehicle Damage Part",
"duration": "Duration",
"duration": "Duration:",
"specialServices": "Special Services",
"specialService": "Special Service",
"adContactDetails": "Ad Contact Details",
@ -392,9 +378,7 @@
"error": "Error",
"appointmentBookedSuccessfully": "Your appointment has been booked successfully",
"appointmentStatusUpdated": "Appointment Status Updated",
"appointmentStatusLabel": "Appointment Status",
"paymentStatusUpdated": "Payment Status Updated",
"serviceStatusUpdated": "Service Status Updated",
"selectOneSubService": "Please select at least one sub service",
"chargesBreakdown": "Charges Breakdown",
"services": "Services",
@ -420,27 +404,15 @@
"passwordAcceptableStrong": "Your password is acceptable but not strong",
"passwordIsStrong": "Your password is strong",
"passwordVeryStrong": "Your password is very strong",
"onlyProviderApp": "Sorry, Only Providers can log in this app",
"onlyProviderApp": "Sorry, Only Customer's can log in this app",
"selectDuration": "Select Duration",
"daysVar": "Days",
"adCharges": "Ad Charges",
"select": "Select",
"selectOption": "Select Option",
"deleteAdConfirmation": "Do you want to delete the ad?",
"deleteAdConfirmationMessage": "Your ad will be permanently deleted and you cannot undo this action",
"mileage": "Mileage",
"mileage": "mileage",
"transmission": "Transmission",
"odometer": "Odometer",
"accidentFree": "Accident Free",
"brandNew": "Brand New",
"used": "Used",
"all": "All",
"newSparePart": "New Spare Part",
"usedSparePart": "Used Spare Part",
"hasYourCarHadAccident": "Has your car had any accident?",
"odometerReading": "Odometer Reading (Km)",
"canMileageIncrease": "Mileage Could Increase?",
"currentlyInUse": "Currently in Use",
"demand": "Demand",
"adDurationExpired": "Your Ad Duration time is over",
"bankDetails": "Bank Details",
@ -451,95 +423,93 @@
"reserveAd": "Reserve Ad",
"reservationAmount": "Reservation Amount",
"belowAmountPayLater": "Below Amount that you will pay later",
"carPrice": "Car Price",
"vatExcluded": "VAT Excluded",
"carInsuranceService": "Car insurance Service",
"toBeDecided": "To be Decided",
"registrationCarPlates": "Registration & Car Plates",
"homeDeliveryService": "Home Delivery Service",
"specialServicechargesInsuranceDeliveryLocation": "Special service charges will be added based on desired insurance and delivery Location",
"estimated": "Estimated",
"servicesReservingAd": "Some services are mandatory while reserving Ad",
"completeReservation": "Complete Reservation",
"contact": "Contact",
"setDateandTime": "Set Date and Time",
"selectOffice": "Select Office",
"availableSlots": "Available Slots",
"bookAndPay": "Book and Pay",
"reservationAmounts": "Reservation Amounts",
"tax": "Tax",
"requester": "Requester",
"mowaterAdvertisement": "Mowater Company",
"carPrice":"Car Price",
"vatExcluded":"VAT Excluded",
"carInsuranceService":"Car insurance Service",
"toBeDecided":"To be Decided",
"registrationCarPlates":"Registration & Car Plates",
"homeDeliveryService":"Home Delivery Service",
"specialServicechargesInsuranceDeliveryLocation":"Special service charges will be added based on desired insurance and delivery Location",
"estimated":"Estimated",
"servicesReservingAd":"Some services are mandatory while reserving Ad",
"completeReservation":"Complete Reservation",
"contact":"Contact",
"setDateandTime":"Set Date and Time",
"selectOffice":"Select Office",
"availableSlots":"Available Slots",
"bookAndPay":"Book and Pay",
"reservationAmounts":"Reservation Amounts",
"tax":"Tax",
"adsFilter": "Ads Filter",
"searchByCity": "Search By City",
"selectCity": "Select City",
"searchByBrandName": "Search By Brand Name",
"selectVehicleBrand": "Select Vehicle Brand",
"searchByVehicleYear": "Search By Vehicle Year",
"selectYear": "Select Year",
"searchByAdOwner": "Search By Ad Owner",
"selectOwner": "Select Owner",
"search": "Search",
"clearFilters": "Clear Filters",
"book": "Book",
"markAsSold": "Mark As Sold",
"deactivateAd": "Deactivate Ad",
"doWantDeactivateAd": "Do you want to the Deactivate this Ad?",
"stoptheBuyers": "We will stop showing this ad to the buyers",
"cancelReservation": "Cancel Reservation",
"reasonForCancellation": "Reason for Cancellation",
"doWantCancelReservation": "Do you want to cancel the reservation",
"yourAdVisibletoBuy": "Your ad reservation will be cancelled and this ad will be again visible to everyone to buy",
"completeDeal": "Complete Deal",
"uploadBankReceipt": "Upload Bank Receipt",
"notesForAdmin": "Notes For Admin",
"note": "Note:",
"extendAd": "Extend Ad",
"updateAdDetails": "Do you want to update the Ad Details",
"durationExtendingAd": "You can change the ad duration and details before extending the ad",
"waitingAdminsResponse": "Waiting for Admins Response",
"cancelledByOwner": "Cancelled by Owner",
"cancelledByAdmin": "Cancelled by Admin",
"reservationTimeOver": "Reservation Time Over",
"paymentVerified": "Payment Verified",
"rejectedFormAdmin": "Rejected form Admin",
"waitingAdminPost": "Waiting for admin to post",
"waitingAdminsApproval": "Waiting for Admins Approval",
"sold": "Sold",
"noAdsShow": "No Ads to show",
"damagePartList": "Damage Part List",
"searchPart": "Search Part",
"addSpecialService": "Add Special Service",
"vehicleVar": "Vehicle",
"detailsVar": "Details",
"damageVar": "Damage",
"searchByCity":"Search By City",
"selectCity":"Select City",
"searchByBrandName":"Search By Brand Name",
"selectVehicleBrand":"Select Vehicle Brand",
"searchByVehicleYear":"Search By Vehicle Year",
"selectYear":"Select Year",
"searchByAdOwner":"Search By Ad Owner",
"selectOwner":"Select Owner",
"search":"Search",
"clearFilters":"Clear Filters",
"book":"Book",
"markAsSold":"Mark As Sold",
"deactivateAd":"Deactivate Ad",
"doWantDeactivateAd":"Do you want to the Deactivate this Ad?",
"stoptheBuyers":"We will stop showing this ad to the buyers",
"cancelReservation":"Cancel Reservation",
"reasonForCancellation":"Reason for Cancellation",
"doWantCancelReservation":"Do you want to cancel the reservation",
"yourAdVisibletoBuy.":"Your ad reservation will be cancelled and this ad will be again visible to everyone to buy",
"completeDeal":"Complete Deal",
"uploadBankReceipt":"Upload Bank Receipt",
"notesForAdmin":"Notes For Admin",
"extendAd":"Extend Ad",
"updateAdDetails":"Do you want to update the Ad Details",
"durationExtendingAd":"You can change the ad duration and details before extending the ad",
"waitingAdminsResponse":"Waiting for Admins Response",
"cancelledByOwner":"Cancelled by Owner",
"cancelledByAdmin":"Cancelled by Admin",
"reservationTimeOver":"Reservation Time Over",
"paymentVerified":"Payment Verified",
"rejectedFormAdmin":"Rejected form Admin",
"waitingAdminPost":"Waiting for admin to post",
"waitingAdminsApproval":"Waiting for Admins Approval",
"sold":"Sold",
"noAdsShow":"No Ads to show",
"damagePartList":"Damage Part List",
"searchPart":"Search Part",
"addSpecialService":"Add Special Service",
"vehicleVar":"Vehicle",
"detailsVar":"Details",
"damageVar":"Damage",
"partsVar": "Parts",
"additional": "Additional",
"review": "Review",
"additional":"Additional",
"review":"Review",
"adVar": "Ad",
"updateAd": "Update Ad",
"createAd": "Create Ad",
"next": "Next",
"submitAd": "Submit Ad",
"selectAdType": "Select Ad Type",
"validUntilSubscriptionExpiration": "Valid Until Subscription Expiration",
"youLeftAdsGivenSubscription": "You have left with limited ads given in the subscription.",
"updateSubscription": "Update Subscription",
"workInProgress": "Work In Progress",
"visitCompleted": "Visit Completed",
"youWantCancelAppointment": "Do you want to cancel this appointment?",
"appointmentCancelledCannotUndoAction": "Your appointment will be cancelled and you cannot undo this action.",
"appointment": "Appointment",
"rescheduleAppointment": "Reschedule Appointment",
"payforAppointment": "Pay for Appointment",
"appointmentsFilter": "Appointments Filter",
"searchByProvider": "Search By Provider",
"selectProvider": "Select Provider",
"searchByBranch": "Search By Branch",
"searchByCategory": "Search By Category",
"selectCategory": "Select Category",
"searchByService": "Search By Service",
"selectServices": "Select Services",
"updateAd":"Update Ad",
"createAd":"Create Ad",
"next":"Next",
"submitAd":"Submit Ad",
"selectAdType":"Select Ad Type",
"validUntilSubscriptionExpiration":"Valid Until Subscription Expiration",
"adsRemaining ":"Ads Remaining",
"youLeftAdsGivenSubscription":"You have left with 05 out of 50 ads given in the subscription.",
"updateSubscription":"Update Subscription",
"workInProgress":"Work In Progress",
"visitCompleted":"Visit Completed",
"youWantCancelAppointment":"Do you want to cancel this appointment?",
"appointmentCancelledCannotUndoAction":"Your appointment will be cancelled and you cannot undo this action.",
"appointment":"Appointment",
"rescheduleAppointment":"Reschedule Appointment",
"payforAppointment":"Pay for Appointment",
"appointmentsFilter":"Appointments Filter",
"searchByProvider":"Search By Provider",
"selectProvider":"Select Provider",
"searchByBranch":"Search By Branch",
"searchByCategory":"Search By Category",
"selectCategory":"Select Category",
"searchByService":"Search By Service",
"selectServices":"Select Services",
"modifyPackage": "Modify Package",
"schedule": "Schedule",
"serviceLocation": "Service Location:",
@ -547,6 +517,7 @@
"itemsSelected": "Item(s) Selected",
"workshopFullAccessServices": "Few services are not available on home location. Change the location to workshop to full access the services",
"changeLocationService": "Change location or service:",
"noItemstoShow": "No Items to show.",
"someDescriptionSubServices": "Some description about the sub-services",
"selectServicesYouWant": "Select services you want",
"selectServiceType": "Select service type",
@ -556,13 +527,13 @@
"dateAndTime": "Date and Time",
"timeLocation": "Time & Location",
"serviceCharges": "Service Charges",
"locationCharges": "Location Charges",
"locationCharges" : "Location Charges",
"payableNow": "Payable Now",
"remainingAmount": "Remaining Amount",
"branchesFilter": "Branches Filter",
"searchByDistance": "Search By Distance",
"searchByDistance": "Search By Distance",
"searchByMinimumRatings": "Search By Minimum Ratings",
"chat": "Chat",
"chat": "Chat",
"noRequestsShow": "No Requests to show.",
"typeMessageHere": "Type your message here..",
"reject": "Reject",
@ -590,359 +561,11 @@
"termPrivacy": "Term & Privacy",
"inviteFriends": "Invite Friends",
"more": "More",
"language": "Language",
"mySubscription": "My Subscription",
"language" :"Language",
"mySubscriptions": "My Subscriptions",
"subscriptions": "Subscriptions",
"defineLicenses": "Define Licenses",
"logOut": "Log Out",
"customer": "Customer",
"accept": "Accept",
"amountVAR": "Amount",
"requestAlreadyInProgress": "This request is already in progress.",
"acceptOfferConfirmation": "Do you want to accept this offer?",
"acceptOfferConfirmationMessage": "This offer will be accepted and you will pay the requested amount to the buyer in given time or else this offer will be cancelled.",
"nowVar": "Now",
"whendoyouWanttoUpgrade": "When do you want to upgrade",
"yourSubscriptionUpgradeAffectingFrom": "Your subscription will upgrade now. Affecting from",
"upgradeAfterCurrentExpiry": "Upgrade after current expiry",
"yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom": "Your subscription will upgrade after you current subscription will end. Affecting from",
"upgradeVar": "Upgrade",
"whendoyouWanttoRenew": "When do you want to renew",
"renewVar": "Renew",
"noUpcomingAppointments": "No Upcoming Appointments.",
"addNewAppointment": "Add New Appointment",
"myNearbyBranches": "My Nearby Branches",
"myRecentBranches": "My Recent Branches",
"favoriteList": "Favorite List",
"myFavouriteProviders": "My Favourite Providers",
"myFavouriteAds": "My Favourite Ads",
"noFavouriteAds": "No Favourite Ads Found",
"noReviewsBranch": "This branch has no reviews.",
"readLess": "Read Less",
"readMoreReviews": "Read More Reviews",
"noProvidersInFav": "You have no providers in Favorites.",
"providerHasNoBranches": "This Provider has no branches yet.",
"totalBranches": "Total Branches",
"memberSince": "Member Since",
"reserved": "Reserved",
"delete": "Delete",
"deleteBranchConfirmation": "Do you want to delete the Branch?",
"deleteBranchConfirmationMessage": "Your branch will be permanently deleted and you cannot undo this action",
"reviewAndPayment": "Review & Payment",
"awaitingPaymentFromCustomer": "Awaiting Payment from Customer",
"awaitingResponseFromProvider": "Awaiting Response From Provider",
"offerNoLongerAvailable": "Offer is No Longer Available",
"doYouWantToCompleteThisDeal": "Do you want to complete this deal?",
"customerCompletingDealMeansThat": "Completing this deal means that the you request that you have posted has been successfully received and this action cannot be undone.",
"providerCompletingDealMeansThat": "Completing this deal means that you have successfully provided the customer according to his request and this action cannot be undone.",
"offerSummary": "Offer Summary",
"personalInformation": "Personal Information",
"name": "Name",
"phone": "Phone",
"locationInformation": "Location Information",
"serviceInformation": "Service Information",
"additionalAddressDetails": "Additional Address Details",
"serviceName": "Service Name",
"serviceCategory": "Service Category",
"offerPrice": "Offer Price",
"totalPrice": "Total Price",
"providerName": "Provider Name",
"createdOn": "Created On",
"manufacturedBy": "Manufactured By",
"manufacturedOn": "Manufactured On",
"shipping": "Shipping",
"delivery": "Delivery",
"selectDeliveryType": "Select Delivery Type",
"shippingManagementInstruction": "Please go to Settings > Shipping Management screen to manage shipping/delivery items further.",
"withdrawOffer": "Withdraw Offer",
"manufacturer": "Manufacturer",
"priceRange": "Price Range",
"cancelOffer": "Cancel Offer",
"pleaseSpecify": "Please Specify",
"customerNotResponding": "The customer is not responding.",
"cancelRequestPrompt": "Do you want to cancel this request?",
"requestPermanentlyCancelled": "Your request will be permanently cancelled. You cannot undo this action.",
"awaitingResponseFromCustomer": "Awaiting Response From Customer",
"acknowledgePaymentToMowater": "I acknowledge that upon completion of this deal, I will pay 2% of this total deal to the Mowater company for their service.",
"requestsFilter": "Requests Filter",
"searchByCondition": "Search By Condition",
"selectCondition": "Select Condition",
"searchByRequestType": "Search By Request Type",
"searchByCustomerName": "Search By Customer Name",
"searchByProviderName": "Search By Provider Name",
"searchByRequestStatus": "Search By Request Status",
"selectRequestStatus": "Select Request Status",
"selectRequestType": "Select Request Type",
"searchByRequestedDate": "Search by Requested Date",
"selectDate": "Select Date",
"searchByVehicleModel": "Search By Vehicle Model",
"selectVehicleModel": "Select Vehicle Model",
"customerCarePrompt": "Got any question? We are here to service. Click here to talk to our customer care right now.",
"callNow": "Call Now",
"condition": "Condition",
"newCondition": "New",
"servicesNotAvailableHomeLocation": "This location will be same for all services",
"additionalChargesNotice": "These charges are additional to the actual service charges. For heavy items the charges may vary.",
"selectServiceLocation": "Select Service Location",
"apptOn": "Appt On",
"merged": "Merged",
"date": "Date",
"selectAll": "Select All",
"unselectAll": "Unselect All",
"copySelectedServices": "Copy Selected Services",
"pictures": "Pictures",
"noChatMessage": "No messages yet. Send a message to start the conversation!",
"shippingManagement": "Shipping Management",
"appointmentCancelled": "Appointment Cancelled",
"appointmentsPerSlot": "Appointments Per Slot",
"createSchedule": "Create Schedule",
"addItems": "Add Items",
"itemName": "Item Name",
"itemDescription": "Item Description",
"itemPrice": "Item Price",
"bookAppointmentForServices": "This option will allow customer to book appointment for these services.",
"showServiceAvailability": "This option will show to customer that you can avail this service on workshop or not.",
"bookAppointmentAtLocation": "This option will allow customer to book appointment at their desired location.",
"deleteScheduleConfirmation": " Are you sure you want to delete this Schedule?",
"deleteScheduleAdConfirmationMessage": "All the appointment slots will be removed and customers will no longer be able to book appointments for this schedule.",
"branchSchedules": "Branch Schedules",
"noSchedulesFound": "You have not added any schedule for this branch.",
"inviteFriendsBySMS": "Invite Friends By SMS",
"inviteFriendsByWhatsApp": "Invite Friends By WhatsApp",
"inviteFriendsByEmail": "Invite Friends By Email",
"noFAQsToShow": "There are no Frequently asked Questions Right now. Please contact us if you have any query.",
"appInfo": "App Info",
"users": "Users",
"adsRemaining": "Ads Remaining",
"attachPDF": "Attach PDF",
"serviceItem": "Service Item",
"createdBy": "Created By",
"createGroupServices": "Create Group Services",
"logoutConfirmation": "Are you sure you want want to Logout?",
"logoutConfirmationMessage": "You will be logged out of the application and you have to add your username and password again to login",
"addToFavoritesOn": "Added to Favorites on:",
"subscriptionDate": "Subscription Date",
"expiresOn": "Expires On",
"expired": "Expired",
"upgradeBranches": "Upgrade your subscription to add more Branches.",
"upgradeSubscription": "Upgrade your subscription",
"upgradeAds": "Upgrade your subscription to add more Ads.",
"upgradeSubUsers": "Upgrade your subscription to add more Sub Users.",
"explore": "Explore",
"manageRequests": "Manage Requests",
"serviceNotAvailableAtHomeLocation": "The Selected Service is not available at Home Location.",
"wantToRescheduleAppointment": "I want to reschedule the appointment.",
"noNeedForService": "I do not need this service anymore.",
"testTheService": "Test the service.",
"companyLocation": "Company Location",
"customerLocation": "Customer Location",
"deliveryAvailable": "Delivery Available",
"viewed": "Viewed",
"read": "Read",
"sent": "Sent",
"itemNoLongerAvailable": "This item is no longer available.",
"reactivateAd": "Reactivate Ad",
"dealOutsideApp": "The deal was done outside the app with another customer.",
"noAgreementCustomer": "There is no agreement from the customer side.",
"dealNotCompleted": "Deal not completed",
"changedDesireToSell": "I changed my desire to sell the vehicle.",
"vehicleDealOutsideApp": "The vehicle deal was done outside the app.",
"markAdAsSoldDesc": "This ad will be marked as sold, and other users will no longer be able to contact you.",
"ownerInformation": "Owner Information",
"noItemsToShow": "There are no Items no show.",
"acceptedRequests": "Accepted Requests",
"specialRequests": "Special Requests",
"specialRequestChat": "Special Request Chat",
"sparePartRequestChat": "Spare Part Request Chat",
"specialCarRequestChat": "Special Car Request Chat",
"companyName": "Company Name",
"noAvailableItems": "There are no available items.",
"serviceDeliveryType": "Service Delivery Type",
"noImagesToShow": "No Images to Show",
"updateGroupServices": "Update Group Services",
"addCommentsHere": "Add comments here",
"waitForBranchVerification": "Please wait for the branch verification.",
"reportComplaint": "Report a complaint",
"descriptionCannotBeEmpty": "Description cannot be empty.",
"adMarkedAsSold": "Ad has been marked as sold successfully!",
"chargesAndServiceRangeGreaterThanZero": "Charges and Service range should be greater than zero.",
"cannotSelectAllDaysAsOff": "You cannot select all days as Off days.",
"endDateAfterStartDate": "End Date should be after start date.",
"pleaseEnterStartDateFirst": "Please enter start date first.",
"endTimeAfterStartTime": "End Time should be after start time.",
"pickedLocationNotice": "This picked location will be used for all home-based services in this appointment",
"serviceNotProvided": "Unfortunately, this service is not provided by your selected branch in this picked location.",
"pleaseSelectService": "Please select at least one service.",
"operationalIssue": "Operational Issue",
"materialIssue": "Material Issue",
"selectReasonBeforeCancel": "Please select a reason before cancelling this appointment. This action cannot be undone.",
"blockedByAdmin": "Blocked by admin",
"active": "Active",
"paymentType": "Payment Type",
"dealCompleted": "The Deal Completed",
"theDealNotCompleted": "The Deal Not Completed",
"cancelRequest": "I want to cancel the request.",
"highPrice": "High Price",
"offerNotMatched": "The offer did not match the request.",
"offerRejected": "Offer has been Rejected.",
"offerAccepted": "Offer has been Accepted.",
"you": "You",
"youCannotDeactivateThisServiceRightNow": "You cannot deactivate this service right now because you have pending appointments for this service. The last appointment details are:",
"done": "Done",
"notice": "Notice",
"serviceDeactivated": "Service Deactivated",
"totalNumberOfServices": "Number of services:",
"noAvailableOfficesInCity": "There are no available offices in your city for your service.",
"searchByItem": "Search By Item",
"selectBranchToCopyServices": "Select the branch to copy their items to this branch. You can modify the selection at any time.",
"tapToSelect": "Tap to select",
"tapToSeeItems": "Tap to see items",
"noteCopyItemsExplanation": "Note: You will be able to copy items from one service to another in a selected category. You must create the services first and they should be approved. Then you will be able to get the available services from which you can copy all or selected items.",
"requestCreatedOn": "Request created on",
"online": "Online",
"searchByCreatedDate": "Search By Created Date",
"updateUserDetails": "Update User Details",
"enterNewFirstName": "Enter First Name",
"enterNewLastName": "Enter Last Name",
"userDetailsUpdated": "User Details is Updated",
"cityNameMandatory": "City is mandatory",
"genderMandatory": "Gender is mandatory",
"updateCity": "Update City",
"userGender": "Gender",
"userMale": "Male",
"userFemale": "Female",
"maxFileSelection": "You can select a maximum of 7 files",
"maxFileSize": "Each file size must be less than 2 MB",
"onlyJPGandPNG": "Only JPG and PNG files are allowed",
"expiryDate": "Expiry Date",
"deliveryStatus": "Your Delivery / Shipping Status is:",
"markAsCompleted": "Mark as Completed",
"searchByServiceDelivery": "Search by Service Delivery",
"searchByMobileNumber": "Search by Mobile Number",
"enterMobileNumber": "Enter Mobile Number",
"enterCustomerName": "Enter Customer Name",
"tapToView": "Tap to view",
"noServicesAvailableToCopy": "There are no services available in this branch to copy.",
"copySelectedItems": "Copy Selected Items",
"companyNameMandatory": "Company Name is mandatory",
"noOfInvites": "No of invites",
"noSpecialServicesAvailable": "There are no special services available for the selected region.",
"customService": "Custom Service",
"selectServiceDetails": "Select service details",
"addServiceDetails": "Add service details",
"connectionProblem": "Connection Problem",
"pleaseCheckConnection": "Please check your internet connection and try again.",
"ok": "Ok",
"continueAsGuest": "Continue as a guest",
"loginToViewAppointments": "Please Login to View Appointments",
"itemType": "Item Type",
"searchByAdID": "Search by Ad ID",
"enterAdID": "Enter Ad ID",
"searchByDemandPrice": "Search by demand price",
"enterStartPrice": "Enter start price",
"enterEndPrice": "Enter end price",
"searchByVehicleType": "Search by vehicle type",
"selectVehicleType": "Select vehicle type",
"specialRequestsChats": "Special Requests Chats",
"selectDeliveryOption": "Select Delivery Option",
"deliveryOptions": "Delivery Options",
"selfPickup": "Self Pickup",
"updateYourLocationInfo": "Update your location information",
"initiateSelfPickup": "Initiate Self Pickup",
"selfPickupStatus": "Self Pickup Status",
"myDraftAds": "My Draft Ads",
"scheduleDeletedSuccessfully": "The schedule has been deleted successfully",
"addValidAddress": "Please add a valid address",
"pleaseAddAtLeastOneImage": "Please add at least one image for your request",
"termsPrivacyPolicy": "Terms & Privacy Policy",
"pendingApproval": "Pending Approval",
"inReview": "In Review",
"rejected": "Rejected",
"deactivated": "Deactivated",
"blocked": "Blocked",
"allRequests": "All Requests",
"pending": "Pending",
"preparingToCollect": "Preparing To Collect",
"readyToCollect": "Ready To Collect",
"collected": "Collected",
"initiated": "Initiated",
"inTransit": "In Transit",
"outForDelivery": "Out For De,livery",
"negotiate": "Negotiate",
"accepted": "Accepted",
"cancelled": "Cancelled",
"delivered": "Delivered",
"loginToAnotherAccount": "Login To Another Account",
"silver": "Silver",
"phoneWithoutCountryCode": "Phone without country code",
"sunday": "Sunday",
"monday": "Monday",
"tuesday": "Tuesday",
"wednesday": "Wednesday",
"thursday": "Thursday",
"friday": "Friday",
"saturday": "Saturday",
"adsWith": "Ads:",
"usersWith": "Users:",
"branchesWith": "Branches:",
"subscribed": "Subscribed",
"expires": "Expires",
"renew": "Renew",
"km": "km",
"items": "items",
"no_items": "No items",
"allAds": "All Ads",
"reserveCancel": "Reserve Cancel",
"pendingForReview": "Pending For Review",
"pendingForPayment": "Pending For Payment",
"rejected_n": "Rejected",
"canceled": "Cancelled",
"pendingForPost": "Pending For Post",
"active_n": "Active",
"expired_n": "Expired",
"sold_n": "Sold",
"reserved_n": "Reserved",
"buyingService": "Buying Service",
"deActive": "De Active",
"pendingForActive": "Pending For Active",
"updateItem": "Update Item",
"createItem": "Create Item",
"pleaseAddAtLeastOneItemImage": "Please add at least one item image",
"pleaseAddValidItemName": "Please add valid item name",
"pleaseAddValidItemDescription": "Please add valid item description",
"pleaseAddValidItemPrice": "Please add valid item price",
"remaining": "remaining",
"month": "Month",
"currentPackage": "Current Package",
"forVar": "for",
"branch": "branch",
"shareAd": "Share Ad",
"checkOutThisAd": "Check out this amazing vehicle!",
"downloadApp": "Download MoWater App:",
"androidApp": "Android",
"iosApp": "iOS",
"pleaseWait": "Please wait...",
"numberOfShipping": "Number of Shipping",
"formatNeedsUpdate": "Ad format needs to be updated.",
"noAdsMatchesYourSearch": "No Ads that matches your search",
"upgrade": "Upgrade",
"downgrade": "Downgrade",
"current": "Current",
"adActiveDuration": "Your Ad will be active for {} Days and then you will need to extend it to keep it active.",
"discountOff": "{} % OFF",
"booked": "Booked",
"confirmed": "Confirmed",
"rescheduled": "Rescheduled",
"upcoming": "Upcoming",
"workStarted": "Work Started",
"past": "Past",
"today": "Today",
"noAppointmentsMatchSearch": "No appointments that match your search",
"appts": "appts",
"approvalPending": "Approval Pending",
"activateNow": "Activate Now"
"accept": "Accept"
}

@ -1,3 +0,0 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

@ -3,20 +3,16 @@ import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:http/io_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/exceptions/api_exception.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/user_models/refresh_token.dart';
import 'package:mc_common_app/models/user_models/user.dart';
import 'package:mc_common_app/utils/shared_prefrence.dart';
import 'package:mc_common_app/utils/utils.dart';
typedef FactoryConstructor<U> = U Function(dynamic);
@ -71,52 +67,6 @@ abstract class ApiClient {
}
class ApiClientImp implements ApiClient {
/// Get current language code for Accept-Language header
/// Returns 'ar' for Arabic, 'en' for English (default)
String _getCurrentLanguage() {
try {
BuildContext? context = navigatorKey.currentContext;
if (context != null) {
String languageCode = context.locale.languageCode;
return languageCode == 'ar' ? 'ar' : 'en';
}
} catch (e) {
log("Error getting current language: $e");
}
// Default to English if context not available
return 'en';
}
// The "I/flutter (pid):" prefix on every line is added by Android's own logcat viewer
// when displaying a multi-line log message -- confirmed this happens regardless of how
// the app prints (debugPrint, plain print, single call or chunked), so it can't be
// avoided from here. Given that cleanup is unavoidable either way, use the shared
// `logger` (PrettyPrinter) for a readable structure instead of hand-rolled plain text.
// Gated by GlobalConsts.showApiResponseInLogs: off by default (URL + payload only,
// since response bodies are noisy and usually not needed), flip on to also see the
// response.
void _logApiCall({required String method, required String url, String? payload, String? response}) {
if (kReleaseMode) return;
logger.d("----- $method -----");
logger.i(url);
if (payload != null && payload.isNotEmpty) {
logger.d("--- Payload ---");
logger.i(_tryDecode(payload));
}
if (GlobalConsts.showApiResponseInLogs && response != null) {
logger.d("--- Response ---");
logger.i(_tryDecode(response));
}
}
dynamic _tryDecode(String raw) {
try {
return jsonDecode(raw);
} catch (_) {
return raw;
}
}
@override
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
@ -164,10 +114,6 @@ class ApiClientImp implements ApiClient {
}) async {
try {
var headers0 = <String, String>{};
// Add Accept-Language header based on current locale
headers0['Accept-Language'] = _getCurrentLanguage();
if (token != null) {
headers0['Authorization'] = 'Bearer $token';
}
@ -184,7 +130,14 @@ class ApiClientImp implements ApiClient {
response = await _post(Uri.parse(url), body: requestBody, headers: headers0).timeout(const Duration(seconds: 100));
_logApiCall(method: 'POST', url: url, payload: requestBody, response: response.body);
if (!kReleaseMode) {
logger.d("------URL------");
logger.i(url);
logger.d("------Payload------");
logger.i(jsonDecode(requestBody));
logger.d("------Response------");
logger.i(jsonDecode(response.body));
}
if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body);
if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") {
@ -212,10 +165,6 @@ class ApiClientImp implements ApiClient {
throw APIException(APIException.OTHER, arguments: e);
}
} on TimeoutException catch (e) {
BuildContext? context = navigatorKey.currentContext;
if (context != null) {
NoInternetDialog.show(context);
}
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
@ -277,10 +226,6 @@ class ApiClientImp implements ApiClient {
Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
try {
var headers0 = <String, String>{};
// Add Accept-Language header based on current locale
headers0['Accept-Language'] = _getCurrentLanguage();
if (token != null) {
headers0['Authorization'] = 'Bearer $token';
}
@ -293,9 +238,16 @@ class ApiClientImp implements ApiClient {
if (isFirstCall) url = '$url?$queryString';
}
var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 120));
if (!kReleaseMode) {
logger.i(url);
logger.i("$queryParameters");
}
var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60));
_logApiCall(method: 'GET', url: url, payload: queryParameters != null ? jsonEncode(queryParameters) : null, response: response.body);
if (!kReleaseMode) {
logger.i("Url:$url");
logger.i(jsonDecode(response.body));
}
if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body);
if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") {
@ -324,10 +276,6 @@ class ApiClientImp implements ApiClient {
throw APIException(APIException.OTHER, arguments: e);
}
} on TimeoutException catch (e) {
final context = navigatorKey.currentContext;
if (context != null) {
NoInternetDialog.show(context);
}
throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) {
if (retryTimes > 0) {
@ -355,7 +303,7 @@ class ApiClientImp implements ApiClient {
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? "";
return await postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.refreshToken, postParams);
return await postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams);
}
Future<String> updateUserToken() async {

@ -1,11 +1,7 @@
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:mc_common_app/models/general_models/post_params_model.dart';
import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/models/user_models/user.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
class AppState {
static final AppState _instance = AppState._internal();
@ -20,25 +16,6 @@ class AppState {
bool? get getIsLogged => isLogged;
String? _deviceToken;
String? get getDeviceToken => _deviceToken;
set setDeviceToken(String value) {
_deviceToken = value;
}
String? _deviceType;
String? get getDeviceType => _deviceType;
set setDeviceType(String value) {
_deviceType = value;
}
bool isArabic(BuildContext context) =>
Localizations.localeOf(context).languageCode == 'ar';
AppType currentAppType = AppType.provider;
UserType userType = UserType.customer;
@ -46,7 +23,7 @@ class AppState {
currentAppType = appType;
}
User? _user;
User? _user = null;
set setUser(v) => _user = v;
@ -67,30 +44,4 @@ class AppState {
set setCurrentLocation(v) => currentLocation = v;
LatLng get getCurrentLocation => currentLocation;
List<Subscription>? _providerSubscription;
List<Subscription> get getproviderSubscription =>
_providerSubscription ?? [Subscription(name: "")];
set setproviderSubscription(List<Subscription>? value) {
_providerSubscription = value;
}
DropValue? _userRegisterCountrySelection;
DropValue get getUserRegisterCountrySelection =>
_userRegisterCountrySelection!;
set setUserRegisterCountrySelection(DropValue value) {
_userRegisterCountrySelection = value;
}
bool _isViewOnly = false;
bool get getIsViewOnly => _isViewOnly;
set setIsViewOnly(bool value) {
_isViewOnly = value;
}
}

@ -1,87 +1,68 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/generated/codegen_loader.g.dart';
import 'package:mc_common_app/models/user_models/user.dart';
import 'package:mc_common_app/utils/enums.dart';
class ApiConsts {
// static String baseUrl = "http://10.200.204.20:2801/"; // Local server
static String baseUrl = "https://ms.hmg.com/"; // production server
static String baseUrlServices = baseUrl; // production server
static String basicOTP = "${baseUrlServices}api/Register/BasicOTP";
static String basicVerify = "${baseUrlServices}api/Register/BasicVerify";
static String basicComplete = "${baseUrlServices}api/Register/BasicComplete";
static String refreshToken = "${baseUrlServices}api/Account/RefreshToken";
static String signalRUrl = "${baseUrl}McHub";
static String baseUrlServices = "$baseUrl"; // production server
static String BasicOTP = "${baseUrlServices}api/Register/BasicOTP";
static String BasicVerify = "${baseUrlServices}api/Register/BasicVerify";
static String BasicComplete = "${baseUrlServices}api/Register/BasicComplete";
static String RefreshToken = "${baseUrlServices}api/Account/RefreshToken";
//User
static String loginV1 = "${baseUrlServices}api/Account/Login_V1";
static String loginV2OTP = "${baseUrlServices}api/Account/Login_V2_OTP";
static String loginV2OTPVerify = "${baseUrlServices}api/Account/Login_V2_OTPVerify";
static String Login_V1 = "${baseUrlServices}api/Account/Login_V1";
static String Login_V2_OTP = "${baseUrlServices}api/Account/Login_V2_OTP";
static String Login_V2_OTPVerify = "${baseUrlServices}api/Account/Login_V2_OTPVerify";
static String user = "${baseUrlServices}api/User/";
static String getAllCountry = "${baseUrlServices}api/Master/Country_Get";
static String getProviderRoles = "${baseUrlServices}api/Master/RoleServiceProvider_Get";
static String getAllCities = "${baseUrlServices}api/Master/City_Get";
static String forgetPasswordOTPRequest = "${baseUrlServices}api/Account/ForgetPasswordOTPRequest";
static String forgetPasswordOTPCompare = "${baseUrlServices}api/Account/ForgetPasswordOTPCompare";
static String forgetPassword = "${baseUrlServices}api/Account/ForgetPassword";
static String loginEmailOTP = "${baseUrlServices}api/Account/EmailVerify";
static String loginEmailOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String changePassword = "${baseUrlServices}api/Account/ChangePassword";
static String changeMobileNoOTPRequest = "${baseUrlServices}api/Account/ChangeMobileNoOTPRequest";
static String changeMobileNo = "${baseUrlServices}api/Account/ChangeMobileNo";
static String changeEmailOTPRequest = "${baseUrlServices}api/Account/ChangeEmailOTPRequest";
static String changeEmail = "${baseUrlServices}api/Account/ChangeEmail";
static String emailVerify = "${baseUrlServices}api/Account/EmailVerify";
static String emailVerifyOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String logoutUser = "${baseUrlServices}api/Account/Logout";
static String updateUserImage = "${baseUrlServices}api/User_UpdateProfileImage";
static String getUserImage = "${baseUrlServices}api/ProfileImage";
static String userUpdate = "${baseUrlServices}api/User_Update";
static String providerComplaintCreate = "${baseUrlServices}api/ServiceProviders/ProviderComplaint_Create";
static String provideContactInfoGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderContact_Get";
static String GetAllCountry = "${baseUrlServices}api/Master/Country_Get";
static String GetProviderRoles = "${baseUrlServices}api/Master/RoleServiceProvider_Get";
static String GetAllCities = "${baseUrlServices}api/Master/City_Get";
static String ForgetPasswordOTPRequest = "${baseUrlServices}api/Account/ForgetPasswordOTPRequest";
static String ForgetPasswordOTPCompare = "${baseUrlServices}api/Account/ForgetPasswordOTPCompare";
static String ForgetPassword = "${baseUrlServices}api/Account/ForgetPassword";
static String Login_Email_OTP = "${baseUrlServices}api/Account/EmailVerify";
static String Login_Email_OTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String ChangePassword = "${baseUrlServices}api/Account/ChangePassword";
static String ChangeMobileNoOTPRequest = "${baseUrlServices}api/Account/ChangeMobileNoOTPRequest";
static String ChangeMobileNo = "${baseUrlServices}api/Account/ChangeMobileNo";
static String ChangeEmailOTPRequest = "${baseUrlServices}api/Account/ChangeEmailOTPRequest";
static String ChangeEmail = "${baseUrlServices}api/Account/ChangeEmail";
static String EmailVerify = "${baseUrlServices}api/Account/EmailVerify";
static String EmailVerifyOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String UpdateUserImage = "${baseUrlServices}api/User_UpdateProfileImage";
static String GetUserImage = "${baseUrlServices}api/ProfileImage";
//Profile
static String fetProviderDocument = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Get";
static String serviceProviderDocumentUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Update";
static String GetProviderDocument = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Get";
static String ServiceProviderDocument_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Update";
//Branch
static String getProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get";
static String createProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Create";
static String updateProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Update";
static String deleteProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Delete";
static String serviceProviderBranchGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get";
static String serviceCategoryGet = "${baseUrlServices}api/Master/ServiceCategory_Get";
static String servicesGet = "${baseUrlServices}api/ServiceProviders/Services_Get";
static String serviceProviderServiceCreate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create";
static String serviceProviderServiceUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update";
static String serviceProviderServiceStatusUpdate = "${baseUrlServices}api/ServiceProviders/CategoryAndService_ActivateDeactivateBySP";
static String getProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String ServiceProviderBranchGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get";
static String ServiceCategory_Get = "${baseUrlServices}api/Master/ServiceCategory_Get";
static String Services_Get = "${baseUrlServices}api/ServiceProviders/Services_Get";
static String ServiceProviderService_Create = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create";
static String ServiceProviderService_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update";
static String GetProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String setScheduleInactive = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_IsActiveUpdate";
static String serviceProviderAppointmentGetByCategoryOrService = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_GetByCategoryOrService";
static String serviceProviderServiceGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String branchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get";
static String ServiceProviderService_Get = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String BranchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get";
static String serviceProviderDDLGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderDDL_Get";
static String getAllNearBranches = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchDetail_Get";
static String getMyRecentBranches = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchRecent_Get";
static String getBranchRatings = "${baseUrlServices}api/ServiceProviders/BranchRating_Get";
static String createBranchRatings = "${baseUrlServices}api/ServiceProviders/BranchRating_Create";
static String favouriteServiceProviderCreate = "${baseUrlServices}api/ServiceProviders/FavouriteServiceProvider_Create";
static String unFavouriteServiceProvider = "${baseUrlServices}api/ServiceProviders/UnFavouriteServiceProvider";
static String favouriteServiceProviderGet = "${baseUrlServices}api/ServiceProviders/FavouriteServiceProvider_Get";
static String GetAllNearBranches = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchDetail_Get";
//Appointment APIs
static String serviceProvidersAppointmentGet = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointment_Get";
static String customersAppointmentGetByFilters = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentSearchFiltersByCustomer_Get";
static String serviceCategoryGet = "${baseUrlServices}api/Master/ServiceCategory_Get";
static String serviceItemsGet = "${baseUrlServices}api/ServiceProviders/ServiceItem_Get";
static String getServiceItemAppointmentScheduleSlots = "${baseUrlServices}api/ServiceProviders/ServiceItemAppointmentScheduleSlots_GetByAppointmentType";
static String serviceProvidersAppointmentCreate = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentList_Create";
static String serviceProviderAppointmentRescheduleCancelAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_RescheduleCancelAppointment";
static String addNewServicesInAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_ServiceItemAdd";
static String GetServiceItemAppointmentScheduleSlots = "${baseUrlServices}api/ServiceProviders/ServiceItemAppointmentScheduleSlots_GetByAppointmentType";
static String ServiceProvidersAppointmentCreate = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentList_Create";
static String ServiceProviderAppointmentRescheduleCancelAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_RescheduleCancelAppointment";
static String AddNewServicesInAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_ServiceItemAdd";
static String getAppointmentSlots = "${baseUrlServices}api/ServiceProviders/ScheduleSlotsInfo_Get";
static String updateAppointmentStatus = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentStatus_Update";
@ -104,7 +85,6 @@ class ApiConsts {
static String updateSchedule = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_Update";
static String createGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Create";
static String updateGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Update";
static String checkGroupServiceInBranchSchedule = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Check";
//Advertisement APIs
static String vehicleTypeGet = "${baseUrlServices}api/ServiceProviders/VehicleType_Get";
@ -125,11 +105,7 @@ class ApiConsts {
static String vehicleAdsSpecialServicesGet = "${baseUrlServices}api/Common/SpecialService_Get";
static String vehicleAdsSingleStepCreate = "${baseUrlServices}api/Advertisement/AdsSingleStep_Create";
static String vehicleAdsSingleStepUpdate = "${baseUrlServices}api/Advertisement/AdsSingleStep_Update";
static String vehicleAdsSingleStepUpdateExtend = "${baseUrlServices}api/Advertisement/AdsSingleStep_Update_Extend";
static String vehicleAdsGet = "${baseUrlServices}api/Advertisement/Ads_Get";
static String favouriteAdsGet = "${baseUrlServices}api/Advertisement/FavouriteAds_Get";
static String favouriteAdsCreate = "${baseUrlServices}api/Advertisement/FavouriteAds_Create";
static String unFavouriteAds = "${baseUrlServices}api/Advertisement/UnFavourite_Ads";
static String myAdsReserveGet = "${baseUrlServices}api/Advertisement/AdsReserve_Get";
static String reserveAdsBankDetailsGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get";
static String adsUpdateStatus = "${baseUrlServices}api/Advertisement/Ads_UpdateStatus";
@ -139,25 +115,19 @@ class ApiConsts {
static String adsPhotoOfficeAppointmentCreate = "${baseUrlServices}api/Advertisement/PhotoOfficeAppointment_Create";
static String adsMCBankAccountAdGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get";
static String adsReserveCreate = "${baseUrlServices}api/Advertisement/AdsReserve_Create";
static String adsReserveCancelByOwner = "${baseUrlServices}api/Advertisement/AdsReserve_CancelByOwner";
static String reserveAdPaymentOnDealDoneCreate = "${baseUrlServices}api/Advertisement/ReserveAdPaymentOnDealDone_Create";
static String adsExtendDurationCreate = "${baseUrlServices}api/Advertisement/Ads_ExtendDuration_Create";
static String adsSingleStepDraftCreate = "${baseUrlServices}api/Advertisement/AdsSingleStepDraft_Create";
static String adsSingleStepDraftUpdate = "${baseUrlServices}api/Advertisement/AdsSingleStepDraft_Update";
static String getMyDraftAds = "${baseUrlServices}api/Advertisement/AdsDraft_Get";
//Subscription
static String getMySubscriptions = "${baseUrlServices}api/ServiceProviders/ProviderSubscription_Get";
static String getAllSubscriptions = "${baseUrlServices}api/Common/Subscription_Get";
static String getSubscriptionBySP = "${baseUrlServices}api/Common/SubscriptionBySP_Get";
static String calculationUpgradePrice = "${baseUrlServices}api/ServiceProviders/CalculationUpgradePrice";
static String payFortOrderProviderSubscriptionCreate = "${baseUrlServices}api/Payment/PayFortOrder_ProviderSubscription_Create";
static String getSPBranchUserGet = "${baseUrlServices}api/ServiceProviders/SPBranchUser_Get";
static String payFortOrder_ProviderSubscription_Create = "${baseUrlServices}api/Payment/PayFortOrder_ProviderSubscription_Create";
static String getSPBranchUser_Get = "${baseUrlServices}api/ServiceProviders/SPBranchUser_Get";
// Payment
static String paymentWebViewUrl = "https://ms.hmg.com/pay/PaymentHome";
static String payForOrderDetailGet = "${baseUrlServices}api/Payment/PayFortOrderDetail_Get";
static String payForOrderIsPaidGet = "${baseUrlServices}api/Payment/PayFortOrderIsPaid_Get";
//Duplicate Services
static String getMatchedServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchServicesMapping_Get";
@ -165,6 +135,9 @@ class ApiConsts {
//Branch Users
static String getAllProviderDealers = "${baseUrlServices}api/ServiceProviders/DealershipUserBranchWise_Get";
// /api/ServiceProviders/BranchUser_Get
//DealershipUserBranchWise_Get
static String getBranchUser = "${baseUrlServices}api/ServiceProviders/BranchUser_Get";
static String assignDealerToBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Create";
static String removeDealerFromBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Update";
@ -176,62 +149,18 @@ class ApiConsts {
static String createRequest = "${baseUrlServices}api/RequestManagement/Request_Create";
static String getRequest = "${baseUrlServices}api/RequestManagement/Request_Get";
static String getRequestOffers = "${baseUrlServices}api/RequestManagement/ReqOffer_Get";
static String updateRequestOfferStatus = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateStatus";
static String updateRequestOffer = "${baseUrlServices}api/RequestManagement/ReqOffer_Update";
static String updateRequestCustomer = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Customer";
static String updateRequestProvider = "${baseUrlServices}api/RequestManagement/Request_StatusUpdate_Provider";
static String updateRequestOffer = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateStatus";
static String requestOffersSpsGet = "${baseUrlServices}api/RequestManagement/Request_OfferSPs_Get";
static String getServiceRequestsForProvider = "${baseUrlServices}api/RequestManagement/Request_ServiceProvider";
static String requestOfferUpdateDeliveryOptionByCustomer = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateDeliveryByCustomer";
static String requestUpdateAdditionalAddress = "${baseUrlServices}api/RequestManagement/Request_UpdateAdditionalAddress";
//Shipping
static String shippingRequestStatusUpdate = "${baseUrlServices}api/RequestManagement/ShippingRequestStatus_Update";
static String shippingRequestStatusGet = "${baseUrlServices}api/RequestManagement/ShippingRequestStatus_Get";
static String selfPickupRequestStatusGet = "${baseUrlServices}api/RequestManagement/SelfPickUpRequestStatus_Get";
static String selfPickupRequestStatusUpdate = "${baseUrlServices}api/RequestManagement/SelfPickUpRequestStatus_Update";
//Chat
static String chatHubUrl = "$baseUrlServices/McHub";
static String messageIsReadUpdateForRequests = "${baseUrlServices}api/RequestManagement/ReqOfferChatIsRead_Update";
static String messageIsReadUpdateForAds = "${baseUrlServices}api/Advertisement/AdsChatIsRead_Update";
static String getChatMessagesForRequests = "${baseUrlServices}api/RequestManagement/ReqOfferChat_Get";
static String getChatMessagesForAds = "${baseUrlServices}api/Advertisement/AdsChat_Get";
static String getChatBuyersForAds = "${baseUrlServices}api/Advertisement/AdsChatBuyer_Get";
static String reqChatUnreadGet = "${baseUrlServices}api/RequestManagement/Req_ChatCount_Get";
//Settings Options
static String getAllFAQs = "${baseUrlServices}api/Common/FAQ_Get";
static String createAppInvitation = "${baseUrlServices}api/Common/AppInvitation_Create";
static String getContactInfo = "${baseUrlServices}api/Master/ContactInfo_Get";
static String getAppInfo = "${baseUrlServices}api/Master/AppInfo_Get";
static String getTermsAndConditions = "${baseUrlServices}api/Master/TermAndCondition_Get";
static String getAppInvitationHistory = "${baseUrlServices}api/Common/AppInvitation_Get";
static String messageIsReadUpdate = "${baseUrlServices}api/RequestManagement/ReqOfferChatIsRead_Update";
static String getChatMessages = "${baseUrlServices}api/RequestManagement/ReqOfferChat_Get";
static List<String> closingUrls = ["PayFortResponse"];
}
class GlobalConsts {
// When false, API logs print only the request URL and payload. When true, the
// response body is also printed. Flip this on only while actively debugging a
// specific API issue -- flip back off afterwards, since response bodies are noisy.
static bool showApiResponseInLogs = true;
static String appNameCustomer = "MOWATER Customer";
static String appNameProvider = "MOWATER Provider";
//Android
static String appPackageNameCustomerAndroid = "com.cloud.solutions.mowater.ksa.customer";
static String appPackageNameProviderAndroid = "com.cloud.solutions.mowater.ksa.provider";
static String appPlayStoreLinkCustomerAndroid = "https://play.google.com/store/apps/details?id=$appPackageNameCustomerAndroid";
static String appPlayStoreLinkProviderAndroid = "https://play.google.com/store/apps/details?id=$appPackageNameProviderAndroid";
//IOS
static String appIDCustomerIOS = "";
static String appIDProviderIOS = "";
static String appAppStoreStoreLinkCustomerIos = "https://apps.apple.com/us/app/$appIDCustomerIOS";
static String appAppStoreStoreLinkProviderIos = "https://apps.apple.com/us/app/$appIDProviderIOS";
static String isRememberMe = "remember_me";
static String email = "email";
static String password = "password";
@ -240,10 +169,8 @@ class GlobalConsts {
static String welcomeVideoUrl = "welcomeVideoUrl";
static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo";
static String demandAmountError = "Amount Cannot be Empty";
static String deliveryOptionSelectionError = "At least one delivery option should be selected.";
static String reservationCancelError = "Cancellation Reason Cannot be Empty";
static String descriptionError = "Description should be more than 5 letters.";
static String acceptingThisOffer = "I am accepting this offer.";
static String descriptionError = "Description Cannot be Empty";
static String vehicleVinError = "Vehicle VIN Cannot be Empty";
static String vehicleTitleError = "Vehicle Title Cannot be Empty";
static String warrantyError = "Warranty Duration Cannot be Empty";
@ -254,44 +181,8 @@ class GlobalConsts {
static String adDurationPhoneNumberError = "Phone number cannot be empty";
static String adReservablePriceErrorConst = "Ad Reservable price cannot be empty";
static String homeLocationEmptyError = "Home location cannot be empty";
static String fillAllFields = "Please fill out all the fields.";
static String requestTypeCannotBeEmpty = "Request type cannot be empty.";
static String serviceNameError = "Service name cannot be empty.";
static String priceError = "Price cannot be empty.";
static String taxError = "Tax cannot be empty.";
static String reserveAdPriceInfo =
"Some dummy description to explain the following concept. This price will be for 24 hours and if a user cancels the reservations before 24 hours then the amount will be automatically refunded to the buyer.";
static String appInvitationMessageEn = "🚗 Hey , check out MOWATER to book car services, buy/sell vehicles, and more—join here! [Invite Link]";
static String getAppInvitationLink() {
String appInvitationMessageEn = "";
if (Platform.isAndroid) {
if (AppState().currentAppType == AppType.customer) {
appInvitationMessageEn = "🚗 Hey , check out $appNameCustomer to book car services, buy/sell vehicles, and more—join here! \n\n $appPlayStoreLinkCustomerAndroid";
} else {
appInvitationMessageEn = "🚗 Hey , check out $appNameProvider to book car services, buy/sell vehicles, and more—join here! \n\n $appPlayStoreLinkProviderAndroid";
}
} else if (Platform.isIOS) {
if (AppState().currentAppType == AppType.customer) {
appInvitationMessageEn = "🚗 Hey , check out $appNameCustomer to book car services, buy/sell vehicles, and more—join here! \n\n $appPlayStoreLinkCustomerAndroid";
} else {
appInvitationMessageEn = "🚗 Hey , check out $appNameProvider to book car services, buy/sell vehicles, and more—join here! \n\n $appPlayStoreLinkProviderAndroid";
}
}
return appInvitationMessageEn;
}
// Attachment Values
static int maxFileCount = 7;
static int maxFileSizeInBytes = 2 * 1024 * 1024;
static String allowedFileExtensions = "jpg,jpeg,png - 2MB/file";
static String allowedFileExtensionsPDF = "PDF 2MB/file";
static int providerDealerRoleTypeId = 6;
static int providerIndividualRoleTypeId = 5;
static int dealershipUserRoleTypeId = 7;
}
class MyAssets {
@ -299,7 +190,6 @@ class MyAssets {
//JPEG
static String bnCar = "${assetPath}images/bn_car.jpeg";
static String bnCarFlashingLights = "${assetPath}images/bn_car_flashing_lights.gif";
static String carBanner = "${assetPath}images/bn_car.jpeg";
//SVG
@ -385,11 +275,6 @@ class MyAssets {
static String visaPng = "${assetPath}icons/payments/visa.png";
static String whatsAppIcon = "${assetPath}icons/whatsapp_icon.svg";
static const String arrowRight = "${assetPath}icons/ic_arrow_right.svg";
static const String brokenImage = "${assetPath}images/broken_image.png";
// Tones
static const String engineStartSound = "${assetPath}tones/engine_start_tone.mp3";
}
RegExp numReg = RegExp(r".*[0-9].*");
@ -405,80 +290,5 @@ class MyLocales {
}
class MyFonts {
static const poppinsFont = 'packages/mc_common_app/Poppins';
static const gessTwoFont = 'packages/mc_common_app/GessTwo';
static const FontWeight Thin = FontWeight.w100;
static const FontWeight ExtraLight = FontWeight.w200;
static const FontWeight Light = FontWeight.w300;
static const FontWeight Regular = FontWeight.w400;
static const FontWeight Medium = FontWeight.w500;
static const FontWeight SemiBold = FontWeight.w600;
static const FontWeight Bold = FontWeight.w700;
static const FontWeight ExtraBold = FontWeight.w800;
static const FontWeight Black = FontWeight.w900;
static const FontWeight ItalicRegular = FontWeight.w400;
static const FontWeight ItalicMedium = FontWeight.w500;
static const FontWeight ItalicSemiBold = FontWeight.w600;
static const FontWeight ItalicBold = FontWeight.w700;
static const FontWeight ItalicExtraBold = FontWeight.w800;
static const FontWeight ItalicBlack = FontWeight.w900;
}
class SignalrConsts {
// Requests
static String receiveMessageRequestOffer = "ReceiveMessageRequestOffer";
static String sendMessageRequestOffer = "SendMessageRequestOffer";
static String requestOfferReadUpdate = "RequestOfferReadUpdate";
// Ads
static String sendMessageAds = "SendMessageAds";
static String receiveMessageAds = "ReceiveMessageAds";
// General
static String sendMessageGeneral = "SendMessageGeneral";
static String receiveMessageGeneral = "ReceiveMessageGeneral";
}
class GuestConsts {
UserInfo userInfo = UserInfo.fromJson(
{
"id": -1,
"userID": null,
"firstName": "Guest",
"lastName": "User",
"companyName": null,
"accountStatus": "2",
"activityStatus": "Offline",
"accountStatusText": null,
"subscriptionDate": null,
"mobileNo": "966123456789",
"email": "mowatter@gmail.com",
"userImageUrl": "https://ms.hmg.com/api/ProfileImage?imageName=User_Default.png",
"roleID": 4,
"roleName": "Customer",
"isEmailVerified": false,
"serviceProviderBranch": [],
"isVerified": true,
"userRoles": [],
"isProviderDealership": false,
"isProviderIndividual": false,
"isProvider": false,
"providerID": null,
"isCustomer": true,
"customerID": 25,
"countryID": 1,
"countryName": "Saudi Arabia",
"cityID": 1,
"cityName": "Riyadh",
"dealershipUserID": null,
"serviceProviderBranchID": null,
"createdOn": "2024-12-24T09:20:47.6733333",
"genderID": 1,
"genderName": "Male",
"serviceProviderPayment": [],
"deviceType": "1",
"deviceToken": null,
},
);
static const poppinsFont = "packages/mc_common_app/Poppins";
}

@ -1,8 +1,6 @@
// import 'package:firebase_crashlytics/firebase_crashlytics.dart';
// import 'package:flutter/material.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:injector/injector.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -12,16 +10,11 @@ import 'package:mc_common_app/repositories/branch_repo.dart';
import 'package:mc_common_app/repositories/chat_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/repositories/payments_repo.dart';
import 'package:mc_common_app/repositories/setting_options_repo.dart';
import 'package:mc_common_app/repositories/shipping_repo.dart';
import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/services/firebase_service.dart';
import 'package:mc_common_app/services/payments_service.dart';
import 'package:mc_common_app/utils/location/Location.dart';
import 'package:mc_common_app/repositories/request_repo.dart';
import 'package:mc_common_app/services/chat_navigation_service.dart';
import '../repositories/request_repo.dart';
Injector injector = Injector.appInstance;
@ -32,12 +25,6 @@ class AppDependencies {
injector.registerSingleton<ApiClient>(() => ApiClientImp());
injector.registerSingleton<CommonAppServices>(() => CommonServicesImp());
injector.registerSingleton<PaymentService>(() => PaymentServiceImp());
injector.registerSingleton<ChatNavigationService>(() => ChatNavigationServiceImp());
injector.registerSingleton<Location>(() => LocationService());
injector.registerSingleton<FirebaseMessagingService>(() => FirebaseMessagingServiceImp(
firebaseMessaging: FirebaseMessaging.instance,
flutterLocalNotifications: FlutterLocalNotificationsPlugin(),
));
//repos
injector.registerSingleton<UserRepo>(() => UserRepoImp());
@ -48,9 +35,5 @@ class AppDependencies {
injector.registerSingleton<AppointmentRepo>(() => AppointmentRepoImp());
injector.registerSingleton<ChatRepo>(() => ChatRepoImp());
injector.registerSingleton<BranchRepo>(() => BranchRepoImp());
injector.registerSingleton<ShippingRepo>(() => ShippingRepoImp());
injector.registerSingleton<SettingOptionsRepo>(() => SettingOptionsRepoImp());
//
}
}

@ -1,35 +1,13 @@
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/models/requests_models/offers_model.dart';
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/models/user_models/register_user.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/views/advertisement/ads_buyer_chats_view.dart';
import 'package:mc_common_app/views/advertisement/ads_detail_view/ads_detail_view.dart';
import 'package:mc_common_app/views/advertisement/ads_filter_view.dart';
import 'package:mc_common_app/views/advertisement/create_ad_view.dart';
import 'package:mc_common_app/views/advertisement/my_draft_ads_view.dart';
import 'package:mc_common_app/views/advertisement/select_ad_type_view.dart';
import 'package:mc_common_app/views/chat/chat_view.dart';
import 'package:mc_common_app/views/payments/payment_methods_view.dart';
import 'package:mc_common_app/views/profile/profile_view.dart';
import 'package:mc_common_app/views/requests/create_request_page.dart';
import 'package:mc_common_app/views/requests/offer_list_page.dart';
import 'package:mc_common_app/views/requests/providers_chat_list_page.dart';
import 'package:mc_common_app/views/requests/request_detail_page.dart';
import 'package:mc_common_app/views/requests/requests_filter_view.dart';
import 'package:mc_common_app/views/requests/review_request_offer.dart';
import 'package:mc_common_app/views/setting_options/provider_accepted_requests_view.dart';
import 'package:mc_common_app/views/setting_options/provider_license_page.dart';
import 'package:mc_common_app/views/setting_options/setting_option_help.dart';
import 'package:mc_common_app/views/setting_options/setting_options_app_info.dart';
import 'package:mc_common_app/views/setting_options/setting_options_contact_us.dart';
import 'package:mc_common_app/views/setting_options/setting_options_faqs.dart';
import 'package:mc_common_app/views/setting_options/setting_options_invite_friends.dart';
import 'package:mc_common_app/views/setting_options/setting_options_more.dart';
import 'package:mc_common_app/views/setting_options/setting_options_terms_and_conditions.dart';
import 'package:mc_common_app/views/shipping_management/shipping_management_view.dart';
import 'package:mc_common_app/views/setting_options/setting_options_language.dart';
import 'package:mc_common_app/views/user/change_email_page.dart';
import 'package:mc_common_app/views/user/change_mobile_page.dart';
import 'package:mc_common_app/views/user/change_password_page.dart';
@ -46,13 +24,8 @@ import 'package:mc_common_app/views/user/register_page.dart';
import 'package:mc_common_app/views/user/register_provider_page.dart';
import 'package:mc_common_app/views/user/register_selection_page.dart';
import 'package:mc_common_app/views/splash/splash_page.dart';
import 'package:mc_common_app/views/user/update_user_city_country.dart';
import 'package:mc_common_app/views/user/update_user_details.dart';
import 'package:mc_common_app/views/user/vertify_password_page.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/widgets/image_viewer/image_viewer_screen.dart';
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
class AppRoutes {
//User
@ -77,47 +50,12 @@ class AppRoutes {
static const String changeEmailPage = "/changeEmailPage";
static const String editAccountPage = "/editAccoundPage";
// Provider App Routes
//settings
static const defineLicense = "/defineLicese";
static const String dealershipSetting = "/dealershipSetting";
static const String branchList = "/branchList";
static const String branchDetail = "/branchDetail";
static const String defineBranch = "/defineBranch";
//Appointments
static const String appointment = "/appointment";
static const String appointmentDetailList = "/appointmentDetailList";
static const String updateAppointmentPage = "/updateAppointmentPage";
static const String addServiceInAppointment = "/addServiceInAppointment";
static const String mergeAppointments = "/mergeAppointments";
//Services
static const String dealerUser = "/dealerUser";
static const String servicesList = "/servicesList";
static const String itemsList = "/itemsList";
static const String createItem = "/createItem";
static const String createServices = "/createServices";
static const String createServices2 = "/createServices2";
static const String createServices3 = "/createServices3";
//Schedules
static const String schedulesList = "/schedulesList";
static const String addSchedule = "/addSchedule";
// Subscriptions
static const String mySubscriptionsPage = "/mySubscriptionsPage";
static const String subscriptionsPage = "/subscriptionsPage";
//Bracnh Duplication
static const String matchServices = "/matchServices";
static const String userSettings = "/userSettings";
static const String dashboard = "/dashboard";
static const String bookProviderAppView = "/bookProviderAppView";
// Appointments
// Appoinments
static const String appointmentDetailView = "/appointmentDetailView";
static const String bookAppointmenServicesView = "/bookAppointmenServicesView";
static const String bookAppointmenSchedulesView = "/bookAppointmenSchedulesView";
@ -130,55 +68,40 @@ class AppRoutes {
static const String adsDetailView = "/adsDetailView";
static const String createAdView = "/createAdView";
static const String adsFilterView = "/adsFilterView";
static const String adsBuyerChatsListView = "/adsBuyersChatListView";
static const String myDraftAdsView = "/myDraftAdsView";
// Payments
static const String paymentMethodsView = "/paymentMethodsView";
//Shipping
static const shippingManagementView = "/shippingManagementView";
//Customer APP: Provider & Services
static const String branchDetailView = "/branchDetailPage";
static const String branchDetailPage = "/branchDetailPage";
static const String branchSearchFilterPage = "/branchSearchFilterPage";
static const String providerProfileView = "/providerProfilePage";
static const String favoriteProvidersView = "/favoriteProvidersView";
static const String favouriteAdsView = "/favouriteAdsView";
static const String providerProfilePage = "/providerProfilePage";
// Subscriptions
static const String mySubscriptionsPage = "/mySubscriptionsPage";
static const String subscriptionsPage = "/subscriptionsPage";
//Requests
static const String requestsDetailPage = "/requestsDetailPage";
static const String sendOfferPage = "/sendOfferPage";
static const String myRequestsPage = "/myRequestsPage";
static const String requestsFilterView = "/requestsFilterView";
static const String createRequestPage = "/createRequestPage";
static const String offersListPage = "/offersListPage";
static const String reviewRequestOffer = "/reviewRequestOffer";
static const String providerAcceptedRequestsView = "/providerAcceptedRequestsView";
static const String providersChatListPage = "/providersChatListPage";
static const String requestsDetailPage = "/requestsDetailPage";
static const String sendOfferPage = "/sendOfferPage";
//Setting Options
static const String settingOptionsFaqs = "/settingOptionsFaqs";
static const String settingOptionsContactUs = "/settingOptionsContactUs";
static const String settingOptionsAppInfo = "/settingOptionsAppInfo";
static const String settingOptionsTermsAndConditions = "/settingOptionsTermsAndConditions";
static const String settingOptionsMore = "/settingOptionsLanguages";
static const String settingOptionsLanguages = "/settingOptionsLanguages";
static const String settingOptionsInviteFriends = "/settingOptionsInviteFriends";
static const String settingOptionsHelp = "/settingOptionsHelp";
//MediaViewer
static const String mediaViewerScreen = "/mediaViewer";
//Profile Screen
static const String profileView = "/profileView";
static const providerLicensePage = "/providerLicensePage";
static const String generalChatsListForProvider = "/generalChatsListForProvider";
static const providerLicensePage = "/providerLicensePage";
//Chat
static const String chatView = "/chatView";
static const String updateUserDetails = "/updateUserDetails";
static const String updateUserCity = "/updateUserCity";
static const String initialRoute = splash;
static final Map<String, WidgetBuilder> routes = {
@ -190,57 +113,40 @@ class AppRoutes {
registerProvider: (context) => const RegisterProviderPage(),
forgetPassword: (context) => const ForgetPasswordPage(),
loginVerification: (context) => const LoginVerificationPage(),
loginWithPassword: (context) => LoginWithPassword(isRemoveBackButton: (ModalRoute.of(context)!.settings.arguments ?? true) as bool),
loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String),
completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUserRespModel),
// verifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String),
forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String),
loginWithPassword: (context) => const LoginWithPassword(),
loginMethodSelection: (context) =>
LoginMethodSelectionPage(ModalRoute
.of(context)!
.settings
.arguments as String),
completeProfile: (context) =>
CompleteProfilePage(ModalRoute
.of(context)!
.settings
.arguments as RegisterUserRespModel),
verifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) =>
ConfirmNewPasswordPage(ModalRoute
.of(context)!
.settings
.arguments as String),
changePassword: (context) => const ChangePasswordPage(),
forgetPasswordMethodPage: (context) =>
ForgetPasswordMethodPage(ModalRoute
.of(context)!
.settings
.arguments as String),
changeMobilePage: (context) => ChangeMobilePage(),
changeEmailPage: (context) => const ChangeEmailPage(),
updateUserDetails: (context) => const UpdateUserDetails(),
updateUserCity: (context) => const UpdateUserCityCountry(),
changePassword: (context) => const ChangePasswordPage(),
editAccountPage: (context) => const EditAccountPage(),
profileView: (context) => const ProfileScreen(),
settingOptionsMore: (context) => const SettingOptionsMore(),
settingOptionsLanguages: (context) => const SettingOptionsLanguage(),
settingOptionsHelp: (context) => const SettingOptionsHelp(),
providerLicensePage: (context) => const ProviderLicensePage(),
// common pages
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => const CreateAdView(),
AppRoutes.adsFilterView: (context) => const AdsFilterView(),
AppRoutes.myDraftAdsView: (context) => const MyDraftAdsView(),
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(arguments: ModalRoute.of(context)!.settings.arguments as List<dynamic>),
AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments),
AppRoutes.adsBuyerChatsListView: (context) => AdsBuyerChatsView(buyersListViewArguments: ModalRoute.of(context)!.settings.arguments as List<BuyersChatForAdsModel>),
AppRoutes.settingOptionsFaqs: (context) => const SettingOptionsFAQs(),
AppRoutes.settingOptionsContactUs: (context) => const SettingOptionsContactUs(),
AppRoutes.settingOptionsAppInfo: (context) => const SettingOptionsAppInfo(),
AppRoutes.settingOptionsTermsAndConditions: (context) => const SettingOptionsTermsAndConditions(),
AppRoutes.settingOptionsInviteFriends: (context) => const SettingOptionsInviteFriends(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes),
//Requests
AppRoutes.requestsDetailPage: (context) => RequestDetailPage(requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments),
AppRoutes.createRequestPage: (context) => const CreateRequestPage(),
AppRoutes.offersListPage: (context) => OfferListPage(requestId: ModalRoute.of(context)!.settings.arguments as int),
AppRoutes.reviewRequestOffer: (context) => const ReviewRequestOffer(),
AppRoutes.requestsFilterView: (context) => const RequestsFilterView(),
AppRoutes.providersChatListPage: (context) => const ProvidersChatListPage(),
//MediaViewer
AppRoutes.mediaViewerScreen: (context) => MediaViewerScreen(images: ModalRoute.of(context)!.settings.arguments as List<MessageImageModel>),
// ChatsList Provider
AppRoutes.generalChatsListForProvider: (context) => OfferListPage(requestId: ModalRoute.of(context)!.settings.arguments as int),
//Shipping
AppRoutes.shippingManagementView: (context) => const ShippingManagementView(),
providerLicensePage: (context) => ProviderLicensePage(),
};
}
class ChatViewArgumentsForRequest {
class ChatViewArguments {
final int? requestId;
final ChatTypeEnum chatTypeEnum;
final String senderId;
@ -249,7 +155,7 @@ class ChatViewArgumentsForRequest {
final int requestIndex;
final RequestModel? requestModel;
ChatViewArgumentsForRequest({
ChatViewArguments({
required this.chatTypeEnum,
this.requestId,
required this.senderId,
@ -260,25 +166,6 @@ class ChatViewArgumentsForRequest {
});
}
class ChatViewArgumentsForAd {
final String? receiverUserID;
final int? adsID;
ChatViewArgumentsForAd({required this.receiverUserID, required this.adsID});
}
class ChatViewArguments {
final ChatViewArgumentsForAd? chatViewArgumentsForAd;
final ChatViewArgumentsForRequest? chatViewArgumentsForRequest;
final ChatTypeEnum chatTypeEnum;
ChatViewArguments({
this.chatViewArgumentsForAd,
this.chatViewArgumentsForRequest,
required this.chatTypeEnum,
});
}
class OfferListPageArguments {
final List<ServiceProvidersOffers> serviceProviderOffers;
final int? requestId;

@ -1,51 +1,38 @@
import 'dart:developer';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
extension EmailValidator on String {
Widget toText(
{Color? color,
bool isBold = false,
double? fontSize,
bool isUnderLine = false,
bool isItalic = false,
TextDecoration? textDecoration,
double letterSpacing = 0,
TextAlign? textAlign,
FontWeight? fontWeight,
double? height,
Color? decorationColor,
TextOverflow? overflow,
bool isUpperCase = false,
int? maxLines}) {
bool isArabic = AppState().postParamsObject!.languageID == 1; // arabic -> 1 , English -> 2
return AutoSizeText(
isUpperCase ? toUpperCase() : this,
textAlign: textAlign,
maxLines: maxLines,
style: TextStyle(
overflow: overflow,
fontStyle: isItalic ? FontStyle.italic : null,
height: height,
decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none,
decorationColor: decorationColor ?? color ?? MyColors.darkTextColor,
fontSize: fontSize ?? 10,
fontFamily: isArabic ? MyFonts.gessTwoFont : MyFonts.poppinsFont,
fontWeight: isBold ? FontWeight.bold : fontWeight ?? MyFonts.SemiBold,
color: color ?? MyColors.darkTextColor,
letterSpacing: letterSpacing,
),
);
}
{Color? color,
bool isBold = false,
double? fontSize,
bool isUnderLine = false,
bool isItalic = false,
TextDecoration? textDecoration,
double letterSpacing = -0.4,
TextAlign? textAlign,
FontWeight? fontWeight,
double? height,
Color? decorationColor,
int? maxLines}) =>
AutoSizeText(
this,
textAlign: textAlign,
maxLines: maxLines,
style: TextStyle(
fontStyle: isItalic ? FontStyle.italic : null,
height: height,
decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none,
decorationColor: decorationColor,
fontSize: fontSize ?? 10,
fontWeight: isBold ? FontWeight.bold : fontWeight ?? FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: letterSpacing,
),
);
bool isValidEmail() {
return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this);
@ -159,141 +146,31 @@ extension FormatDate on String {
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a', "en_US").format(DateFormat('hh:mm:ss', "en_US").parse(time))}";
}
// String toFormattedDateWithoutTime() {
// String date = split("T")[0];
// var dates = date.split("-");
// return "${dates[2]} ${getMonth(int.parse(dates[1]))}, ${dates[0]}";
// }
String toFormattedDateWithoutTime({bool isArabic = false}) {
String date = split("T")[0];
var dates = date.split("-");
final monthNumber = int.parse(dates[1]);
final monthsEn = [
'',
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December',
];
final monthsAr = [
'',
'يناير',
'فبراير',
'مارس',
'أبريل',
'مايو',
'يونيو',
'يوليو',
'أغسطس',
'سبتمبر',
'أكتوبر',
'نوفمبر',
'ديسمبر',
];
final month = isArabic
? monthsAr[monthNumber]
: monthsEn[monthNumber];
return "${dates[2]} $month, ${dates[0]}";
}
String toLocalizedFormattedDateWithoutTime(BuildContext context) {
String toFormattedDateWithoutTime() {
String date = split("T")[0];
var dates = date.split("-");
final isArabic = Localizations.localeOf(context).languageCode == 'ar';
final month = isArabic ? getArabicMonth(int.parse(dates[1])) : getMonth(int.parse(dates[1]));
return "${dates[2]} $month, ${dates[0]}";
}
String getArabicMonth(int month) {
const months = [
'',
'يناير',
'فبراير',
'مارس',
'أبريل',
'مايو',
'يونيو',
'يوليو',
'أغسطس',
'سبتمبر',
'أكتوبر',
'نوفمبر',
'ديسمبر',
];
return months[month];
return "${dates[2]} ${getMonth(int.parse(dates[1]))}, ${dates[0]}";
}
}
extension RequestEnum on int {
RequestStatusEnum toRequestStatusEnum() {
RequestStatus toRequestStatusEnum() {
if (this == 1) {
return RequestStatusEnum.submitted;
return RequestStatus.submitted;
} else if (this == 2) {
return RequestStatusEnum.inProgress;
return RequestStatus.inProgress;
} else if (this == 3) {
return RequestStatusEnum.completed;
return RequestStatus.completed;
} else if (this == 4) {
return RequestStatusEnum.cancelled;
return RequestStatus.cancelled;
} else if (this == 5) {
return RequestStatusEnum.paid;
return RequestStatus.paid;
} else if (this == 6) {
return RequestStatusEnum.expired;
return RequestStatus.expired;
} else if (this == 7) {
return RequestStatusEnum.shipping;
} else if (this == 8) {
return RequestStatusEnum.delivery;
} else if (this == 9) {
return RequestStatusEnum.selfPickup;
return RequestStatus.shipping;
} else {
return RequestStatusEnum.pending;
}
}
}
extension RequestStatusEnumToInt on RequestStatusEnum {
int getIdFromRequestStatusEnum() {
switch (this) {
case RequestStatusEnum.submitted:
return 1;
case RequestStatusEnum.inProgress:
return 2;
case RequestStatusEnum.completed:
return 3;
case RequestStatusEnum.cancelled:
return 4;
case RequestStatusEnum.paid:
return 5;
case RequestStatusEnum.expired:
return 6;
case RequestStatusEnum.shipping:
return 7;
case RequestStatusEnum.delivery:
return 8;
case RequestStatusEnum.selfPickup:
return 9;
case RequestStatusEnum.pending:
return 0;
default:
return 0;
return RequestStatus.pending;
}
}
}
@ -322,10 +199,6 @@ extension AdPostEnum on int {
return AdPostStatus.buyingService;
} else if (this == 11) {
return AdPostStatus.reserveCancel;
} else if (this == 12) {
return AdPostStatus.deActive;
} else if (this == 13) {
return AdPostStatus.pendingForActive;
} else if (this == 0) {
return AdPostStatus.allAds;
} else {
@ -352,125 +225,56 @@ extension AppointmentStatusToInt on AppointmentStatusEnum {
case AppointmentStatusEnum.rescheduled:
return 5;
case AppointmentStatusEnum.upcoming:
return 6;
case AppointmentStatusEnum.workStarted:
return 7;
case AppointmentStatusEnum.visitCompleted:
return 8;
case AppointmentStatusEnum.today:
return 9;
case AppointmentStatusEnum.past:
return 10;
case AppointmentStatusEnum.upcoming:
return 11;
case AppointmentStatusEnum.served:
return 12;
case AppointmentStatusEnum.allAppointments:
return 0;
default:
return 0;
}
}
}
extension AppointmentTypeEnumExt on int {
AppointmentTypeEnum toAppointmentTypeEnum() {
if (this == 1) {
return AppointmentTypeEnum.workshop;
} else if (this == 2) {
return AppointmentTypeEnum.home;
} else {
return AppointmentTypeEnum.workshop;
}
}
}
extension AppointmentTypeEnumExtString on AppointmentTypeEnum {
int getIdFromAppointmentTypeEnum() {
switch (this) {
case AppointmentTypeEnum.workshop:
return 1;
case AppointmentTypeEnum.home:
return 2;
default:
return 1;
}
}
}
// extension AppointmentStatusToString on AppointmentStatusEnum {
// String getAppointmentNameFromEnum() {
// switch (this) {
// case AppointmentStatusEnum.booked:
// return "Booked";
//
// case AppointmentStatusEnum.confirmed:
// return "Confirmed";
//
// case AppointmentStatusEnum.arrived:
// return "Arrived";
//
// case AppointmentStatusEnum.cancelled:
// return "Canceled";
//
// case AppointmentStatusEnum.rescheduled:
// return "Rescheduled";
//
// case AppointmentStatusEnum.upcoming:
// return "Upcoming";
//
// case AppointmentStatusEnum.workStarted:
// return "Work Started";
//
// case AppointmentStatusEnum.visitCompleted:
// return "Visit Completed";
//
// case AppointmentStatusEnum.past:
// return "Past";
//
// case AppointmentStatusEnum.today:
// return "Today";
//
// default:
// return "Booked";
// }
// }
// }
extension AppointmentStatusToString on AppointmentStatusEnum {
String getAppointmentNameFromEnum() {
switch (this) {
case AppointmentStatusEnum.booked:
return LocaleKeys.booked.tr();
return "Booked";
case AppointmentStatusEnum.confirmed:
return LocaleKeys.confirmed.tr();
return "Confirmed";
case AppointmentStatusEnum.arrived:
return LocaleKeys.arrived.tr();
return "Arrived";
case AppointmentStatusEnum.cancelled:
return LocaleKeys.canceled.tr();
return "Canceled";
case AppointmentStatusEnum.rescheduled:
return LocaleKeys.rescheduled.tr();
return "Rescheduled";
case AppointmentStatusEnum.upcoming:
return LocaleKeys.upcoming.tr();
return "Upcoming";
case AppointmentStatusEnum.workStarted:
return LocaleKeys.workStarted.tr();
return "Work Started";
case AppointmentStatusEnum.visitCompleted:
return LocaleKeys.visitCompleted.tr();
case AppointmentStatusEnum.past:
return LocaleKeys.past.tr();
case AppointmentStatusEnum.today:
return LocaleKeys.today.tr();
return "Visit Completed";
default:
return LocaleKeys.booked.tr();
return "Booked";
}
}
}
//TODO: Need to verify Enum on upcoming and inprogress with the database
//TODO: 6 is service Deactivated
extension AppointmentEnum on int {
AppointmentStatusEnum toAppointmentStatusEnum() {
if (this == 1) {
@ -483,18 +287,12 @@ extension AppointmentEnum on int {
return AppointmentStatusEnum.cancelled;
} else if (this == 5) {
return AppointmentStatusEnum.rescheduled;
} else if (this == 6) {
return AppointmentStatusEnum.upcoming;
} else if (this == 7) {
return AppointmentStatusEnum.workStarted;
} else if (this == 8) {
return AppointmentStatusEnum.visitCompleted;
} else if (this == 9) {
return AppointmentStatusEnum.today;
} else if (this == 10) {
return AppointmentStatusEnum.past;
} else if (this == 11) {
return AppointmentStatusEnum.upcoming;
} else if (this == 12) {
return AppointmentStatusEnum.served;
} else {
return AppointmentStatusEnum.allAppointments;
}
@ -543,21 +341,19 @@ extension AppointmentPaymentEnum on int {
}
}
extension RequestTypeTypEnum on int {
RequestsTypeEnum toRequestTypeEnum() {
extension RequestTypeTypeEnum on int {
RequestsTypeEnum toRequestTypeStatusEnum() {
if (this == 1) {
return RequestsTypeEnum.specialCarRequest;
} else if (this == 2) {
return RequestsTypeEnum.serviceRequest;
} else if (this == 3) {
return RequestsTypeEnum.other;
}
return RequestsTypeEnum.specialCarRequest;
}
}
extension RequestTypeStatusToInt on RequestsTypeEnum {
int getIdFromRequestTypeEnum() {
int getIdFromRequestTypeStatusEnum() {
switch (this) {
case RequestsTypeEnum.specialCarRequest:
return 1;
@ -565,21 +361,19 @@ extension RequestTypeStatusToInt on RequestsTypeEnum {
case RequestsTypeEnum.serviceRequest:
return 2;
case RequestsTypeEnum.other:
return 3;
default:
return 0;
}
}
}
// 290223243016
extension AdPostStatusToInt on AdPostStatus {
int getIdFromAdPostStatusEnum() {
switch (this) {
case AdPostStatus.pendingForReview:
return 1;
case AdPostStatus.pendingForPayment:
return 2;
@ -609,13 +403,6 @@ extension AdPostStatusToInt on AdPostStatus {
case AdPostStatus.reserveCancel:
return 11;
case AdPostStatus.deActive:
return 12;
case AdPostStatus.pendingForActive:
return 13;
default:
return 0;
}
@ -627,12 +414,16 @@ extension PaymentTypesToInt on PaymentTypes {
switch (this) {
case PaymentTypes.subscription:
return 1;
case PaymentTypes.appointment:
return 2;
case PaymentTypes.adReserve:
return 4;
case PaymentTypes.ads:
return 3;
case PaymentTypes.request:
return 5;
case PaymentTypes.extendAds:
@ -646,30 +437,6 @@ extension PaymentTypesToInt on PaymentTypes {
}
}
extension PaymentIdToPaymentTypes on int {
PaymentTypes getPaymentTypeFromId() {
switch (this) {
case 1:
return PaymentTypes.subscription;
case 2:
return PaymentTypes.appointment;
case 4:
return PaymentTypes.adReserve;
case 3:
return PaymentTypes.ads;
case 5:
return PaymentTypes.request;
case 6:
return PaymentTypes.extendAds;
case 7:
return PaymentTypes.partialAppointment;
default:
return PaymentTypes.ads;
}
}
}
extension CreatedByRoleEnumToInt on CreatedByRoleEnum {
int getIdFromCreatedByRoleEnum() {
switch (this) {
@ -702,8 +469,6 @@ extension AdReserveStatusEnum on int {
} else if (this == 5) {
return AdReserveStatus.dealDone;
} else if (this == 6) {
return AdReserveStatus.paymentDoneByCustomer;
} else if (this == 7) {
return AdReserveStatus.fullPaymentVerified;
} else {
return AdReserveStatus.defaultStatus;
@ -766,108 +531,29 @@ extension ServiceEnum on int {
}
}
extension BranchServiceEnumStatusToInt on ServiceStatusEnum {
int getIdFromServiceStatusEnum() {
switch (this) {
case ServiceStatusEnum.pending:
return 1;
case ServiceStatusEnum.review:
return 2;
case ServiceStatusEnum.approvedOrActive:
return 3;
case ServiceStatusEnum.rejected:
return 4;
case ServiceStatusEnum.blocked:
return 5;
case ServiceStatusEnum.deactivated:
return 6;
default:
return 1;
}
}
}
// extension DateTimeConversions on DateTime {
// String getTimeAgo({bool numericDates = true, bool isArabic = false,}) {
// final date2 = DateTime.now();
// final difference = date2.difference(this);
// if ((difference.inDays / 7).floor() >= 2) {
// return DateHelper.formatAsDayMonthYear(this, isArabic: isArabic,);
// } else if ((difference.inDays / 7).floor() >= 1) {
// return (numericDates) ? '1 week ago' : 'Last week';
// } else if (difference.inDays >= 2) {
// return '${difference.inDays} days ago';
// } else if (difference.inDays >= 1) {
// return (numericDates) ? '1 day ago' : 'Yesterday';
// } else if (difference.inHours >= 2) {
// return '${difference.inHours} hours ago';
// } else if (difference.inHours >= 1) {
// return (numericDates) ? '1 hour ago' : 'An hour ago';
// } else if (difference.inMinutes >= 2) {
// return '${difference.inMinutes} min ago';
// } else if (difference.inMinutes >= 1) {
// return (numericDates) ? '1 min ago' : 'A min ago';
// } else if (difference.inSeconds >= 3) {
// return '${difference.inSeconds} sec ago';
// } else {
// return 'Just now';
// }
// }
// }
extension DateTimeConversions on DateTime {
String getTimeAgo({
bool numericDates = true,
bool isArabic = false,
}) {
final now = DateTime.now();
final difference = now.difference(this);
if ((difference.inDays / 7).floor() >= 2) {
return DateHelper.formatAsDayMonthYear(
this,
isArabic: isArabic,
);
} else if ((difference.inDays / 7).floor() >= 1) {
if (isArabic) {
return numericDates ? 'منذ أسبوع' : 'الأسبوع الماضي';
}
String getTimeAgo({bool numericDates = true}) {
final date2 = DateTime.now();
final difference = date2.difference(this);
return numericDates ? '1 week ago' : 'Last week';
if ((difference.inDays / 7).floor() >= 1) {
return (numericDates) ? '1 week ago' : 'Last week';
} else if (difference.inDays >= 2) {
return isArabic ? 'منذ ${difference.inDays} أيام' : '${difference.inDays} days ago';
return '${difference.inDays} days ago';
} else if (difference.inDays >= 1) {
if (isArabic) {
return numericDates ? 'منذ يوم' : 'أمس';
}
return numericDates ? '1 day ago' : 'Yesterday';
return (numericDates) ? '1 day ago' : 'Yesterday';
} else if (difference.inHours >= 2) {
return isArabic ? 'منذ ${difference.inHours} ساعات' : '${difference.inHours} hours ago';
return '${difference.inHours} hours ago';
} else if (difference.inHours >= 1) {
if (isArabic) {
return numericDates ? 'منذ ساعة' : 'قبل ساعة';
}
return numericDates ? '1 hour ago' : 'An hour ago';
return (numericDates) ? '1 hour ago' : 'An hour ago';
} else if (difference.inMinutes >= 2) {
return isArabic ? 'منذ ${difference.inMinutes} دقائق' : '${difference.inMinutes} min ago';
return '${difference.inMinutes} minutes ago';
} else if (difference.inMinutes >= 1) {
if (isArabic) {
return numericDates ? 'منذ دقيقة' : 'قبل دقيقة';
}
return numericDates ? '1 min ago' : 'A min ago';
return (numericDates) ? '1 minute ago' : 'A minute ago';
} else if (difference.inSeconds >= 3) {
return isArabic ? 'منذ ${difference.inSeconds} ثوانٍ' : '${difference.inSeconds} sec ago';
return '${difference.inSeconds} seconds ago';
} else {
return isArabic ? 'الآن' : 'Just now';
return 'Just now';
}
}
}
@ -968,23 +654,6 @@ extension FormatMonthByNumber on String {
}
}
extension NameExtensions on String {
String getInitials() {
final name = trim();
String initials = "";
if (name.isEmpty) {
return initials;
}
final list = name.split(' ');
if (list.length > 1) {
initials = list[0][0].toUpperCase() + list[1][0].toUpperCase();
}
return initials;
}
}
extension ChatMessageTypeEnumExt on int {
//FreeText = 1,
// Image = 2,
@ -1040,7 +709,7 @@ extension RequestOfferStatusEnumExt on int {
} else if (this == 5) {
return RequestOfferStatusEnum.cancel;
}
return RequestOfferStatusEnum.defaultStatus;
return RequestOfferStatusEnum.cancel;
}
}
@ -1120,242 +789,18 @@ extension SubscriptionTypeEnumToInt on SubscriptionTypeEnum {
}
}
// extension SubscriptionTypeEnumToString on SubscriptionTypeEnum {
// String getStringSubscriptionTypeEnum() {
// switch (this) {
// case SubscriptionTypeEnum.current:
// return "Current";
// case SubscriptionTypeEnum.upgrade:
// return "Upgrade";
// case SubscriptionTypeEnum.downgrade:
// return "Downgrade";
//
// default:
// return "Current";
// }
// }
// }
extension SubscriptionTypeEnumExtension on SubscriptionTypeEnum {
extension SubscriptionTypeEnumToString on SubscriptionTypeEnum {
String getStringSubscriptionTypeEnum() {
switch (this) {
case SubscriptionTypeEnum.current:
return LocaleKeys.current.tr();
return "Current";
case SubscriptionTypeEnum.upgrade:
return LocaleKeys.upgrade.tr();
return "Upgrade";
case SubscriptionTypeEnum.downgrade:
return LocaleKeys.downgrade.tr();
}
}
}
extension ShippingStatusEnumExt on int {
ShippingRequestStatusEnum toShippingStatusEnum() {
if (this == -1) {
return ShippingRequestStatusEnum.allRequests;
} else if (this == 0) {
return ShippingRequestStatusEnum.pending;
} else if (this == 1) {
return ShippingRequestStatusEnum.initiated;
} else if (this == 2) {
return ShippingRequestStatusEnum.inTransit;
} else if (this == 3) {
return ShippingRequestStatusEnum.outForDelivery;
} else if (this == 4) {
return ShippingRequestStatusEnum.delivered;
}
return ShippingRequestStatusEnum.pending;
}
}
return "Downgrade";
extension ShippingStatusEnumToInt on ShippingRequestStatusEnum {
int getIdFromShippingStatusEnum() {
switch (this) {
case ShippingRequestStatusEnum.pending:
return 0;
case ShippingRequestStatusEnum.initiated:
return 1;
case ShippingRequestStatusEnum.inTransit:
return 2;
case ShippingRequestStatusEnum.outForDelivery:
return 3;
case ShippingRequestStatusEnum.delivered:
return 4;
case ShippingRequestStatusEnum.allRequests:
return -1;
default:
return -1;
}
}
}
extension SelfPickupStatusEnumExt on int {
SelfPickupRequestStatusEnum toSelfPickupStatusEnum() {
if (this == -1) {
return SelfPickupRequestStatusEnum.allRequests;
} else if (this == 0) {
return SelfPickupRequestStatusEnum.pending;
} else if (this == 1) {
return SelfPickupRequestStatusEnum.preparingToCollect;
} else if (this == 2) {
return SelfPickupRequestStatusEnum.readyToCollect;
} else if (this == 3) {
return SelfPickupRequestStatusEnum.collected;
}
return SelfPickupRequestStatusEnum.allRequests;
}
}
extension SelfPickupStatusEnumToInt on SelfPickupRequestStatusEnum {
int getIdFromSelfPickupStatusEnum() {
switch (this) {
case SelfPickupRequestStatusEnum.allRequests:
return -1;
case SelfPickupRequestStatusEnum.pending:
return 0;
case SelfPickupRequestStatusEnum.preparingToCollect:
return 1;
case SelfPickupRequestStatusEnum.readyToCollect:
return 2;
case SelfPickupRequestStatusEnum.collected:
return 3;
default:
return -1;
}
}
}
extension RequestDeliveryOptionEnumExt on int {
RequestDeliveryOptionEnum toRequestDeliveryOptionEnum() {
if (this == 1) {
return RequestDeliveryOptionEnum.delivery;
} else if (this == 2) {
return RequestDeliveryOptionEnum.selfPickup;
} else if (this == 3) {
return RequestDeliveryOptionEnum.both;
}
return RequestDeliveryOptionEnum.none;
}
}
extension RequestDeliveryOptionEnumToIntExt on RequestDeliveryOptionEnum {
int getIdRequestDeliveryOptionEnum() {
switch (this) {
case RequestDeliveryOptionEnum.delivery:
return 1;
case RequestDeliveryOptionEnum.selfPickup:
return 2;
case RequestDeliveryOptionEnum.both:
return 3;
default:
return 0;
}
}
}
extension RequestDeliveryOptionEnumTosTRINGExt on RequestDeliveryOptionEnum {
String getStringFromRequestDeliveryOptionEnum() {
switch (this) {
case RequestDeliveryOptionEnum.delivery:
return LocaleKeys.delivery.tr();
case RequestDeliveryOptionEnum.selfPickup:
return LocaleKeys.selfPickup.tr();
case RequestDeliveryOptionEnum.both:
return "${LocaleKeys.delivery.tr()}, ${LocaleKeys.selfPickup.tr()}";
default:
return LocaleKeys.selfPickup.tr();
}
}
}
extension CapitalizeFirstLetter on String {
String capitalizeFirstLetter() {
if (isEmpty) {
return this; // Return the string as-is if it's empty
}
return this[0].toUpperCase() + substring(1).toLowerCase();
}
}
// Extension to convert InviteType to corresponding integer
extension InviteTypeToInt on InviteTypeEnum {
int toIntFromEnum() {
switch (this) {
case InviteTypeEnum.whatsapp:
return 1;
case InviteTypeEnum.sms:
return 2;
case InviteTypeEnum.email:
return 3;
}
}
}
// Extension to convert integer to corresponding InviteType
extension IntToInviteType on int {
InviteTypeEnum get toInviteTypeFromInt {
switch (this) {
case 1:
return InviteTypeEnum.whatsapp;
case 2:
return InviteTypeEnum.sms;
case 3:
return InviteTypeEnum.email;
default:
throw ArgumentError('Invalid integer value: $this');
}
}
}
extension AdCreationStepsToInt on AdCreationStepsEnum {
int toIntFromStepsEnum() {
switch (this) {
case AdCreationStepsEnum.vehicleDetails:
return 1;
case AdCreationStepsEnum.damageParts:
return 2;
case AdCreationStepsEnum.adDuration:
return 3;
case AdCreationStepsEnum.reviewAd:
return 4;
}
}
}
extension AdCreationStepsFromInt on int {
AdCreationStepsEnum toAdCreationStepsEnumFromInt() {
switch (this) {
case 0:
return AdCreationStepsEnum.vehicleDetails;
case 1:
return AdCreationStepsEnum.vehicleDetails;
case 2:
return AdCreationStepsEnum.damageParts;
case 3:
return AdCreationStepsEnum.adDuration;
case 4:
return AdCreationStepsEnum.reviewAd;
}
return AdCreationStepsEnum.vehicleDetails;
}
}
extension UserTypeExtension on UserType {
/// Returns a user-friendly display name for the UserType
String toDisplayName() {
switch (this) {
case UserType.providerDealer:
return "Provider - Dealership";
case UserType.providerIndividual:
return "Provider - Individual";
case UserType.dealershipUser:
return "Dealership User";
case UserType.customer:
return "Customer";
default:
return toString(); // Fallback to default toString
return "Current";
}
}
}

File diff suppressed because it is too large Load Diff

@ -1,8 +1,6 @@
// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart
// ignore_for_file: constant_identifier_names
abstract class LocaleKeys {
abstract class LocaleKeys {
static const firstTimeLogIn = 'firstTimeLogIn';
static const signUp = 'signUp';
static const changeMobile = 'changeMobile';
@ -16,7 +14,6 @@ abstract class LocaleKeys {
static const verify = 'verify';
static const verified = 'verified';
static const signOut = 'signOut';
static const accessDenied = 'accessDenied';
static const enterEmail = 'enterEmail';
static const enterNewEmail = 'enterNewEmail';
static const enterCurrentPassword = 'enterCurrentPassword';
@ -50,7 +47,7 @@ abstract class LocaleKeys {
static const emailChangedSuccessfully = 'emailChangedSuccessfully';
static const passwordIsUpdated = 'passwordIsUpdated';
static const passwordShouldContains = 'passwordShouldContains';
static const successfullyRegistered = ' successfullyRegistered';
static const successfullyRegistered = ' successfullyRegistered';
static const pleaseEnterSamePassword = 'pleaseEnterSamePassword';
static const firstNameMandatory = 'firstNameMandatory';
static const surnameNameMandatory = 'surnameNameMandatory';
@ -68,8 +65,6 @@ abstract class LocaleKeys {
static const imageUploaded = 'imageUploaded';
static const fileLarger = 'fileLarger';
static const account = 'account';
static const role = 'role';
static const userType = 'userType';
static const edit = 'edit';
static const imageDeleted = 'imageDeleted';
static const dashboard = 'dashboard';
@ -132,7 +127,6 @@ abstract class LocaleKeys {
static const my_service_providers = 'my_service_providers';
static const appointment_details = 'appointment_details';
static const no_city_available = 'no_city_available';
static const noDataAvailable = 'noDataAvailable';
static const branch_created = 'branch_created';
static const branch_updated = 'branch_updated';
static const branch_deleted = 'branch_deleted';
@ -228,7 +222,6 @@ abstract class LocaleKeys {
static const payLater = 'payLater';
static const complete = 'complete';
static const makeAnOffer = 'makeAnOffer';
static const provideOffer = 'provideOffer';
static const enterAmount = 'enterAmount';
static const submit = 'submit';
static const viewChat = 'viewChat';
@ -240,9 +233,6 @@ abstract class LocaleKeys {
static const sendOTP = 'sendOTP';
static const noUserAddedYet = 'noUserAddedYet';
static const assignDealerUser = 'assignDealerUser';
static const confirmAssignDealerUser = 'confirmAssignDealerUser';
static const removeDealerUser = 'removeDealerUser';
static const confirmRemoveDealerUser = 'confirmRemoveDealerUser';
static const createNewUser = 'createNewUser';
static const dealerUser = 'dealerUser';
static const setorEditBranchSchedule = 'setorEditBranchSchedule';
@ -317,9 +307,6 @@ abstract class LocaleKeys {
static const vehiclePictures = 'vehiclePictures';
static const vehiclePart = 'vehiclePart';
static const damagePartPictures = 'damagePartPictures';
static const qrCode = 'qrCode';
static const downgradeAppliedAfterExpiry = 'downgradeAppliedAfterExpiry';
static const downgradeDeactivateInstruction = 'downgradeDeactivateInstruction';
static const vehicleDamagePart = 'vehicleDamagePart';
static const duration = 'duration';
static const specialServices = 'specialServices';
@ -349,7 +336,7 @@ abstract class LocaleKeys {
static const setupTouchID = 'setupTouchID';
static const reenableTouchID = 'reenableTouchID';
static const scanFaceIDAuthenticate = 'scanFaceIDAuthenticate';
static const adDeletedSuccessfully = 'adDeletedSuccessfully';
static const AdDeletedSuccessfully = 'AdDeletedSuccessfully';
static const yourReservationCancelled = 'yourReservationCancelled';
static const adDeactivatedSuccessfully = 'adDeactivatedSuccessfully';
static const vehicle_selectVehicleType = 'vehicle.selectVehicleType';
@ -370,9 +357,7 @@ abstract class LocaleKeys {
static const error = 'error';
static const appointmentBookedSuccessfully = 'appointmentBookedSuccessfully';
static const appointmentStatusUpdated = 'appointmentStatusUpdated';
static const appointmentStatusLabel = 'appointmentStatusLabel';
static const paymentStatusUpdated = 'paymentStatusUpdated';
static const serviceStatusUpdated = 'serviceStatusUpdated';
static const selectOneSubService = 'selectOneSubService';
static const chargesBreakdown = 'chargesBreakdown';
static const services = 'services';
@ -402,22 +387,10 @@ abstract class LocaleKeys {
static const daysVar = 'daysVar';
static const adCharges = 'adCharges';
static const select = 'select';
static const selectOption = 'selectOption';
static const deleteAdConfirmation = 'deleteAdConfirmation';
static const deleteAdConfirmationMessage = 'deleteAdConfirmationMessage';
static const mileage = 'mileage';
static const transmission = 'transmission';
static const odometer = 'odometer';
static const accidentFree = 'accidentFree';
static const brandNew = 'brandNew';
static const used = 'used';
static const all = 'all';
static const newSparePart = 'newSparePart';
static const usedSparePart = 'usedSparePart';
static const hasYourCarHadAccident = 'hasYourCarHadAccident';
static const odometerReading = 'odometerReading';
static const canMileageIncrease = 'canMileageIncrease';
static const currentlyInUse = 'currentlyInUse';
static const demand = 'demand';
static const adDurationExpired = 'adDurationExpired';
static const bankDetails = 'bankDetails';
@ -445,8 +418,6 @@ abstract class LocaleKeys {
static const bookAndPay = 'bookAndPay';
static const reservationAmounts = 'reservationAmounts';
static const tax = 'tax';
static const requester = 'requester';
static const mowaterAdvertisement = 'mowaterAdvertisement';
static const adsFilter = 'adsFilter';
static const searchByCity = 'searchByCity';
static const selectCity = 'selectCity';
@ -470,7 +441,6 @@ abstract class LocaleKeys {
static const completeDeal = 'completeDeal';
static const uploadBankReceipt = 'uploadBankReceipt';
static const notesForAdmin = 'notesForAdmin';
static const note = 'note';
static const extendAd = 'extendAd';
static const updateAdDetails = 'updateAdDetails';
static const durationExtendingAd = 'durationExtendingAd';
@ -500,6 +470,7 @@ abstract class LocaleKeys {
static const submitAd = 'submitAd';
static const selectAdType = 'selectAdType';
static const validUntilSubscriptionExpiration = 'validUntilSubscriptionExpiration';
static const adsRemaining = 'adsRemaining';
static const youLeftAdsGivenSubscription = 'youLeftAdsGivenSubscription';
static const updateSubscription = 'updateSubscription';
static const workInProgress = 'workInProgress';
@ -524,6 +495,7 @@ abstract class LocaleKeys {
static const itemsSelected = 'itemsSelected';
static const workshopFullAccessServices = 'workshopFullAccessServices';
static const changeLocationService = 'changeLocationService';
static const noItemstoShow = 'noItemstoShow';
static const someDescriptionSubServices = 'someDescriptionSubServices';
static const selectServicesYouWant = 'selectServicesYouWant';
static const selectServiceType = 'selectServiceType';
@ -568,361 +540,11 @@ abstract class LocaleKeys {
static const inviteFriends = 'inviteFriends';
static const more = 'more';
static const language = 'language';
static const mySubscription = 'mySubscription';
static const mySubscriptions = 'mySubscriptions';
static const subscriptions = 'subscriptions';
static const defineLicenses = 'defineLicenses';
static const logOut = 'logOut';
static const customer = 'customer';
static const amountVAR = 'amountVAR';
static const accept = 'accept';
static const nowVar = 'nowVar';
static const whendoyouWanttoUpgrade = 'whendoyouWanttoUpgrade';
static const yourSubscriptionUpgradeAffectingFrom = 'yourSubscriptionUpgradeAffectingFrom';
static const upgradeAfterCurrentExpiry = 'upgradeAfterCurrentExpiry';
static const yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom = 'yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom';
static const upgradeVar = 'upgradeVar';
static const whendoyouWanttoRenew = 'whendoyouWanttoRenew';
static const renewVar = 'renewVar';
static const requestAlreadyInProgress = 'requestAlreadyInProgress';
static const acceptOfferConfirmation = 'acceptOfferConfirmation';
static const acceptOfferConfirmationMessage = 'acceptOfferConfirmationMessage';
static const noUpcomingAppointments = 'noUpcomingAppointments';
static const addNewAppointment = 'addNewAppointment';
static const myNearbyBranches = 'myNearbyBranches';
static const myRecentBranches = 'myRecentBranches';
static const favoriteList = 'favoriteList';
static const myFavouriteProviders = 'myFavouriteProviders';
static const myFavouriteAds = 'myFavouriteAds';
static const noFavouriteAds = 'noFavouriteAds';
static const noReviewsBranch = 'noReviewsBranch';
static const readLess = 'readLess';
static const readMoreReviews = 'readMoreReviews';
static const noProvidersInFav = 'noProvidersInFav';
static const providerHasNoBranches = 'providerHasNoBranches';
static const totalBranches = 'totalBranches';
static const memberSince = 'memberSince';
static const reserved = 'reserved';
static const delete = 'delete';
static const deleteBranchConfirmation = 'deleteBranchConfirmation';
static const deleteBranchConfirmationMessage = 'deleteBranchConfirmationMessage';
static const reviewAndPayment = 'reviewAndPayment';
static const awaitingPaymentFromCustomer = 'awaitingPaymentFromCustomer';
static const awaitingResponseFromProvider = 'awaitingResponseFromProvider';
static const offerNoLongerAvailable = 'offerNoLongerAvailable';
static const doYouWantToCompleteThisDeal = 'doYouWantToCompleteThisDeal';
static const customerCompletingDealMeansThat = 'customerCompletingDealMeansThat';
static const providerCompletingDealMeansThat = 'providerCompletingDealMeansThat';
static const offerSummary = 'offerSummary';
static const personalInformation = 'personalInformation';
static const name = 'name';
static const phone = 'phone';
static const serviceInformation = 'serviceInformation';
static const locationInformation = 'locationInformation';
static const additionalAddressDetails = 'additionalAddressDetails';
static const serviceName = 'serviceName';
static const serviceCategory = 'serviceCategory';
static const offerPrice = 'offerPrice';
static const totalPrice = 'totalPrice';
static const providerName = 'providerName';
static const createdOn = 'createdOn';
static const manufacturedBy = 'manufacturedBy';
static const manufacturedOn = 'manufacturedOn';
static const shipping = 'shipping';
static const delivery = 'delivery';
static const selectDeliveryType = 'selectDeliveryType';
static const shippingManagementInstruction = 'shippingManagementInstruction';
static const withdrawOffer = 'withdrawOffer';
static const manufacturer = 'manufacturer';
static const priceRange = 'priceRange';
static const cancelOffer = 'cancelOffer';
static const pleaseSpecify = 'pleaseSpecify';
static const customerNotResponding = 'customerNotResponding';
static const cancelRequestPrompt = 'cancelRequestPrompt';
static const requestPermanentlyCancelled = 'requestPermanentlyCancelled';
static const awaitingResponseFromCustomer = 'awaitingResponseFromCustomer';
static const acknowledgePaymentToMowater = 'acknowledgePaymentToMowater';
static const requestsFilter = 'requestsFilter';
static const searchByCondition = 'searchByCondition';
static const selectCondition = 'selectCondition';
static const searchByRequestType = 'searchByRequestType';
static const searchByCustomerName = 'searchByCustomerName';
static const searchByProviderName = 'searchByProviderName';
static const searchByRequestStatus = 'searchByRequestStatus';
static const selectRequestType = 'selectRequestType';
static const selectRequestStatus = 'selectRequestStatus';
static const searchByRequestedDate = 'searchByRequestedDate';
static const selectDate = 'selectDate';
static const searchByVehicleModel = 'searchByVehicleModel';
static const selectVehicleModel = 'selectVehicleModel';
static const customerCarePrompt = 'customerCarePrompt';
static const callNow = 'callNow';
static const condition = 'condition';
static const newCondition = 'newCondition';
static const servicesNotAvailableHomeLocation = 'servicesNotAvailableHomeLocation';
static const additionalChargesNotice = 'additionalChargesNotice';
static const selectServiceLocation = 'selectServiceLocation';
static const apptOn = 'apptOn';
static const merged = 'merged';
static const date = 'date';
static const selectAll = 'selectAll';
static const unselectAll = 'unselectAll';
static const copySelectedServices = 'copySelectedServices';
static const pictures = 'pictures';
static const noChatMessage = 'noChatMessage';
static const shippingManagement = 'shippingManagement';
static const appointmentCancelled = 'appointmentCancelled';
static const appointmentsPerSlot = 'appointmentsPerSlot';
static const createSchedule = 'createSchedule';
static const addItems = 'addItems';
static const itemName = 'itemName';
static const itemDescription = 'itemDescription';
static const itemPrice = 'itemPrice';
static const bookAppointmentForServices = 'bookAppointmentForServices';
static const showServiceAvailability = 'showServiceAvailability';
static const bookAppointmentAtLocation = 'bookAppointmentAtLocation';
static const appointmentBookingOption = 'appointmentBookingOption';
static const workshopAvailabilityOption = 'workshopAvailabilityOption';
static const appointmentLocationOption = 'appointmentLocationOption';
static const deleteScheduleConfirmation = 'deleteScheduleConfirmation';
static const deleteScheduleAdConfirmationMessage = 'deleteScheduleAdConfirmationMessage';
static const branchSchedules = 'branchSchedules';
static const noSchedulesFound = 'noSchedulesFound';
static const inviteFriendsBySMS = 'inviteFriendsBySMS';
static const inviteFriendsByWhatsApp = 'inviteFriendsByWhatsApp';
static const inviteFriendsByEmail = 'inviteFriendsByEmail';
static const noFAQsToShow = 'noFAQsToShow';
static const appInfo = 'appInfo';
static const users = 'users';
static const adsRemaining = 'adsRemaining';
static const attachPDF = 'attachPDF';
static const noItemsToShow = 'noItemsToShow';
static const serviceItem = 'serviceItem';
static const createdBy = 'createdBy';
static const createGroupServices = 'createGroupServices';
static const logoutConfirmation = 'logoutConfirmation';
static const logoutConfirmationMessage = 'logoutConfirmationMessage';
static const addToFavoritesOn = 'addToFavoritesOn';
static const subscriptionDate = 'subscriptionDate';
static const expiresOn = 'expiresOn';
static const expired = 'expired';
static const upgradeBranches = 'upgradeBranches';
static const upgradeAds = 'upgradeAds';
static const upgradeSubUsers = 'upgradeSubUsers';
static const explore = 'explore';
static const manageRequests = 'manageRequests';
static const serviceNotAvailableAtHomeLocation = 'serviceNotAvailableAtHomeLocation';
static const wantToRescheduleAppointment = 'wantToRescheduleAppointment';
static const noNeedForService = 'noNeedForService';
static const testTheService = 'testTheService';
static const companyLocation = 'companyLocation';
static const customerLocation = 'customerLocation';
static const deliveryAvailable = 'deliveryAvailable';
static const viewed = 'viewed';
static const read = 'read';
static const sent = 'sent';
static const updateUserDetails = 'updateUserDetails';
static const enterNewFirstName = 'enterNewFirstName';
static const enterNewLastName = 'enterNewLastName';
static const userDetailsUpdated = 'userDetailsUpdated';
static const itemNoLongerAvailable = 'itemNoLongerAvailable';
static const reactivateAd = 'reactivateAd';
static const dealOutsideApp = 'dealOutsideApp';
static const noAgreementCustomer = 'noAgreementCustomer';
static const dealNotCompleted = 'dealNotCompleted';
static const changedDesireToSell = 'changedDesireToSell';
static const vehicleDealOutsideApp = 'vehicleDealOutsideApp';
static const markAdAsSoldDesc = 'markAdAsSoldDesc';
static const ownerInformation = 'ownerInformation';
static const acceptedRequests = 'acceptedRequests';
static const specialRequests = 'specialRequests';
static const specialRequestChat = 'specialRequestChat';
static const sparePartRequestChat = 'sparePartRequestChat';
static const specialCarRequestChat = 'specialCarRequestChat';
static const companyName = 'companyName';
static const noAvailableItems = 'noAvailableItems';
static const serviceDeliveryType = 'serviceDeliveryType';
static const noImagesToShow = 'noImagesToShow';
static const updateGroupServices = 'updateGroupServices';
static const addCommentsHere = 'addCommentsHere';
static const waitForBranchVerification = 'waitForBranchVerification';
static const reportComplaint = 'reportComplaint';
static const descriptionCannotBeEmpty = 'descriptionCannotBeEmpty';
static const adMarkedAsSold = 'adMarkedAsSold';
static const chargesAndServiceRangeGreaterThanZero = 'chargesAndServiceRangeGreaterThanZero';
static const cannotSelectAllDaysAsOff = 'cannotSelectAllDaysAsOff';
static const endDateAfterStartDate = 'endDateAfterStartDate';
static const pleaseEnterStartDateFirst = 'pleaseEnterStartDateFirst';
static const endTimeAfterStartTime = 'endTimeAfterStartTime';
static const pickedLocationNotice = 'pickedLocationNotice';
static const serviceNotProvided = 'serviceNotProvided';
static const pleaseSelectService = 'pleaseSelectService';
static const operationalIssue = 'operationalIssue';
static const materialIssue = 'materialIssue';
static const selectReasonBeforeCancel = 'selectReasonBeforeCancel';
static const blockedByAdmin = 'blockedByAdmin';
static const active = 'active';
static const paymentType = 'paymentType';
static const searchByCreatedDate = 'searchByCreatedDate';
static const cityNameMandatory = 'cityNameMandatory';
static const genderMandatory = 'genderMandatory';
static const updateCity = 'updateCity';
static const userGender = 'userGender';
static const userMale = 'userMale';
static const userFemale = 'userFemale';
static const maxFileSelection = 'maxFileSelection';
static const maxFileSize = 'maxFileSize';
static const onlyJPGandPNG = 'onlyJPGandPNG';
static const expiryDate = 'expiryDate';
static const dealCompleted = 'dealCompleted';
static const theDealNotCompleted = 'theDealNotCompleted';
static const cancelRequest = 'cancelRequest';
static const highPrice = 'highPrice';
static const offerNotMatched = 'offerNotMatched';
static const offerRejected = 'offerRejected';
static const offerAccepted = 'offerAccepted';
static const you = 'you';
static const youCannotDeactivateThisServiceRightNow = 'youCannotDeactivateThisServiceRightNow';
static const done = 'done';
static const notice = 'notice';
static const serviceDeactivated = 'serviceDeactivated';
static const totalNumberOfServices = 'totalNumberOfServices';
static const noAvailableOfficesInCity = 'noAvailableOfficesInCity';
static const searchByItem = 'searchByItem';
static const selectBranchToCopyServices = 'selectBranchToCopyServices';
static const tapToSeeItems = 'tapToSeeItems';
static const tapToSelect = 'tapToSelect';
static const noteCopyItemsExplanation = 'noteCopyItemsExplanation';
static const requestCreatedOn = 'requestCreatedOn';
static const online = 'online';
static const deliveryStatus = 'deliveryStatus';
static const markAsCompleted = 'markAsCompleted';
static const searchByServiceDelivery = 'searchByServiceDelivery';
static const searchByMobileNumber = 'searchByMobileNumber';
static const enterMobileNumber = 'enterMobileNumber';
static const enterCustomerName = 'enterCustomerName';
static const tapToView = 'tapToView';
static const noServicesAvailableToCopy = 'noServicesAvailableToCopy';
static const copySelectedItems = 'copySelectedItems';
static const noOfInvites = 'noOfInvites';
static const noSpecialServicesAvailable = 'noSpecialServicesAvailable';
static const customService = 'customService';
static const selectServiceDetails = 'selectServiceDetails';
static const addServiceDetails = 'addServiceDetails';
static const companyNameMandatory = 'companyNameMandatory';
static const connectionProblem = 'connectionProblem';
static const pleaseCheckConnection = 'pleaseCheckConnection';
static const ok = 'ok';
static const continueAsGuest = 'continueAsGuest';
static const loginToViewAppointments = 'loginToViewAppointments';
static const itemType = 'itemType';
static const upgradeSubscription = 'upgradeSubscription';
static const searchByAdID = 'searchByAdID';
static const enterAdID = 'enterAdID';
static const searchByDemandPrice = 'searchByDemandPrice';
static const enterStartPrice = 'enterStartPrice';
static const enterEndPrice = 'enterEndPrice';
static const searchByVehicleType = 'searchByVehicleType';
static const selectVehicleType = 'selectVehicleType';
static const specialRequestsChats = 'specialRequestsChats';
static const selectDeliveryOption = 'selectDeliveryOption';
static const deliveryOptions = 'deliveryOptions';
static const selfPickup = 'selfPickup';
static const updateYourLocationInfo = 'updateYourLocationInfo';
static const initiateSelfPickup = 'initiateSelfPickup';
static const selfPickupStatus = 'selfPickupStatus';
static const myDraftAds = 'myDraftAds';
static const scheduleDeletedSuccessfully = 'scheduleDeletedSuccessfully';
static const addValidAddress = 'addValidAddress';
static const pleaseAddAtLeastOneImage = 'pleaseAddAtLeastOneImage';
static const termsPrivacyPolicy = 'termsPrivacyPolicy';
static const pendingApproval = 'pendingApproval';
static const inReview = 'inReview';
static const rejected = 'rejected';
static const deactivated = 'deactivated';
static const blocked = 'blocked';
static const allRequests = 'allRequests';
static const pending = 'pending';
static const preparingToCollect = 'preparingToCollect';
static const readyToCollect = 'readyToCollect';
static const collected = 'collected';
static const initiated = 'initiated';
static const inTransit = 'inTransit';
static const outForDelivery = 'outForDelivery';
static const delivered = 'delivered';
static const negotiate = 'negotiate';
static const accepted = 'accepted';
static const cancelled = 'cancelled';
static const loginToAnotherAccount = 'loginToAnotherAccount';
static const silver = 'silver';
static const phoneWithoutCountryCode = 'phoneWithoutCountryCode';
static const sunday = 'sunday';
static const monday = 'monday';
static const tuesday = 'tuesday';
static const wednesday = 'wednesday';
static const thursday = 'thursday';
static const friday = 'friday';
static const saturday = 'saturday';
static const adsWith = 'adsWith';
static const usersWith = 'usersWith';
static const branchesWith = 'branchesWith';
static const subscribed = 'subscribed';
static const expires = 'expires';
static const renew = 'renew';
static const km = 'km';
static const items = 'items';
static const no_items = 'no_items';
static const allAds = 'allAds';
static const reserveCancel = 'reserveCancel';
static const pendingForReview = 'pendingForReview';
static const pendingForPayment = 'pendingForPayment';
static const rejected_n = 'rejected_n';
static const canceled = 'canceled';
static const pendingForPost = 'pendingForPost';
static const active_n = 'active_n';
static const expired_n = 'expired_n';
static const sold_n = 'sold_n';
static const reserved_n = 'reserved_n';
static const buyingService = 'buyingService';
static const deActive = 'deActive';
static const pendingForActive = 'pendingForActive';
static const updateItem = 'updateItem';
static const createItem = 'createItem';
static const pleaseAddAtLeastOneItemImage = 'pleaseAddAtLeastOneItemImage';
static const pleaseAddValidItemName = 'pleaseAddValidItemName';
static const pleaseAddValidItemDescription = 'pleaseAddValidItemDescription';
static const pleaseAddValidItemPrice = 'pleaseAddValidItemPrice';
static const remaining = 'remaining';
static const month = 'month';
static const currentPackage = 'currentPackage';
static const forVar = 'forVar';
static const branch = 'branch';
static const shareAd = 'shareAd';
static const checkOutThisAd = 'checkOutThisAd';
static const downloadApp = 'downloadApp';
static const androidApp = 'androidApp';
static const iosApp = 'iosApp';
static const pleaseWait = 'pleaseWait';
static const numberOfShipping = 'numberOfShipping';
static const loading = 'loading';
static const pleaseSelectAccidentFree = 'pleaseSelectAccidentFree';
static const pleaseSelectMileageIncrease = 'pleaseSelectMileageIncrease';
static const formatNeedsUpdate = 'formatNeedsUpdate';
static const noAdsMatchesYourSearch = 'noAdsMatchesYourSearch';
static const upgrade = 'upgrade';
static const downgrade = 'downgrade';
static const current = 'current';
static const adActiveDuration = 'adActiveDuration';
static const discountOff = 'discountOff';
static const booked = 'booked';
static const confirmed = 'confirmed';
static const rescheduled = 'rescheduled';
static const upcoming = 'upcoming';
static const workStarted = 'workStarted';
static const past = 'past';
static const today = 'today';
static const noAppointmentsMatchSearch = 'noAppointmentsMatchSearch';
static const appts = 'appts';
static const approvalPending = 'approvalPending';
static const activateNow = 'activateNow';
}

@ -1,13 +1,135 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/theme/app_theme.dart';
import 'package:logger/logger.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:sizer/sizer.dart';
//testing push
final navigatorKey = GlobalKey<NavigatorState>();
Logger logger = Logger(
// printer: PrettyPrinter(lineLength: 0, methodCount: 0,),
);
Logger logger = Logger(printer: PrettyPrinter(printEmojis: false, colors: true, printTime: false));
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
}
}
bool disableThingsForQA = true;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Language Tile in Settings
await EasyLocalization.ensureInitialized();
// AppState().setPostParamsInitConfig();
HttpOverrides.global = MyHttpOverrides();
runApp(
EasyLocalization(
supportedLocales: const <Locale>[
Locale('en', 'US'),
Locale('ar', 'SA'),
],
path: 'resources',
// assetLoader: const CodegenLoader(),
child: MultiProvider(
providers: const <SingleChildWidget>[
// ChangeNotifierProvider<LoginProviderModel>(
// create: (_) => LoginProviderModel(),
// ),
],
child: const MyApp(),
),
),
);
}
// todo terminal command to genertate translation files
// flutter pub run easy_localization:generate --source-dir ./assets/langs
// todo terminal command to genertate translation keys
// flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart
// command to generate languages data from json
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraints) {
return Sizer(
builder: (
BuildContext context,
Orientation orientation,
DeviceType deviceType,
) {
List<LocalizationsDelegate<dynamic>> delegates = context.localizationDelegates;
// AppState().setPostParamsModel(
// PostParamsModel(
// languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,
// ),
// );
return MaterialApp(
// key: navigatorKey,
navigatorKey: navigatorKey,
theme: AppTheme.getTheme(
isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar",
),
debugShowCheckedModeBanner: false,
localizationsDelegates: delegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
);
},
);
});
}
}
// class MyApp extends StatelessWidget {
// MyApp({super.key}) {
// AppDependencies.addDependencies();
// AppState = Injector.appInstance.get<AppState>();
// // AppState.setPostParamsInitConfig();
// }
//
// @override
// Widget build(BuildContext context) {
// return LayoutBuilder(builder: (context, constraints) {
// return Sizer(
// builder: (
// BuildContext context,
// Orientation orientation,
// DeviceType deviceType,
// ) {
// SizeConfig().init(constraints, orientation);
// List<LocalizationsDelegate<dynamic>> delegates = context.localizationDelegates;
// // AppState().setPostParamsModel(
// // PostParamsModel(
// // languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,
// // ),
// // );
// return MaterialApp(
// // key: navigatorKey,
// navigatorKey: navigatorKey,
// theme: AppTheme.getTheme(
// EasyLocalization.of(context)?.locale.languageCode == "ar",
// ),
// debugShowCheckedModeBanner: false,
// localizationsDelegates: delegates,
// supportedLocales: context.supportedLocales,
// locale: context.locale,
// initialRoute: AppRoutes.initialPage,
// routes: AppRoutes.routes,
// );
// },
// );
// });
// }
// }

@ -2,7 +2,6 @@ import 'dart:math';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/special_service_model.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class AdDetailsModel {
@ -14,10 +13,7 @@ class AdDetailsModel {
// List<Null>? reserved;
int? statusID;
//TODO: Overwrite these with StatusLabelDisplay and StatusLabelDisplayN
String? statuslabel;
String? statuslabelN;
double? adsDurationPrice;
double? adsDurationDiscount;
double? adsDurationDiscountPrice;
@ -35,91 +31,59 @@ class AdDetailsModel {
String? qrCodePath;
bool? isCustomerAcknowledged;
int? createdByRole;
AdCreationStepsEnum? adCreationStepsEnum;
int? totalViews;
String? createdOn;
double? priceExcludingDiscount;
double? reservePrice;
bool? isMCHandled;
bool? showContactDetail;
bool? isOnWhatsApp;
String? modifiedOn;
AdPostStatus? adPostStatus;
AdReserveStatus? adReserveStatus;
int? adsReserveId; // Reserve ID from AdsReserve_Get API
bool? isReservable;
String? reserveCustomerMessage;
bool? isMyAd;
bool? isReservedByMe;
bool? isAdFavorite;
bool? onBehalfOfCustomer;
int? favouriteAdID; // Favorite record ID (used when unfavoriting)
String? phoneNo;
String? whatsAppNo;
String? adOwnerName;
String? adOwnerEmail;
AdOwnerDetails? adOwnerDetails;
String? warrantyYears;
CreatedByRoleEnum? createdByRoleEnum;
List<ChatMessageModel>? adMessages;
int? totalItemsCount;
AdDetailsModel({
this.id,
this.startdate,
this.enddate,
this.vehicle,
this.specialservice,
// this.reserved,
this.statusID,
this.statuslabel,
this.statuslabelN,
this.adsDurationPrice,
this.adsDurationDiscount,
this.adsDurationDiscountPrice,
this.comment,
this.active,
this.isPaid,
this.isSubscription,
this.isVerified,
this.netPrice,
this.specialServiceTotalPrice,
this.taxPrice,
this.totalPrice,
this.userID,
this.vehiclePostingID,
this.qrCodePath,
this.isCustomerAcknowledged,
this.createdByRole,
this.adCreationStepsEnum,
this.totalViews,
this.createdOn,
this.priceExcludingDiscount,
this.reservePrice,
this.isMCHandled,
this.showContactDetail,
this.isOnWhatsApp,
this.adPostStatus,
this.adReserveStatus,
this.adsReserveId,
this.isReservable,
this.reserveCustomerMessage,
this.isMyAd,
this.isReservedByMe,
this.isAdFavorite,
this.onBehalfOfCustomer,
this.favouriteAdID,
this.phoneNo,
this.whatsAppNo,
this.adOwnerName,
this.adOwnerEmail,
this.adOwnerDetails,
this.warrantyYears,
this.createdByRoleEnum,
this.modifiedOn,
this.adMessages,
this.totalItemsCount,
});
AdDetailsModel(
{this.id,
this.startdate,
this.enddate,
this.vehicle,
this.specialservice,
// this.reserved,
this.statusID,
this.statuslabel,
this.adsDurationPrice,
this.adsDurationDiscount,
this.adsDurationDiscountPrice,
this.comment,
this.active,
this.isPaid,
this.isSubscription,
this.isVerified,
this.netPrice,
this.specialServiceTotalPrice,
this.taxPrice,
this.totalPrice,
this.userID,
this.vehiclePostingID,
this.qrCodePath,
this.isCustomerAcknowledged,
this.createdByRole,
this.totalViews,
this.createdOn,
this.priceExcludingDiscount,
this.reservePrice,
this.isMCHandled,
this.adPostStatus,
this.adReserveStatus,
this.isMyAd,
this.isReservedByMe,
this.phoneNo,
this.whatsAppNo,
this.createdByRoleEnum,
this.modifiedOn});
int getRandomValue({required int min, required int max}) {
Random random = Random();
@ -127,7 +91,7 @@ class AdDetailsModel {
return randomNumber;
}
AdDetailsModel.fromJson(Map<String, dynamic> json, bool isMyAds, int totalItems) {
AdDetailsModel.fromJson(Map<String, dynamic> json, bool isMyAds) {
id = json['id'];
startdate = json['startdate'];
enddate = json['enddate'];
@ -139,8 +103,7 @@ class AdDetailsModel {
});
}
statusID = json['statusID'];
statuslabel = json['statuslabelDisplay'] ?? json['statuslabel'];
statuslabelN = json['statuslabelDisplayN'] ?? json['statuslabelN'] ?? json['statuslabelDisplay'] ?? json['statuslabel'];
statuslabel = json['statuslabel'];
adsDurationPrice = json['adsDurationPrice'];
adsDurationDiscount = json['adsDurationDiscount'];
adsDurationDiscountPrice = json['adsDurationDiscountPrice'];
@ -154,36 +117,26 @@ class AdDetailsModel {
taxPrice = json['taxPrice'];
totalPrice = json['totalPrice'];
userID = json['userID'];
vehiclePostingID = (json['vehiclePostingID'] == null || json['vehiclePostingID'] == 0) ? json['id'] : json['vehiclePostingID'];
vehiclePostingID = json['vehiclePostingID'];
qrCodePath = json['qrCodePath'];
isCustomerAcknowledged = json['isCustomerAcknowledged'];
createdByRole = json['createdByRole'];
adCreationStepsEnum = json['stepNo'] != null ? (json['stepNo'] as int).toAdCreationStepsEnumFromInt() : AdCreationStepsEnum.vehicleDetails;
totalViews = json['totalViews'];
createdOn = json['createdOn'];
priceExcludingDiscount = json['priceExcludingDiscount'];
reservePrice = json['reservePrice'];
isMCHandled = json['isMCHandled'];
showContactDetail = json['showContactDetail'];
isOnWhatsApp = json['isOnWhatsApp'];
modifiedOn = json['modifiedOn'];
phoneNo = json['vehicle'] != null ? (json['vehicle']['mobileNo'] ?? "") : "";
whatsAppNo = json['vehicle'] != null ? (json['vehicle']['whatsAppNo'] ?? "") : "";
warrantyYears = json['vehicle'] != null ? (json['vehicle']['warantyYears'] != null ? ((json['vehicle']['warantyYears']).toString()) : "") : "";
adOwnerName = json['vehicle'] != null ? (json['vehicle']['adOwnerName'] ?? "") : "";
adOwnerEmail = json['vehicle'] != null ? (json['vehicle']['adOwnerEmail'] ?? "") : "";
adOwnerDetails = (json['vehicle'] != null && json['vehicle']['aDsUser'] != null) ? (AdOwnerDetails.fromJson(json['vehicle']['aDsUser'])) : null;
adPostStatus = ((json['statusID'] ?? 1) as int).toAdPostEnum();
whatsAppNo = json['phoneNo'];
modifiedOn = json['whatsAppNo'];
// adPostStatus = AdPostStatus.expired;
adPostStatus = (json['statusID'] as int).toAdPostEnum();
//TODO: THIS ID SHOULD BE UPDATED!
adReserveStatus = AdReserveStatus.defaultStatus;
isReservable = json['isReservable'] ?? false;
reserveCustomerMessage = json['reserveCustomerMessage'];
// createdByRoleEnum = CreatedByRoleEnum.admin;
createdByRoleEnum = (json['createdByRole'] as int).toCreatedByRoleEnum();
isMyAd = isMyAds;
isReservedByMe = false;
isAdFavorite = json['isFavourite'] ?? false;
onBehalfOfCustomer = json['onBehalfOfCustomer'] ?? false;
favouriteAdID = json['favouriteAdID'];
totalItemsCount = totalItems;
}
}
@ -191,12 +144,11 @@ class Vehicle {
int? id;
int? cityID;
String? cityName;
String? cityNameN;
double? demandAmount;
bool? isActive;
bool? isFinanceAvailable;
int? status;
String? statusText;
String? statustext;
Category? category;
Category? color;
Condition? condition;
@ -205,32 +157,25 @@ class Vehicle {
ModelYear? modelyear;
Condition? sellertype;
Condition? transmission;
AdsDuration? duration;
List<GenericImageModel>? image;
Duration? duration;
List<AdImage>? image;
List<DamageReport>? damagereport;
String? vehicleDescription;
String? vehicleTitle;
int? vehicleType;
String? vehicleVIN;
int? countryID;
String? countryName;
String? countryNameN;
String? currency;
String? currencyN;
int? odometer;
int? isInUsed;
bool? isAccidentFree;
Vehicle(
{this.id,
this.cityID,
this.cityName,
this.cityNameN,
this.demandAmount,
this.isActive,
this.isFinanceAvailable,
this.status,
this.statusText,
this.statustext,
this.category,
this.color,
this.condition,
@ -247,24 +192,17 @@ class Vehicle {
this.vehicleType,
this.vehicleVIN,
this.countryID,
this.countryName,
this.countryNameN,
this.currency,
this.currencyN,
this.odometer,
this.isInUsed,
this.isAccidentFree});
this.currency});
Vehicle.fromJson(Map<String, dynamic> json) {
id = json['id'];
cityID = json['cityID'];
cityName = json['cityName'];
cityNameN = json['cityNameN'];
demandAmount = json['demandAmount'];
isActive = json['isActive'];
isFinanceAvailable = json['isFinanceAvailable'];
status = json['status'];
statusText = json['statustext'];
statustext = json['statustext'];
category = json['category'] != null ? Category.fromJson(json['category']) : null;
color = json['color'] != null ? Category.fromJson(json['color']) : null;
condition = json['condition'] != null ? Condition.fromJson(json['condition']) : null;
@ -273,11 +211,11 @@ class Vehicle {
modelyear = json['modelyear'] != null ? ModelYear.fromJson(json['modelyear']) : null;
sellertype = json['sellertype'] != null ? Condition.fromJson(json['sellertype']) : null;
transmission = json['transmission'] != null ? Condition.fromJson(json['transmission']) : null;
duration = json['duration'] != null ? AdsDuration.fromJson(json['duration']) : null;
duration = json['duration'] != null ? Duration.fromJson(json['duration']) : null;
if (json['image'] != null) {
image = <GenericImageModel>[];
image = <AdImage>[];
json['image'].forEach((v) {
image!.add(GenericImageModel.fromJson(v));
image!.add(AdImage.fromJson(v));
});
}
if (json['damagereport'] != null) {
@ -291,13 +229,7 @@ class Vehicle {
vehicleType = json['vehicleType'];
vehicleVIN = json['vehicleVIN'];
countryID = json['countryID'];
countryName = json['countryName'];
countryNameN = json['countryNameN'] ?? json['countryName'];
currency = json['currency'];
currencyN = json['currencyN'];
odometer = json['odometer'];
isInUsed = json['isInUsed'];
isAccidentFree = json['isAccidentFree'];
}
}
@ -378,7 +310,6 @@ class Mileage {
class ModelYear {
int? id;
String? label;
String? labelN;
ModelYear({this.id, this.label});
@ -395,16 +326,16 @@ class ModelYear {
}
}
class AdsDuration {
class Duration {
int? id;
String? label;
int? days;
double? price;
ModelYear? country;
AdsDuration({this.id, this.label, this.days, this.price, this.country});
Duration({this.id, this.label, this.days, this.price, this.country});
AdsDuration.fromJson(Map<String, dynamic> json) {
Duration.fromJson(Map<String, dynamic> json) {
id = json['id'];
label = json['label'];
days = json['days'];
@ -425,15 +356,15 @@ class AdsDuration {
}
}
class GenericImageModel {
class AdImage {
int? id;
String? imageName;
String? imageUrl;
bool? isActive;
GenericImageModel({this.id, this.imageName, this.imageUrl, this.isActive});
AdImage({this.id, this.imageName, this.imageUrl, this.isActive});
GenericImageModel.fromJson(Map<String, dynamic> json) {
AdImage.fromJson(Map<String, dynamic> json) {
id = json['id'];
imageName = json['imageName'];
imageUrl = json['imageUrl'];
@ -467,7 +398,6 @@ class DamageReport {
isActive = json['isActive'];
vehicleDamagePartID = json['vehicleDamagePartID'];
partName = json['partName'];
comment = json['comment'];
}
Map<String, dynamic> toJson() {
@ -481,28 +411,3 @@ class DamageReport {
return data;
}
}
class AdOwnerDetails {
String? name;
String? email;
String? mobileNo;
String? profilePic;
AdOwnerDetails({this.name, this.email, this.mobileNo, this.profilePic});
AdOwnerDetails.fromJson(Map<String, dynamic> json) {
name = json['name'];
email = json['email'];
mobileNo = json['mobileNo'];
profilePic = json['profilePic'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['name'] = name;
data['email'] = email;
data['mobileNo'] = mobileNo;
data['profilePic'] = profilePic;
return data;
}
}

@ -28,17 +28,3 @@ class AdsBankDetailsModel {
return data;
}
}
class AdExtensionOrderResponseModel {
final int adsID;
final bool isPaymentRequired;
AdExtensionOrderResponseModel({required this.adsID, required this.isPaymentRequired});
factory AdExtensionOrderResponseModel.fromJson(Map<String, dynamic> json) {
return AdExtensionOrderResponseModel(
adsID: json['adsID'] as int,
isPaymentRequired: json['isPaymentRequired'] as bool,
);
}
}

@ -6,32 +6,9 @@ class AdsDurationModel {
int? countryID;
bool? isActive;
String? countryName;
String? currency;
String? countryNameN;
String? currencyN;
double? discountValue;
double? discountPercent;
double? priceAfterDiscount;
int? roleID;
bool? isSelected;
AdsDurationModel({
this.id,
this.name,
this.days,
this.price,
this.countryID,
this.isActive,
this.countryName,
this.currency,
this.countryNameN,
this.currencyN,
this.discountValue,
this.discountPercent,
this.priceAfterDiscount,
this.roleID,
this.isSelected,
});
AdsDurationModel({this.id, this.name, this.days, this.price, this.countryID, this.isActive, this.countryName, this.isSelected});
AdsDurationModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -41,13 +18,6 @@ class AdsDurationModel {
countryID = json['countryID'];
isActive = json['isActive'];
countryName = json['countryName'];
currency = json['currency'];
countryNameN = json['countryNameN'];
currencyN = json['currencyN'];
discountValue = json['discountValue'];
discountPercent = json['discountPercent'];
priceAfterDiscount = json['priceAfterDiscount'];
roleID = json['roleID'];
isSelected = false;
}
@ -60,13 +30,6 @@ class AdsDurationModel {
data['countryID'] = countryID;
data['isActive'] = isActive;
data['countryName'] = countryName;
data['currency'] = currency;
data['countryNameN'] = countryNameN;
data['currencyN'] = currencyN;
data['discountValue'] = discountValue;
data['discountPercent'] = discountPercent;
data['priceAfterDiscount'] = priceAfterDiscount;
data['roleID'] = roleID;
return data;
}
}

@ -26,7 +26,7 @@ class MyReservedAdsRespModel {
adsID = json['adsID'];
customerID = json['customerID'];
paymentStatus = json['paymentStatus'];
adsReserveStatus = json['adsReserveStatus'];
paymentStatus = json['adsReserveStatus'];
reservationTimeID = json['reservationTimeID'];
reservationBasePrice = json['reservationBasePrice'];
refundAmount = json['refundAmount'];

@ -81,7 +81,7 @@ class Office {
String? officeAreaName;
String? officeAreaNameN;
int? cityID;
CitySSModel? city;
String? city;
int? specialServiceID;
Office({this.id, this.officeAreaName, this.officeAreaNameN, this.cityID, this.city, this.specialServiceID});
@ -91,41 +91,11 @@ class Office {
officeAreaName = json['officeAreaName'];
officeAreaNameN = json['officeAreaNameN'];
cityID = json['cityID'];
if (json['city'] != null) {
city = json['city'] != null ? CitySSModel.fromJson(json['city']) : null;
}
city = json['city'];
specialServiceID = json['specialServiceID'];
}
}
class CitySSModel {
int? id;
String? cityName;
String? cityNameN;
int? countryID;
String? country;
bool? isActive;
int? createdBy;
String? createdOn;
String? modifiedBy;
String? modifiedOn;
CitySSModel({this.id, this.cityName, this.cityNameN, this.countryID, this.country, this.isActive, this.createdBy, this.createdOn, this.modifiedBy, this.modifiedOn});
CitySSModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
cityName = json['cityName'];
cityNameN = json['cityNameN'];
countryID = json['countryID'];
country = json['country'];
isActive = json['isActive'];
createdBy = json['createdBy'];
createdOn = json['createdOn'];
modifiedBy = json['modifiedBy'];
modifiedOn = json['modifiedOn'];
}
}
class SpecialServiceModelForAds {
int? adsID;
int? specialServiceID;
@ -156,6 +126,7 @@ class SpecialServiceModelForAds {
appointmentStatusEnum = (json['appointmentStatus'] as int).toAppointmentStatusEnum();
appointmentDate = json['appointmentDate'];
appointmentStatusId = json['appointmentStatus'];
}
@override

@ -12,7 +12,7 @@ class SSPhotoOfficeScheduleModel {
String? areaName;
String? latitude;
String? longitude;
double? distanceKM;
int? distanceKM;
int? totalItemsCount;
List<PhotoOfficeScheduleSlots>? photoOfficeScheduleSlots;
List<CustomTimeDateSlotModel>? customTimeDateSlotList;

@ -451,11 +451,10 @@ class VehicleBrandsModel {
String? vehicleTypeVal;
String? vehicleBrandDescription;
String? vehicleBrandDescriptionN;
String? imageUrl;
bool? isActive;
bool? isSelected;
VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive, this.isSelected, this.imageUrl});
VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive, this.isSelected});
VehicleBrandsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -464,7 +463,6 @@ class VehicleBrandsModel {
vehicleBrandDescription = json['vehicleBrand_Description'];
vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN'];
isActive = json['isActive'];
imageUrl = json['imageUrl'];
isSelected = false;
}
@ -475,7 +473,6 @@ class VehicleBrandsModel {
data['vehicleTypeVal'] = vehicleTypeVal;
data['vehicleBrand_Description'] = vehicleBrandDescription;
data['vehicleBrand_DescriptionN'] = vehicleBrandDescriptionN;
data['imageUrl'] = imageUrl;
data['isActive'] = isActive;
return data;
}

@ -1,45 +0,0 @@
class AppointmentBasicDetailsModel {
int? serviceSlotID;
String? slotDate;
String? startTime;
String? endTime;
int? appointmentStatusID;
String? appointmentStatusText;
int? serviceProviderID;
int? customerID;
AppointmentBasicDetailsModel({
this.serviceSlotID,
this.slotDate,
this.startTime,
this.endTime,
this.appointmentStatusID,
this.appointmentStatusText,
this.serviceProviderID,
this.customerID,
});
AppointmentBasicDetailsModel.fromJson(Map<String, dynamic> json) {
serviceSlotID = json['serviceSlotID'];
slotDate = json['slotDate'];
startTime = json['startTime'];
endTime = json['endTime'];
appointmentStatusID = json['appointmentStatusID'];
appointmentStatusText = json['appointmentStatusText'];
serviceProviderID = json['serviceProviderID'];
customerID = json['customerID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['serviceSlotID'] = serviceSlotID;
data['slotDate'] = slotDate;
data['startTime'] = startTime;
data['endTime'] = endTime;
data['appointmentStatusID'] = appointmentStatusID;
data['appointmentStatusText'] = appointmentStatusText;
data['serviceProviderID'] = serviceProviderID;
data['customerID'] = customerID;
return data;
}
}

@ -16,19 +16,12 @@ class AppointmentListModel {
String? customerName;
String? customerMobileNum;
int? appointmentType;
AppointmentTypeEnum? appointmentTypeEnum;
String? providerName;
String? duration;
String? appointmentDate;
String? appointmentCreatedOn;
String? paymentType;
String? appointmentAddress;
String? appointmentLatitude;
String? appointmentLongitude;
String? branchName;
int? branchId;
int? servicePaymentStatus;
bool? isPaymentRequiredAtBooking;
double? totalAmount;
double? remainingAmount;
bool? isSelected;
@ -39,8 +32,7 @@ class AppointmentListModel {
List<AppointmentListModel>? customerAppointmentList;
List<MergeAppointmentList>? mergeAppointmentList;
AppointmentListModel({
this.id,
AppointmentListModel({this.id,
this.serviceSlotID,
this.appointmentStatusID,
this.appointmentStatusText,
@ -53,29 +45,21 @@ class AppointmentListModel {
this.customerName,
this.customerMobileNum,
this.appointmentType,
this.appointmentTypeEnum,
this.providerName,
this.paymentType,
this.appointmentAddress,
this.appointmentLatitude,
this.appointmentLongitude,
this.duration,
this.branchName,
this.branchId,
this.servicePaymentStatus,
this.isPaymentRequiredAtBooking,
this.totalAmount,
this.remainingAmount,
this.isSelected,
this.appointmentDate,
this.appointmentCreatedOn,
this.appointmentServicesList,
this.customerAppointmentList,
this.mergeAppointmentList,
});
this.customerAppointmentList, this.mergeAppointmentList,});
@override
String toString() {
return 'AppointmentListModel{id: $id, serviceSlotID: $serviceSlotID, appointmentStatusID: $appointmentStatusID, appointmentStatusText: $appointmentStatusText, serviceProviderID: $serviceProviderID, customerID: $customerID, isActive: $isActive, isPaymentRequired: $isPaymentRequired, paymentStatus: $paymentStatus, paymentStatusText: $paymentStatusText, customerName: $customerName, providerName: $providerName, duration: $duration, appointmentDate: $appointmentDate,appointmentCreatedOn: $appointmentCreatedOn, appointmentStatusEnum: $appointmentStatusEnum, appointmentServicesList: $appointmentServicesList}';
return 'AppointmentListModel{id: $id, serviceSlotID: $serviceSlotID, appointmentStatusID: $appointmentStatusID, appointmentStatusText: $appointmentStatusText, serviceProviderID: $serviceProviderID, customerID: $customerID, isActive: $isActive, isPaymentRequired: $isPaymentRequired, paymentStatus: $paymentStatus, paymentStatusText: $paymentStatusText, customerName: $customerName, providerName: $providerName, duration: $duration, appointmentDate: $appointmentDate, appointmentStatusEnum: $appointmentStatusEnum, appointmentServicesList: $appointmentServicesList}';
}
AppointmentListModel.fromJson(Map<String, dynamic> json) {
@ -92,31 +76,31 @@ class AppointmentListModel {
customerName = json['customerName'];
customerMobileNum = json['customerMobile'];
appointmentType = json['appointmentType'];
appointmentTypeEnum = json['appointmentType'] != null ? (json['appointmentType'] as int).toAppointmentTypeEnum() : AppointmentTypeEnum.workshop;
providerName = json['providerName'];
duration = json['duration'];
appointmentDate = json['appointmentDate'];
appointmentCreatedOn = json['createdOn'];
paymentType = json['paymentType'];
appointmentAddress = json['address'] ?? "";
appointmentLatitude = json['branchLatitude'];
appointmentLongitude = json['branchLongitude'];
branchName = json['branchName'];
branchId = json['branchID'];
servicePaymentStatus = json['servicePaymentStatus'];
isPaymentRequiredAtBooking = json['isPaymentRequiredAtBooking'];
totalAmount = json['amountTotal'];
remainingAmount = json['amountRem'];
isSelected = false;
appointmentStatusEnum = (json['appointmentStatusID'] as int).toAppointmentStatusEnum();
appointmentPaymentStatusEnum = (json['servicePaymentStatus'] as int).toAppointmentPaymentStatusEnum();
appointmentStatusEnum =
(json['appointmentStatusID'] as int).toAppointmentStatusEnum();
appointmentPaymentStatusEnum =
(json['servicePaymentStatus'] as int).toAppointmentPaymentStatusEnum();
if (json['serviceList'] != null) {
appointmentServicesList = <ServiceModel>[];
json['serviceList'].forEach((v) {
appointmentServicesList!.add(ServiceModel.fromJson(v, isForAppointment: true));
appointmentServicesList!
.add(ServiceModel.fromJson(v, isForAppointment: true));
});
}
mergeAppointmentList = json["mergeAppointmentList"] == null ? [] : List<MergeAppointmentList>.from(json["mergeAppointmentList"]!.map((x) => MergeAppointmentList.fromJson(x)));
mergeAppointmentList =
json["mergeAppointmentList"] == null ? [] : List<MergeAppointmentList>.from(
json["mergeAppointmentList"]!.map((x) =>
MergeAppointmentList.fromJson(x)));
}
}
@ -126,7 +110,10 @@ class ServiceAppointmentItems {
String? serviceItemName;
String? serviceItemDescription;
ServiceAppointmentItems({this.id, this.serviceItemID, this.serviceItemName, this.serviceItemDescription});
ServiceAppointmentItems({this.id,
this.serviceItemID,
this.serviceItemName,
this.serviceItemDescription});
ServiceAppointmentItems.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -151,9 +138,12 @@ class CustomerData {
final String customerName;
final List<AppointmentListModel> appointmentList;
CustomerData({required this.customerID, required this.customerName, required this.appointmentList});
CustomerData({required this.customerID,
required this.customerName,
required this.appointmentList});
}
class MergeAppointmentList {
int? id;
int? mergeAppointmentId;
@ -165,15 +155,17 @@ class MergeAppointmentList {
this.serviceAppointmentId,
});
factory MergeAppointmentList.fromJson(Map<String, dynamic> json) => MergeAppointmentList(
factory MergeAppointmentList.fromJson(Map<String, dynamic> json) =>
MergeAppointmentList(
id: json["id"],
mergeAppointmentId: json["mergeAppointmentID"],
serviceAppointmentId: json["serviceAppointmentID"],
);
Map<String, dynamic> toJson() => {
Map<String, dynamic> toJson() =>
{
"id": id,
"mergeAppointmentID": mergeAppointmentId,
"serviceAppointmentID": serviceAppointmentId,
};
}
}

@ -1,7 +1,6 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/models/general_models/widgets_models.dart';
import 'package:mc_common_app/utils/enums.dart';
class CustomTimeDateSlotModel {
TimeSlotModel? date;
@ -11,7 +10,6 @@ class CustomTimeDateSlotModel {
}
class ServiceAppointmentScheduleModel {
String? scheduleName;
List<ServiceSlotList>? serviceSlotList;
List<ServiceModel>? servicesListInAppointment;
int? selectedDateIndex;
@ -21,12 +19,8 @@ class ServiceAppointmentScheduleModel {
double? amountTotal;
double? amountRem;
int? appointmentType;
double? totalLocationCharges;
CurrentLocationInfoModel? locationInfoModel;
AppointmentTypeEnum? appointmentTypeEnum;
ServiceAppointmentScheduleModel({
this.scheduleName,
this.serviceSlotList,
this.servicesListInAppointment,
this.selectedDateIndex,
@ -36,9 +30,6 @@ class ServiceAppointmentScheduleModel {
this.amountTotal,
this.amountRem,
this.appointmentType,
this.totalLocationCharges,
this.locationInfoModel,
this.appointmentTypeEnum,
});
List<CustomTimeDateSlotModel> getFormattedDateTimeSlotPackage() {
@ -78,7 +69,7 @@ class ServiceAppointmentScheduleModel {
.toList();
List<TimeSlotModel> slotTime = [];
for (var element in slotTimeData) {
slotTime.add(TimeSlotModel(isSelected: false, slotId: element.id!, slot: element.startTime ?? "", date: element.slotDate!.toFormattedDateWithoutTime()));
slotTime.add(TimeSlotModel(isSelected: false, slotId: element.id!, slot: element.startTime ?? "", date: element.slotDate!.toFormattedDateWithoutTime() ?? ""));
}
return slotTime;
@ -96,8 +87,6 @@ class ServiceAppointmentScheduleModel {
}
ServiceAppointmentScheduleModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) {
scheduleName = json['scheduleName'];
if (json['serviceSlotList'] != null) {
serviceSlotList = <ServiceSlotList>[];
json['serviceSlotList'].forEach((v) {
@ -116,9 +105,6 @@ class ServiceAppointmentScheduleModel {
amountTotal = json['amountTotal'];
amountRem = json['amountRem'];
appointmentType = json['appointmentType'];
totalLocationCharges = 0.0;
locationInfoModel = CurrentLocationInfoModel(address: "", latitude: 0.0, longitude: 0.0, distanceToBranch: 0.0, homeChargesInCurrentService: 0.0);
appointmentTypeEnum = json['appointmentType'] != null ? (json['appointmentType'] as int).toAppointmentTypeEnum() : AppointmentTypeEnum.workshop;
}
}

@ -1,21 +0,0 @@
class BuyersChatForAdsModel {
int? id;
String? buyerUserID;
String? buyerName;
int? adsID;
int? unReadMessagesCount;
String? lastMessage;
String? lastMessageDateTime;
BuyersChatForAdsModel({this.id, this.buyerUserID, this.buyerName, this.adsID});
BuyersChatForAdsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
buyerUserID = json['buyerUserID'];
buyerName = json['buyerName'];
adsID = json['adsID'];
unReadMessagesCount = json['unReadCount'];
lastMessage = json['lastMessage'];
lastMessageDateTime = json['lastMessageDateTime'];
}
}

@ -17,7 +17,6 @@ class ChatMessageModel {
int? serviceProviderID;
int? offerStatus;
ReqOffer? reqOffer;
List<MessageImageModel>? messageImages;
bool? isRead;
String? readOn;
bool? isMyMessage;
@ -35,7 +34,6 @@ class ChatMessageModel {
this.serviceProviderID,
this.offerStatus,
this.reqOffer,
this.messageImages,
this.isRead,
this.readOn,
this.isMyMessage,
@ -43,10 +41,10 @@ class ChatMessageModel {
@override
String toString() {
return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}';
return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: $reqOffer, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}';
}
ChatMessageModel.fromJson(Map<String, dynamic> json, {bool isFromNetwork = true, bool isForReqOfferImagesURLs = false}) {
ChatMessageModel.fromJson(Map<String, dynamic> json) {
final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase();
id = json['id'];
senderUserID = json['senderUserID'];
@ -59,13 +57,7 @@ class ChatMessageModel {
reqOfferID = json['reqOfferID'];
serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus'];
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer'], isFromNetwork, isForReqOfferImagesURLs) : null;
if (json['reqOfferImages'] != null) {
messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
messageImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null;
isRead = json['isRead'];
readOn = json['readOn'];
isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId;
@ -79,15 +71,8 @@ class ReqOffer {
int? offerStatus;
String? offerStatusText;
String? comment;
String? serviceItemName;
String? manufacturedByName;
String? manufacturedOn;
double? price;
bool? isDeliveryAvailable;
RequestDeliveryOptionEnum? requestDeliveryOption;
RequestsTypeEnum? requestsTypeEnum;
RequestOfferStatusEnum? requestOfferStatusEnum;
List<MessageImageModel>? reqOfferImages;
ReqOffer({
this.id,
@ -96,52 +81,19 @@ class ReqOffer {
this.offerStatus,
this.offerStatusText,
this.comment,
this.serviceItemName,
this.manufacturedByName,
this.manufacturedOn,
this.price,
this.isDeliveryAvailable,
this.requestDeliveryOption,
this.requestOfferStatusEnum,
this.requestsTypeEnum,
this.reqOfferImages,
});
ReqOffer.fromJson(Map<String, dynamic> json, bool isFromNetwork, bool isForReqOfferImagesURLs) {
ReqOffer.fromJson(Map<String, dynamic> json) {
id = json['id'];
requestID = json['requestID'];
serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus'];
offerStatusText = json['offerStatusText'];
comment = json['comment'];
serviceItemName = json['serviceItem'];
manufacturedByName = json['offeredItemCreatedByName'].toString();
manufacturedOn = json['offeredItemCreatedOn'] ?? json["createdOn"];
price = json['price'];
isDeliveryAvailable = json['isDeliveryAvailable'];
requestDeliveryOption = ((json['offerDeliveryOption'] ?? 0) as int).toRequestDeliveryOptionEnum();
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
requestsTypeEnum = RequestsTypeEnum.serviceRequest;
// if (isForReqOfferImagesURLs) {
// if (json['reqOfferImagesURLs'] != null) {
// reqOfferImages = <MessageImageModel>[];
// json['reqOfferImagesURLs'].forEach((v) {
// reqOfferImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
// });
// }
// } else {
if (json['reqOfferImages'] != null) {
reqOfferImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
reqOfferImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
// }
}
@override
String toString() {
return 'ReqOffer{id: $id, requestID: $requestID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, offerStatusText: $offerStatusText, comment: $comment, serviceItemName: $serviceItemName, manufacturedById: $manufacturedByName, manufacturedOn: $manufacturedOn, price: $price, requestsTypeEnum: $requestsTypeEnum, requestOfferStatusEnum: $requestOfferStatusEnum}';
}
}
@ -152,43 +104,3 @@ class OfferRequestCommentModel {
OfferRequestCommentModel({this.index, this.title, this.isSelected});
}
class MessageImageModel {
int? id;
String? imageUrl;
String? imageStr;
String? imagePath;
bool? isFromNetwork;
int? reqOfferID;
MessageImageModel({
this.id,
this.imageUrl,
this.imageStr,
this.imagePath,
this.reqOfferID,
this.isFromNetwork = false,
});
MessageImageModel.fromJson(Map<String, dynamic> json, bool fromNetwork) {
id = json['id'];
imageUrl = json['imageUrl'];
imageStr = json['imageStr'];
imagePath = json[''];
reqOfferID = json['reqOfferID'];
isFromNetwork = fromNetwork;
}
Map<String, dynamic> toJson() {
return {
'id': id,
'imageStr': imageStr,
'reqOfferID': reqOfferID, // We don't include 'isFromNetwork' since it's set manually when parsing JSON
};
}
@override
String toString() {
return 'MessageImageModel{id: $id, imageUrl: $imageUrl, imageStr: $imageStr, imagePath: $imagePath, isFromNetwork: $isFromNetwork, reqOfferID: $reqOfferID}';
}
}

@ -2,8 +2,6 @@ class EnumsModel {
int id;
int enumTypeId;
String enumValueStr;
String enumValueStrN;
String enumValueStrDes;
int enumValue;
bool isActive;
@ -11,8 +9,6 @@ class EnumsModel {
required this.id,
required this.enumTypeId,
required this.enumValueStr,
required this.enumValueStrN,
required this.enumValueStrDes,
required this.enumValue,
required this.isActive,
});
@ -20,18 +16,21 @@ class EnumsModel {
factory EnumsModel.fromJson(Map<String, dynamic> json) => EnumsModel(
id: json["id"],
enumTypeId: json["enumTypeID"],
// enumValueStr: json["enumValueStr"],
// enumValueStrN: json["enumValueStrN"] ?? json["enumValueStr"],
enumValueStr: json["enumValueDisplay"] ?? json["enumValueStr"],
enumValueStrN: json["enumValueDisplayN"] ?? json["enumValueDisplay"] ?? json["enumValueStrN"] ?? json["enumValueStr"],
enumValueStrDes: json["enumValueStrDes"] ?? json["enumValueStr"],
enumValueStr: json["enumValueStr"],
enumValue: json["enumValue"],
isActive: json["isActive"],
);
@override
String toString() {
return 'EnumsModel{id: $id, enumTypeId: $enumTypeId, enumValueStr: $enumValueStr,enumValueStrDes: $enumValueStrDes, enumValue: $enumValue, isActive: $isActive,'
'enumValueStrN: $enumValueStrN}';
return 'EnumsModel{id: $id, enumTypeId: $enumTypeId, enumValueStr: $enumValueStr, enumValue: $enumValue, isActive: $isActive}';
}
Map<String, dynamic> toJson() => {
"id": id,
"enumTypeID": enumTypeId,
"enumValueStr": enumValueStr,
"enumValue": enumValue,
"isActive": isActive,
};
}

@ -1,7 +1,5 @@
import 'dart:io';
import 'package:mc_common_app/utils/utils.dart';
class GenericRespModel {
GenericRespModel({
this.data,
@ -15,19 +13,12 @@ class GenericRespModel {
int? totalItemsCount;
String? message;
factory GenericRespModel.fromJson(Map<String, dynamic> json) {
if (json.containsKey('StatusMessage')) {
if ((json['StatusMessage'] as String).contains('Internal server error')) {
Utils.showToast("${json['StatusMessage']}");
}
}
return GenericRespModel(
data: json["data"],
messageStatus: json["messageStatus"],
totalItemsCount: json["totalItemsCount"],
message: json["message"],
);
}
factory GenericRespModel.fromJson(Map<String, dynamic> json) => GenericRespModel(
data: json["data"],
messageStatus: json["messageStatus"],
totalItemsCount: json["totalItemsCount"],
message: json["message"],
);
Map<String, dynamic> toJson() => {
"data": data,
@ -47,6 +38,17 @@ class AdsCreationPayloadModel {
ads = json['ads'] != null ? Ads.fromJson(json['ads']) : null;
vehiclePosting = json['vehiclePosting'] != null ? VehiclePosting.fromJson(json['vehiclePosting']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (ads != null) {
data['ads'] = ads!.toJson();
}
if (vehiclePosting != null) {
data['vehiclePosting'] = vehiclePosting!.toJson();
}
return data;
}
}
class Ads {
@ -56,19 +58,8 @@ class Ads {
int? countryId;
List<int>? specialServiceIDs;
bool? isMCHandled;
bool? showContactDetail;
bool? isOnWhatsApp;
Ads({
this.id,
this.adsDurationID,
this.startDate,
this.countryId,
this.specialServiceIDs,
this.isMCHandled,
this.showContactDetail,
this.isOnWhatsApp,
});
Ads({this.id, this.adsDurationID, this.startDate, this.countryId, this.specialServiceIDs, this.isMCHandled});
Ads.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -77,8 +68,6 @@ class Ads {
countryId = json['countryId'];
specialServiceIDs = json['specialServiceIDs'].cast<int>();
isMCHandled = json['isMCHandled'];
showContactDetail = json['showContactDetail'];
isOnWhatsApp = json['isOnWhatsApp'];
}
Map<String, dynamic> toJson() {
@ -124,40 +113,33 @@ class VehiclePosting {
List<VehiclePostingDamageParts>? vehiclePostingDamageParts;
String? phoneNo;
String? whatsAppNo;
int? odometer;
int? isInUsed;
bool? isAccidentFree;
VehiclePosting({
this.id,
this.userID,
this.vehicleType,
this.vehicleModelID,
this.vehicleModelYearID,
this.vehicleColorID,
this.vehicleCategoryID,
this.vehicleConditionID,
this.vehicleMileageID,
this.vehicleTransmissionID,
this.vehicleSellerTypeID,
this.cityID,
this.price,
this.vehicleVIN,
this.vehicleDescription,
this.vehicleTitle,
this.vehicleDescriptionN,
this.isFinanceAvailable,
this.warantyYears,
this.demandAmount,
this.adStatus,
this.phoneNo,
this.whatsAppNo,
this.vehiclePostingImages,
this.vehiclePostingDamageParts,
this.odometer,
this.isInUsed,
this.isAccidentFree,
});
VehiclePosting(
{this.id,
this.userID,
this.vehicleType,
this.vehicleModelID,
this.vehicleModelYearID,
this.vehicleColorID,
this.vehicleCategoryID,
this.vehicleConditionID,
this.vehicleMileageID,
this.vehicleTransmissionID,
this.vehicleSellerTypeID,
this.cityID,
this.price,
this.vehicleVIN,
this.vehicleDescription,
this.vehicleTitle,
this.vehicleDescriptionN,
this.isFinanceAvailable,
this.warantyYears,
this.demandAmount,
this.adStatus,
this.phoneNo,
this.whatsAppNo,
this.vehiclePostingImages,
this.vehiclePostingDamageParts});
VehiclePosting.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -183,9 +165,6 @@ class VehiclePosting {
adStatus = json['adStatus'];
phoneNo = json['phoneNo'];
whatsAppNo = json['whatsAppNo'];
odometer = json['odometer'];
isInUsed = json['isInUsed'];
isAccidentFree = json['isAccidentFree'];
if (json['vehiclePostingImages'] != null) {
vehiclePostingImages = <VehiclePostingImages>[];
json['vehiclePostingImages'].forEach((v) {
@ -200,9 +179,43 @@ class VehiclePosting {
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['userID'] = userID;
data['vehicleType'] = vehicleType;
data['vehicleModelID'] = vehicleModelID;
data['vehicleModelYearID'] = vehicleModelYearID;
data['vehicleColorID'] = vehicleColorID;
data['vehicleCategoryID'] = vehicleCategoryID;
data['vehicleConditionID'] = vehicleConditionID;
data['vehicleMileageID'] = vehicleMileageID;
data['vehicleTransmissionID'] = vehicleTransmissionID;
data['vehicleSellerTypeID'] = vehicleSellerTypeID;
data['cityID'] = cityID;
data['price'] = price;
data['vehicleVIN'] = vehicleVIN;
data['vehicleDescription'] = vehicleDescription;
data['vehicleTitle'] = vehicleTitle;
data['vehicleDescriptionN'] = vehicleDescriptionN;
data['isFinanceAvailable'] = isFinanceAvailable;
data['warantyYears'] = warantyYears;
data['demandAmount'] = demandAmount;
data['adStatus'] = adStatus;
data['phoneNo'] = phoneNo;
data['whatsAppNo'] = whatsAppNo;
if (vehiclePostingImages != null) {
data['vehiclePostingImages'] = vehiclePostingImages!.map((v) => v.toJson()).toList();
}
if (vehiclePostingDamageParts != null) {
data['vehiclePostingDamageParts'] = vehiclePostingDamageParts!.map((v) => v.toJson()).toList();
}
return data;
}
@override
String toString() {
return 'VehiclePosting{id: $id, userID: $userID, vehicleType: $vehicleType, vehicleModelID: $vehicleModelID, vehicleModelYearID: $vehicleModelYearID, vehicleColorID: $vehicleColorID, vehicleCategoryID: $vehicleCategoryID, vehicleConditionID: $vehicleConditionID, vehicleMileageID: $vehicleMileageID, vehicleTransmissionID: $vehicleTransmissionID, vehicleSellerTypeID: $vehicleSellerTypeID, cityID: $cityID, price: $price, vehicleVIN: $vehicleVIN, vehicleDescription: $vehicleDescription, vehicleTitle: $vehicleTitle, vehicleDescriptionN: $vehicleDescriptionN, isFinanceAvailable: $isFinanceAvailable, warantyYears: $warantyYears, demandAmount: $demandAmount, adStatus: $adStatus, vehiclePostingImages: $vehiclePostingImages, vehiclePostingDamageParts: $vehiclePostingDamageParts, phoneNo: $phoneNo, whatsAppNo: $whatsAppNo, odometer: $odometer, isInUsed: $isInUsed, isAccidentFree: $isAccidentFree}';
return 'VehiclePosting{id: $id, userID: $userID, vehicleType: $vehicleType, vehicleModelID: $vehicleModelID, vehicleModelYearID: $vehicleModelYearID, vehicleColorID: $vehicleColorID, vehicleCategoryID: $vehicleCategoryID, vehicleConditionID: $vehicleConditionID, vehicleMileageID: $vehicleMileageID, vehicleTransmissionID: $vehicleTransmissionID, vehicleSellerTypeID: $vehicleSellerTypeID, cityID: $cityID, price: $price, vehicleVIN: $vehicleVIN, vehicleDescription: $vehicleDescription, vehicleTitle: $vehicleTitle, vehicleDescriptionN: $vehicleDescriptionN, isFinanceAvailable: $isFinanceAvailable, warantyYears: $warantyYears, demandAmount: $demandAmount, adStatus: $adStatus, vehiclePostingImages: $vehiclePostingImages, vehiclePostingDamageParts: $vehiclePostingDamageParts, phoneNo: $phoneNo, whatsAppNo: $whatsAppNo}';
}
}
@ -306,24 +319,8 @@ class VehiclePostingDamageParts {
return data;
}
@override
String toString() {
return 'VehiclePostingDamageParts{id: $id, comment: $comment, vehicleImageBase64: $vehicleImageBase64, vehicleDamagePartID: $vehicleDamagePartID, vehiclePostingID: $vehiclePostingID, isActive: $isActive}';
}
@override
String toString() {
return 'VehiclePostingDamageParts{id: $id, comment: $comment, vehicleImageBase64: $vehicleImageBase64, vehicleDamagePartID: $vehicleDamagePartID, vehiclePostingID: $vehiclePostingID, isActive: $isActive}';
}
class BranchPostingImages {
int? id;
String? imageName;
String? imageUrl;
String? imageStr;
BranchPostingImages({this.id, this.imageName, this.imageUrl, this.imageStr});
BranchPostingImages.fromJson(Map<String, dynamic> json) {
id = json['id'];
imageName = json['imageName'];
imageUrl = json['imageUrl'];
imageStr = json['imageStr'];
}
}

@ -0,0 +1,36 @@
// To parse this JSON data, do
//
// final mResponse = mResponseFromJson(jsonString);
import 'dart:convert';
MResponse mResponseFromJson(String str) => MResponse.fromJson(json.decode(str));
String mResponseToJson(MResponse data) => json.encode(data.toJson());
class MResponse {
MResponse({
this.totalItemsCount,
this.messageStatus,
this.message,
this.data,
});
int? totalItemsCount;
int? messageStatus;
String? message;
dynamic data;
factory MResponse.fromJson(Map<String, dynamic> json) => MResponse(
totalItemsCount: json["totalItemsCount"],
messageStatus: json["messageStatus"],
message: json["message"],
data: json["data"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"messageStatus": messageStatus,
"message": message,
};
}

@ -1,14 +1,9 @@
class FilterListModel {
String title;
String titleN;
String description;
String descriptionN;
String iconUrl;
int id;
bool isSelected;
bool isCustom;
FilterListModel({required this.id, required this.isSelected, this.isCustom = false, this.iconUrl = "", required this.title, this.titleN = "", this.description = "", this.descriptionN = "",});
FilterListModel({required this.id, required this.isSelected, required this.title});
}
class SelectionModel {
@ -16,22 +11,13 @@ class SelectionModel {
int selectedId;
String errorValue;
String itemPrice;
String currency;
String currencyN;
SelectionModel({
this.selectedOption = "",
this.errorValue = "",
this.selectedId = 0,
this.itemPrice = "",
this.currency = "",
this.currencyN = "",
});
@override
String toString() {
return 'SelectionModel{selectedOption: $selectedOption, selectedId: $selectedId, errorValue: $errorValue, itemPrice: $itemPrice, currency: $currency, currencyN: $currencyN}';
}
}
class TimeSlotModel {

@ -1,46 +1,35 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart';
import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class BranchDetailModel {
int? id;
int? serviceProviderId;
String? serviceProviderName;
String? branchProfileImage;
String? branchName;
String? branchDescription;
int? cityId;
String? cityName;
String? address;
String? latitude;
String? longitude;
double? distanceKm;
String? openTime;
String? closeTime;
BranchStatusEnum? branchStatus;
List<GenericImageModel>? branchImages;
int? statusId;
String? statusText;
String? branchStatusLabel;
double? branchRateAvg;
List<ServiceModel>? branchServices;
final int? id;
final int? serviceProviderId;
final String? serviceProviderName;
final String? branchName;
final String? branchDescription;
final int? cityId;
final String? cityName;
final String? address;
final String? latitude;
final String? longitude;
final double? distanceKm;
final String? openTime;
final String? closeTime;
final BranchStatusEnum? branchStatus;
final int? statusId;
final dynamic statusText;
final List<ServiceModel>? branchServices;
List<CategoryData>? categories;
List<BranchAuditTrial>? branchAuditTrial;
int? countryID;
String? countryName;
bool isExpanded = false;
bool? isFavorite;
String? cityNameN;
String? countryNameN;
bool isExpanded;
BranchDetailModel({
this.id,
this.serviceProviderId,
this.serviceProviderName,
this.branchProfileImage,
this.branchName,
this.branchDescription,
this.cityId,
@ -52,81 +41,57 @@ class BranchDetailModel {
this.openTime,
this.closeTime,
this.branchStatus,
this.branchImages,
this.branchRateAvg,
this.statusId,
this.statusText,
this.branchStatusLabel,
this.branchServices,
this.categories,
this.branchAuditTrial,
this.countryID,
this.countryName,
this.isFavorite,
required this.isExpanded,
this.cityNameN,
this.countryNameN,
});
List<GenericImageModel> populateBranchImages(value) {
List<GenericImageModel> images = [];
if (value != null) {
value.forEach((v) {
images.add(GenericImageModel.fromJson(v));
});
}
return images;
}
BranchDetailModel.fromJson(Map<String, dynamic> json) {
List<GenericImageModel> images = [];
if (json.containsKey('serviceProviderBranchImage')) {
images = populateBranchImages(json["serviceProviderBranchImage"]);
} else {
images = populateBranchImages(json["branchImages"]);
}
id = json["id"];
serviceProviderId = json["serviceProviderID"];
branchProfileImage = images.isNotEmpty ? images.first.imageUrl ?? "" : null;
serviceProviderName = json["serviceProviderName"];
branchName = json["branchName"];
branchDescription = json["branchDescription"];
cityId = json["cityID"];
cityName = json["cityName"];
address = json["address"];
latitude = json["latitude"];
longitude = json["longitude"];
distanceKm = json["distanceKM"]?.toDouble();
openTime = json["openTime"];
closeTime = json["closeTime"];
branchStatus = json.containsKey("branchStatus") ? (json['branchStatus'] as int).toBranchStatusEnum() : null;
statusId = json["branchStatus"];
branchImages = images;
statusText = json["statusText"];
branchStatusLabel = json["branchStatusText"];
branchRateAvg = json["branchRateAvg"];
branchServices = json["serviceProviderServices"] == null ? [] : List<ServiceModel>.from(json["serviceProviderServices"]!.map((x) => ServiceModel.fromJson(x)));
categories = [];
branchAuditTrial = json["branchAuditTrial"] == null ? [] : List<BranchAuditTrial>.from(json["branchAuditTrial"]!.map((x) => BranchAuditTrial.fromJson(x)));
isExpanded = false;
isFavorite = false;
cityNameN = json["cityNameN"];
countryNameN = json["countryNameN"];
}
}
class BranchAuditTrial {
int? status;
String? comment;
int? createdBy;
String? createdOn;
BranchAuditTrial({this.status, this.comment, this.createdBy, this.createdOn});
factory BranchDetailModel.fromJson(Map<String, dynamic> json) =>
BranchDetailModel(
id: json["id"],
serviceProviderId: json["serviceProviderID"],
serviceProviderName: json["serviceProviderName"],
branchName: json["branchName"],
branchDescription: json["branchDescription"],
cityId: json["cityID"],
cityName: json["cityName"],
address: json["address"],
latitude: json["latitude"],
longitude: json["longitude"],
distanceKm: json["distanceKM"]?.toDouble(),
openTime: json["openTime"],
closeTime: json["closeTime"],
branchStatus: json.containsKey("branchStatus")?(json['branchStatus'] as int).toBranchStatusEnum():null,
statusId: json["branchStatus"],
statusText: json["statusText"],
branchServices: json["serviceProviderServices"] == null ? [] : List<
ServiceModel>.from(json["serviceProviderServices"]!.map((x) =>
ServiceModel.fromJson(x))),
categories: [],
isExpanded: false,
);
BranchAuditTrial.fromJson(Map<String, dynamic> json) {
status = json['status'];
comment = json['comment'];
createdBy = json['createdBy'];
createdOn = json['createdOn'];
}
Map<String, dynamic> toJson() =>
{
"id": id,
"serviceProviderID": serviceProviderId,
"serviceProviderName": serviceProviderName,
"branchName": branchName,
"branchDescription": branchDescription,
"cityID": cityId,
"address": address,
"latitude": latitude,
"longitude": longitude,
"distanceKM": distanceKm,
"openTime": openTime,
"closeTime": closeTime,
"status": statusId,
"statusText": statusText,
"serviceProviderServices": branchServices == null ? [] : List<
dynamic>.from(branchServices!.map((x) => x.toJson())),
};
}

@ -1,36 +0,0 @@
class BranchRatingModel {
int? id;
String? title;
String? review;
int? ratNo;
int? serviceProviderBranchID;
String? serviceProviderBranchName;
int? customerID;
String? customerName;
BranchRatingModel({this.id, this.title, this.review, this.ratNo, this.serviceProviderBranchID, this.serviceProviderBranchName, this.customerID, this.customerName});
BranchRatingModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
title = json['title'];
review = json['review'];
ratNo = json['ratNo'];
serviceProviderBranchID = json['serviceProviderBranchID'];
serviceProviderBranchName = json['serviceProviderBranchName'];
customerID = json['customerID'];
customerName = json['customerName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['title'] = title;
data['review'] = review;
data['ratNo'] = ratNo;
data['serviceProviderBranchID'] = serviceProviderBranchID;
data['serviceProviderBranchName'] = serviceProviderBranchName;
data['customerID'] = customerID;
data['customerName'] = customerName;
return data;
}
}

@ -22,17 +22,17 @@ class Branch {
String? message;
factory Branch.fromJson(Map<String, dynamic> json) => Branch(
totalItemsCount: json["totalItemsCount"],
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<BranchData>.from(json["data"].map((x) => BranchData.fromJson(x))),
messageStatus: json["messageStatus"],
message: json["message"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus,
"message": message,
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
@ -60,26 +60,26 @@ class BranchData {
int? status;
factory BranchData.fromJson(Map<String, dynamic> json) => BranchData(
id: json["id"],
serviceProviderId: json["serviceProviderID"],
branchName: json["branchName"],
branchDescription: json["branchDescription"],
cityId: json["cityID"],
address: json["address"],
latitude: json["latitude"],
longitude: json["longitude"],
status: json["status"],
id: json["id"] == null ? null : json["id"],
serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"],
branchName: json["branchName"] == null ? null : json["branchName"],
branchDescription: json["branchDescription"] == null ? null : json["branchDescription"],
cityId: json["cityID"] == null ? null : json["cityID"],
address: json["address"] == null ? null : json["address"],
latitude: json["latitude"] == null ? null : json["latitude"],
longitude: json["longitude"] == null ? null : json["longitude"],
status: json["status"] == null ? null : json["status"],
);
Map<String, dynamic> toJson() => {
"id": id,
"serviceProviderID": serviceProviderId,
"branchName": branchName,
"branchDescription": branchDescription,
"cityID": cityId,
"address": address,
"latitude": latitude,
"longitude": longitude,
"status": status,
"id": id == null ? null : id,
"serviceProviderID": serviceProviderId == null ? null : serviceProviderId,
"branchName": branchName == null ? null : branchName,
"branchDescription": branchDescription == null ? null : branchDescription,
"cityID": cityId == null ? null : cityId,
"address": address == null ? null : address,
"latitude": latitude == null ? null : latitude,
"longitude": longitude == null ? null : longitude,
"status": status == null ? null : status,
};
}

@ -26,17 +26,17 @@ class Category {
String? message;
factory Category.fromJson(Map<String, dynamic> json) => Category(
totalItemsCount: json["totalItemsCount"],
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<CategoryData>.from(json["data"].map((x) => CategoryData.fromJson(x))),
messageStatus: json["messageStatus"],
message: json["message"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus,
"message": message,
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
@ -51,33 +51,30 @@ class CategoryData extends Equatable {
this.services,
this.branchId,
this.branchName,
this.isDeactivated,
});
int? id;
String? categoryName;
String? categoryNameN;
String? serviceCategoryIconUrl;
String? serviceCategoryImageUrl;
dynamic? serviceCategoryIconUrl;
dynamic? serviceCategoryImageUrl;
String? branchId;
String? branchName;
bool? isDeactivated;
List<ServiceModel>? services;
factory CategoryData.fromJson(Map<String, dynamic> json) => CategoryData(
id: json["id"],
categoryName: json["categoryName"],
categoryNameN: json["categoryNameN"],
id: json["id"] == null ? null : json["id"],
categoryName: json["categoryName"] == null ? null : json["categoryName"],
categoryNameN: json["categoryNameN"] == null ? null : json["categoryNameN"],
serviceCategoryIconUrl: json["serviceCategoryIconUrl"],
serviceCategoryImageUrl: json["serviceCategoryImageUrl"],
services: [],
isDeactivated: false,
);
Map<String, dynamic> toJson() => {
"id": id,
"categoryName": categoryName,
"categoryNameN": categoryNameN,
"id": id == null ? null : id,
"categoryName": categoryName == null ? null : categoryName,
"categoryNameN": categoryNameN == null ? null : categoryNameN,
"serviceCategoryIconUrl": serviceCategoryIconUrl,
"serviceCategoryImageUrl": serviceCategoryImageUrl,
};

@ -4,8 +4,6 @@
import 'dart:convert';
import 'package:mc_common_app/utils/enums.dart';
Document documentFromJson(String str) => Document.fromJson(json.decode(str));
String documentToJson(Document data) => json.encode(data.toJson());
@ -24,103 +22,65 @@ class Document {
String? message;
factory Document.fromJson(Map<String, dynamic> json) => Document(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : List<DocumentData>.from(json["data"].map((x) => DocumentData.fromJson(x))),
messageStatus: json["messageStatus"],
message: json["message"],
);
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<DocumentData>.from(json["data"].map((x) => DocumentData.fromJson(x))),
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus,
"message": message,
};
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
class DocumentData {
DocumentData(
{this.id,
this.serviceProviderId,
this.documentId,
this.documentUrl,
this.status,
this.statusText,
this.comment,
this.isActive,
this.document,
this.fileExt,
this.documentName,
this.isLocalFile,
this.description,
this.dateExpire,
this.isAllowUpdate,
this.isExpired});
DocumentData({
this.id,
this.serviceProviderId,
this.documentId,
this.documentUrl,
this.status,
this.comment,
this.isActive,
this.document,
this.fileExt,
this.documentName,
});
int? id;
int? serviceProviderId;
int? documentId;
String? documentUrl;
DocumentStatusEnum? status;
String? comment;
dynamic? documentUrl;
int? status;
dynamic? comment;
bool? isActive;
String? document;
String? fileExt;
String? statusText;
String? documentName;
bool? isLocalFile;
String? description;
String? dateExpire;
bool? isExpired;
bool? isAllowUpdate;
factory DocumentData.fromJson(Map<String, dynamic> json) => DocumentData(
id: json["id"],
serviceProviderId: json["serviceProviderID"],
documentId: json["documentID"],
documentUrl: json["documentURL"],
status: json.containsKey("status") ? (json['status'] as int).toDocumentStatusEnum() : null,
statusText: json["statusText"],
comment: json["comment"],
isActive: json["isActive"],
dateExpire: json["dateExpire"],
isExpired: json["isExpired"],
isAllowUpdate: json["isAllowUpdate"],
document: null,
fileExt: null,
documentName: json["documentName"],
isLocalFile: false,
description: null);
id: json["id"] == null ? null : json["id"],
serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"],
documentId: json["documentID"] == null ? null : json["documentID"],
documentUrl: json["documentURL"],
status: json["status"] == null ? null : json["status"],
comment: json["comment"],
isActive: json["isActive"] == null ? null : json["isActive"],
document: null,
fileExt: null,
documentName: json["documentName"] == null ? null : json["documentName"],
);
Map<String, dynamic> toJson() => {
"id": id,
"serviceProviderID": serviceProviderId,
"documentID": documentId,
"documentURL": documentUrl,
"status": status,
"comment": comment,
"isActive": isActive,
"dateExpire": dateExpire,
"isExpired": isExpired,
"isAllowUpdate": isAllowUpdate,
};
}
extension DocumentEnum on int {
DocumentStatusEnum toDocumentStatusEnum() {
switch (this) {
case 0:
return DocumentStatusEnum.needUpload;
case 1:
return DocumentStatusEnum.pending;
case 2:
return DocumentStatusEnum.review;
case 3:
return DocumentStatusEnum.approvedOrActive;
case 4:
return DocumentStatusEnum.rejected;
default:
throw Exception('Invalid status value: $this'); // Explicit handling for invalid cases
}
}
"id": id == null ? null : id,
"serviceProviderID": serviceProviderId == null ? null : serviceProviderId,
"documentID": documentId == null ? null : documentId,
"documentURL": documentUrl,
"status": status == null ? null : status,
"comment": comment,
"isActive": isActive == null ? null : isActive,
};
}

@ -1,47 +0,0 @@
class ProviderContactInfoModel {
int? id;
int? providerID;
String? name;
int? allDocStatus;
String? companyName;
String? companyDescription;
int? countryID;
String? countryName;
String? userID;
String? memberSince;
String? mobile;
String? whatsApp;
String? email;
ProviderContactInfoModel({
this.id,
this.providerID,
this.name,
this.allDocStatus,
this.companyName,
this.companyDescription,
this.countryID,
this.countryName,
this.userID,
this.memberSince,
this.mobile,
this.whatsApp,
this.email,
});
ProviderContactInfoModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
providerID = json['providerID'];
name = json['name'];
allDocStatus = json['allDocStatus'];
companyName = json['companyName'];
companyDescription = json['companyDescription'];
countryID = json['countryID'];
countryName = json['countryName'];
userID = json['userID'];
memberSince = json['memberSince'];
mobile = json['mobile'];
whatsApp = json['whatsApp'];
email = json['email'];
}
}

@ -8,6 +8,8 @@ import 'package:mc_common_app/models/provider_branches_models/branch_detail_mode
ProviderModel branch2FromJson(String str) => ProviderModel.fromJson(json.decode(str));
String branch2ToJson(ProviderModel data) => json.encode(data.toJson());
class ProviderModel {
ProviderModel({
this.messageStatus,
@ -27,6 +29,13 @@ class ProviderModel {
data: json["data"] == null ? null : ProviderModelData.fromJson(json["data"]),
message: json["message"],
);
Map<String, dynamic> toJson() => {
"messageStatus": messageStatus,
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"message": message,
};
}
class ProviderModelData {
@ -63,6 +72,16 @@ class ProviderModelData {
userId: json["userID"],
serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<BranchDetailModel>.from(json["serviceProviderBranch"].map((x) => BranchDetailModel.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"id": id,
"companyName": companyName,
"companyDescription": companyDescription,
"allDocStatus": allDocStatus,
"isValidSubscription": isValidSubscription,
"userID": userId,
"serviceProviderBranch": serviceProviderBranch == null ? null : List<dynamic>.from(serviceProviderBranch!.map((x) => x.toJson())),
};
}
class ProviderBasicDataModel {

@ -1,86 +1,53 @@
// To parse this JSON data, do
//
// final branch2 = branch2FromJson(jsonString);
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
class ProviderProfileModel {
ProviderProfileModel({
this.id,
this.companyName,
this.profileImage,
this.name,
this.countryName,
this.companyDescription,
this.allDocStatus,
this.isValidSubscription,
this.userId,
this.memberSince,
this.serviceProviderBranch,
this.countryID,
this.isFavorite,
this.providerID,
this.noOfBranches,
this.customerID,
});
final int? id;
final String? profileImage;
final String? companyName;
final String? companyDescription;
int? countryID;
final String? countryName;
int? countryID;
final String? companyDescription;
final int? allDocStatus;
final bool? isValidSubscription;
final String? name;
final String? userId;
final String? memberSince;
bool? isFavorite;
final int? providerID;
final int? customerID;
final int? noOfBranches;
final List<BranchDetailModel>? serviceProviderBranch;
factory ProviderProfileModel.fromJson(Map<String, dynamic> json) => ProviderProfileModel(
id: json["id"],
companyName: json["companyName"],
profileImage: json["profileImage"] ?? "",
name: json["name"],
countryName: json["countryName"],
countryID: json["countryID"],
companyDescription: json["companyDescription"],
allDocStatus: json["allDocStatus"],
isValidSubscription: json["isValidSubscription"],
userId: json["userID"],
memberSince: json["memberSince"] ?? "",
providerID: json["providerID"] ?? 0,
customerID: json["customerID"] ?? 0,
noOfBranches: json["noOfBranches"] ?? (json["serviceProviderBranch"] != null ? (json["serviceProviderBranch"] as List).length : 0),
isFavorite: json["isFavourite"] ?? false,
serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<BranchDetailModel>.from(json["serviceProviderBranch"].map((x) => BranchDetailModel.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"id": id,
"companyName": companyName,
"companyDescription": companyDescription,
"allDocStatus": allDocStatus,
"isValidSubscription": isValidSubscription,
"userID": userId,
"serviceProviderBranch": serviceProviderBranch == null ? null : List<dynamic>.from(serviceProviderBranch!.map((x) => x.toJson())),
};
}
// {
// "id": 10,
// "companyName": "string",
// "companyDescription": "",
// "countryID": 1,
// "countryName": "Saudi Arabia",
// "allDocStatus": 0,
// "isValidSubscription": true,
// "name": null,
// "userID": "88e2e2e8-9a6d-4f97-b05c-08dc7e4513b3",
// }
//
// {
// "id": 0,
// "companyName": "string",
// "companyDescription": "",
// "countryID": 1,
// "countryName": "string",
// "allDocStatus": 3,
// "isValidSubscription": true,
// "name": "Mirza Shafique",
// "userID": "7db5e1ae-6de4-47d7-984b-08db2842f899",
// "providerID": 2,
// "customerID": 6,
// "noOfBranches": 12,
// "memberSince": "2024-08-22T11:36:46.41"
// }

@ -1,30 +1,50 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/utils/enums.dart';
class OffersModel {
int? id;
int? requestID;
int? serviceProviderID;
ServiceProvider? serviceProvider;
int? offerStatus;
RequestOfferStatusEnum? requestOfferStatusEnum;
String? offerStatusText;
String? comment;
double? price;
OffersModel({this.id, this.requestID, this.serviceProviderID, this.serviceProvider, this.offerStatus, this.offerStatusText, this.comment, this.price});
OffersModel(
{this.id,
this.requestID,
this.serviceProviderID,
this.serviceProvider,
this.offerStatus,
this.offerStatusText,
this.comment,
this.price});
OffersModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
requestID = json['requestID'];
serviceProviderID = json['serviceProviderID'];
serviceProvider = json['serviceProvider'] != null ? ServiceProvider.fromJson(json['serviceProvider']) : null;
serviceProvider = json['serviceProvider'] != null
? ServiceProvider.fromJson(json['serviceProvider'])
: null;
offerStatus = json['offerStatus'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
offerStatusText = json['offerStatusText'];
comment = json['comment'];
price = json['price'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['requestID'] = requestID;
data['serviceProviderID'] = serviceProviderID;
if (serviceProvider != null) {
data['serviceProvider'] = serviceProvider!.toJson();
}
data['offerStatus'] = offerStatus;
data['offerStatusText'] = offerStatusText;
data['comment'] = comment;
data['price'] = price;
return data;
}
}
class ServiceProvider {
@ -58,32 +78,32 @@ class ServiceProvider {
ServiceProvider(
{this.providerId,
this.providerGUID,
this.firstName,
this.lastName,
this.name,
this.gender,
this.genderName,
this.mobileNo,
this.email,
this.isEmailVerfied,
this.isCompleted,
this.city,
this.cityName,
this.country,
this.countryName,
this.accountStatus,
this.accountStatusText,
this.activityStatus,
this.activityStatusText,
this.bankName,
this.iBanNo,
this.isActive,
this.subscriptionDate,
this.companyName,
this.currency,
this.branch,
this.requestOffer});
this.providerGUID,
this.firstName,
this.lastName,
this.name,
this.gender,
this.genderName,
this.mobileNo,
this.email,
this.isEmailVerfied,
this.isCompleted,
this.city,
this.cityName,
this.country,
this.countryName,
this.accountStatus,
this.accountStatusText,
this.activityStatus,
this.activityStatusText,
this.bankName,
this.iBanNo,
this.isActive,
this.subscriptionDate,
this.companyName,
this.currency,
this.branch,
this.requestOffer});
ServiceProvider.fromJson(Map<String, dynamic> json) {
providerId = json['providerId'];

@ -1,60 +0,0 @@
class OffersUnreadChatModel {
final int reqTotal;
final List<OffersUnreadChatDataModel> reqChatUnread;
OffersUnreadChatModel({
required this.reqTotal,
required this.reqChatUnread,
});
factory OffersUnreadChatModel.fromJson(Map<String, dynamic> json) {
return OffersUnreadChatModel(
reqTotal: json['total'],
reqChatUnread: (json['reqChatCountData'] as List).map((e) => OffersUnreadChatDataModel.fromJson(e)).toList(),
);
}
}
class OffersUnreadChatDataModel {
String reqTitle;
int reqTotal;
int requestID;
String senderUserID;
int unreadMessagesCount;
String lastChatTime;
String lastChatText;
String customerName;
OffersUnreadChatDataModel({
required this.reqTitle,
required this.reqTotal,
required this.requestID,
required this.senderUserID,
required this.unreadMessagesCount,
required this.lastChatTime,
required this.lastChatText,
required this.customerName,
});
factory OffersUnreadChatDataModel.fromJson(Map<String, dynamic> json) {
return OffersUnreadChatDataModel(
reqTitle: json['reqTitle'],
reqTotal: json['reqTotal'],
requestID: json['requestID'],
senderUserID: json['senderUserID'],
unreadMessagesCount: json['unreadMessagesCount'],
lastChatTime: json['lastChatTime'],
lastChatText: json['lastChatText'],
customerName: json['customerName'],
);
}
}
// "reqTitle": "Spare_Parts / Ford / Edge / 2016",
// I/flutter (16941): │ "reqTotal": 1,
// I/flutter (16941): │ "requestID": 145,
// I/flutter (16941): │ "senderUserID": "b56bc6bd-e45c-4644-b7c4-08dd02460895",
// I/flutter (16941): │ "unreadMessagesCount": 0,
// I/flutter (16941): │ "lastChatTime": "2025-02-12T10:33:42.1433333",
// I/flutter (16941): │ "lastChatText": "I am accepting this offer.",
// I/flutter (16941): │ "customerName": "Faiz 100"

@ -1,9 +1,6 @@
import 'dart:developer';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ProviderOffersModel {
int? id;
@ -34,7 +31,7 @@ class ProviderOffersModel {
this.serviceProviders,
});
ProviderOffersModel.fromJson(Map<String, dynamic> json, int? reqId) {
ProviderOffersModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
customerID = json['customerID'];
requestType = json['requestType'];
@ -49,7 +46,7 @@ class ProviderOffersModel {
if (json['serviceProviders'] != null) {
serviceProviders = <ServiceProvidersOffers>[];
json['serviceProviders'].forEach((v) {
serviceProviders!.add(ServiceProvidersOffers.fromJson(v, reqId));
serviceProviders!.add(ServiceProvidersOffers.fromJson(v));
});
}
}
@ -62,51 +59,19 @@ class ServiceProvidersOffers {
String? mobileNo;
String? email;
String? companyName;
String? createdOn;
RequestOfferStatusEnum? requestOfferStatusEnum;
int? offerCount;
int? requestId;
String? providerAddress;
String? providerLatitude;
String? providerLongitude;
List<ChatMessageModel>? chatMessages;
ServiceProvidersOffers({
this.providerId,
this.name,
this.mobileNo,
this.email,
this.companyName,
this.offerCount,
this.requestId,
this.chatMessages,
this.providerUserId,
this.createdOn,
this.requestOfferStatusEnum,
this.providerAddress,
this.providerLatitude,
this.providerLongitude,
});
ServiceProvidersOffers({this.providerId, this.name, this.mobileNo, this.email, this.companyName, this.offerCount, this.chatMessages, this.providerUserId});
ServiceProvidersOffers.fromJson(Map<String, dynamic> json, int? reqId) {
ServiceProvidersOffers.fromJson(Map<String, dynamic> json) {
providerId = json['providerID'];
providerUserId = json['providerUserID'];
providerUserId = json['providerUserId'] ?? "c680271c-b2a7-4ecf-7e95-08db545aec1b"; //TODO Remove this when parameter is added in backend
name = json['name'];
mobileNo = json['mobileNo'];
email = json['email'];
companyName = json['companyName'];
offerCount = json['offerCount'];
requestId = reqId;
createdOn = json['createdOn'];
requestOfferStatusEnum = ((json['offerStatusLast']) as int).toRequestOfferStatusEnum();
providerAddress = json['address'] ?? "";
providerLatitude = json['latititude'] ?? "0.0";
providerLongitude = json['langitude'] ?? "0.0";
chatMessages = [];
}
@override
String toString() {
return 'ServiceProvidersOffers{providerUserId: $providerUserId, providerId: $providerId, name: $name, mobileNo: $mobileNo, email: $email, companyName: $companyName,offeredItemCreatedOn: $createdOn, requestOfferStatusEnum: $requestOfferStatusEnum, offerCount: $offerCount, chatMessages: $chatMessages}';
}
}

@ -1,158 +0,0 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/utils/enums.dart';
class ProviderOffersChatsModel {
int? id;
int? requestID;
int? serviceProviderID;
ServiceProviderModel? serviceProvider;
int? offerStatus;
RequestOfferStatusEnum? requestOfferStatusEnum;
String? offerStatusText;
String? comment;
String? customerName;
double? price;
String? serviceItem;
String? offeredItemCreatedBy;
String? offeredItemCreatedByName;
String? offeredItemCreatedOn;
String? reqOfferImages;
bool? isDeliveryAvailable;
String? createdOn;
ProviderOffersChatsModel({
this.id,
this.requestID,
this.serviceProviderID,
this.serviceProvider,
this.offerStatus,
this.requestOfferStatusEnum,
this.offerStatusText,
this.comment,
this.customerName,
this.price,
this.serviceItem,
this.offeredItemCreatedBy,
this.offeredItemCreatedByName,
this.offeredItemCreatedOn,
this.reqOfferImages,
this.isDeliveryAvailable,
this.createdOn,
});
ProviderOffersChatsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
requestID = json['requestID'];
serviceProviderID = json['serviceProviderID'];
serviceProvider = json['serviceProvider'] != null ? ServiceProviderModel.fromJson(json['serviceProvider']) : null;
offerStatus = json['offerStatus'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
offerStatusText = json['offerStatusText'];
comment = json['comment'];
customerName = json['customerName'];
price = json['price'];
serviceItem = json['serviceItem'];
offeredItemCreatedBy = json['offeredItemCreatedBy'];
offeredItemCreatedByName = json['offeredItemCreatedByName'];
offeredItemCreatedOn = json['offeredItemCreatedOn'];
reqOfferImages = json['reqOfferImages'];
isDeliveryAvailable = json['isDeliveryAvailable'];
createdOn = json['createdOn'];
}
}
class ServiceProviderModel {
int? providerId;
String? providerGUID;
String? firstName;
String? lastName;
String? name;
int? gender;
String? genderName;
String? mobileNo;
String? email;
bool? isEmailVerified;
bool? isCompleted;
int? city;
String? cityName;
int? country;
String? countryName;
int? accountStatus;
String? accountStatusText;
int? activityStatus;
String? activityStatusText;
String? bankName;
String? iBanNo;
bool? isActive;
String? subscriptionDate;
String? createdOn;
String? companyName;
String? currency;
String? branch;
bool? isChatted;
bool? isDealership;
ServiceProviderModel({
this.providerId,
this.providerGUID,
this.firstName,
this.lastName,
this.name,
this.gender,
this.genderName,
this.mobileNo,
this.email,
this.isEmailVerified,
this.isCompleted,
this.city,
this.cityName,
this.country,
this.countryName,
this.accountStatus,
this.accountStatusText,
this.activityStatus,
this.activityStatusText,
this.bankName,
this.iBanNo,
this.isActive,
this.subscriptionDate,
this.createdOn,
this.companyName,
this.currency,
this.branch,
this.isChatted,
this.isDealership,
});
ServiceProviderModel.fromJson(Map<String, dynamic> json) {
providerId = json['providerId'];
providerGUID = json['providerGUID'];
firstName = json['firstName'];
lastName = json['lastName'];
name = json['name'];
gender = json['gender'];
genderName = json['genderName'];
mobileNo = json['mobileNo'];
email = json['email'];
isEmailVerified = json['isEmailVerfied'];
isCompleted = json['isCompleted'];
city = json['city'];
cityName = json['cityName'];
country = json['country'];
countryName = json['countryName'];
accountStatus = json['accountStatus'];
accountStatusText = json['accountStatusText'];
activityStatus = json['activityStatus'];
activityStatusText = json['activityStatusText'];
bankName = json['bankName'];
iBanNo = json['iBanNo'];
isActive = json['isActive'];
subscriptionDate = json['subscriptionDate'];
createdOn = json['createdOn'];
companyName = json['companyName'];
currency = json['currency'];
branch = json['branch'];
isChatted = json['isChatted'];
isDealership = json['isDealership'];
}
}

@ -1,7 +1,4 @@
import 'dart:convert';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/utils/enums.dart';
@ -9,28 +6,17 @@ class RequestModel {
int requestType;
String requestTypeName;
String requestStatusName;
RequestStatusEnum requestStatus;
int? shippingStatus;
ShippingRequestStatusEnum? shippingStatusEnum;
SelfPickupRequestStatusEnum? selfPickupRequestStatusEnum;
RequestStatus requestStatus;
String cityName;
String cityNameN;
String vehicleTypeName;
String vehicleTypeNameN;
String countryName;
String countryNameN;
String customerName;
String customerID;
String address;
String additionalAddressDetails;
dynamic serviceProviders;
int offerCount;
int id;
int customerId;
bool isChatted;
bool isOfferAccepted;
RequestDeliveryOptionEnum offerDeliveryOption;
RequestDeliveryOptionEnum selectedDeliveryOptionByCustomer;
String customerUserID;
dynamic customer;
String brand;
@ -38,7 +24,7 @@ class RequestModel {
int year;
bool isNew;
String description;
List<GenericImageModel>? requestImages;
List<dynamic> requestImages;
int cityId;
dynamic city;
double price;
@ -48,26 +34,19 @@ class RequestModel {
List<dynamic> requestProviderItem;
bool isActive;
int createdBy;
String? createdOn;
int? modifiedBy;
String? modifiedOn;
DateTime createdOn;
dynamic modifiedBy;
dynamic modifiedOn;
List<ChatMessageModel> chatMessages;
String? requestStatusNameN;
RequestModel({
required this.requestType,
required this.requestTypeName,
required this.requestStatusName,
required this.requestStatus,
required this.shippingStatus,
required this.shippingStatusEnum,
required this.selfPickupRequestStatusEnum,
required this.cityName,
required this.cityNameN,
required this.vehicleTypeName,
required this.vehicleTypeNameN,
required this.countryName,
required this.countryNameN,
required this.customerName,
required this.customerID,
required this.serviceProviders,
@ -75,13 +54,8 @@ class RequestModel {
required this.id,
required this.customerId,
required this.isChatted,
required this.isOfferAccepted,
required this.offerDeliveryOption,
required this.selectedDeliveryOptionByCustomer,
required this.customerUserID,
required this.customer,
required this.address,
required this.additionalAddressDetails,
required this.brand,
required this.model,
required this.year,
@ -101,46 +75,24 @@ class RequestModel {
required this.modifiedBy,
required this.modifiedOn,
required this.chatMessages,
required this.requestStatusNameN,
});
List<GenericImageModel> populateRequestImages(value) {
List<GenericImageModel> images = [];
if (value != null) {
value.forEach((v) {
images.add(GenericImageModel.fromJson(v));
});
}
return images;
}
factory RequestModel.fromJson(Map<String, dynamic> json) {
return RequestModel(
requestType: json["requestType"],
requestTypeName: json["requestTypeName"],
requestStatusName: json["requestStatusName"],
requestStatus: (json['requestStatus'] as int).toRequestStatusEnum(),
shippingStatus: json['shippingRequestStatus'],
shippingStatusEnum: json['shippingRequestStatus'] != null ? (json['shippingRequestStatus'] as int).toShippingStatusEnum() : ShippingRequestStatusEnum.pending,
selfPickupRequestStatusEnum: json['selfPickupRequestStatus'] != null ? (json['selfPickupRequestStatus'] as int).toSelfPickupStatusEnum() : SelfPickupRequestStatusEnum.preparingToCollect,
cityName: json["cityName"],
cityNameN: json["cityNameN"],
vehicleTypeName: json["vehicleTypeName"],
vehicleTypeNameN: json["vehicleTypeNameN"],
countryName: json["countryName"],
countryNameN: json["countryNameN"],
customerName: json["customerName"] ?? "",
address: json["address"] ?? "",
additionalAddressDetails: json['additionalAddress'] ?? "",
customerName: json["customerName"],
customerID: json["customerUserID"],
serviceProviders: json["serviceProviders"],
offerCount: json["offerCount"],
id: json["id"],
customerId: json["customerID"],
isChatted: json["isChatted"],
isOfferAccepted: json["isOfferAccepted"],
offerDeliveryOption: ((json["offerDeliveryOption"] ?? 0) as int).toRequestDeliveryOptionEnum(),
selectedDeliveryOptionByCustomer: ((json["deliveryOption"] ?? 0) as int).toRequestDeliveryOptionEnum(),
customerUserID: json["customerUserID"],
customer: json["customer"],
brand: json["brand"],
@ -148,7 +100,7 @@ class RequestModel {
year: json["year"],
isNew: json["isNew"],
description: json["description"],
requestImages: List<GenericImageModel>.from(json["requestImages"].map((x) => GenericImageModel.fromJson(x))),
requestImages: List<dynamic>.from(json["requestImages"].map((x) => x)),
cityId: json["cityID"],
city: json["city"],
price: json["price"],
@ -158,10 +110,9 @@ class RequestModel {
requestProviderItem: List<dynamic>.from(json["requestProviderItem"].map((x) => x)),
isActive: json["isActive"],
createdBy: json["createdBy"],
createdOn: json["createdOn"],
createdOn: DateTime.parse(json["createdOn"]),
modifiedBy: json["modifiedBy"],
modifiedOn: json["modifiedOn"],
requestStatusNameN: json["requestStatusNameN"],
chatMessages: [],
);
}

@ -42,7 +42,7 @@ class ItemData {
final String? price;
final String? manufactureDate;
final String? description;
final String? pictureUrl;
final dynamic pictureUrl;
final int? companyId;
final int? serviceProviderServiceId;
final String? serviceProviderServiceDescription;

@ -1,44 +1,37 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ServiceModel {
final int? serviceProviderServiceId;
final dynamic providerServiceDescription;
final int? categoryId;
final String? categoryName;
final String? categoryNameN;
final int? serviceId;
final String? serviceDescription;
final String? serviceDescriptionN;
final int? serviceStatus;
final ServiceStatusEnum? serviceStatusEnum;
final dynamic statusText;
final bool? isAllowAppointment;
final bool? isAllowAppointmentHome;
final int? customerLocationRange;
String? rangePricePerKm;
final String? rangePricePerKm;
final int? itemsCount;
List<ItemData>? serviceItems;
bool isExpandedOrSelected;
int providerServiceId;
String providerServiceName;
bool isHomeSelected;
String homeLocation;
double currentTotalServicePrice;
CurrentLocationInfoModel servicelocationInfo;
bool isActive;
ServiceModel({
this.serviceProviderServiceId,
this.providerServiceDescription,
this.categoryId,
this.categoryName,
this.categoryNameN,
this.serviceId,
this.serviceDescription,
this.serviceDescriptionN,
this.serviceStatus,
this.serviceStatusEnum,
this.statusText,
this.isAllowAppointment,
this.isAllowAppointmentHome,
@ -47,12 +40,11 @@ class ServiceModel {
this.itemsCount,
this.serviceItems,
this.isHomeSelected = false,
this.homeLocation = "",
this.currentTotalServicePrice = 0.0,
this.isActive = true,
required this.isExpandedOrSelected,
required this.providerServiceId,
required this.providerServiceName,
required this.servicelocationInfo,
});
factory ServiceModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) => ServiceModel(
@ -60,17 +52,15 @@ class ServiceModel {
providerServiceDescription: json["providerServiceDescription"],
categoryId: json["categoryID"],
categoryName: json["categoryName"],
categoryNameN: json["categoryNameN"],
serviceId: json["serviceID"],
serviceDescription: json["serviceDescription"] ?? json["serviceName"],
serviceDescriptionN: json["serviceDescriptionN"] ?? json["serviceNameN"],
serviceStatus: json["serviceStatus"],
serviceStatusEnum: ((json["serviceStatus"] ?? 0) as int).toServiceStatusEnum(),
statusText: json["statusText"],
isAllowAppointment: json["isAllowAppointment"],
isAllowAppointmentHome: json["isAllowAppointmentHome"],
customerLocationRange: json["customerLocationRange"],
rangePricePerKm: json["rangePricePerKm"]?.toString(),
rangePricePerKm: json["rangePricePerKm"].toString(),
itemsCount: json["itemsCount"],
serviceItems: isForAppointment
? json["serviceItemList"] == null
@ -81,10 +71,9 @@ class ServiceModel {
: List<ItemData>.from(json["branchServiceItems"]!.map((x) => ItemData.fromJson(x))),
isExpandedOrSelected: false,
providerServiceId: 0,
providerServiceName: json['serviceName'] ?? "",
providerServiceName: "",
isHomeSelected: false,
isActive: json["isActive"] ?? true,
servicelocationInfo: CurrentLocationInfoModel(address: '', distanceToBranch: 0.0, homeChargesInCurrentService: 0.0, latitude: 0.0, longitude: 0.0),
homeLocation: "",
);
Map<String, dynamic> toJson() => {
@ -92,7 +81,6 @@ class ServiceModel {
"providerServiceDescription": providerServiceDescription,
"categoryID": categoryId,
"categoryName": categoryName,
"categoryNameN": categoryNameN,
"serviceID": serviceId,
"serviceDescription": serviceDescription,
"serviceDescriptionN": serviceDescriptionN,
@ -111,24 +99,3 @@ class ServiceModel {
return 'ServiceModel{serviceProviderServiceId: $serviceProviderServiceId, providerServiceDescription: $providerServiceDescription, categoryId: $categoryId, categoryName: $categoryName, serviceId: $serviceId, serviceDescription: $serviceDescription, serviceDescriptionN: $serviceDescriptionN, serviceStatus: $serviceStatus, statusText: $statusText, isAllowAppointment: $isAllowAppointment, isAllowAppointmentHome: $isAllowAppointmentHome, customerLocationRange: $customerLocationRange, rangePricePerKm: $rangePricePerKm, itemsCount: $itemsCount, serviceItems: $serviceItems, isExpandedOrSelected: $isExpandedOrSelected}';
}
}
class CurrentLocationInfoModel {
String address;
double latitude;
double longitude;
double distanceToBranch;
double homeChargesInCurrentService;
CurrentLocationInfoModel({
required this.address,
required this.latitude,
required this.longitude,
required this.distanceToBranch,
required this.homeChargesInCurrentService,
});
@override
String toString() {
return 'CurrentLocationInfoModel{address: $address, latitude: $latitude, longitude: $longitude, distanceToBranch: $distanceToBranch, homeChargesInCurrentService: $homeChargesInCurrentService}';
}
}

@ -1,30 +0,0 @@
import 'package:mc_common_app/view_models/ad_view_model.dart';
class AppInfoModel {
int? id;
String? header;
String? content;
bool? isActive;
int? channel;
List<ImageModel>? images;
AppInfoModel({this.id, this.header, this.content, this.isActive, this.channel, this.images});
AppInfoModel.fromJson(Map<String, dynamic> json, {bool isForTermsAndCondition = false}) {
String imagesKey = "appInfoImages";
if (isForTermsAndCondition) {
imagesKey = "termAndConditionImages";
}
id = json['id'];
header = json['header'];
content = json['content'];
isActive = json['isActive'];
channel = json['channel'];
if (json[imagesKey] != null) {
images = <ImageModel>[];
json[imagesKey].forEach((v) {
images!.add(ImageModel.fromJson(v));
});
}
}
}

@ -1,26 +0,0 @@
class AppInvitationHistoryModel {
int? id;
int? customerID;
int? channelID;
int? appInvitationEnumID;
int? noOfInvites;
String? comments;
AppInvitationHistoryModel({
this.id,
this.customerID,
this.channelID,
this.appInvitationEnumID,
this.noOfInvites,
this.comments,
});
AppInvitationHistoryModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
customerID = json['customerID'];
channelID = json['channelID'];
appInvitationEnumID = json['appInvitationEnumID'];
noOfInvites = json['noofInvites'];
comments = json['comments'];
}
}

@ -1,36 +0,0 @@
import 'package:mc_common_app/view_models/ad_view_model.dart';
class ContactInfoModel {
int? id;
String? companyName;
String? mobileNo;
String? phoneNo;
String? email;
String? address;
String? latitude;
String? longitude;
int? channel;
bool? isActive;
List<ImageModel>? contactInfoImages;
ContactInfoModel({this.id, this.companyName, this.mobileNo, this.phoneNo, this.email, this.address, this.latitude, this.longitude, this.channel, this.isActive, this.contactInfoImages});
ContactInfoModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
companyName = json['companyName'];
mobileNo = json['mobileNo'];
phoneNo = json['phoneNo'];
email = json['email'];
address = json['address'];
latitude = json['latitude'];
longitude = json['longitude'];
channel = json['channel'];
isActive = json['isActive'];
if (json['contactInfoImages'] != null) {
contactInfoImages = <ImageModel>[];
json['contactInfoImages'].forEach((v) {
contactInfoImages!.add(ImageModel.fromJson(v));
});
}
}
}

@ -1,39 +0,0 @@
class FAQsModel {
int? id;
String? question;
String? answer;
int? sequenceNo;
bool? isActive;
int? channel;
bool? isCollapsed;
String? questionN;
String? answerN;
FAQsModel({this.id, this.question, this.answer, this.sequenceNo, this.isActive, this.channel, this.isCollapsed,
this.questionN, this.answerN, });
FAQsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
question = json['question'];
answer = json['answer'];
sequenceNo = json['sequenceNo'];
isActive = json['isActive'];
channel = json['channel'];
isCollapsed = false;
questionN = json['questionN'];
answerN = json['answerN'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['question'] = question;
data['answer'] = answer;
data['sequenceNo'] = sequenceNo;
data['isActive'] = isActive;
data['channel'] = channel;
data['questionN'] = questionN;
data['answerN'] = answerN;
return data;
}
}

@ -1,86 +0,0 @@
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/utils/enums.dart';
class ShippingRequestModel {
int? id;
int? requestID;
Request? request;
int? pickupOrshippingStatus;
ShippingRequestStatusEnum? shippingStatusEnum;
SelfPickupRequestStatusEnum? selfPickupRequestStatusEnum;
String? deliveredorCollectedOn;
String? comment;
String? createdOn;
int? customerID;
String? customerName;
int? vehicleTypeID;
String? vehicleType;
String? numberOfShipping;
ShippingRequestModel({
this.id,
this.requestID,
this.request,
this.pickupOrshippingStatus,
this.deliveredorCollectedOn,
this.comment,
this.createdOn,
this.customerID,
this.customerName,
this.vehicleTypeID,
this.vehicleType,
this.numberOfShipping,
});
ShippingRequestModel.fromJsonShipping(Map<String, dynamic> json, bool isForShipping) {
id = json['id'];
requestID = json['requestID'];
request = json['request'] != null ? Request.fromJson(json['request']) : null;
pickupOrshippingStatus = isForShipping ? json['shippingStatus'] : json['selfPickUpStatus'];
shippingStatusEnum = isForShipping ? (json['shippingStatus'] != null ? (json['shippingStatus'] as int).toShippingStatusEnum() : ShippingRequestStatusEnum.initiated) : null;
selfPickupRequestStatusEnum =
isForShipping ? null : (json['selfPickUpStatus'] != null ? (json['selfPickUpStatus'] as int).toSelfPickupStatusEnum() : SelfPickupRequestStatusEnum.preparingToCollect);
deliveredorCollectedOn = isForShipping ? json['deliveredOn'] : json['collectedOn'];
comment = json['comment'];
createdOn = json['createdOn'];
customerID = json['customerID'];
customerName = json['customerName'];
vehicleTypeID = json['vehicleTypeID'];
vehicleType = json['vehicleType'];
numberOfShipping = json['numberOfShipping'];
}
}
class Request {
int? requestType;
String? brand;
String? model;
int? year;
bool? isNew;
String? description;
double? price;
Request({this.requestType, this.brand, this.model, this.year, this.isNew, this.description, this.price});
Request.fromJson(Map<String, dynamic> json) {
requestType = json['requestType'];
brand = json['brand'];
model = json['model'];
year = json['year'];
isNew = json['isNew'];
description = json['description'];
price = json['price'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['requestType'] = requestType;
data['brand'] = brand;
data['model'] = model;
data['year'] = year;
data['isNew'] = isNew;
data['description'] = description;
data['price'] = price;
return data;
}
}

@ -18,10 +18,6 @@ class ProviderSubscriptionModel {
bool? isUpgradeLater;
bool? isTrialSubscription;
dynamic currentSubscription;
int? totalBranches;
int? totalSubUsers;
int? totalAds;
ProviderSubscriptionModel({
this.id,
@ -40,10 +36,7 @@ class ProviderSubscriptionModel {
this.isUpgradeLater,
this.isTrialSubscription,
this.currentSubscription,
this.subscriptionID,
this.totalAds,
this.totalBranches,
this.totalSubUsers,
this.subscriptionID
});
factory ProviderSubscriptionModel.fromRawJson(String str) => ProviderSubscriptionModel.fromJson(json.decode(str));
@ -51,48 +44,42 @@ class ProviderSubscriptionModel {
String toRawJson() => json.encode(toJson());
factory ProviderSubscriptionModel.fromJson(Map<String, dynamic> json) => ProviderSubscriptionModel(
id: json["id"],
subscriptionAppliedId: json["subscriptionAppliedID"],
serviceProviderId: json["serviceProviderID"],
subscriptionID: json["subscriptionID"],
subscriptionName: json["subscriptionName"],
subscriptionDescription: json["subscriptionDescription"],
dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]),
dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]),
branchesRemaining: json["branchesRemaining"],
subUsersRemaining: json["subUsersRemaining"],
adsRemaining: json["adsRemaining"],
isExpired: json["isExpired"],
isActive: json["isActive"],
isUpgradeNow: json["isUpgradeNow"],
isUpgradeLater: json["isUpgradeLater"],
isTrialSubscription: json["isTrialSubscription"],
currentSubscription: json["currentSubscription"],
totalBranches: json["totalBranches"],
totalAds: json["totalAds"],
totalSubUsers: json["totalSubUsers"],
);
id: json["id"],
subscriptionAppliedId: json["subscriptionAppliedID"],
serviceProviderId: json["serviceProviderID"],
subscriptionID: json["subscriptionID"],
subscriptionName: json["subscriptionName"],
subscriptionDescription: json["subscriptionDescription"],
dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]),
dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]),
branchesRemaining: json["branchesRemaining"],
subUsersRemaining: json["subUsersRemaining"],
adsRemaining: json["adsRemaining"],
isExpired: json["isExpired"],
isActive: json["isActive"],
isUpgradeNow: json["isUpgradeNow"],
isUpgradeLater: json["isUpgradeLater"],
isTrialSubscription: json["isTrialSubscription"],
currentSubscription: json["currentSubscription"],
);
Map<String, dynamic> toJson() => {
"id": id,
"subscriptionAppliedID": subscriptionAppliedId,
"serviceProviderID": serviceProviderId,
"subscriptionID": subscriptionID,
"subscriptionName": subscriptionName,
"subscriptionDescription": subscriptionDescription,
"dateStart": dateStart?.toIso8601String(),
"dateEnd": dateEnd?.toIso8601String(),
"branchesRemaining": branchesRemaining,
"subUsersRemaining": subUsersRemaining,
"adsRemaining": adsRemaining,
"isExpired": isExpired,
"isActive": isActive,
"isUpgradeNow": isUpgradeNow,
"isUpgradeLater": isUpgradeLater,
"isTrialSubscription": isTrialSubscription,
"currentSubscription": currentSubscription,
"totalAds": totalAds,
"totalSubUsers": totalSubUsers,
"totalBranches": totalBranches,
};
"id": id,
"subscriptionAppliedID": subscriptionAppliedId,
"serviceProviderID": serviceProviderId,
"subscriptionID": subscriptionID,
"subscriptionName": subscriptionName,
"subscriptionDescription": subscriptionDescription,
"dateStart": dateStart?.toIso8601String(),
"dateEnd": dateEnd?.toIso8601String(),
"branchesRemaining": branchesRemaining,
"subUsersRemaining": subUsersRemaining,
"adsRemaining": adsRemaining,
"isExpired": isExpired,
"isActive": isActive,
"isUpgradeNow": isUpgradeNow,
"isUpgradeLater": isUpgradeLater,
"isTrialSubscription":isTrialSubscription,
"currentSubscription": currentSubscription,
};
}

@ -8,7 +8,10 @@ import 'package:mc_common_app/extensions/string_extensions.dart';
import '../../utils/enums.dart';
Subscription subscriptionFromJson(String str) => Subscription.fromJson(json.decode(str));
Subscription subscriptionFromJson(String str) =>
Subscription.fromJson(json.decode(str));
String subscriptionToJson(Subscription data) => json.encode(data.toJson());
class SubscriptionModel {
SubscriptionModel({
@ -23,45 +26,50 @@ class SubscriptionModel {
List<Subscription>? data;
String? message;
factory SubscriptionModel.fromJson(Map<String, dynamic> json) => SubscriptionModel(
factory SubscriptionModel.fromJson(Map<String, dynamic> json) =>
SubscriptionModel(
messageStatus: json["messageStatus"],
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? [] : List<Subscription>.from(json["data"]!.map((x) => Subscription.fromJson(x))),
data: json["data"] == null
? []
: List<Subscription>.from(
json["data"]!.map((x) => Subscription.fromJson(x))),
message: json["message"],
);
Map<String, dynamic> toJson() => {
"messageStatus": messageStatus,
"totalItemsCount": totalItemsCount,
"data": data == null
? []
: List<dynamic>.from(data!.map((x) => x.toJson())),
"message": message,
};
}
class Subscription {
Subscription(
{this.id,
this.name,
this.description,
this.durationName,
this.durationDays,
this.price,
this.currency,
this.countryId,
this.countryName,
this.isSubscribed,
this.subscriptionAppliedId,
this.serviceProviderId,
this.dateStart,
this.dateEnd,
this.isExpired,
this.isActive,
this.subscriptionTypeEnum,
this.isMyCurrentPackage,
this.isRenewable,
this.subscriptionBranches,
this.subscriptionSubUsers,
this.subscriptionAds,
this.totalBranches,
this.totalSubUsers,
this.totalAds,
this.branchesRemaining,
this.subUsersRemaining,
this.subscriptionType,
this.adsRemaining});
Subscription({
this.id,
this.name,
this.description,
this.durationName,
this.durationDays,
this.price,
this.currency,
this.numberOfBranches,
this.numberOfSubUsers,
this.numberOfAds,
this.countryId,
this.countryName,
this.isSubscribed,
this.subscriptionAppliedId,
this.serviceProviderId,
this.dateStart,
this.dateEnd,
this.isExpired,
this.isActive,
this.subscriptionTypeEnum,
});
int? id;
String? name;
@ -70,59 +78,65 @@ class Subscription {
int? durationDays;
double? price;
String? currency;
int? numberOfBranches;
int? numberOfSubUsers;
int? numberOfAds;
int? countryId;
String? countryName;
bool? isSubscribed;
int? subscriptionAppliedId;
int? serviceProviderId;
String? dateStart;
String? dateEnd;
DateTime? dateStart;
DateTime? dateEnd;
bool? isExpired;
bool? isActive;
SubscriptionTypeEnum? subscriptionTypeEnum;
bool? isMyCurrentPackage;
bool? isRenewable;
int? subscriptionType;
int? subscriptionBranches;
int? subscriptionSubUsers;
int? subscriptionAds;
int? totalBranches;
int? totalSubUsers;
int? totalAds;
int? branchesRemaining;
int? subUsersRemaining;
int? adsRemaining;
factory Subscription.fromJson(Map<String, dynamic> json) => Subscription(
id: json["id"],
name: json["name"],
description: json["description"],
durationName: json["durationName"],
durationDays: json["durationDays"],
price: json["price"]?.toDouble(),
currency: json["currency"],
countryId: json["countryID"],
countryName: json["countryName"],
isSubscribed: json["isSubscribed"],
subscriptionAppliedId: json["subscriptionAppliedID"],
serviceProviderId: json["serviceProviderID"],
dateStart: json["dateStart"],
dateEnd: json["dateEnd"],
isExpired: json["isExpired"],
isActive: json["isActive"],
isMyCurrentPackage: false,
isRenewable: json["isRenewable"],
subscriptionTypeEnum: json["subscriptionType"] == null ? null : ((json['subscriptionType']) as int).toSubscriptionTypeEnum(),
subscriptionBranches: json["subscriptionBranches"],
subscriptionSubUsers: json["subscriptionSubUsers"],
subscriptionAds: json["subscriptionAds"],
totalBranches: json["totalBranches"],
totalSubUsers: json["totalSubUsers"],
totalAds: json["totalAds"],
branchesRemaining: json["branchesRemaining"],
subUsersRemaining: json["subUsersRemaining"],
adsRemaining: json["adsRemaining"],
subscriptionType: json["subscriptionType"],
);
id: json["id"],
name: json["name"],
description: json["description"],
durationName: json["durationName"],
durationDays: json["durationDays"],
price: json["price"]?.toDouble(),
currency: json["currency"],
numberOfBranches: json["numberOfBranches"],
numberOfSubUsers: json["numberOfSubUsers"],
numberOfAds: json["numberOfAds"],
countryId: json["countryID"],
countryName: json["countryName"],
isSubscribed: json["isSubscribed"],
subscriptionAppliedId: json["subscriptionAppliedID"],
serviceProviderId:
json["serviceProviderID"],
dateStart:
json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]),
dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]),
isExpired: json["isExpired"],
isActive: json["isActive"],
subscriptionTypeEnum: json["subscriptionType"] == null
? null
: ((json['subscriptionType']) as int).toSubscriptionTypeEnum());
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"description": description,
"durationName": durationName,
"durationDays": durationDays,
"price": price,
"currency": currency,
"numberOfBranches": numberOfBranches,
"numberOfSubUsers": numberOfSubUsers,
"numberOfAds": numberOfAds,
"countryID": countryId,
"countryName": countryName,
"isSubscribed": isSubscribed,
"subscriptionAppliedID": subscriptionAppliedId,
"serviceProviderID": serviceProviderId,
"dateStart": dateStart?.toIso8601String(),
"dateEnd": dateEnd?.toIso8601String(),
"isExpired": isExpired,
"isActive": isActive,
};
}

@ -22,17 +22,17 @@ class Role {
String? message;
factory Role.fromJson(Map<String, dynamic> json) => Role(
totalItemsCount: json["totalItemsCount"],
totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<RoleData>.from(json["data"].map((x) => RoleData.fromJson(x))),
messageStatus: json["messageStatus"],
message: json["message"],
messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"] == null ? null : json["message"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus,
"message": message,
"messageStatus": messageStatus == null ? null : messageStatus,
"message": message == null ? null : message,
};
}
@ -50,16 +50,16 @@ class RoleData {
bool? isActive;
factory RoleData.fromJson(Map<String, dynamic> json) => RoleData(
id: json["id"],
roleName: json["roleName"],
roleNameN: json["roleNameN"],
isActive: json["isActive"],
id: json["id"] == null ? null : json["id"],
roleName: json["roleName"] == null ? null : json["roleName"],
roleNameN: json["roleNameN"] == null ? null : json["roleNameN"],
isActive: json["isActive"] == null ? null : json["isActive"],
);
Map<String, dynamic> toJson() => {
"id": id,
"roleName": roleName,
"roleNameN": roleNameN,
"isActive": isActive,
"id": id == null ? null : id,
"roleName": roleName == null ? null : roleName,
"roleNameN": roleNameN == null ? null : roleNameN,
"isActive": isActive == null ? null : isActive,
};
}

@ -25,18 +25,16 @@ class User {
int? messageStatus;
String? message;
factory User.fromJson(Map<String, dynamic> json) =>
User(
factory User.fromJson(Map<String, dynamic> json) => User(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : UserData.fromJson(json["data"]),
messageStatus: json["messageStatus"],
message: json["message"],
);
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data?.toJson(),
"data": data == null ? null : data!.toJson(),
"messageStatus": messageStatus,
"message": message,
};
@ -55,68 +53,53 @@ class UserData {
DateTime? expiryDate;
UserInfo? userInfo;
factory UserData.fromJson(Map<String, dynamic> json) =>
UserData(
factory UserData.fromJson(Map<String, dynamic> json) => UserData(
accessToken: json["accessToken"],
refreshToken: json["refreshToken"],
expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]),
userInfo: json["userInfo"] == null ? null : UserInfo.fromJson(json["userInfo"]),
);
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"accessToken": accessToken,
"refreshToken": refreshToken,
"expiryDate": expiryDate?.toIso8601String(),
"userInfo": userInfo?.toJson(),
"expiryDate": expiryDate == null ? null : expiryDate!.toIso8601String(),
"userInfo": userInfo == null ? null : userInfo!.toJson(),
};
}
class UserInfo {
UserInfo({this.id,
this.userId,
this.firstName,
this.lastName,
this.mobileNo,
this.email,
this.userImageUrl,
this.roleId,
this.roleName,
this.roleNameN,
this.genderID,
this.genderName,
this.isEmailVerified,
this.serviceProviderBranch,
this.isVerified,
this.userRoles,
this.isCustomer,
this.isProviderDealership,
this.isDealershipUser,
this.providerId,
this.customerId,
this.countryId,
this.cityId,
this.dealershipId,
this.userLocalImage,
this.cityName,
this.countryName,
});
UserInfo(
{this.id,
this.userId,
this.firstName,
this.lastName,
this.mobileNo,
this.email,
this.userImageUrl,
this.roleId,
this.roleName,
this.isEmailVerified,
this.serviceProviderBranch,
this.isVerified,
this.userRoles,
this.isCustomer,
this.isProviderDealership,
this.isDealershipUser,
this.providerId,
this.customerId,
this.dealershipId,
this.userLocalImage});
int? id;
String? userId;
String? firstName;
String? lastName;
String? countryName;
String? cityName;
int? genderID;
String? genderName;
String? mobileNo;
String? email;
dynamic userImageUrl;
int? roleId;
String? roleName;
String? roleNameN; // Arabic role name
bool? isEmailVerified;
List<dynamic>? serviceProviderBranch;
bool? isVerified;
@ -126,8 +109,6 @@ class UserInfo {
bool? isDealershipUser;
dynamic providerId;
int? customerId;
int? cityId;
int? countryId;
dynamic dealershipId;
File? userLocalImage;
@ -136,8 +117,6 @@ class UserInfo {
AppState().userType = UserType.providerDealer;
} else if (json["roleID"] == 6) {
AppState().userType = UserType.providerIndividual;
} else if (json["roleID"] == 7) {
AppState().userType = UserType.dealershipUser;
} else {
AppState().userType = UserType.customer;
}
@ -145,16 +124,11 @@ class UserInfo {
userId = json["userID"];
firstName = json["firstName"];
lastName = json["lastName"];
cityName = json["cityName"];
genderID = json["genderID"];
genderName = json["genderName"];
countryName = json["countryName"];
mobileNo = json["mobileNo"];
email = json["email"];
userImageUrl = json["userImageUrl"];
roleId = json["roleID"];
roleName = json["roleName"];
roleNameN = json["roleNameN"];
isEmailVerified = json["isEmailVerified"];
serviceProviderBranch = json["serviceProviderBranch"] == null ? null : List<dynamic>.from(json["serviceProviderBranch"].map((x) => x));
isVerified = json["isVerified"];
@ -164,8 +138,6 @@ class UserInfo {
isDealershipUser = json["isDealershipUser"];
providerId = json["providerID"];
customerId = json["customerID"];
countryId = json["countryId"] ?? 1;
cityId = json["cityId"] ?? 1;
dealershipId = json["dealershipID"];
userLocalImage = null;
}
@ -192,20 +164,16 @@ class UserInfo {
// dealershipId: json["dealershipID"],
// );
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": id,
"userID": userId,
"firstName": firstName,
"lastName": lastName,
"countryName": countryName,
"cityName": cityName,
"mobileNo": mobileNo,
"email": email,
"userImageUrl": userImageUrl,
"roleID": roleId,
"roleName": roleName,
"roleNameN": roleNameN,
"isEmailVerified": isEmailVerified,
"serviceProviderBranch": serviceProviderBranch == null ? null : List<dynamic>.from(serviceProviderBranch!.map((x) => x)),
"isVerified": isVerified,
@ -216,12 +184,5 @@ class UserInfo {
"providerID": providerId,
"customerID": customerId,
"dealershipID": dealershipId,
"genderName": genderName,
"genderID": genderID
};
@override
String toString() {
return 'UserInfo{id: $id, userId: $userId, firstName: $firstName, lastName: $lastName, mobileNo: $mobileNo, email: $email, userImageUrl: $userImageUrl, roleId: $roleId, roleName: $roleName, isEmailVerified: $isEmailVerified, serviceProviderBranch: $serviceProviderBranch, isVerified: $isVerified, userRoles: $userRoles, isCustomer: $isCustomer, isProviderDealership: $isProviderDealership, isDealershipUser: $isDealershipUser, providerId: $providerId, customerId: $customerId, dealershipId: $dealershipId, userLocalImage: $userLocalImage}';
}
}

@ -1,12 +1,11 @@
import 'dart:convert';
import 'dart:developer';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart';
@ -14,78 +13,36 @@ import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart
import 'package:mc_common_app/models/advertisment_models/pdf_receipt_model.dart';
import 'package:mc_common_app/models/advertisment_models/reserved_ads_models.dart';
import 'package:mc_common_app/models/advertisment_models/special_service_model.dart';
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart';
import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class AdsRepo {
Future<List<AdsDurationModel>> getAdsDuration({required int? countryId});
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceType, required int cityId, required int countryId});
Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required bool isExtendAdEditEnabled});
Future<GenericRespModel> createOrUpdateDraftAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required AdCreationStepsEnum stepNo});
Future<List<AdDetailsModel>> getAllAds({
required bool isMyAds,
AdPostStatus? adPostStatus,
CreatedByRoleEnum? createdByRoleEnum,
int? vehicleBrandId,
int? page,
});
Future<List<AdDetailsModel>> getMyDraftAds({int? page});
Future<List<AdDetailsModel>> getExploreAdsBasedOnFilters({
List<String>? adIdsList,
List<String>? cityIdsList,
List<String>? vehicleModelYearIdsList,
List<String>? vehicleTypeIdsList,
List<String>? vehicleBrandIdsList,
List<String>? vehicleModelIdsList,
List<String>? createdByRolesIdsList,
List<String>? vehicleAdConditionIdsList,
List<String>? vehicleAdCreatedDateList,
List<String>? mobileNumbersList,
int? startPriceDemand,
int? endPriceDemand,
int page,
bool isMyAds = false,
});
Future<List<AdsDurationModel>> getAdsDuration();
Future<List<AdDetailsModel>> getMyReservedAds();
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceId});
Future<List<AdDetailsModel>> getMyAds();
Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew});
Future<List<AdDetailsModel>> getFavouriteAds({
AdPostStatus? adPostStatus,
CreatedByRoleEnum? createdByRoleEnum,
int? vehicleBrandId,
});
Future<List<AdDetailsModel>> getAllAds({required bool isMyAds});
Future<GenericRespModel> toggleAdFavorite({required int adsID, required bool isFavorite});
Future<List<AdDetailsModel>> getMyReservedAds();
Future<AdDetailsModel?> getAdDetailsById({required int adId});
Future<List<AdDetailsModel>> getMyAds();
Future<AdsBankDetailsModel?> getAdBankingAccountInfo({required int adId});
Future<GenericRespModel> updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate, String? comment});
Future<GenericRespModel> updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate});
Future<GenericRespModel> createAppointmentForAdSpecialService({required int adId, required int photoOfficeID, required int photoOfficeSlotID, required int adsSpecialServiceID});
Future<GenericRespModel> deleteAd({required int adId});
Future<GenericRespModel> cancelMyAdReservation({required int adId, required int adsReserveId, required int adsReserveStatus, required String reason});
Future<GenericRespModel> cancelMyAdReservation({required int adId, required int adsReserveStatus, required String reason});
Future<GenericRespModel> createReserveAd({required int adId});
Future<GenericRespModel> uploadBankReceiptsOnReserveDealDone({required int adId, required String detailNote, required List<PdfReceiptModel> pdfReceiptsList});
Future<List<BuyersChatForAdsModel>> getChatBuyersForAds({required int adsID});
Future<GenericRespModel> createAdExtensionOrder({required int adID, required List<int> specialServiceIds, required int adsDurationId});
}
class AdsRepoImp implements AdsRepo {
@ -93,16 +50,10 @@ class AdsRepoImp implements AdsRepo {
AppState appState = injector.get<AppState>();
@override
Future<List<AdsDurationModel>> getAdsDuration({required int? countryId}) async {
int roleID = appState.getUser.data!.userInfo!.roleId ?? 0;
var param = {
"CountryID": countryId.toString(),
"roleID": roleID.toString(),
};
Future<List<AdsDurationModel>> getAdsDuration() async {
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
queryParameters: param,
ApiConsts.vehicleAdsDurationGet,
);
List<AdsDurationModel> vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => AdsDurationModel.fromJson(adsGenericModel.data[index]));
@ -110,84 +61,54 @@ class AdsRepoImp implements AdsRepo {
}
@override
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceType, required int cityId, required int countryId}) async {
log("getSpecialServices cityId: $cityId");
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceId}) async {
var params = {
"SpecialServiceType": specialServiceType.toString(),
"CountryID": countryId.toString(),
"SpecialServiceType": specialServiceId.toString(),
};
GenericRespModel adsGenericModel =
await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.vehicleAdsSpecialServicesGet, queryParameters: params);
List<SpecialServiceModel> list = List.generate(adsGenericModel.data.length, (index) => SpecialServiceModel.fromJson(adsGenericModel.data[index]));
List<SpecialServiceModel> specialServicesByCity = getOfficesOnlyByCity(list, cityId);
return specialServicesByCity;
}
List<SpecialServiceModel> getOfficesOnlyByCity(List<SpecialServiceModel> allServices, int cityId) {
List<SpecialServiceModel> list = [];
for (var service in allServices) {
if (service.office != null && service.office!.isNotEmpty) {
for (var office in service.office!) {
if (office.cityID == cityId) {
list.add(service);
}
}
}
}
return list;
List<SpecialServiceModel> vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => SpecialServiceModel.fromJson(adsGenericModel.data[index]));
return vehicleAdsDuration;
}
@override
Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required bool isExtendAdEditEnabled}) async {
Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew}) async {
List vehiclePostingImages = [];
log("isCreateNew: $isCreateNew");
log("vehiclePostingID: $isExtendAdEditEnabled");
log("adsCreationPayloadModel.ads!.adsDurationID,: ${adsCreationPayloadModel.ads!.adsDurationID}");
adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages?.forEach((element) {
var imageMap = {
"id": element.id ?? 0,
"imageName": element.imageName,
"imageUrl": element.imageUrl,
"imageStr": element.imageStr,
"vehiclePostingID": isCreateNew ? 0 : element.vehiclePostingID ?? 0,
"vehiclePostingID": element.vehiclePostingID ?? 0,
"vehiclePosting": null,
};
vehiclePostingImages.add(imageMap);
});
List vehiclePostingDamageParts = [];
int sellerTypeID = AppState().getUser.data!.userInfo!.roleId ?? 0;
adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts?.forEach((element) {
log("comment: ${element.comment}");
var imageMap = {
"id": element.id ?? 0,
"comment": element.comment,
"vehicleImageBase64": element.vehicleImageBase64,
"vehicleDamagePartID": element.vehicleDamagePartID,
"vehiclePostingID": isCreateNew ? 0 : element.vehiclePostingID ?? 0,
"vehiclePostingID": element.vehiclePostingID ?? 0,
"isActive": true
};
vehiclePostingDamageParts.add(imageMap);
});
var postParams = {
"ads": {
"id": isCreateNew ? 0 : adsCreationPayloadModel.ads!.id ?? 0,
"id": adsCreationPayloadModel.ads!.id ?? 0,
"adsDurationID": adsCreationPayloadModel.ads!.adsDurationID,
"startDate": adsCreationPayloadModel.ads!.startDate,
"countryId": adsCreationPayloadModel.ads!.countryId,
"specialServiceIDs": adsCreationPayloadModel.ads!.specialServiceIDs,
"isMCHandled": false,
"showContactDetail": adsCreationPayloadModel.ads!.showContactDetail ?? false,
"isOnWhatsApp": adsCreationPayloadModel.ads!.isOnWhatsApp ?? false,
"isMCHandled": false
},
"vehiclePosting": {
"id": isCreateNew ? 0 : adsCreationPayloadModel.vehiclePosting!.id ?? 0,
"id": adsCreationPayloadModel.vehiclePosting!.id ?? 0,
"userID": adsCreationPayloadModel.vehiclePosting!.userID,
"vehicleType": adsCreationPayloadModel.vehiclePosting!.vehicleType,
"vehicleModelID": adsCreationPayloadModel.vehiclePosting!.vehicleModelID,
@ -197,7 +118,7 @@ class AdsRepoImp implements AdsRepo {
"vehicleConditionID": adsCreationPayloadModel.vehiclePosting!.vehicleConditionID,
"vehicleMileageID": adsCreationPayloadModel.vehiclePosting!.vehicleMileageID,
"vehicleTransmissionID": adsCreationPayloadModel.vehiclePosting!.vehicleTransmissionID,
"vehicleSellerTypeID": sellerTypeID,
"vehicleSellerTypeID": adsCreationPayloadModel.vehiclePosting!.vehicleSellerTypeID,
"cityID": adsCreationPayloadModel.vehiclePosting!.cityID,
"price": adsCreationPayloadModel.vehiclePosting!.price,
"vehicleVIN": adsCreationPayloadModel.vehiclePosting!.vehicleVIN,
@ -209,23 +130,14 @@ class AdsRepoImp implements AdsRepo {
"demandAmount": adsCreationPayloadModel.vehiclePosting!.demandAmount,
// "adStatus": 1,
"vehiclePostingImages": vehiclePostingImages,
"vehiclePostingDamageParts": vehiclePostingDamageParts,
"mobileNo": adsCreationPayloadModel.vehiclePosting!.phoneNo,
"whatsAppNo": adsCreationPayloadModel.vehiclePosting!.whatsAppNo,
"odometer": adsCreationPayloadModel.vehiclePosting!.odometer,
"isInUsed": adsCreationPayloadModel.vehiclePosting!.isInUsed,
"isAccidentFree": adsCreationPayloadModel.vehiclePosting!.isAccidentFree,
"vehiclePostingDamageParts": vehiclePostingDamageParts
}
};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
isExtendAdEditEnabled
? ApiConsts.vehicleAdsSingleStepUpdateExtend
: isCreateNew
? ApiConsts.vehicleAdsSingleStepCreate
: ApiConsts.vehicleAdsSingleStepUpdate,
isCreateNew ? ApiConsts.vehicleAdsSingleStepCreate : ApiConsts.vehicleAdsSingleStepUpdate,
postParams,
token: token,
);
@ -234,223 +146,22 @@ class AdsRepoImp implements AdsRepo {
}
@override
Future<GenericRespModel> createOrUpdateDraftAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required AdCreationStepsEnum stepNo}) async {
log("isNew: $isCreateNew |||createOrUpdateDraftAd stepNo: $stepNo ||| adsCreationPayloadModel: ${adsCreationPayloadModel.ads?.id}");
int sellerTypeID = AppState().getUser.data!.userInfo!.roleId ?? 0;
List vehiclePostingImages = [];
List vehiclePostingDamageParts = [];
if (adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages != null) {
adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages?.forEach(
(element) {
var imageMap = {
"id": element.id ?? 0,
"imageName": element.imageName,
"imageUrl": element.imageUrl,
"imageStr": element.imageStr,
"vehiclePostingDraftID": element.vehiclePostingID ?? 0,
"vehiclePosting": null,
};
vehiclePostingImages.add(imageMap);
},
);
}
if (adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts != null) {
adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts?.forEach((element) {
var imageMap = {
"id": element.id ?? 0,
"comment": element.comment,
"vehicleImageBase64": element.vehicleImageBase64,
"vehicleDamagePartID": element.vehicleDamagePartID,
"vehiclePostingDraftID": element.vehiclePostingID ?? 0,
"isActive": true
};
vehiclePostingDamageParts.add(imageMap);
});
}
var postParams = {
"adsDraft": {
"id": adsCreationPayloadModel.ads!.id ?? 0,
"adsDurationID": adsCreationPayloadModel.ads!.adsDurationID,
"startDate": adsCreationPayloadModel.ads!.startDate,
"countryId": adsCreationPayloadModel.ads!.countryId,
"specialServiceIDs": adsCreationPayloadModel.ads!.specialServiceIDs,
"isMCHandled": false,
"showContactDetail": adsCreationPayloadModel.ads!.showContactDetail ?? false,
"isOnWhatsApp": adsCreationPayloadModel.ads!.isOnWhatsApp ?? false,
},
"vehiclePostingDraft": {
"id": adsCreationPayloadModel.vehiclePosting!.id ?? 0,
"userID": adsCreationPayloadModel.vehiclePosting!.userID,
"vehicleType": adsCreationPayloadModel.vehiclePosting!.vehicleType,
"vehicleModelID": adsCreationPayloadModel.vehiclePosting!.vehicleModelID,
"vehicleModelYearID": adsCreationPayloadModel.vehiclePosting!.vehicleModelYearID,
"vehicleColorID": adsCreationPayloadModel.vehiclePosting!.vehicleColorID,
"vehicleCategoryID": adsCreationPayloadModel.vehiclePosting!.vehicleCategoryID,
"vehicleConditionID": adsCreationPayloadModel.vehiclePosting!.vehicleConditionID,
"vehicleMileageID": adsCreationPayloadModel.vehiclePosting!.vehicleMileageID,
"vehicleTransmissionID": adsCreationPayloadModel.vehiclePosting!.vehicleTransmissionID,
"vehicleSellerTypeID": sellerTypeID,
"cityID": adsCreationPayloadModel.vehiclePosting!.cityID,
"price": adsCreationPayloadModel.vehiclePosting!.price,
"vehicleVIN": adsCreationPayloadModel.vehiclePosting!.vehicleVIN,
"vehicleDescription": adsCreationPayloadModel.vehiclePosting!.vehicleDescription,
"vehicleTitle": adsCreationPayloadModel.vehiclePosting!.vehicleTitle,
"vehicleDescriptionN": adsCreationPayloadModel.vehiclePosting!.vehicleDescription,
"isFinanceAvailable": adsCreationPayloadModel.vehiclePosting!.isFinanceAvailable,
"warantyYears": adsCreationPayloadModel.vehiclePosting!.warantyYears,
"demandAmount": adsCreationPayloadModel.vehiclePosting!.demandAmount,
"vehiclePostingImagesDraft": vehiclePostingImages,
"vehiclePostingDamagePartsDraft": vehiclePostingDamageParts,
"mobileNo": adsCreationPayloadModel.vehiclePosting!.phoneNo,
"whatsAppNo": adsCreationPayloadModel.vehiclePosting!.whatsAppNo,
"odometer": adsCreationPayloadModel.vehiclePosting!.odometer,
"isInUsed": adsCreationPayloadModel.vehiclePosting!.isInUsed,
"isAccidentFree": adsCreationPayloadModel.vehiclePosting!.isAccidentFree,
// "adStatus": 1,
},
"stepNo": stepNo.toIntFromStepsEnum(),
};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
isCreateNew ? ApiConsts.adsSingleStepDraftCreate : ApiConsts.adsSingleStepDraftUpdate,
postParams,
token: token,
);
return Future.value(adsGenericModel);
}
@override
Future<List<AdDetailsModel>> getMyDraftAds({int? page}) async {
var draftAdsParams = {
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "0",
"userID": appState.getUser.data!.userInfo!.userId ?? "",
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.getMyDraftAds,
queryParameters: draftAdsParams,
);
//print("ADS DATA = ${adsGenericModel.data}");
List<AdDetailsModel> vehicleAdsDetails = List.generate(
adsGenericModel.data.length,
(index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true, adsGenericModel.totalItemsCount ?? 1),
);
return vehicleAdsDetails;
}
@override
Future<List<AdDetailsModel>> getAllAds({
required isMyAds,
AdPostStatus? adPostStatus,
CreatedByRoleEnum? createdByRoleEnum,
int? vehicleBrandId,
int? page,
}) async {
Map<String, dynamic> onlyMyAdsParams = {
Future<List<AdDetailsModel>> getAllAds({required isMyAds}) async {
var onlyMyAdsParams = {
"userID": appState.getUser.data!.userInfo!.userId ?? "",
};
if (isMyAds && adPostStatus != null) {
onlyMyAdsParams.addAll({
"AdsStatuses": ["${adPostStatus.getIdFromAdPostStatusEnum()}"],
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "0",
});
}
var allAdsParams = {
"AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS
"isActive": "true", //only Active ADS
"isExplore": "true",
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "0",
"IsPaid": "true", //only Active ADS
};
if (!isMyAds && createdByRoleEnum != null) {
allAdsParams.addAll({
"CreatedByRoles": ["${createdByRoleEnum.getIdFromCreatedByRoleEnum()}"],
});
}
if (!isMyAds && vehicleBrandId != null && vehicleBrandId != 0) {
allAdsParams.addAll({
"VehicleBrandIDs": ["$vehicleBrandId"],
});
}
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.vehicleAdsGet,
queryParameters: isMyAds ? onlyMyAdsParams : allAdsParams,
);
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], isMyAds, adsGenericModel.totalItemsCount ?? 1));
return vehicleAdsDetails;
}
@override
Future<List<AdDetailsModel>> getExploreAdsBasedOnFilters({
List<String>? adIdsList,
List<String>? cityIdsList,
List<String>? vehicleModelYearIdsList,
List<String>? vehicleTypeIdsList,
List<String>? vehicleBrandIdsList,
List<String>? vehicleModelIdsList,
List<String>? createdByRolesIdsList,
List<String>? vehicleAdConditionIdsList,
List<String>? vehicleAdCreatedDateList,
List<String>? mobileNumbersList,
int? startPriceDemand,
int? endPriceDemand,
int? page,
bool isMyAds = false,
}) async {
var parameters = {
"AdsIDs": adIdsList ?? [],
"CityIDs": cityIdsList ?? [],
"VehicleTypeIDs": vehicleTypeIdsList ?? [],
"VehicleBrandIDs": vehicleBrandIdsList ?? [],
"VehicleModels": vehicleModelIdsList ?? [],
"VehicleModelYearIDs": vehicleModelYearIdsList ?? [],
"CreatedByRoles": createdByRolesIdsList ?? [],
"AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS
"VehicleNew": vehicleAdConditionIdsList != null && vehicleAdConditionIdsList.isNotEmpty ? vehicleAdConditionIdsList.first.toString() : null,
"CreatedOn": (vehicleAdCreatedDateList != null && vehicleAdCreatedDateList.isNotEmpty) ? vehicleAdCreatedDateList.first.toString() : null,
"MobileNumbers": mobileNumbersList ?? [],
"StartPriceDemand": startPriceDemand?.toString(),
"EndPriceDemand": endPriceDemand?.toString(),
"isActive": "true", //only Active ADS
"isExplore": (!isMyAds).toString(),
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "1",
};
if (isMyAds) {
parameters.addAll({
"userID": appState.getUser.data!.userInfo!.userId ?? "",
});
}
parameters.removeWhere((key, value) => value == null);
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.vehicleAdsGet,
queryParameters: parameters,
);
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], false, adsGenericModel.totalItemsCount ?? 1));
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], isMyAds));
return vehicleAdsDetails;
}
@ -458,7 +169,6 @@ class AdsRepoImp implements AdsRepo {
Future<List<AdDetailsModel>> getMyReservedAds() async {
var params = {
"userID": appState.getUser.data!.userInfo!.userId ?? "",
"IsAdCurrentlyReserved": "true",
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
@ -467,27 +177,19 @@ class AdsRepoImp implements AdsRepo {
ApiConsts.myAdsReserveGet,
queryParameters: params,
);
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
throw Exception(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr());
}
List<MyReservedAdsRespModel> reservedAds = List.generate(adsGenericModel.data.length, (index) => MyReservedAdsRespModel.fromJson(adsGenericModel.data[index]));
List<String> selectedIdsString = reservedAds.map((component) => component.adsID.toString()).toList();
if (reservedAds.isEmpty) {
return []; // No reserved ads - this is a valid state
if (selectedIdsString.isEmpty) {
return [];
}
List<String> selectedIdsString = reservedAds.map((component) => component.adsID.toString()).toList();
return await getAdsPerSpecificIds(ids: selectedIdsString, reservedAds: reservedAds);
}
Future<List<AdDetailsModel>> getAdsPerSpecificIds({required List<String> ids, required List<MyReservedAdsRespModel> reservedAds, bool applyReservationFilter = true}) async {
Future<List<AdDetailsModel>> getAdsPerSpecificIds({required List<String> ids, required List<MyReservedAdsRespModel> reservedAds}) async {
var params = {
"AdsIDs": ids,
"isActive": "true",
"PageSize": ids.length.toString(), // Request all reserved ads in one call
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
@ -495,58 +197,13 @@ class AdsRepoImp implements AdsRepo {
queryParameters: params,
ApiConsts.vehicleAdsGet,
);
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
throw Exception(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr());
}
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true, adsGenericModel.totalItemsCount ?? 1));
// Create maps for O(1) lookup: adsID -> reserve status and reserve ID
Map<int, AdReserveStatus> statusMap = {};
Map<int, int> reserveIdMap = {}; // adsID -> reserve ID
for (var reserved in reservedAds) {
log("adsReserveStatus: ${reserved.adsReserveStatus}");
statusMap[reserved.adsID ?? 0] = (reserved.adsReserveStatus ?? 0).toAdRserveStatusEnum();
reserveIdMap[reserved.adsID ?? 0] = reserved.id ?? 0; // Store reserve ID
}
log("📋 Status Map created: ${statusMap.length} entries");
statusMap.forEach((key, value) {
log(" Ad ID: $key -> Status: $value, Reserve ID: ${reserveIdMap[key]}");
});
// Assign reserve status and reserve ID by matching ad ID (not by index!)
log("📦 Processing ${vehicleAdsDetails.length} ads from second API");
for (var ad in vehicleAdsDetails) {
if (statusMap.containsKey(ad.id)) {
ad.adReserveStatus = statusMap[ad.id]!;
ad.adsReserveId = reserveIdMap[ad.id]!; // Store reserve ID
// Backend will set adPostStatus=reserved in the response, so no need to set it manually
log(" ✅ Ad ${ad.id}: Assigned adReserveStatus ${ad.adReserveStatus}, adsReserveId ${ad.adsReserveId}");
} else {
// Ad exists but no reserve status found - shouldn't happen but handle it
ad.adReserveStatus = AdReserveStatus.defaultStatus;
log(" ⚠️ Ad ${ad.id}: No status found, set to defaultStatus");
}
}
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true));
if (applyReservationFilter) {
// Show all ads with ANY reservation history (exclude only defaultStatus/none)
// This includes: reserved (1), cancelledByOwner (2), cancelledByAdmin (3), timeOver (4), dealDone (5), fullPaymentVerified (6)
// Only meaningful for the "My Reserved Ads" list — callers fetching a specific
// ad by id (e.g. deep links) should NOT filter, or every ad with no reservation
// history (the normal case) gets incorrectly dropped.
int beforeFilter = vehicleAdsDetails.length;
vehicleAdsDetails.removeWhere((element) => element.adReserveStatus == AdReserveStatus.defaultStatus);
int afterFilter = vehicleAdsDetails.length;
log("🎯 Filter Result: ${afterFilter} ads remaining (removed ${beforeFilter - afterFilter})");
for (var ad in vehicleAdsDetails) {
log(" ✅ Keeping Ad ${ad.id} with status ${ad.adReserveStatus}");
}
for (int i = 0; i < vehicleAdsDetails.length; i++) {
vehicleAdsDetails[i].adReserveStatus = (reservedAds[i].adsReserveStatus ?? 0).toAdRserveStatusEnum();
}
vehicleAdsDetails.removeWhere((element) => element.adReserveStatus != AdReserveStatus.reserved);
return vehicleAdsDetails;
}
@ -554,7 +211,6 @@ class AdsRepoImp implements AdsRepo {
Future<List<AdDetailsModel>> getMyAds() async {
var params = {
"userID": appState.getUser.data!.userInfo!.userId ?? "",
"PageSize": "30",
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
@ -562,94 +218,10 @@ class AdsRepoImp implements AdsRepo {
queryParameters: params,
ApiConsts.vehicleAdsGet,
);
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true, adsGenericModel.totalItemsCount ?? 1));
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true));
return vehicleAdsDetails;
}
@override
Future<List<AdDetailsModel>> getFavouriteAds({AdPostStatus? adPostStatus, CreatedByRoleEnum? createdByRoleEnum, int? vehicleBrandId}) async {
// Build filter parameters similar to getAllAds
Map<String, dynamic> params = {
"PageSize": "30",
};
// Add status filter if provided
if (adPostStatus != null) {
params["AdsStatuses"] = ["${adPostStatus.getIdFromAdPostStatusEnum()}"];
}
// Add created by role filter if provided
if (createdByRoleEnum != null && createdByRoleEnum != CreatedByRoleEnum.allAds) {
params["CreatedByRoles"] = ["${createdByRoleEnum.getIdFromCreatedByRoleEnum()}"];
}
// Add vehicle brand filter if provided
if (vehicleBrandId != null && vehicleBrandId != 0) {
params["VehicleBrandIDs"] = ["$vehicleBrandId"];
}
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.favouriteAdsGet,
queryParameters: params,
);
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
return [];
}
List<AdDetailsModel> favouriteAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], false, adsGenericModel.totalItemsCount ?? 1));
return favouriteAdsDetails;
}
@override
Future<GenericRespModel> toggleAdFavorite({required int adsID, required bool isFavorite}) async {
var params = {
"adsID": adsID.toString(),
};
if (isFavorite) {
params = {
"ID": adsID.toString(),
};
}
String endpoint = isFavorite ? ApiConsts.unFavouriteAds : ApiConsts.favouriteAdsCreate;
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
endpoint,
params,
);
return genericRespModel;
}
@override
Future<AdDetailsModel?> getAdDetailsById({required int adId}) async {
try {
List<AdDetailsModel> ads = await getAdsPerSpecificIds(ids: [adId.toString()], reservedAds: [], applyReservationFilter: false);
if (ads.isEmpty) return null;
AdDetailsModel ad = ads.first;
// getAdsPerSpecificIds hardcodes isMyAd=true, which is only correct for its
// original "My Reserved Ads" use case. This method can fetch ANY ad (e.g. from a
// shared deep link), so recompute isMyAd from actual ownership instead.
final String? currentUserId = appState.getUser.data?.userInfo?.userId;
ad.isMyAd = currentUserId != null && ad.userID == currentUserId;
return ad;
} catch (e) {
logger.e(e.toString());
return null;
}
}
@override
Future<AdsBankDetailsModel?> getAdBankingAccountInfo({required int adId}) async {
var params = {
@ -671,11 +243,11 @@ class AdsRepoImp implements AdsRepo {
}
@override
Future<GenericRespModel> updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate, String? comment}) async {
Future<GenericRespModel> updateAdStatus({required int adId, required AdPostStatus adStatusToUpdate}) async {
var postParams = {
"id": adId,
"status": adStatusToUpdate.getIdFromAdPostStatusEnum().toString(),
"comment": comment ?? "",
"comment": "",
};
String token = appState.getUser.data!.accessToken ?? "";
@ -689,25 +261,6 @@ class AdsRepoImp implements AdsRepo {
return Future.value(adsGenericModel);
}
@override
Future<GenericRespModel> createAdExtensionOrder({required int adID, required List<int> specialServiceIds, required int adsDurationId}) async {
var postParams = {
"adsID": adID,
"adsDurationID": adsDurationId,
"specialServiceIDs": specialServiceIds,
};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.adsExtendDurationCreate,
postParams,
token: token,
);
return Future.value(adsGenericModel);
}
@override
Future<GenericRespModel> deleteAd({required int adId}) async {
var postParams = {
@ -726,24 +279,20 @@ class AdsRepoImp implements AdsRepo {
}
@override
Future<GenericRespModel> cancelMyAdReservation({required int adId, required int adsReserveId, required int adsReserveStatus, required String reason}) async {
Future<GenericRespModel> cancelMyAdReservation({required int adId, required int adsReserveStatus, required String reason}) async {
int customerID = AppState().getUser.data!.userInfo!.customerId ?? 0;
var postParams = {
"ID": adsReserveId, // Reserve ID (mandatory as per backend requirement)
"adsID": adId,
"customerID": customerID,
"adsReserveStatus": adsReserveStatus,
"comment": reason,
};
if (!AppState().getIsViewOnly) {
postParams["customerID"] = customerID;
}
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.adsReserveCancelByOwner,
ApiConsts.deleteAd,
postParams,
token: token,
);
@ -757,13 +306,10 @@ class AdsRepoImp implements AdsRepo {
var postParams = {
"adsID": adId,
"customerID": customerID,
"adsReserveStatus": 0,
};
if (!AppState().getIsViewOnly) {
postParams["customerID"] = customerID;
}
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
@ -782,14 +328,14 @@ class AdsRepoImp implements AdsRepo {
required int photoOfficeSlotID,
required int adsSpecialServiceID,
}) async {
String? userId = AppState().getUser.data!.userInfo!.userId ?? "";
int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0;
var postParams = {
"adsID": adId,
"photoOfficeID": photoOfficeID,
"photoOfficeSlotID": photoOfficeSlotID,
"adsSpecialServiceID": adsSpecialServiceID,
"UserID": userId,
"customerID": customerId,
};
String token = appState.getUser.data!.accessToken ?? "";
@ -820,38 +366,19 @@ class AdsRepoImp implements AdsRepo {
var postParams = {
"adsID": adId,
"customerID": customerId,
"detailNote": detailNote,
"receiptImages": receiptImages,
};
if (!AppState().getIsViewOnly) {
postParams["customerID"] = customerId;
}
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.reserveAdPaymentOnDealDoneCreate,
ApiConsts.adsPhotoOfficeAppointmentCreate,
postParams,
token: token,
);
return Future.value(adsGenericModel);
}
@override
Future<List<BuyersChatForAdsModel>> getChatBuyersForAds({required int adsID}) async {
var queryParameters = {"AdsID": adsID.toString()};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getChatBuyersForAds,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
List<BuyersChatForAdsModel> buyersChatListForAds = [];
if (genericRespModel.data != null && genericRespModel.data.length > 0) {
buyersChatListForAds = List.generate(genericRespModel.data.length, (index) => BuyersChatForAdsModel.fromJson(genericRespModel.data[index]));
}
return buyersChatListForAds;
}
}

@ -3,57 +3,43 @@ import 'dart:developer';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class AppointmentRepo {
Future<List<AppointmentListModel>> getMyAppointmentsForProvider(Map<String, dynamic> map);
Future<List<AppointmentListModel>> getMyAppointmentsForProvidersByFilters({
required int branchID,
List<String>? serviceProviderServiceIdsList,
List<String>? customerNamesList,
List<String>? customerPhonesList,
List<String>? deliveryTypeIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
String? fromDate,
String? toDate,
});
Future<List<AppointmentListModel>> getMyAppointmentsForCustomersByFilters({
List<String>? providerIdsList,
List<String>? categoryIdsList,
List<String>? serviceIdsList,
List<String>? itemIdsList,
List<String>? branchIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
List<int>? providerIdsList,
List<int>? categoryIdsList,
List<int>? serviceIdsList,
List<int>? branchIdsList,
});
Future<GenericRespModel> updateAppointmentStatus({required int appointmentId, required AppointmentStatusEnum appointmentStatusEnum});
Future<MResponse> updateAppointmentStatus(Map<String, dynamic> map);
Future<GenericRespModel> updateAppointmentPaymentStatus(Map<String, dynamic> map);
Future<MResponse> updateAppointmentPaymentStatus(Map<String, dynamic> map);
Future<GenericRespModel> getAppointmentSlots({required int branchID, required String fromDate, required String toDate});
Future<MResponse> getAppointmentSlots(Map<String, dynamic> map);
Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map);
Future<MResponse> createMergeAppointment(Map<String, dynamic> map);
Future<Services> getAllServices(String branchId);
Future<GenericRespModel> createSchedule(Map map);
Future<MResponse> createSchedule(Map map);
Future<GenericRespModel> addServicesInSchedule(Map map);
Future<MResponse> addServicesInSchedule(Map map);
Future<GenericRespModel> updateSchedule(Map map);
Future<MResponse> updateSchedule(Map map);
Future<List<ScheduleData>> getSchedules(String branchId);
Future<GenericRespModel> updateServicesInSchedule(Map map);
Future<MResponse> updateServicesInSchedule(Map map);
Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
required List<String> serviceItemIdsForHome,
@ -77,15 +63,15 @@ class AppointmentRepoImp implements AppointmentRepo {
}
@override
Future<GenericRespModel> createSchedule(Map map) async {
Future<MResponse> createSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createSchedule, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t);
}
@override
Future<GenericRespModel> addServicesInSchedule(Map map) async {
Future<MResponse> addServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createGroup, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t);
}
@override
@ -104,41 +90,35 @@ class AppointmentRepoImp implements AppointmentRepo {
}
@override
Future<GenericRespModel> updateSchedule(Map map) async {
Future<MResponse> updateSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateSchedule, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t);
}
@override
Future<GenericRespModel> updateServicesInSchedule(Map map) async {
Future<MResponse> updateServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateGroup, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t);
}
@override
Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
required List<String> serviceItemIdsForHome,
required List<String> serviceItemIdsForWorkshop,
}) async {
String t = appState.getUser.data!.accessToken ?? "";
var queryParameters = [];
if (serviceItemIdsForWorkshop.isNotEmpty) {
queryParameters.add({
var queryParameters = [
// {
// "appointmentType": 2,
// "ServiceItemIDs": serviceItemIdsForHome,
// },
{
"appointmentType": 1,
"ServiceItemIDs": serviceItemIdsForWorkshop,
});
}
if (serviceItemIdsForHome.isNotEmpty) {
queryParameters.add({
"appointmentType": 2,
"ServiceItemIDs": serviceItemIdsForHome,
});
}
}
];
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceItemAppointmentScheduleSlots,
ApiConsts.GetServiceItemAppointmentScheduleSlots,
queryParameters,
token: t,
);
@ -150,51 +130,30 @@ class AppointmentRepoImp implements AppointmentRepo {
return serviceAppointmentScheduleModel;
}
@override
Future<GenericRespModel> createServiceAppointment({required List<ServiceAppointmentScheduleModel> schedules, required int serviceProviderID}) async {
String t = appState.getUser.data!.accessToken ?? "";
int customerId = appState.getUser.data!.userInfo!.customerId ?? 0;
List<Map<String, dynamic>> mapList = [];
for (var schedule in schedules) {
schedules.forEach((schedule) {
List<int> serviceItemIds = [];
for (var service in schedule.servicesListInAppointment!) {
for (var item in service.serviceItems!) {
schedule.servicesListInAppointment!.forEach((service) {
service.serviceItems!.forEach((item) {
serviceItemIds.add(item.id!);
}
}
int slotId = 0;
int index = schedule.selectedCustomTimeDateSlotModel!.availableSlots!.indexWhere((element) => element.isSelected);
if (index == -1) {
index = 0;
}
slotId = schedule.selectedCustomTimeDateSlotModel!.availableSlots![index].slotId;
Map<String, dynamic> appointmentMap = {
"serviceSlotID": slotId,
});
});
mapList.add({
"serviceSlotID": schedule.selectedCustomTimeDateSlotModel!.date!.slotId,
"serviceProviderID": serviceProviderID,
"customerID": customerId,
"serviceItemID": serviceItemIds,
"amountCustomerLocation": schedule.totalLocationCharges.toString(),
"customerLocLat": (schedule.locationInfoModel!.latitude).toString(),
"customerLocLong": (schedule.locationInfoModel!.longitude).toString(),
"customerLocAddress": (schedule.locationInfoModel!.address).toString(),
};
if (!appState.getIsViewOnly) {
appointmentMap["customerID"] = customerId;
}
mapList.add(appointmentMap);
}
});
});
log("maplist: ${mapList.toString()}");
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProvidersAppointmentCreate,
ApiConsts.ServiceProvidersAppointmentCreate,
mapList,
token: t,
);
@ -214,7 +173,7 @@ class AppointmentRepoImp implements AppointmentRepo {
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProviderAppointmentRescheduleCancelAppointment,
ApiConsts.ServiceProviderAppointmentRescheduleCancelAppointment,
payload,
token: t,
);
@ -232,93 +191,65 @@ class AppointmentRepoImp implements AppointmentRepo {
queryParameters: map,
ApiConsts.serviceProvidersAppointmentGet,
);
List<AppointmentListModel> appointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentListModel.fromJson(genericRespModel.data[index]));
return appointmentList;
}
@override
Future<List<AppointmentListModel>> getMyAppointmentsForProvidersByFilters({
required int branchID,
List<String>? serviceProviderServiceIdsList,
List<String>? customerNamesList,
List<String>? customerPhonesList,
List<String>? deliveryTypeIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
String? fromDate,
String? toDate,
}) async {
String t = appState.getUser.data!.accessToken ?? "";
String providerId = appState.getUser.data!.userInfo!.providerId.toString();
var params = {
"ServiceProviderID": providerId.toString(),
"IsSearchFilter": true.toString(),
"ProviderBranchID": branchID.toString(),
"SPServiceIDs": serviceProviderServiceIdsList ?? [],
"CustomerNames": customerNamesList ?? [],
"CustomerMobileNos": customerPhonesList ?? [],
"AppointmentTypes": deliveryTypeIdsList ?? [],
"FromDate": fromDate ?? "",
"DateTo": toDate ?? "",
};
// 0 means "all branches" (e.g. the home dashboard carousel) -- omit the key entirely
// rather than sending "0", since branch IDs are real backend records starting at 1
// and "0" likely just doesn't match any branch, returning an empty result.
if (appointmentStatusEnum != null) {
params.addAll({"AppointmentStatusID": appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString()});
}
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: t,
(json) => GenericRespModel.fromJson(json),
queryParameters: params,
ApiConsts.serviceProvidersAppointmentGet,
);
List<AppointmentListModel> appointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentListModel.fromJson(genericRespModel.data[index]));
List<AppointmentListModel> appointmentList = await List.generate(genericRespModel.data.length, (index) => AppointmentListModel.fromJson(genericRespModel.data[index]));
return appointmentList;
}
@override
Future<List<AppointmentListModel>> getMyAppointmentsForCustomersByFilters({
List<String>? providerIdsList,
List<String>? categoryIdsList,
List<String>? serviceIdsList,
List<String>? itemIdsList,
List<String>? branchIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
List<int>? providerIdsList,
List<int>? categoryIdsList,
List<int>? serviceIdsList,
List<int>? branchIdsList,
}) async {
var params = <String, dynamic>{
"ServiceProviderIDs": providerIdsList ?? [],
"ProviderBranchIDs": branchIdsList ?? [],
"ServiceIDs": serviceIdsList ?? [],
"ServiceItemIDs": itemIdsList ?? [],
"CategoryIDs": categoryIdsList ?? [],
};
if (!appState.getIsViewOnly) {
params["customerID"] = appState.getUser.data!.userInfo!.customerId.toString();
List<String> providerIds = [];
if (providerIdsList != null) {
for (var element in providerIdsList) {
providerIds.add(element.toString());
}
}
if (appointmentStatusEnum != null) {
params["AppointmentStatusID"] = appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString();
List<String> categoryIds = [];
if (categoryIdsList != null) {
for (var element in categoryIdsList) {
categoryIds.add(element.toString());
}
}
List<String> serviceIds = [];
if (serviceIdsList != null) {
for (var element in serviceIdsList) {
serviceIds.add(element.toString());
}
}
List<String> branchIds = [];
if (branchIdsList != null) {
for (var element in branchIdsList) {
branchIds.add(element.toString());
}
}
var params = {
"customerID": appState.getUser.data!.userInfo!.customerId.toString(),
"ServiceProviderIDs": providerIds,
"ProviderBranchIDs": categoryIds,
"ServiceIDs": serviceIds,
"CategoryIDs": categoryIds,
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
queryParameters: params,
ApiConsts.customersAppointmentGetByFilters,
);
List<AppointmentListModel> appointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentListModel.fromJson(genericRespModel.data[index]));
return appointmentList;
}
@override
Future<GenericRespModel> getAppointmentSlots({required int branchID, required String fromDate, required String toDate}) async {
Future<MResponse> getAppointmentSlots(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? "";
final map = {"ProviderBranchID": branchID.toString(), "FromDate": fromDate, "ToDate": toDate};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
MResponse adsGenericModel = await apiClient.getJsonForObject(
(json) => MResponse.fromJson(json),
ApiConsts.getAppointmentSlots,
token: t,
queryParameters: map,
@ -328,24 +259,20 @@ class AppointmentRepoImp implements AppointmentRepo {
}
@override
Future<GenericRespModel> updateAppointmentPaymentStatus(Map<String, dynamic> map) async {
Future<MResponse> updateAppointmentPaymentStatus(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateAppointmentPaymentStatus, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateAppointmentPaymentStatus, map, token: t);
}
@override
Future<GenericRespModel> updateAppointmentStatus({required int appointmentId, required AppointmentStatusEnum appointmentStatusEnum}) async {
Future<MResponse> updateAppointmentStatus(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? "";
var params = {
"appointmentID": appointmentId.toString(),
"appointmentStatusID": appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString(),
};
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateAppointmentStatus, params, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateAppointmentStatus, map, token: t);
}
@override
Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map) async {
Future<MResponse> createMergeAppointment(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createMergeAppointment, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createMergeAppointment, map, token: t);
}
}

@ -1,15 +1,14 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/appointments_models/appointment_basic_detail_model.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_review_model.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/branch.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/document.dart';
@ -17,37 +16,11 @@ import 'package:mc_common_app/models/provider_branches_models/profile/services.d
import 'package:mc_common_app/models/provider_branches_models/provider_model.dart';
import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class BranchRepo {
Future<GenericRespModel> createBranch({
required String branchName,
required String branchDescription,
required int cityId,
required String address,
required String openTime,
required String closeTime,
required double latitude,
required double longitude,
required List<BranchPostingImages> imagesList,
});
Future<GenericRespModel> updateBranch({
required int branchId,
required String branchName,
required String branchDescription,
required String openTime,
required String closeTime,
required int cityId,
required String address,
required String latitude,
required String longitude,
required List<BranchPostingImages> imagesList,
bool isNeedToDelete = true,
});
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude);
Future<GenericRespModel> deleteBranch({required int branchId});
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true});
Future<Branch> fetchAllBranches();
@ -57,47 +30,39 @@ abstract class BranchRepo {
Future<Services> fetchProviderServices(String branchID, String serviceCategoryId);
Future<List<ServiceModel>> fetchProviderServicesModelByCategoryIdAndBranchID(String branchID, String serviceCategoryId);
Future<GenericRespModel> createNewService(List<Map<String, dynamic>> map);
Future<MResponse> createNewService(List<Map<String, dynamic>> map);
Future<Document> getServiceProviderDocument(dynamic userId);
Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
Future<ProviderModel> getBranchAndServices();
Future<List<ProviderBasicDataModel>> getAllProvidersWitheBasicData();
Future<GenericRespModel> createService(List<Map<String, dynamic>> map);
Future<MResponse> createService(List<Map<String, dynamic>> map);
Future<GenericRespModel> updateService(List<Map<String, dynamic>> map);
Future<MResponse> updateService(List<Map<String, dynamic>> map);
Future<GenericRespModel> updateServiceStatus({required int branchId, required List<int> serviceIds, required ServiceStatusEnum serviceStatusEnum});
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId);
Future<GenericRespModel> updateCategoryStatus({required int branchId, required int categoryId, required ServiceStatusEnum serviceStatusEnum});
Future<MResponse> duplicateItems(Map<String, dynamic> map);
Future<List<AppointmentBasicDetailsModel>> getAppointmentsByCategoryOrService({required int branchId, required int categoryId, required int serviceId});
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map);
Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId);
Future<MResponse> getBranchUsers(Map<String, dynamic> map);
Future<GenericRespModel> duplicateItems({required String providerBranchID, required List<int> items});
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map);
Future<GenericRespModel> getAllProviderDealers(Map<String, dynamic> map);
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map);
Future<GenericRespModel> getBranchUsers(Map<String, dynamic> map);
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map);
Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map);
Future<List<BranchDetailModel>> getAllNearBranchAndServices();
Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map);
Future<List<ItemData>> getServiceItems(int serviceId);
Future<GenericRespModel> addNewServicesInAppointment(Map<String, dynamic> map);
Future<List<BranchDetailModel>> getAllNearBranchAndServices({required double latitude, required double longitude});
Future<List<ItemData>> getServiceItems({required int serviceId});
Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId, {double? latitude, double? longitude});
Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId);
Future<List<BranchDetailModel>> getBranchesByFilters({
List<int>? providerIdsList,
@ -108,18 +73,6 @@ abstract class BranchRepo {
double? latitude,
double? longitude,
});
Future<List<BranchDetailModel>> getMyRecentBranchesWithServices();
Future<List<BranchRatingModel>> getBranchRatings({required int serviceProviderBranchID});
Future<GenericRespModel> submitBranchRatings({required int serviceProviderBranchID, required String title, required String review, required double ratingNo});
Future<GenericRespModel> addProviderToFavourite({required int providerID});
Future<GenericRespModel> removeProviderFromFavourite({required int providerID});
Future<List<ProviderProfileModel>> getMyFavoriteProviders();
}
class BranchRepoImp implements BranchRepo {
@ -127,70 +80,46 @@ class BranchRepoImp implements BranchRepo {
AppState appState = injector.get<AppState>();
@override
Future<GenericRespModel> createBranch({
required String branchName,
required String branchDescription,
required int cityId,
required String address,
required String openTime,
required String closeTime,
required double latitude,
required double longitude,
required List<BranchPostingImages> imagesList,
}) async {
List serviceProviderBranchImages = [];
for (var element in imagesList) {
var imageMap = {
"id": element.id ?? 0,
"imageName": element.imageName,
"imageUrl": element.imageUrl,
"imageStr": element.imageStr,
};
serviceProviderBranchImages.add(imageMap);
}
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
var postParams = {
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName,
"branchDescription": branchDescription,
"cityID": cityId.toString(),
"cityID": cityId,
"address": address,
"openTime": openTime,
"closeTime": closeTime,
"latitude": latitude,
"longitude": longitude,
"isActive": true,
"serviceProviderBranchImages": serviceProviderBranchImages,
"isActive": true
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
}
@override
Future<Branch> fetchAllBranches() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => Branch.fromJson(json), ApiConsts.serviceProviderBranchGet, queryParameters: postParams, token: t);
return await apiClient.getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t);
}
@override
Future<Category> fetchBranchCategory() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => Category.fromJson(json), ApiConsts.serviceCategoryGet, queryParameters: postParams, token: t);
return await apiClient.getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t);
}
@override
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async {
var postParams = {"ServiceCategoryID": serviceCategoryId.toString()};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.servicesGet, queryParameters: serviceCategoryId.toString() != "-1" ? postParams : null, token: t);
return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: serviceCategoryId.toString() != "-1" ? postParams : null, token: t);
}
@override
Future<GenericRespModel> createNewService(List<Map<String, dynamic>> map) async {
Future<MResponse> createNewService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
}
@override
@ -202,11 +131,11 @@ class BranchRepoImp implements BranchRepo {
debugPrint(token);
return await injector
.get<ApiClient>()
.getJsonForObject((json) => Document.fromJson(json), ApiConsts.fetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
.getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
}
@override
Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
List<Map<String, dynamic>> map = [];
for (int i = 0; i < documents!.length; i++) {
if (documents[i].document != null) {
@ -216,21 +145,20 @@ class BranchRepoImp implements BranchRepo {
"documentID": documents[i].documentId,
"documentExt": documents[i].fileExt,
"documentImage": documents[i].document,
"isActive": true,
"dateExpire": documents[i].dateExpire,
"isActive": true
};
map.add(postParams);
}
}
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderDocumentUpdate, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t);
}
@override
Future<ProviderModel> getBranchAndServices() async {
var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => ProviderModel.fromJson(json), ApiConsts.branchesAndServices, queryParameters: postParams, token: t);
return await apiClient.getJsonForObject((json) => ProviderModel.fromJson(json), ApiConsts.BranchesAndServices, queryParameters: postParams, token: t);
}
@override
@ -247,179 +175,78 @@ class BranchRepoImp implements BranchRepo {
}
@override
Future<GenericRespModel> updateBranch({
required int branchId,
required String branchName,
required String branchDescription,
required String openTime,
required String closeTime,
required int cityId,
required String address,
required String latitude,
required String longitude,
required List<BranchPostingImages> imagesList,
bool isNeedToDelete = true,
}) async {
List serviceProviderBranchImages = [];
for (var element in imagesList) {
var imageMap = {
"id": element.id ?? 0,
"imageName": element.imageName,
"imageUrl": element.imageUrl,
"imageStr": element.imageStr,
};
serviceProviderBranchImages.add(imageMap);
}
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async {
String lat = "0", long = "0";
try {
lat = latitude.toString().substring(0, 9);
long = longitude.toString().substring(0, 9);
lat = latitude.substring(0, 9);
long = longitude.substring(0, 9);
} catch (e) {}
var postParams = {
"id": branchId,
"id": id,
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName,
"branchDescription": branchDescription,
"openTime": openTime,
"closeTime": closeTime,
"cityID": cityId,
"address": address,
"latitude": lat,
"longitude": long,
"serviceProviderBranchImages": serviceProviderBranchImages,
"isActive": isNeedToDelete
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t);
}
@override
Future<GenericRespModel> deleteBranch({required int branchId}) async {
var postParams = {
"id": branchId,
};
Future<MResponse> createService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.deleteProviderBranch, postParams, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t);
}
@override
Future<GenericRespModel> createService(List<Map<String, dynamic>> map) async {
Future<MResponse> updateService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Update, map, token: t);
}
@override
Future<GenericRespModel> updateService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t);
}
@override
Future<GenericRespModel> updateServiceStatus({required int branchId, required List<int> serviceIds, required ServiceStatusEnum serviceStatusEnum}) async {
List<String> ids = [];
for (var id in serviceIds) {
ids.add(id.toString());
}
int providerID = AppState().getUser.data!.userInfo!.providerId;
var map = {
"ServiceProviderID": providerID.toString(),
"ProviderBranchID": branchId.toString(),
"ProviderServiceIDs": ids,
"Status": serviceStatusEnum.getIdFromServiceStatusEnum().toString(),
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceStatusUpdate, queryParameters: map, token: t);
}
@override
Future<GenericRespModel> updateCategoryStatus({required int branchId, required int categoryId, required ServiceStatusEnum serviceStatusEnum}) async {
int providerID = AppState().getUser.data!.userInfo!.providerId;
var map = {
"ServiceProviderID": providerID.toString(),
"ProviderBranchID": branchId.toString(),
"ServiceCategoryID": categoryId.toString(),
"Status": serviceStatusEnum.getIdFromServiceStatusEnum().toString(),
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceStatusUpdate, queryParameters: map, token: t);
}
@override
Future<List<AppointmentBasicDetailsModel>> getAppointmentsByCategoryOrService({required int branchId, required int categoryId, required int serviceId}) async {
var map = {
"ProviderBranchID": branchId.toString(),
};
if (serviceId != -1) {
map.addAll({
"ServiceProviderServiceID": serviceId.toString(),
});
}
if (categoryId != -1) {
map.addAll({
"ServiceProviderServiceID": serviceId.toString(),
});
}
String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProviderAppointmentGetByCategoryOrService,
queryParameters: map,
token: t,
);
List<AppointmentBasicDetailsModel> basicAppointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentBasicDetailsModel.fromJson(genericRespModel.data[index]));
return basicAppointmentList;
}
@override
Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
var postParams = {
"ProviderBranchIDExisted": oldBranchId.toString(),
"ProviderBranchIDNew": newBranchId.toString(),
"CategoryID": categoryId.toString(),
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t);
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t);
}
@override
Future<GenericRespModel> duplicateItems({required String providerBranchID, required List<int> items}) async {
Future<MResponse> duplicateItems(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
Map<String, dynamic> map = {
"providerBranchID": providerBranchID,
"serviceItems": items,
};
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.duplicateItems, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.duplicateItems, map, token: t);
}
@override
Future<GenericRespModel> getAllProviderDealers(Map<String, dynamic> map) async {
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t);
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t);
}
@override
Future<GenericRespModel> getBranchUsers(Map<String, dynamic> map) async {
Future<MResponse> getBranchUsers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t);
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t);
}
@override
Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map) async {
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t);
}
@override
Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map) async {
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t);
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t);
}
@override
@ -429,68 +256,25 @@ class BranchRepoImp implements BranchRepo {
"ProviderBranchID": branchID,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.getProviderServices, queryParameters: postParams, token: t);
debugPrint("token " + t);
return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.GetProviderServices, queryParameters: postParams, token: t);
}
@override
Future<List<ServiceModel>> fetchProviderServicesModelByCategoryIdAndBranchID(String branchID, String serviceCategoryId) async {
var queryParameters = {
"ID": branchID,
"ServiceCategoryIDs": [serviceCategoryId],
};
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAllNearBranches,
token: appState.getUser.data!.accessToken,
queryParameters: queryParameters,
);
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
if (nearBranches.isNotEmpty) {
List<ServiceModel> services = nearBranches.first.branchServices ?? [];
return services;
}
return [];
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.AddNewServicesInAppointment, map, token: t);
}
@override
Future<GenericRespModel> addNewServicesInAppointment(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.addNewServicesInAppointment, map, token: t);
}
@override
Future<List<BranchDetailModel>> getAllNearBranchAndServices({required double latitude, required double longitude}) async {
var queryParameters = {
"isActive": "true",
"Status": "3",
"latitude": latitude.toString(),
"longitude": longitude.toString(),
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAllNearBranches,
token: appState.getUser.data!.accessToken,
queryParameters: queryParameters,
);
Future<List<BranchDetailModel>> getAllNearBranchAndServices() async {
GenericRespModel adsGenericModel = await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.GetAllNearBranches, token: appState.getUser.data!.accessToken);
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return nearBranches;
}
@override
Future<List<BranchDetailModel>> getMyRecentBranchesWithServices() async {
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getMyRecentBranches,
token: appState.getUser.data!.accessToken,
);
List<BranchDetailModel> recentBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return recentBranches;
}
@override
Future<List<ItemData>> getServiceItems({required int serviceId}) async {
Future<List<ItemData>> getServiceItems(int serviceId) async {
var queryParameters = {
"ServiceProviderServiceID": serviceId.toString(),
};
@ -499,25 +283,18 @@ class BranchRepoImp implements BranchRepo {
(json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceItems,
token: appState.getUser.data!.accessToken,
queryParameters: serviceId.toString() != "-1" ? queryParameters : null,
queryParameters: queryParameters,
);
List<ItemData> serviceItems = List.generate(adsGenericModel.data.length, (index) => ItemData.fromJson(adsGenericModel.data[index]));
return serviceItems;
}
@override
Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId, {double? latitude, double? longitude}) async {
var postParams = {
"serviceProviderID": providerId.toString(),
};
if (latitude != null && longitude != null) {
postParams.addAll({"Longitude": "$longitude"});
postParams.addAll({"Latitude": "$latitude"});
}
Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId) async {
var postParams = {"serviceProviderID": providerId.toString()};
GenericRespModel adsGenericModel =
await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.branchesAndServices, token: appState.getUser.data!.accessToken, queryParameters: postParams);
print("branchesAndServices response ===== ${adsGenericModel.data}");
await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.BranchesAndServices, token: appState.getUser.data!.accessToken, queryParameters: postParams);
return ProviderProfileModel.fromJson(adsGenericModel.data);
}
@ -557,99 +334,15 @@ class BranchRepoImp implements BranchRepo {
"Rating": "${rating ?? 0}",
"Latitude": latitude.toString(),
"Longitude": longitude.toString(),
"Status": "3",
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAllNearBranches,
ApiConsts.GetAllNearBranches,
token: appState.getUser.data!.accessToken,
queryParameters: postParams,
);
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return nearBranches;
}
@override
Future<List<BranchRatingModel>> getBranchRatings({required int serviceProviderBranchID}) async {
var postParams = {"ServiceProviderBranchID": serviceProviderBranchID.toString()};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getBranchRatings,
token: appState.getUser.data!.accessToken,
queryParameters: postParams,
);
List<BranchRatingModel> branchRatings = List.generate(adsGenericModel.data.length, (index) => BranchRatingModel.fromJson(adsGenericModel.data[index]));
return branchRatings;
}
@override
Future<GenericRespModel> submitBranchRatings({required int serviceProviderBranchID, required String title, required String review, required double ratingNo}) async {
final customerID = appState.getUser.data!.userInfo!.customerId;
final parameters = {"title": title, "review": review, "ratNo": ratingNo, "serviceProviderBranchID": serviceProviderBranchID};
if (!appState.getIsViewOnly) {
parameters["customerID"] = "$customerID";
}
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.createBranchRatings,
parameters,
token: appState.getUser.data!.accessToken,
);
return adsGenericModel;
}
@override
Future<GenericRespModel> addProviderToFavourite({required int providerID}) async {
final customerID = appState.getUser.data!.userInfo!.customerId;
final parameters = {
"providerID": providerID.toString(),
};
if (!appState.getIsViewOnly) {
parameters["customerID"] = customerID.toString();
}
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.favouriteServiceProviderCreate,
parameters,
token: appState.getUser.data!.accessToken,
);
return adsGenericModel;
}
@override
Future<GenericRespModel> removeProviderFromFavourite({required int providerID}) async {
final parameters = {"id": providerID.toString()};
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.unFavouriteServiceProvider,
parameters,
token: appState.getUser.data!.accessToken,
);
return adsGenericModel;
}
@override
Future<List<ProviderProfileModel>> getMyFavoriteProviders() async {
final customerID = appState.getUser.data!.userInfo!.customerId;
var postParams = <String, dynamic>{};
if (!appState.getIsViewOnly) {
postParams["customerID"] = customerID.toString();
}
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.favouriteServiceProviderGet,
token: appState.getUser.data!.accessToken,
queryParameters: postParams.isNotEmpty ? postParams : null,
);
List<ProviderProfileModel> favProviders = List.generate(adsGenericModel.data.length, (index) => ProviderProfileModel.fromJson(adsGenericModel.data[index]));
return favProviders;
}
}

@ -4,44 +4,18 @@ import 'package:http/io_client.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:signalr_core/signalr_core.dart';
abstract class ChatRepo {
Future<HubConnection> getHubConnection();
Future<bool> markMessageAsRead({required List<int> messageIds, required ChatTypeEnum chatTypeEnum});
Future<void> markMessageAsRead({required int messageId});
Future<List<ChatMessageModel>> getUsersChatMessagesForRequests({
required int providerId,
required int customerId,
required int requestOfferId,
required int requestId,
int pageIndex = 0,
int pageSize = 0,
});
Future<List<ChatMessageModel>> getUsersChatMessagesForAds({
String? userID,
int? adID,
int? adsChatBuyerId,
required bool isForBuyer,
int pageIndex = 0,
int pageSize = 0,
});
Future<List<ChatMessageModel>> getUsersChatMessagesForGeneralChat({
String? userID,
int? adID,
int? adsChatBuyerId,
required bool isForBuyer,
int pageIndex = 0,
int pageSize = 0,
});
Future<List<ChatMessageModel>> getUsersChatMessages({required int providerId, required int customerId, required int requestOfferId, required int requestId, int pageIndex = 0, int pageSize = 0});
}
class ChatRepoImp implements ChatRepo {
@ -51,7 +25,7 @@ class ChatRepoImp implements ChatRepo {
@override
Future<HubConnection> getHubConnection() async {
final userId = AppState().getUser.data!.userInfo!.userId ?? "";
final hubUrl = "${ApiConsts.signalRUrl}?userID=$userId";
final hubUrl = "https://ms.hmg.com/McHub?userID=$userId";
logger.i("Connecting with Hub ($hubUrl)");
HubConnection hub;
@ -62,42 +36,26 @@ class ChatRepoImp implements ChatRepo {
client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true),
logging: (level, message) {},
))
.withAutomaticReconnect()
.build();
return hub;
}
@override
Future<bool> markMessageAsRead({required List<int> messageIds, required ChatTypeEnum chatTypeEnum}) async {
String url = "";
if (chatTypeEnum == ChatTypeEnum.ads) {
url = ApiConsts.messageIsReadUpdateForAds;
} else if (chatTypeEnum == ChatTypeEnum.requestOffer) {
url = ApiConsts.messageIsReadUpdateForRequests;
} else if (chatTypeEnum == ChatTypeEnum.general) {
url = ApiConsts.messageIsReadUpdateForRequests;
}
var queryParameters = {"iDs": messageIds};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
Future<void> markMessageAsRead({required int messageId}) async {
var queryParameters = {
"id": messageId.toString(),
};
await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
url,
ApiConsts.messageIsReadUpdate,
queryParameters,
token: appState.getUser.data!.accessToken,
);
return genericRespModel.message == "";
}
@override
Future<List<ChatMessageModel>> getUsersChatMessagesForRequests({
required int providerId,
required int customerId,
required int requestOfferId,
required int requestId,
int pageIndex = 0,
int pageSize = 0,
}) async {
Future<List<ChatMessageModel>> getUsersChatMessages(
{required int providerId, required int customerId, required int requestOfferId, required int requestId, int pageIndex = 0, int pageSize = 0}) async {
var queryParameters = {
"ReqOfferID": requestOfferId.toString(),
"RequestID": requestId.toString(),
@ -108,75 +66,7 @@ class ChatRepoImp implements ChatRepo {
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getChatMessagesForRequests,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
if (genericRespModel.messageStatus == 1 && genericRespModel.data != null) {
List<ChatMessageModel> chatMessages = List.generate(
genericRespModel.data.length,
(index) => ChatMessageModel.fromJson(genericRespModel.data[index]),
);
return chatMessages;
}
return [];
}
@override
Future<List<ChatMessageModel>> getUsersChatMessagesForAds({String? userID, int? adID, int? adsChatBuyerId, required bool isForBuyer, int pageIndex = 0, int pageSize = 0}) async {
var parameterForBuyer = {
"UserID": userID.toString(),
"AdsID": adID.toString(),
"IsAdsBuyer": isForBuyer.toString(),
"PageSize": pageSize.toString(),
"PageIndex": pageIndex.toString(),
};
var parameterForSeller = {
"AdsChatBuyerID": adsChatBuyerId.toString(),
"IsAdsBuyer": isForBuyer.toString(),
"PageSize": pageSize.toString(),
"PageIndex": pageIndex.toString(),
};
var queryParameters = isForBuyer ? parameterForBuyer : parameterForSeller;
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getChatMessagesForAds,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
if (genericRespModel.messageStatus == 1 && genericRespModel.data != null) {
List<ChatMessageModel> chatMessages = List.generate(
genericRespModel.data.length,
(index) => ChatMessageModel.fromJson(genericRespModel.data[index]),
);
return chatMessages;
}
return [];
}
@override
Future<List<ChatMessageModel>> getUsersChatMessagesForGeneralChat({String? userID, int? adID, int? adsChatBuyerId, required bool isForBuyer, int pageIndex = 0, int pageSize = 0}) async {
var parameterForBuyer = {
"UserID": userID.toString(),
"AdsID": adID.toString(),
"IsAdsBuyer": isForBuyer.toString(),
"PageSize": pageSize.toString(),
"PageIndex": pageIndex.toString(),
};
var parameterForSeller = {
"AdsChatBuyerID": adsChatBuyerId.toString(),
"IsAdsBuyer": isForBuyer.toString(),
"PageSize": pageSize.toString(),
"PageIndex": pageIndex.toString(),
};
var queryParameters = isForBuyer ? parameterForBuyer : parameterForSeller;
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getChatMessagesForAds,
ApiConsts.getChatMessages,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);

@ -1,18 +1,16 @@
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/advertisment_models/ss_car_check_schedule_model.dart';
import 'package:mc_common_app/models/advertisment_models/ss_photo_schedule_model.dart';
import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/general_models/enums_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/provider_branches_models/provider_contact_info_model.dart';
import 'package:mc_common_app/models/user_models/cities.dart';
import 'package:mc_common_app/models/user_models/country.dart';
import 'package:mc_common_app/models/user_models/role.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class CommonRepo {
Future<Country> getAllCountries();
@ -47,18 +45,15 @@ abstract class CommonRepo {
Future<Role> getRoles();
Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long});
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long, required int cityID});
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long});
//TODO: Needs to remove common methods from AD's repo and delete all repeated methods.
Future<VehicleDetailsModel> getVehicleDetails({int? vehicleTypeId, int? vehicleBrandId});
Future<List<EnumsModel>> getEnumTypeValues({int? enumTypeID, String? enumTypeName});
Future<GenericRespModel> createComplainFromProvider({required int customerId, required String comment, required int complainType});
Future<ProviderContactInfoModel> getProvidersContactInfo({required int providerId});
}
class CommonRepoImp implements CommonRepo {
@ -67,7 +62,7 @@ class CommonRepoImp implements CommonRepo {
@override
Future<Country> getAllCountries() async {
return await apiClient.getJsonForObject((json) => Country.fromJson(json), ApiConsts.getAllCountry);
return await apiClient.getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
}
@override
@ -75,14 +70,16 @@ class CommonRepoImp implements CommonRepo {
var postParams = {
"CountryID": countryId,
};
return await apiClient.getJsonForObject((json) => Cities.fromJson(json), ApiConsts.getAllCities, queryParameters: postParams);
return await apiClient.getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
}
@override
Future<Role> getRoles() async {
return await apiClient.getJsonForObject((json) => Role.fromJson(json), ApiConsts.getProviderRoles);
return await apiClient.getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
}
@override
Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long}) async {
var params = {
@ -100,11 +97,10 @@ class CommonRepoImp implements CommonRepo {
}
@override
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long, required int cityID}) async {
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long}) async {
var params = {
"Latitude": lat.toString(),
"Longitude": long.toString(),
"cityID": cityID.toString(),
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
@ -128,33 +124,6 @@ class CommonRepoImp implements CommonRepo {
@override
Future<List<EnumsModel>> getEnumTypeValues({int? enumTypeID, String? enumTypeName}) async {
if (enumTypeID == -1) {
// This is for the vehicle type condition (old, new) which will be added to API later
final Map<String, dynamic> json = {
"data": [
{"id": 1, "enumTypeID": 0, "enumValueStr": "New", "enumValue": 1, "isActive": true},
{"id": 2, "enumTypeID": 0, "enumValueStr": "Used", "enumValue": 2, "isActive": true},
],
};
List<EnumsModel> enums = List.generate((json['data'] as List).length, (index) => EnumsModel.fromJson(json['data'][index]));
return enums;
}
if (enumTypeID == -2) {
// This is for the ShippingRequestStatus which will be added to API later
final Map<String, dynamic> json = {
"data": [
{"id": 1, "enumTypeID": 0, "enumValueStr": "Initiated", "enumValue": 1, "isActive": true},
{"id": 2, "enumTypeID": 0, "enumValueStr": "In Transit", "enumValue": 2, "isActive": true},
{"id": 3, "enumTypeID": 0, "enumValueStr": "Out for Delivery", "enumValue": 3, "isActive": true},
{"id": 4, "enumTypeID": 0, "enumValueStr": "Delivered", "enumValue": 4, "isActive": true},
],
};
List<EnumsModel> enums = List.generate((json['data'] as List).length, (index) => EnumsModel.fromJson(json['data'][index]));
return enums;
}
var postParams = {"enumTypeID": (enumTypeID ?? 0).toString(), "enumTypeName": enumTypeName ?? ""};
GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
@ -257,7 +226,7 @@ class CommonRepoImp implements CommonRepo {
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.vehicleModelGet,
queryParameters: vehicleTypeId != -1 ? postParams : null,
queryParameters: postParams,
);
List<VehicleModel> vehicleModels = List.generate(adsGenericModel.data.length, (index) => VehicleModel.fromJson(adsGenericModel.data[index]));
return vehicleModels;
@ -349,36 +318,22 @@ class CommonRepoImp implements CommonRepo {
return vehicleParts;
}
@override
Future<GenericRespModel> createComplainFromProvider({required int customerId, required String comment, required int complainType}) async {
final providerId = appState.getUser.data!.userInfo!.providerId;
final parameters = {
"serviceProviderID": providerId,
"customerID": customerId,
"detail": comment,
"complaintType": complainType,
};
GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.providerComplaintCreate,
parameters,
token: appState.getUser.data!.accessToken,
);
return adsGenericModel;
}
@override
Future<ProviderContactInfoModel> getProvidersContactInfo({required int providerId}) async {
final parameters = {
"ProviderID": providerId.toString(),
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.provideContactInfoGet,
queryParameters: parameters,
);
ProviderContactInfoModel contactInfoModel = ProviderContactInfoModel.fromJson(adsGenericModel.data);
return contactInfoModel;
}
//
// @override
// Future<List<ProviderCategoryModel>> getProviderServiceCategories() async {
// GenericRespModel adsGenericModel = await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.serviceCategoryGet);
// List<ProviderCategoryModel> providerCategories = List.generate(adsGenericModel.data.length, (index) => ProviderCategoryModel.fromJson(adsGenericModel.data[index]));
// return providerCategories;
// }
// @override
// Future<List<ProviderServiceModel>> getProviderServices({required int categoryId}) async {
// var postParams = {
// "ServiceCategoryID": categoryId.toString(),
// };
// GenericRespModel adsGenericModel =
// await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.serviceCategoryGet, queryParameters: postParams);
// List<ProviderServiceModel> providerServices = List.generate(adsGenericModel.data.length, (index) => ProviderServiceModel.fromJson(adsGenericModel.data[index]));
// return providerServices;
// }
}

@ -3,24 +3,25 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
abstract class ItemsRepo {
Future<GenericRespModel> createServiceItems(Map map);
Future<MResponse> createServiceItems(Map map);
Future<ItemModel> getServiceItems(int serviceId);
Future<GenericRespModel> updateServiceItem(Map map);
Future<MResponse> updateServiceItem(Map map);
}
class ItemsRepoImp implements ItemsRepo {
@override
Future<GenericRespModel> createServiceItems(Map map) async {
Future<MResponse> createServiceItems(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createItems, map, token: t);
debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createItems, map, token: t);
}
@override
@ -29,15 +30,17 @@ class ItemsRepoImp implements ItemsRepo {
"ServiceProviderServiceID": serviceId.toString(),
};
String? token = AppState().getUser.data?.accessToken;
debugPrint(token);
return await injector
.get<ApiClient>()
.getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
}
@override
Future<GenericRespModel> updateServiceItem(Map map) async {
Future<MResponse> updateServiceItem(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateServiceItem, map, token: t);
debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateServiceItem, map, token: t);
}
}

@ -1,16 +1,12 @@
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/payment_models/pay_order_detail_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class PaymentsRepo {
Future<bool> verifyPayment({required int paymentTypeId, required int id, bool isForAppointments = false, List<int>? appointmentIds});
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentTypeId, required int adId});
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentId, required int adId});
}
class PaymentsRepoImp implements PaymentsRepo {
@ -18,67 +14,9 @@ class PaymentsRepoImp implements PaymentsRepo {
AppState appState = injector.get<AppState>();
@override
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentTypeId, required int adId}) async {
var queryParameters = {
"AdsID": adId.toString(),
"PaymentType": paymentTypeId.toString(),
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
queryParameters: queryParameters,
(json) => GenericRespModel.fromJson(json),
ApiConsts.payForOrderDetailGet,
);
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentId, required int adId}) async {
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.payForOrderDetailGet);
PayOrderDetailRespModel payOrderDetailRespModel = PayOrderDetailRespModel.fromJson(adsGenericModel.data);
return payOrderDetailRespModel;
}
String getKeyByPaymentType({required int paymentType}) {
PaymentTypes paymentTypeEnum = paymentType.getPaymentTypeFromId();
switch (paymentTypeEnum) {
case PaymentTypes.subscription:
return "SubscriptionAppliedID";
case PaymentTypes.appointment:
case PaymentTypes.partialAppointment:
return "appointmentIds";
case PaymentTypes.ads:
case PaymentTypes.adReserve:
case PaymentTypes.extendAds:
return "AdsID";
case PaymentTypes.request:
return "RequestID";
}
}
@override
Future<bool> verifyPayment({required int paymentTypeId, required int id, bool isForAppointments = false, List<int>? appointmentIds}) async {
Map<String, dynamic> queryParameters = {
"ID": id.toString(),
"PaymentType": paymentTypeId.toString(),
};
if (isForAppointments) {
List<String> ids = [];
if (appointmentIds != null) {
for (var element in appointmentIds) {
ids.add(element.toString());
}
}
queryParameters.removeWhere((key, value) => key == "ID");
queryParameters.addAll({"IDs": ids});
}
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
queryParameters: queryParameters,
(json) => GenericRespModel.fromJson(json),
ApiConsts.payForOrderIsPaidGet,
);
if (adsGenericModel.data == null) {
return false;
}
bool isPaid = adsGenericModel.data['isPaid'] ?? false;
return isPaid;
}
}

@ -1,80 +1,24 @@
import 'dart:developer';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/requests_models/offers_unread_chat_model.dart';
import 'package:mc_common_app/models/requests_models/offers_model.dart';
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
import 'package:mc_common_app/models/requests_models/providers_offers_chat_model.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class RequestRepo {
Future<GenericRespModel> createRequest({
required int requestTypeId,
required int vehicleTypeId,
required String brand,
required String model,
required String year,
required int conditionType,
required int countryID,
required int cityID,
required String price,
required String description,
required String address,
required bool isSpecialServiceNeeded,
required List requestImages,
});
Future<List<ProviderOffersChatsModel>> getOffersChatByProvider({int requestId = 0, required int serviceProviderId});
Future<GenericRespModel> createRequest(Map<String, dynamic> map);
Future<OffersUnreadChatModel> getOffersChatsUnreadList({required String userId});
Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0});
Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId});
Future<List<RequestModel>> getRequests({required int providerOrCustomerID});
Future<List<RequestModel>> getRequestsBasedOnFilters({
required int requestTypeId,
int requestId = 0,
int requestStatusId = 0,
int reqOfferStatus = 0,
int? cityId = 0,
int? vehicleYearId = 0,
String? vehicleModel = "",
String? vehicleBrand = "",
String? requestedDate = "",
int? conditionId = 0,
int pageIndex = 0,
int pageSize = 100,
});
Future<List<RequestModel>> getServiceRequestsForProviders({required int serviceProviderID});
Future<GenericRespModel> updateRequestStatus({required RequestStatusEnum requestStatusEnum, required int requestId});
Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams);
Future<GenericRespModel> updateRequestOfferStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId, required String comments});
Future<GenericRespModel> updateRequestDeliveryOptionByCustomer({required int requestID, required int requestOfferId, required RequestDeliveryOptionEnum deliveryOptionEnum});
Future<GenericRespModel> updateRequestOfferFromProvider({
required String message,
required int requestId,
required int offerId,
required String offerPrice,
required bool isDeliveryAvailable,
required int offerDeliveryOption,
required String serviceItemName,
required String manufacturedByName,
required String manufacturedOn,
required List requestImages,
required RequestOfferStatusEnum requestOfferStatusEnum,
});
Future<GenericRespModel> updateRequestAdditionalAddress({required int requestID, required String additionalAddress});
Future<GenericRespModel> updateOfferRequestStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId});
}
class RequestRepoImp implements RequestRepo {
@ -82,40 +26,7 @@ class RequestRepoImp implements RequestRepo {
AppState appState = injector.get<AppState>();
@override
Future<GenericRespModel> createRequest({
required int requestTypeId,
required int vehicleTypeId,
required String brand,
required String model,
required String year,
required int conditionType,
required int countryID,
required int cityID,
required String price,
required String description,
required String address,
required bool isSpecialServiceNeeded,
required List requestImages,
}) async {
Map<String, dynamic> postParams = {
"requestType": requestTypeId,
"vehicleTypeID": vehicleTypeId,
"brand": brand,
"model": model,
"year": year,
"conditionType": conditionType,
"countryID": countryID,
"cityID": cityID,
"price": price,
"description": description,
"address": address,
"isSpecialServiceNeeded": false,
"requestImages": requestImages,
};
if (!appState.getIsViewOnly) {
postParams["customerID"] = appState.getUser.data!.userInfo!.customerId ?? 0;
}
Future<GenericRespModel> createRequest(Map<String, dynamic> postParams) async {
GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.createRequest,
@ -126,23 +37,11 @@ class RequestRepoImp implements RequestRepo {
}
@override
Future<List<RequestModel>> getRequests({required int providerOrCustomerID}) async {
final paramsForGetRequests = {
"pageSize": 100,
"pageIndex": 0,
};
if (appState.currentAppType == AppType.provider) {
paramsForGetRequests.addEntries([MapEntry("providerID", providerOrCustomerID)]);
} else {
if (!appState.getIsViewOnly) {
paramsForGetRequests.addEntries([MapEntry("customerID", providerOrCustomerID)]);
}
}
Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams) async {
GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getRequest,
paramsForGetRequests,
postParams,
token: appState.getUser.data!.accessToken,
);
List<RequestModel> requests = List.generate(
@ -155,147 +54,7 @@ class RequestRepoImp implements RequestRepo {
}
@override
Future<List<RequestModel>> getRequestsBasedOnFilters({
required int requestTypeId,
int requestStatusId = 0,
int requestId = 0,
int reqOfferStatus = 0,
int? cityId = 0,
int? vehicleYearId = 0,
String? vehicleModel = "",
String? vehicleBrand = "",
String? requestedDate = "",
int? conditionId = 0,
int pageIndex = 0,
int pageSize = 100,
}) async {
final paramsForGetRequests = {
"pageIndex": pageIndex,
"pageSize": pageSize,
"doPagination": true,
"requestType": requestTypeId.toString(),
"requestStatus": requestStatusId.toString(),
"reqOfferStatus": reqOfferStatus.toString(),
"brand": vehicleBrand.toString(),
"requestedDate": requestedDate,
"model": vehicleModel.toString(),
"year": vehicleYearId.toString(),
"cityID": cityId.toString(),
};
// Add conditionType if provided (1=New, 2=Used, 3=All)
if (conditionId != null && conditionId != 0) {
paramsForGetRequests["conditionType"] = conditionId.toString();
}
if (appState.currentAppType == AppType.customer) {
if (!appState.getIsViewOnly) {
paramsForGetRequests.addEntries([MapEntry("customerID", appState.getUser.data!.userInfo!.customerId ?? 0)]);
}
} else {
paramsForGetRequests.addEntries([MapEntry("providerID", appState.getUser.data!.userInfo!.providerId.toString())]);
}
paramsForGetRequests.removeWhere((key, value) => value == "" || value == "0");
if (appState.currentAppType == AppType.provider && requestTypeId == 2) {
List<RequestModel> requests = await getRequestBasedOnFiltersForProvidersServiceRequest(paramsForGetRequests);
return requests;
}
GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getRequest,
paramsForGetRequests,
token: appState.getUser.data!.accessToken,
);
List<RequestModel> requests = List.generate(
enumGenericModel.data.length,
(index) => RequestModel.fromJson(enumGenericModel.data[index]),
);
return requests;
}
Future<List<RequestModel>> getRequestBasedOnFiltersForProvidersServiceRequest(Map<String, Object?> parameters) async {
List<String> requestStatusList = [
RequestStatusEnum.submitted.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.completed.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.inProgress.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.paid.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.delivery.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.shipping.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.selfPickup.getIdFromRequestStatusEnum().toString(),
];
if (parameters['requestStatus'] != null && parameters['requestStatus'] != "0") {
parameters.addEntries([
MapEntry("RequestStatuses", [parameters['requestStatus'].toString()])
]);
} else {
parameters.removeWhere((key, value) => key == "requestStatus");
parameters.addEntries([MapEntry("RequestStatuses", requestStatusList)]);
}
parameters.removeWhere((key, value) => key == "providerID");
parameters.removeWhere((key, value) => key == "pageIndex");
parameters.removeWhere((key, value) => key == "pageSize");
parameters.removeWhere((key, value) => key == "doPagination");
parameters.addEntries([MapEntry("ServiceProviderId", appState.getUser.data!.userInfo!.providerId.toString())]);
// final parameters = {
// "ServiceProviderId": serviceProviderID.toString(),
// "RequestType": "2", // Only to get the Service Request
// "RequestStatuses": requestStatusList,
// };
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceRequestsForProvider,
queryParameters: parameters,
token: appState.getUser.data!.accessToken,
);
List<RequestModel> requests = List.generate(
genericRespModel.data.length,
(index) => RequestModel.fromJson(
genericRespModel.data[index],
),
);
return requests;
}
@override
Future<List<RequestModel>> getServiceRequestsForProviders({required int serviceProviderID}) async {
List<String> requestStatusList = [
RequestStatusEnum.submitted.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.completed.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.inProgress.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.paid.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.delivery.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.shipping.getIdFromRequestStatusEnum().toString(),
RequestStatusEnum.selfPickup.getIdFromRequestStatusEnum().toString(),
];
final parameters = {
"ServiceProviderId": serviceProviderID.toString(),
"RequestType": "2", // Only to get the Service Request
"RequestStatuses": requestStatusList,
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceRequestsForProvider,
queryParameters: parameters,
token: appState.getUser.data!.accessToken,
);
List<RequestModel> requests = List.generate(
genericRespModel.data.length,
(index) => RequestModel.fromJson(
genericRespModel.data[index],
),
);
return requests;
}
@override
Future<List<ProviderOffersChatsModel>> getOffersChatByProvider({int requestId = 0, required int serviceProviderId}) async {
Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0}) async {
var queryParameters = {
"RequestID": requestId.toString(),
"ServiceProviderID": serviceProviderId.toString(),
@ -306,39 +65,20 @@ class RequestRepoImp implements RequestRepo {
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
List<ProviderOffersChatsModel> offersList = List.generate(
List<OffersModel> offersList = List.generate(
genericRespModel.data.length,
(index) => ProviderOffersChatsModel.fromJson(genericRespModel.data[index]),
(index) => OffersModel.fromJson(genericRespModel.data[index]),
);
return offersList;
}
@override
Future<OffersUnreadChatModel> getOffersChatsUnreadList({required String userId}) async {
var queryParameters = {
"ReceiverUserID": userId.toString(),
};
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.reqChatUnreadGet,
queryParameters: queryParameters,
token: appState.getUser.data!.accessToken,
);
OffersUnreadChatModel offersUnreadChatModel = OffersUnreadChatModel.fromJson(genericRespModel.data);
return offersUnreadChatModel;
}
@override
Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId}) async {
final customerId = appState.getUser.data!.userInfo!.customerId;
var queryParameters = {
"customerID": customerId.toString(),
"requestID": requestId.toString(),
};
if (!appState.getIsViewOnly) {
queryParameters["customerID"] = customerId.toString();
}
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.requestOffersSpsGet,
@ -347,106 +87,16 @@ class RequestRepoImp implements RequestRepo {
);
ProviderOffersModel providerOffersModel = ProviderOffersModel();
if (genericRespModel.data != null && genericRespModel.data.length > 0) {
providerOffersModel = ProviderOffersModel.fromJson(genericRespModel.data.first, requestId);
providerOffersModel = ProviderOffersModel.fromJson(genericRespModel.data.first);
}
return providerOffersModel;
}
@override
Future<GenericRespModel> updateRequestStatus({required RequestStatusEnum requestStatusEnum, required int requestId}) async {
var queryParameters = {
"requestId": requestId.toString(),
"requestStatus": requestStatusEnum.getIdFromRequestStatusEnum().toString(),
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
appState.currentAppType == AppType.provider ? ApiConsts.updateRequestProvider : ApiConsts.updateRequestCustomer,
queryParameters,
token: appState.getUser.data!.accessToken,
);
return genericRespModel;
}
@override
Future<GenericRespModel> updateRequestAdditionalAddress({required int requestID, required String additionalAddress}) async {
var queryParameters = {
"requestID": requestID.toString(),
"additionalAddress": additionalAddress.toString(),
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.requestUpdateAdditionalAddress,
queryParameters,
token: appState.getUser.data!.accessToken,
);
return genericRespModel;
}
@override
Future<GenericRespModel> updateRequestOfferStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId, required String comments}) async {
Future<GenericRespModel> updateOfferRequestStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId}) async {
var queryParameters = {
"requestOfferId": requestOfferId.toString(),
"offerStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum().toString(),
"comments": comments,
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.updateRequestOfferStatus,
queryParameters,
token: appState.getUser.data!.accessToken,
);
return genericRespModel;
}
@override
Future<GenericRespModel> updateRequestDeliveryOptionByCustomer({required int requestID, required int requestOfferId, required RequestDeliveryOptionEnum deliveryOptionEnum}) async {
var queryParameters = {
"requestID": requestID.toString(),
"requestOfferId": requestOfferId.toString(),
"deliveryOption": deliveryOptionEnum.getIdRequestDeliveryOptionEnum().toString(),
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.requestOfferUpdateDeliveryOptionByCustomer,
queryParameters,
token: appState.getUser.data!.accessToken,
);
return genericRespModel;
}
@override
Future<GenericRespModel> updateRequestOfferFromProvider({
required String message,
required int requestId,
required int offerId,
required String offerPrice,
required bool isDeliveryAvailable,
required int offerDeliveryOption,
required String serviceItemName,
required String manufacturedByName,
required String manufacturedOn,
required List requestImages,
required RequestOfferStatusEnum requestOfferStatusEnum,
}) async {
final providerId = appState.getUser.data!.userInfo!.providerId;
var queryParameters = {
"id": offerId,
"requestID": requestId,
"serviceProviderID": providerId,
"offerStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum(),
"serviceItem": serviceItemName,
"comment": message,
"price": offerPrice,
"offeredItemCreatedByName": manufacturedByName.toString(),
"offeredItemCreatedOn": manufacturedOn.toString(),
"reqOfferImages": requestImages,
"isDeliveryAvailable": isDeliveryAvailable,
"offerDeliveryOption": offerDeliveryOption
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),

@ -1,27 +1,25 @@
import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
abstract class ScheduleRepo {
Future<Services> getAllServices(String branchId);
Future<GenericRespModel> createSchedule(Map map);
Future<MResponse> createSchedule(Map map);
Future<GenericRespModel> checkServiceGroupInBranchSchedule(Map map);
Future<MResponse> addServicesInSchedule(Map map);
Future<GenericRespModel> addServicesInSchedule(Map map);
Future<GenericRespModel> updateSchedule(Map map);
Future<MResponse> updateSchedule(Map map);
Future<Schedule> getSchedules(String branchId);
Future<GenericRespModel> updateServicesInSchedule(Map map);
Future<MResponse> updateServicesInSchedule(Map map);
Future<GenericRespModel> setScheduleInActive(int scheduleId, int branchId);
Future<MResponse> setScheduleInActive(int scheduleId, int branchId);
}
class ScheduleRepoImp implements ScheduleRepo {
@ -33,21 +31,15 @@ class ScheduleRepoImp implements ScheduleRepo {
}
@override
Future<GenericRespModel> createSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createSchedule, map, token: t);
}
@override
Future<GenericRespModel> checkServiceGroupInBranchSchedule(Map map) async {
Future<MResponse> createSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.checkGroupServiceInBranchSchedule, map, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t);
}
@override
Future<GenericRespModel> addServicesInSchedule(Map map) async {
Future<MResponse> addServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createGroup, map, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t);
}
@override
@ -58,25 +50,25 @@ class ScheduleRepoImp implements ScheduleRepo {
}
@override
Future<GenericRespModel> setScheduleInActive(int scheduleId, int branchId) async {
Future<MResponse> setScheduleInActive(int scheduleId, int branchId) async {
Map<String, dynamic> map = {
"id": scheduleId,
"serviceProviderBranchID": branchId,
"isActive": false,
};
String t = AppState().getUser.data!.accessToken ?? "";
return injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.setScheduleInactive, token: t, map);
return injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.setScheduleInactive, token: t, map);
}
@override
Future<GenericRespModel> updateSchedule(Map map) async {
Future<MResponse> updateSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateSchedule, map, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t);
}
@override
Future<GenericRespModel> updateServicesInSchedule(Map map) async {
Future<MResponse> updateServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateGroup, map, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t);
}
}

@ -1,220 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/setting_utils_models/app_info_model.dart';
import 'package:mc_common_app/models/setting_utils_models/app_invitation_history_model.dart';
import 'package:mc_common_app/models/setting_utils_models/contact_infos_model.dart';
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class SettingOptionsRepo {
Future<List<FAQsModel>> getAllFaqs();
Future<List<ContactInfoModel>> getAllContactInfos();
Future<List<AppInfoModel>> getAppInfoList();
Future<List<AppInfoModel>> getTermsAndConditions();
Future<GenericRespModel> appInvitationCreate({required int channelId, required String message});
Future<List<AppInvitationHistoryModel>> getAppInvitationsHistory();
}
class SettingOptionsRepoImp extends SettingOptionsRepo {
ApiClient apiClient = injector.get<ApiClient>();
AppState appState = injector.get<AppState>();
@override
Future<List<FAQsModel>> getAllFaqs() async {
int channel = 0;
if (AppState().currentAppType == AppType.provider) {
channel = 2;
} else {
channel = 3;
}
final params = {
"Channel": channel.toString(),
};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAllFAQs,
token: token,
queryParameters: params,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<FAQsModel> list = List.generate(genericRespModel.data.length, (index) => FAQsModel.fromJson(genericRespModel.data[index]));
return list;
}
@override
Future<List<ContactInfoModel>> getAllContactInfos() async {
int channel = 0;
if (AppState().currentAppType == AppType.provider) {
channel = 2;
} else {
channel = 3;
}
final params = {"Channel": channel.toString()};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getContactInfo,
queryParameters: params,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<ContactInfoModel> list = List.generate(genericRespModel.data.length, (index) => ContactInfoModel.fromJson(genericRespModel.data[index]));
return list;
}
@override
Future<List<AppInfoModel>> getAppInfoList() async {
String token = appState.getUser.data!.accessToken ?? "";
int channel = 0;
if (AppState().currentAppType == AppType.provider) {
channel = 2;
} else {
channel = 3;
}
final params = {
"Channel": channel.toString(),
};
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAppInfo,
token: token,
queryParameters: params,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<AppInfoModel> list = List.generate(genericRespModel.data.length, (index) => AppInfoModel.fromJson(genericRespModel.data[index]));
return list;
}
@override
Future<List<AppInfoModel>> getTermsAndConditions() async {
String token = appState.getUser.data!.accessToken ?? "";
int channel = 0;
if (AppState().currentAppType == AppType.provider) {
channel = 2;
} else {
channel = 3;
}
final params = {
"Channel": channel.toString(),
};
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getTermsAndConditions,
token: token,
queryParameters: params,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<AppInfoModel> list = List.generate(genericRespModel.data.length, (index) => AppInfoModel.fromJson(genericRespModel.data[index], isForTermsAndCondition: true));
return list;
}
@override
Future<GenericRespModel> appInvitationCreate({required int channelId, required String message}) async {
String token = appState.getUser.data!.accessToken ?? "";
final params = {
"appInvitationEnumID": channelId.toString(),
"comments": message,
};
if (AppState().currentAppType == AppType.customer) {
if (!appState.getIsViewOnly) {
params.addAll({
"customerID": (appState.getUser.data!.userInfo!.customerId ?? "0").toString(),
"channelID": "3",
});
} else {
params.addAll({
"channelID": "3",
});
}
} else {
params.addAll({
"providerID": (appState.getUser.data!.userInfo!.providerId ?? "0").toString(),
"channelID": "2",
});
}
GenericRespModel genericRespModel = await injector.get<ApiClient>().postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.createAppInvitation,
token: token,
params,
);
return genericRespModel;
}
@override
Future<List<AppInvitationHistoryModel>> getAppInvitationsHistory() async {
final params = {
"CustomerID": (appState.getUser.data!.userInfo!.customerId ?? "0").toString(),
"ChannelID": "3",
};
String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getAppInvitationHistory,
queryParameters: params,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<AppInvitationHistoryModel> list = List.generate(genericRespModel.data.length, (index) => AppInvitationHistoryModel.fromJson(genericRespModel.data[index]));
return list;
}
}

@ -1,127 +0,0 @@
import 'dart:developer';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/shipping_models/shipping_status_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class ShippingRepo {
Future<List<ShippingRequestModel>> getSelfPickupRequestListByStatus({SelfPickupRequestStatusEnum? selfPickupRequestStatus, int? requestId});
Future<List<ShippingRequestModel>> getShippingRequestListByStatus({ShippingRequestStatusEnum? shippingStatusEnum, int? requestId});
Future<GenericRespModel> updateShippingRequestStatus({required ShippingRequestStatusEnum shippingStatusEnum, required int shippingRequestId, String? comment, String? numberOfShipping});
Future<GenericRespModel> updateSelfPickupRequestStatus({required SelfPickupRequestStatusEnum selfPickupStatusEnum, required int shippingRequestId, String? comment, String? numberOfShipping});
}
class ShippingRepoImp extends ShippingRepo {
ApiClient apiClient = injector.get<ApiClient>();
AppState appState = injector.get<AppState>();
@override
Future<List<ShippingRequestModel>> getShippingRequestListByStatus({ShippingRequestStatusEnum? shippingStatusEnum, int? requestId}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map queryParameters = {
"requestID": "${requestId ?? 0}",
"shippingStatus": "${shippingStatusEnum != null ? shippingStatusEnum.getIdFromShippingStatusEnum() : -1}", // -1 to get all requests
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.shippingRequestStatusGet,
queryParameters,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<ShippingRequestModel> list = List.generate(genericRespModel.data.length, (index) => ShippingRequestModel.fromJsonShipping(genericRespModel.data[index], true));
return list;
}
@override
Future<List<ShippingRequestModel>> getSelfPickupRequestListByStatus({SelfPickupRequestStatusEnum? selfPickupRequestStatus, int? requestId}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map queryParameters = {
"requestID": "${requestId ?? 0}",
"selfPickUpStatus": "${selfPickupRequestStatus != null ? selfPickupRequestStatus.getIdFromSelfPickupStatusEnum() : -1}", // -1 to get all requests
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.selfPickupRequestStatusGet,
queryParameters,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<ShippingRequestModel> list = List.generate(genericRespModel.data.length, (index) => ShippingRequestModel.fromJsonShipping(genericRespModel.data[index], false));
return list;
}
@override
Future<GenericRespModel> updateShippingRequestStatus({required ShippingRequestStatusEnum shippingStatusEnum, required int shippingRequestId, String? comment, String? numberOfShipping}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {
"id": "$shippingRequestId",
"shippingStatus": "${shippingStatusEnum.getIdFromShippingStatusEnum()}",
"comment": comment ?? "",
"numberOfShipping": numberOfShipping ?? "",
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.shippingRequestStatusUpdate,
queryParameters,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
}
return genericRespModel;
}
@override
Future<GenericRespModel> updateSelfPickupRequestStatus({required SelfPickupRequestStatusEnum selfPickupStatusEnum, required int shippingRequestId, String? comment, String? numberOfShipping}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {
"id": "$shippingRequestId",
"selfPickUpStatus": "${selfPickupStatusEnum.getIdFromSelfPickupStatusEnum()}",
"comment": comment ?? "",
"numberOfShipping": numberOfShipping ?? "",
};
GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.selfPickupRequestStatusUpdate,
queryParameters,
token: token,
);
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
}
return genericRespModel;
}
}

@ -1,37 +1,52 @@
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/models/subscriptions_models/branch_user_selection_model.dart';
import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/models/user_models/branch_user.dart';
abstract class SubscriptionRepo {
// Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID);
// Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID});
Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID);
Future<SubscriptionModel> getMySubscriptions(String? serviceProviderID);
Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID});
Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew);
Future<GenericRespModel> calculationUpgradePrice(String? serviceProviderID, String? newSubscription);
Future<MResponse> calculationUpgradePrice(String? serviceProviderID, String? newSubscription);
Future<GenericRespModel> payForProviderSubscription(Map<String, dynamic> map);
Future<MResponse> payForProviderSubscription(Map<String, dynamic> map);
Future<List<BranchSelectionModel>> getSPBranchUserGet(Map<String, String> map);
Future<List<BranchSelectionModel>> getSPBranchUser_Get(Map<String, String> map);
}
class SubscriptionRepoImp extends SubscriptionRepo {
ApiClient apiClient = injector.get<ApiClient>();
AppState appState = injector.get<AppState>();
@override
Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID) async {
String t = AppState().getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {};
if (serviceProviderID != null) {
queryParameters = {
"ID": serviceProviderID,
};
}
return await injector.get<ApiClient>().getJsonForObject((json) => SubscriptionModel.fromJson(json), ApiConsts.getAllSubscriptions, token: t, queryParameters: queryParameters);
}
@override
Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew) async {
String t = AppState().getUser.data!.accessToken ?? "";
Map<String, dynamic> queryParameters = {};
Map<String, String> queryParameters = {};
if (serviceProviderID != null) {
queryParameters = {
"ProviderID": serviceProviderID,
@ -48,7 +63,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
}
@override
Future<GenericRespModel> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async {
Future<MResponse> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async {
String t = AppState().getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {};
if (serviceProviderID != null) {
@ -59,7 +74,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
}
return await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
(json) => MResponse.fromJson(json),
ApiConsts.calculationUpgradePrice,
token: t,
queryParameters: queryParameters,
@ -67,24 +82,24 @@ class SubscriptionRepoImp extends SubscriptionRepo {
}
@override
Future<GenericRespModel> payForProviderSubscription(Map<String, dynamic> map) async {
Future<MResponse> payForProviderSubscription(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.payFortOrderProviderSubscriptionCreate,
(json) => MResponse.fromJson(json),
ApiConsts.payFortOrder_ProviderSubscription_Create,
map,
token: t,
);
}
@override
Future<List<BranchSelectionModel>> getSPBranchUserGet(Map<String, String> map) async {
Future<List<BranchSelectionModel>> getSPBranchUser_Get(Map<String, String> map) async {
String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.getSPBranchUserGet,
ApiConsts.getSPBranchUser_Get,
token: t,
queryParameters: map,
);
@ -124,38 +139,25 @@ class SubscriptionRepoImp extends SubscriptionRepo {
return await injector.get<ApiClient>().getJsonForObject((json) => SubscriptionModel.fromJson(json), ApiConsts.getAllSubscriptions, token: t, queryParameters: queryParameters);
}
// @override
// Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID) async {
// String t = AppState().getUser.data!.accessToken ?? "";
// Map<String, String> queryParameters = {};
// if (serviceProviderID != null) {
// queryParameters = {
// "ID": serviceProviderID,
// };
// }
//
// return await injector.get<ApiClient>().getJsonForObject((json) => SubscriptionModel.fromJson(json), ApiConsts.getAllSubscriptions, token: t, queryParameters: queryParameters);
// }
@override
Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID}) async {
Map<String, String> queryParameters = {};
if (serviceProviderID != null) {
queryParameters = {
"ServiceProviderID": serviceProviderID,
"IsActiveSubscriptionForProvider": "true",
};
}
// @override
// Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID}) async {
// Map<String, String> queryParameters = {};
// if (serviceProviderID != null) {
// queryParameters = {
// "ServiceProviderID": serviceProviderID,
// "IsActiveSubscriptionForProvider": "true",
// };
// }
//
// GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
// token: appState.getUser.data!.accessToken,
// (json) => GenericRespModel.fromJson(json),
// ApiConsts.getMySubscriptions,
// queryParameters: queryParameters,
// );
// List<ProviderSubscriptionModel> providerSubList = List.generate(adsGenericModel.data.length, (index) => ProviderSubscriptionModel.fromJson(adsGenericModel.data[index]));
// return providerSubList;
// }
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.getMySubscriptions,
queryParameters: queryParameters,
);
List<ProviderSubscriptionModel> providerSubList = List.generate(adsGenericModel.data.length, (index) => ProviderSubscriptionModel.fromJson(adsGenericModel.data[index]));
return providerSubList;
}
// @override
// Future<SubscriptionModel> getProviderSubscription(

@ -6,8 +6,8 @@ import 'package:http/http.dart';
import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/user_models/basic_otp.dart';
import 'package:mc_common_app/models/user_models/change_email.dart';
import 'package:mc_common_app/models/user_models/change_mobile.dart';
@ -31,13 +31,13 @@ abstract class UserRepo {
Future<RegisterUserRespModel> basicVerify(String phoneNo, String otp, String userToken, {bool isNeedToPassToken = false});
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String compannyNname, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false});
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password, {bool isNeedToPassToken = false});
Future<Response> loginV1(String phoneNo, String password);
Future<LoginPasswordRespModel> loginV2OTP(String userToken, String loginType);
Future<Response> loginV2OTPVerify(String userToken, String otp, String deviceType, String deviceToken);
Future<Response> loginV2OTPVerify(String userToken, String otp);
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken);
@ -53,9 +53,7 @@ abstract class UserRepo {
Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword);
Future<GenericRespModel> changePassword(String currentPassword, String newPassword);
Future<Map<String, dynamic>> updateUserInfo(String firstName, String lastName, String? city);
Future<MResponse> changePassword(String currentPassword, String newPassword);
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password);
@ -67,14 +65,12 @@ abstract class UserRepo {
Future<VerifyEmailRespModel> emailVerify(String email, String userID);
Future<GenericRespModel> emailVerifyOTPVerify(String userToken, String userOTP);
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP);
Future<ImageResponse> updateUserImage(String image);
Future<ImageResponse> getUserImage(String image);
Future<Response> logoutUser();
Future<String> updateUserToken();
}
@ -87,7 +83,7 @@ class UserRepoImp implements UserRepo {
t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
}
return await injector.get<ApiClient>().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.basicOTP, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams, token: t);
}
@override
@ -102,23 +98,23 @@ class UserRepoImp implements UserRepo {
t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
}
return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.basicVerify, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams, token: t);
}
@override
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String companyName, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false}) async {
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password, {bool isNeedToPassToken = false}) async {
Map<String, Object> postParams;
if (email.isEmpty) {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": companyName, "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID};
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password};
} else {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": companyName, "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID};
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password};
}
String? t;
if (isNeedToPassToken) {
t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
}
return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.basicComplete, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams, token: t);
}
@override
@ -127,7 +123,7 @@ class UserRepoImp implements UserRepo {
"mobileorEmail": phoneNo,
"password": password,
};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.loginV1, postParams);
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V1, postParams);
//return await injector.get<ApiClient>().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams);
}
@ -138,50 +134,40 @@ class UserRepoImp implements UserRepo {
"loginType": loginType,
};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.loginV2OTP, postParams);
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams);
LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body));
return user;
}
@override
Future<Response> loginV2OTPVerify(
String userToken,
String otp,
String deviceType,
String deviceToken,
) async {
var postParams = {"userToken": userToken, "userOTP": otp, "deviceType": deviceType, "deviceToken": deviceToken};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.loginV2OTPVerify, postParams);
Future<Response> loginV2OTPVerify(String userToken, String otp) async {
var postParams = {"userToken": userToken, "userOTP": otp};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
}
@override
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.refreshToken, postParams);
return await injector.get<ApiClient>().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams);
}
@override
Future<Country> getAllCountries() async {
return await injector.get<ApiClient>().getJsonForObject((json) => Country.fromJson(json), ApiConsts.getAllCountry);
return await injector.get<ApiClient>().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry);
}
// @override
// Future<Country> getAllCountriesForUser() async {
// return await injector.get<ApiClient>().getJsonForObject((json) => Country.fromJson(json), ApiConsts.getAllCountry);
// }
@override
Future<Cities> getAllCites(String countryId) async {
var postParams = {
"CountryID": countryId,
};
return await injector.get<ApiClient>().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.getAllCities, queryParameters: postParams);
return await injector.get<ApiClient>().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams);
}
@override
Future<Role> getRoles() async {
return await injector.get<ApiClient>().getJsonForObject((json) => Role.fromJson(json), ApiConsts.getProviderRoles);
return await injector.get<ApiClient>().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles);
}
@override
@ -190,14 +176,14 @@ class UserRepoImp implements UserRepo {
"userName": userName,
"otpType": 1,
};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.forgetPasswordOTPRequest, postParams);
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams);
//return await injector.get<ApiClient>().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams);
}
@override
Future<PasswordOTPCompareResModel> forgetPasswordOTPCompare(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.forgetPasswordOTPCompare, postParams);
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams);
PasswordOTPCompareResModel otpCompare = PasswordOTPCompareResModel.fromJson(jsonDecode(response.body));
return otpCompare;
@ -210,7 +196,7 @@ class UserRepoImp implements UserRepo {
"newPassword": newPassword,
};
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.forgetPassword, postParams);
Response response = await injector.get<ApiClient>().postJsonForResponse(ApiConsts.ForgetPassword, postParams);
ConfirmPasswordRespModel data = ConfirmPasswordRespModel.fromJson(jsonDecode(response.body));
return data;
@ -218,7 +204,7 @@ class UserRepoImp implements UserRepo {
}
@override
Future<GenericRespModel> changePassword(String currentPassword, String newPassword) async {
Future<MResponse> changePassword(String currentPassword, String newPassword) async {
var postParams = {
"currentPassword": currentPassword,
"newPassword": newPassword,
@ -227,14 +213,14 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.changePassword, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
}
@override
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password) async {
var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.changeMobileNoOTPRequest, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t);
}
@override
@ -244,28 +230,21 @@ class UserRepoImp implements UserRepo {
"userOTP": userOTP,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.changeMobileNo, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t);
}
@override
Future<ChanEmailRespModel> changeEmailOTPRequest(String email, String password) async {
var postParams = {"email": email, "password": password};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.changeEmailOTPRequest, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t);
}
@override
Future<ConfirmEmailRespModel> changeEmail(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.changeEmail, postParams, token: t);
}
@override
Future<Map<String, dynamic>> updateUserInfo(String firstName, String lastName, String? city) async {
var postParams = {"userID": "${AppState().getUser.data!.userInfo!.userId}", "firstName": "${firstName}", "lastName": "${lastName}", "genderID": 1, "cityID": city ?? 1};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => json, ApiConsts.userUpdate, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t);
}
@override
@ -278,15 +257,15 @@ class UserRepoImp implements UserRepo {
};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.emailVerify, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t);
}
@override
Future<GenericRespModel> emailVerifyOTPVerify(String userToken, String userOTP) async {
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.emailVerifyOTPVerify, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t);
}
@override
@ -296,12 +275,7 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
return await injector.get<ApiClient>().postJsonForObject(
(json) => ImageResponse.fromJson(json),
ApiConsts.updateUserImage,
postParams,
token: t,
);
return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t,);
}
@override
@ -311,7 +285,7 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t");
return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.updateUserImage, postParams, token: t);
return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t);
}
@override
@ -329,10 +303,4 @@ class UserRepoImp implements UserRepo {
AppState().setUser = user;
return refresh.data!.accessToken ?? "";
}
Future<Response> logoutUser() async {
String t = AppState().getUser.data!.accessToken ?? "";
var postParams = {"token": AppState().getUser.data!.accessToken ?? ""};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.logoutUser, postParams, token: t);
}
}

@ -1,206 +0,0 @@
import 'dart:async';
import 'package:app_links/app_links.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/widgets.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:provider/provider.dart';
/// Handles opening the ad detail screen directly when the app is launched or
/// resumed via a shared ad link, for Android App Links / iOS Universal Links
/// (https://ms.hmg.com/ad/1541) AND the custom-scheme fallback used by that
/// same web page when App Links verification isn't active
/// (mowatercustomer://ad/1541, mowaterprovider://ad/1541).
class AdDeepLinkService {
static final AppLinks _appLinks = AppLinks();
static StreamSubscription<Uri>? _subscription;
static Uri? _lastHandledUri;
// Route name given to the inert, self-removing placeholder pushed from main.dart's
// onUnknownRoute for Android's native deep-link route forwarding (see that file for
// why it exists). It's pushed and removed again within a frame, so the route-settle
// polling below must ignore it rather than treat its brief presence/absence as a real
// navigation change -- otherwise the route name never reads as "stable" and _openAd
// gives up without ever opening the ad.
static const String ignoredPlaceholderRouteName = '__ad_deep_link_ignore__';
static String? _currentTopRouteName;
/// Register via MaterialApp(navigatorObservers: [AdDeepLinkService.routeObserver]).
/// This is the only reliable way to know the current top route name from here --
/// confirmed on a real device: ModalRoute.of(navigatorKey.currentContext) does NOT
/// work for this. navigatorKey.currentContext is the Navigator widget's OWN element,
/// which sits ABOVE all its routes in the tree, so it has no ModalRoute ancestor and
/// that call returns null essentially always. That silently made every route-settle
/// poll below read null forever, so _openAd always timed out and gave up without ever
/// opening the ad, regardless of login state or what screen was actually showing.
static final NavigatorObserver routeObserver = _RouteNameTracker();
/// Call once, after the app's first frame (so [navigatorKey] is attached to a Navigator).
static Future<void> init() async {
debugPrint("AdDeepLinkService: init() called");
try {
final Uri? initialUri = await _appLinks.getInitialLink();
debugPrint("AdDeepLinkService: getInitialLink() -> $initialUri");
if (initialUri != null) {
_handleUri(initialUri);
}
} catch (e) {
debugPrint("AdDeepLinkService: failed to read initial link - $e");
}
_subscription?.cancel();
_subscription = _appLinks.uriLinkStream.listen(
(uri) {
debugPrint("AdDeepLinkService: uriLinkStream emitted $uri");
_handleUri(uri);
},
onError: (Object e) => debugPrint("AdDeepLinkService: stream error - $e"),
);
debugPrint("AdDeepLinkService: uriLinkStream subscription active");
}
static void _handleUri(Uri uri) {
debugPrint("AdDeepLinkService: received $uri");
// https://ms.hmg.com/ad/1541 -> host="ms.hmg.com", pathSegments=["ad", "1541"]
// mowatercustomer://ad/1541 -> host="ad" (Dart treats it as the authority), pathSegments=["1541"]
int? adId;
if (uri.scheme == 'https') {
final segments = uri.pathSegments;
if (segments.length >= 2 && segments[0] == 'ad') {
adId = int.tryParse(segments[1]);
}
} else if (uri.host == 'ad' && uri.pathSegments.isNotEmpty) {
adId = int.tryParse(uri.pathSegments.first);
}
if (adId == null) return;
// app_links can emit the same initial uri twice (once via getInitialLink, once as
// the stream's first event) -- skip the duplicate rather than run _openAd twice.
if (uri == _lastHandledUri) {
debugPrint("AdDeepLinkService: ignoring duplicate $uri");
return;
}
_lastHandledUri = uri;
_openAd(adId);
}
// Deliberately no loading dialog anywhere in here: on a cold start (app was killed),
// this races the app's own bootstrap navigation -- confirmed on a real device, the
// bootstrap chain is SplashPage's hardcoded 5s timer -> pushReplacementNamed to
// registerSelection -> (if a saved login exists) a silent auto-login with its own
// showLoading/hideLoading dialog -> pushReplacementNamed again towards the dashboard.
// Every one of those calls uses a *captured* BuildContext and mutates the same
// Navigator via Navigator.of(context), regardless of what else has since been pushed
// on top. If we push the ad route while any of that is still in flight, our route gets
// clobbered by the next replacement -- in debug this throws "_elements.contains
// (element)"; in release (asserts stripped) it silently wedges the Navigator and the
// app hangs on a black screen. So: wait for the current route name to stay the same
// across two consecutive polls (i.e. bootstrap has actually settled) before touching
// the Navigator or fetching anything.
static Future<void> _openAd(int adId) async {
debugPrint("AdDeepLinkService: _openAd($adId) called");
if (!await _waitUntilRouteSettles()) {
debugPrint("AdDeepLinkService: app never settled past bootstrap, aborting");
return;
}
debugPrint("AdDeepLinkService: route settled at '$_currentTopRouteName'");
// Checking for a saved token here is NOT a reliable "is the user ready" signal --
// confirmed on a real device: a stale token from before the app was killed survives
// on disk through the whole re-login flow (splash -> registerSelection -> silent
// relogin -> loginMethodSelection OTP screen), so it reads as "already logged in"
// while still sitting on the OTP screen, fetches too early with no real session
// ready yet, and silently fails. The dashboard route is the one signal that's only
// true once a real session is actually in place, however the user got there.
if (_currentTopRouteName != AppRoutes.dashboard) {
debugPrint("AdDeepLinkService: not on dashboard yet ('$_currentTopRouteName'), waiting for login to finish");
if (!await _waitForRoute(AppRoutes.dashboard)) {
debugPrint("AdDeepLinkService: gave up waiting for dashboard, aborting");
return;
}
debugPrint("AdDeepLinkService: reached dashboard");
} else {
debugPrint("AdDeepLinkService: already on dashboard, proceeding directly");
}
debugPrint("AdDeepLinkService: fetching ad $adId");
AdDetailsModel? adDetails;
try {
adDetails = await navigatorKey.currentContext?.read<AdVM>().getAdDetailsById(adId);
debugPrint("AdDeepLinkService: fetch result adDetails=${adDetails != null ? 'FOUND id=${adDetails.id}' : 'NULL'}");
} catch (e) {
debugPrint("AdDeepLinkService: failed to fetch ad $adId - $e");
}
if (adDetails == null) {
Utils.showToast(LocaleKeys.somethingWrong.tr());
return;
}
// Navigate via the NavigatorState directly (not a captured BuildContext) so this
// still works even if the route/context active when we started has since changed.
debugPrint("AdDeepLinkService: pushing ${AppRoutes.adsDetailView}");
navigatorKey.currentState?.pushNamed(AppRoutes.adsDetailView, arguments: adDetails);
}
static String? _currentRouteNameIgnoringPlaceholder() {
final name = _currentTopRouteName;
// The placeholder pops itself a frame after being pushed -- if this poll happens to
// land exactly then, pretend nothing was read rather than counting it as a route.
return name == ignoredPlaceholderRouteName ? null : name;
}
static Future<bool> _waitUntilRouteSettles({int maxAttempts = 60, Duration retryDelay = const Duration(milliseconds: 300)}) async {
String? lastRouteName;
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
final currentRouteName = _currentRouteNameIgnoringPlaceholder();
if (currentRouteName != null && currentRouteName != AppRoutes.splash && currentRouteName == lastRouteName) {
return true;
}
if (currentRouteName != null) lastRouteName = currentRouteName;
if (attempt < maxAttempts) await Future.delayed(retryDelay);
}
return false;
}
// Used both for the short "did bootstrap settle" check and for waiting on the
// dashboard specifically, which can be user-paced (entering an OTP, picking a login
// method) -- default timeout is generous (5 minutes) to cover that case.
static Future<bool> _waitForRoute(String targetRoute, {int maxAttempts = 600, Duration retryDelay = const Duration(milliseconds: 500)}) async {
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
if (_currentRouteNameIgnoringPlaceholder() == targetRoute) return true;
if (attempt < maxAttempts) await Future.delayed(retryDelay);
}
return false;
}
}
class _RouteNameTracker extends NavigatorObserver {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
AdDeepLinkService._currentTopRouteName = route.settings.name;
}
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
AdDeepLinkService._currentTopRouteName = previousRoute?.settings.name;
}
@override
void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
AdDeepLinkService._currentTopRouteName = previousRoute?.settings.name;
}
@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
AdDeepLinkService._currentTopRouteName = newRoute?.settings.name;
}
}

@ -1,180 +0,0 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
/// Service for handling navigation to different chat types in the app
/// Provides centralized navigation logic for Request, Advertisement, and General chats
abstract class ChatNavigationService {
/// Navigate to Request Offer Chat screen
Future<void> navigateToRequestOfferChat({
required BuildContext context,
required int requestId,
required String receiverId,
required String senderId,
required int requestIndex,
required int providerIndex,
required RequestModel requestModel,
});
/// Navigate to Advertisement Chat screen
Future<void> navigateToAdChat({
required BuildContext context,
required int adsId,
required String receiverUserId,
});
/// Navigate to General Chat screen
Future<void> navigateToGeneralChat({
required BuildContext context,
required String receiverUserId,
Map<String, dynamic>? additionalData,
});
/// Navigate to Chat List screen based on chat type
Future<void> navigateToChatList({
required BuildContext context,
required ChatTypeEnum chatType,
Map<String, dynamic>? arguments,
});
}
class ChatNavigationServiceImp implements ChatNavigationService {
@override
Future<void> navigateToRequestOfferChat({
required BuildContext context,
required int requestId,
required String receiverId,
required String senderId,
required int requestIndex,
required int providerIndex,
required RequestModel requestModel,
}) async {
try {
log("Navigating to Request Offer Chat: requestId=$requestId");
ChatViewArgumentsForRequest args = ChatViewArgumentsForRequest(
chatTypeEnum: ChatTypeEnum.requestOffer,
requestId: requestId,
receiverId: receiverId,
senderId: senderId,
requestIndex: requestIndex,
providerIndex: providerIndex,
requestModel: requestModel,
);
ChatViewArguments chatViewArguments = ChatViewArguments(
chatTypeEnum: ChatTypeEnum.requestOffer,
chatViewArgumentsForRequest: args,
);
navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments);
} catch (e) {
log("Error navigating to request offer chat: $e");
}
}
@override
Future<void> navigateToAdChat({
required BuildContext context,
required int adsId,
required String receiverUserId,
}) async {
try {
log("Navigating to Ad Chat: adsId=$adsId, receiverId=$receiverUserId");
ChatViewArgumentsForAd args = ChatViewArgumentsForAd(
adsID: adsId,
receiverUserID: receiverUserId,
);
ChatViewArguments chatViewArguments = ChatViewArguments(
chatTypeEnum: ChatTypeEnum.ads,
chatViewArgumentsForAd: args,
);
navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments);
} catch (e) {
log("Error navigating to ad chat: $e");
}
}
@override
Future<void> navigateToGeneralChat({
required BuildContext context,
required String receiverUserId,
Map<String, dynamic>? additionalData,
}) async {
try {
log("Navigating to General Chat: receiverId=$receiverUserId");
// General chat implementation
// You can extend this based on your general chat requirements
ChatViewArguments chatViewArguments = ChatViewArguments(
chatTypeEnum: ChatTypeEnum.general,
);
navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments);
} catch (e) {
log("Error navigating to general chat: $e");
}
}
@override
Future<void> navigateToChatList({
required BuildContext context,
required ChatTypeEnum chatType,
Map<String, dynamic>? arguments,
}) async {
try {
log("Navigating to Chat List: type=$chatType");
switch (chatType) {
case ChatTypeEnum.requestOffer:
// Navigate to Providers Chat List (for customer side)
// or Requests list (for provider side)
if (AppState().currentAppType == AppType.customer) {
navigateWithName(context, AppRoutes.providersChatListPage);
} else {
// For provider, navigate to requests page
navigateWithName(context, AppRoutes.dashboard);
}
break;
case ChatTypeEnum.ads:
// Navigate to Ads Buyers Chat List
if (arguments != null && arguments['buyers'] != null) {
navigateWithName(
context,
AppRoutes.adsBuyerChatsListView,
arguments: arguments['buyers'] as List<BuyersChatForAdsModel>,
);
} else {
// Navigate to ads list if buyers not provided
navigateWithName(context, AppRoutes.dashboard);
}
break;
case ChatTypeEnum.general:
// Navigate to General Chats List
if (arguments != null && arguments['requestId'] != null) {
navigateWithName(
context,
AppRoutes.generalChatsListForProvider,
arguments: arguments['requestId'] as int,
);
} else {
navigateWithName(context, AppRoutes.dashboard);
}
break;
}
} catch (e) {
log("Error navigating to chat list: $e");
}
}
}

@ -2,10 +2,12 @@ import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/services.dart';
import 'package:huawei_fido/huawei_fido.dart';
import 'package:local_auth/local_auth.dart';
import 'package:local_auth_android/local_auth_android.dart';
import 'package:local_auth_darwin/types/auth_messages_ios.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart';
import 'package:easy_localization/easy_localization.dart';
abstract class CommonAuthServices {
@ -17,11 +19,10 @@ abstract class CommonAuthServices {
class CommonAuthImp implements CommonAuthServices {
final LocalAuthentication localAuth = LocalAuthentication();
@override
Future<bool> authenticate() async {
try {
final availableBiometrics = await localAuth.getAvailableBiometrics();
if (availableBiometrics.isEmpty) {
if (availableBiometrics == null || availableBiometrics.isEmpty) {
return false;
}
@ -60,11 +61,11 @@ class CommonAuthImp implements CommonAuthServices {
return await localAuth.getAvailableBiometrics();
}
// Future<void> getHuaweiAuth() async {
// DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
// AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
// // if (androidInfo.brand == "HUAWEI") {
// // huawei.canAuth();
// // }
// }
Future<void> getHuaweiAuth() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
// if (androidInfo.brand == "HUAWEI") {
// huawei.canAuth();
// }
}
}

@ -1,31 +1,19 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/utils/app_permission_handler.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class CommonAppServices {
Future<List<File>> pickMultipleImages();
Future<File?> pickImageFromPhone(int sourceFlag);
Future<List<File>?> pickMultipleFiles(BuildContext context, {bool allowMultiple = true});
Future<List<File>?> pickMultipleFiles(BuildContext context);
Future<File?> pickFile(BuildContext context, {required FileType fileType, List<String>? allowedExtensions});
double getDistanceBetween({
required double curLatitude,
required double curLongitude,
required double destLatitude,
required double destLongitude,
});
Future<File?> pickFile(BuildContext context,
{required FileType fileType, List<String>? allowedExtensions});
}
class CommonServicesImp implements CommonAppServices {
@ -40,12 +28,12 @@ class CommonServicesImp implements CommonAppServices {
}
@override
Future<List<File>?> pickMultipleFiles(BuildContext context, {bool allowMultiple = true}) async {
Future<List<File>?> pickMultipleFiles(BuildContext context) async {
FilePickerResult? result;
final status = await AppPermissions.checkStoragePermissions(context);
if (status) {
result = await FilePicker.platform.pickFiles(allowMultiple: allowMultiple, type: FileType.custom, allowedExtensions: ['pdf']);
result = await FilePicker.platform.pickFiles(allowMultiple: true, type: FileType.custom, allowedExtensions: ['pdf']);
}
List<File> pickedFiles = [];
@ -62,41 +50,32 @@ class CommonServicesImp implements CommonAppServices {
@override
Future<List<File>> pickMultipleImages() async {
final picker = ImagePicker();
List<File> imageModels = [];
List<File> pickedImages = [];
var images = await picker.pickMultiImage(imageQuality: 70);
for (var element in images) {
final extension = element.path.split('.').last.toLowerCase();
if (extension != 'jpg' && extension != 'jpeg' && extension != 'png') {
Utils.showToast(LocaleKeys.onlyJPGandPNG);
return [];
}
final pickedImagesXFiles = await picker.pickMultiImage();
if (await element.length() > GlobalConsts.maxFileSizeInBytes) {
Utils.showToast(LocaleKeys.maxFileSize);
return [];
}
imageModels.add(File(element.path));
List<File> pickedImages = [];
if (pickedImagesXFiles == null) {
return [];
}
if (imageModels.length > GlobalConsts.maxFileCount) {
Utils.showToast(LocaleKeys.maxFileSelection.tr());
imageModels = imageModels.sublist(0, GlobalConsts.maxFileCount); // Keep only the first 7 images
if (pickedImagesXFiles.isEmpty) {
return [];
}
for (var element in pickedImagesXFiles) {
pickedImages.add(File(element.path));
}
pickedImages.addAll(imageModels);
return pickedImages;
}
@override
Future<File?> pickFile(BuildContext context, {required FileType fileType, List<String>? allowedExtensions}) async {
Future<File?> pickFile(BuildContext context,
{required FileType fileType, List<String>? allowedExtensions}) async {
FilePickerResult? result;
final status = await AppPermissions.checkStoragePermissions(context);
if (status) {
result = await FilePicker.platform.pickFiles(allowMultiple: false, type: fileType, allowedExtensions: allowedExtensions);
result = await FilePicker.platform.pickFiles(
allowMultiple: true,
type: fileType,
allowedExtensions: allowedExtensions);
}
List<File> pickedFiles = [];
@ -107,23 +86,6 @@ class CommonServicesImp implements CommonAppServices {
}
}
}
return pickedFiles.isNotEmpty ? pickedFiles.first : null;
}
@override
double getDistanceBetween({required double curLatitude, required double curLongitude, required double destLatitude, required double destLongitude}) {
try {
double distance = Geolocator.distanceBetween(
curLatitude,
curLongitude,
destLatitude,
destLongitude,
);
return (distance / 1000);
} catch (e) {
logger.e(e.toString());
return 0.0;
}
return pickedFiles.length > 0 ? pickedFiles.first : null;
}
}

@ -1,402 +0,0 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/services/chat_navigation_service.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
abstract class FirebaseMessagingService {
Future<String> getFirebaseToken();
Future<void> initializeNotifications();
}
class FirebaseMessagingServiceImp implements FirebaseMessagingService {
final FlutterLocalNotificationsPlugin flutterLocalNotifications;
final FirebaseMessaging firebaseMessaging;
FirebaseMessagingServiceImp({required this.firebaseMessaging, required this.flutterLocalNotifications});
@override
Future<String> getFirebaseToken() async => await firebaseMessaging.getToken() ?? "";
Future<void> requestPermissions() async {
if (Platform.isIOS) {
await flutterLocalNotifications.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true, badge: true, sound: true);
} else if (Platform.isAndroid) {
AndroidFlutterLocalNotificationsPlugin? androidImplementation = flutterLocalNotifications.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();
bool? granted = await androidImplementation?.requestNotificationsPermission();
if (granted == false) {
await Permission.notification.request();
}
}
}
@override
Future<void> initializeNotifications() async {
await requestPermissions();
AppState().setDeviceToken = await getFirebaseToken();
AppState().setDeviceType = Platform.isAndroid ? "1" : "2";
await Permission.notification.isDenied.then((bool value) {
if (value) {
Permission.notification.request();
}
});
// Create high-priority notification channel for Android (required for terminated state)
if (Platform.isAndroid) {
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'mowater_chat_channel', // More descriptive channel ID
'Chat Notifications',
description: 'Notifications for chat messages',
importance: Importance.max,
// Changed to max for Android 14
playSound: true,
enableVibration: true,
showBadge: true,
);
await flutterLocalNotifications.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
log("✅ Android notification channel created: ${channel.id}");
}
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('ic_launcher');
DarwinInitializationSettings initializationSettingsDarwin = const DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestCriticalPermission: true,
requestProvisionalPermission: true,
requestSoundPermission: true,
defaultPresentAlert: true,
defaultPresentBadge: true,
defaultPresentBanner: true,
defaultPresentList: true,
defaultPresentSound: true,
);
final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsDarwin);
await flutterLocalNotifications.initialize(
initializationSettings,
onDidReceiveNotificationResponse: (NotificationResponse response) async {
// Handle notification tap when app is in foreground/background
log("========== Notification Tapped ==========");
log("Notification ID: ${response.id}");
log("Action ID: ${response.actionId}");
log("Input: ${response.input}");
log("Payload: ${response.payload}");
log("=========================================");
if (response.payload != null && response.payload!.isNotEmpty) {
try {
Map<String, dynamic> data = jsonDecode(response.payload!);
log("Parsed payload data: $data");
_handleNotificationNavigation(data);
} catch (e) {
logger.e("Error parsing notification payload: $e");
}
}
},
);
RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
if (initialMessage != null) _handleNotification(initialMessage);
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
// Foreground notification - just display, don't navigate automatically
if (message.notification != null) _handleForegroundNotification(message);
});
FirebaseMessaging.onMessageOpenedApp.listen(_handleNotificationOpenedApp);
FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);
FirebaseMessaging.instance.onTokenRefresh.listen((String token) async {
AppState().setDeviceToken = token;
});
}
void _onDidReceiveLocalNotification(int id, String? title, String? body, String? payload) async {
logger.i(body);
}
void _handleForegroundNotification(RemoteMessage message) async {
log("========== Foreground Notification Received ==========");
log("Title: ${message.notification!.title}");
log("Body: ${message.notification!.body}");
log("Data payload: ${message.data}");
log("Message ID: ${message.messageId}");
log("Sent time: ${message.sentTime}");
log("Android config: ${message.toMap()}");
log("======================================================");
// Just display notification - DON'T navigate automatically
// Navigation happens only when user taps the notification
displayNotification(
title: message.notification!.title ?? '',
body: message.notification!.body ?? '',
payload: jsonEncode(message.data),
);
}
void _handleNotificationOpenedApp(RemoteMessage message) async {
log("========== Notification Opened App ==========");
log("Title: ${message.notification!.title}");
log("Body: ${message.notification!.body}");
log("Data payload: ${message.data}");
log("Message ID: ${message.messageId}");
log("Sent time: ${message.sentTime}");
log("=============================================");
// User tapped notification - navigate to chat
_handleNotificationNavigation(message.data);
}
void _handleNotification(RemoteMessage message) async {
// This is called when app is terminated and opened by notification
log("========== App Terminated Notification ==========");
log("Title: ${message.notification!.title}");
log("Body: ${message.notification!.body}");
log("Data payload: ${message.data}");
log("Message ID: ${message.messageId}");
log("Sent time: ${message.sentTime}");
log("=================================================");
// User opened app from notification - navigate to chat
_handleNotificationNavigation(message.data);
}
void _handleNotificationNavigation(Map<String, dynamic> data) async {
log("========== Handling Notification Navigation ==========");
log("Full data received: $data");
if (data.isEmpty) {
log("Data is empty, skipping navigation");
log("======================================================");
return;
}
// Backend sends NotiType as string: "1" = Request, "2" = Ads, "3" = General
String? notiTypeStr = data['NotiType'];
int? notiType = int.tryParse(notiTypeStr ?? '');
log("NotiType from backend: $notiTypeStr (parsed: $notiType)");
if (notiType == null || notiType < 1 || notiType > 3) {
log("Invalid or missing NotiType, skipping navigation");
log("======================================================");
return;
}
// Map NotiType to chat type
String chatType;
switch (notiType) {
case 1:
chatType = 'request_offer';
break;
case 2:
chatType = 'ad_chat';
break;
case 3:
chatType = 'general_chat';
break;
default:
log("Unknown NotiType: $notiType");
log("======================================================");
return;
}
log("Mapped chat type: $chatType");
// Wait a bit for context to be available
await Future.delayed(Duration(milliseconds: 300));
BuildContext? context = navigatorKey.currentContext;
if (context == null) {
logger.e("Context not available for navigation");
log("======================================================");
return;
}
// Log all available data fields to understand backend format
log("Available data fields:");
data.forEach((key, value) {
log(" $key: $value");
});
switch (chatType) {
case 'request_offer':
log("Navigating to Request Offer Chat...");
await _navigateToRequestOfferChat(context, data);
break;
case 'ad_chat':
log("Navigating to Advertisement Chat...");
await _navigateToAdChat(context, data);
break;
case 'general':
log("Navigating to General Chat...");
await _navigateToGeneralChat(context, data);
break;
default:
logger.e("Unknown chat type: $chatType");
}
log("======================================================");
}
Future<void> _navigateToRequestOfferChat(
BuildContext context,
Map<String, dynamic> data,
) async {
try {
// Try both backend format and our format
int requestId = int.tryParse(data['RequestID']?.toString() ?? data['request_id']?.toString() ?? '0') ?? 0;
if (requestId == 0) {
log("❌ Invalid or missing RequestID in notification data");
return;
}
if (AppState().currentAppType == AppType.customer) {
// Customer notification tap: land on this request's offers list, matching
// the normal (non-notification) customer flow in requests_fragment.dart.
// ProvidersChatListPage below is provider-only (it reads the current
// user's own providerId), so routing a customer there fails.
log("✅ Navigating to offers list for request: $requestId");
navigateWithName(context, AppRoutes.offersListPage, arguments: requestId);
} else {
log("✅ Navigating to providers chat list for request: $requestId");
navigateWithName(context, AppRoutes.providersChatListPage);
}
// TODO: If backend sends all required data (ProviderId, CustomerId),
// we can navigate directly to the chat screen
} catch (e) {
logger.e("Error navigating to request chat: $e");
}
}
Future<void> _navigateToAdChat(
BuildContext context,
Map<String, dynamic> data,
) async {
try {
// Try both backend format and our format
int adId = int.tryParse(data['AdID']?.toString() ?? data['ad_id']?.toString() ?? '0') ?? 0;
// The "other participant" for the chat we're about to open/keep messaging in is
// whoever SENT the message that triggered this notification — NOT whatever the
// payload calls the "receiver". Backend has repeatedly mixed up sender/receiver
// fields in this payload (see firebase_notification_payload_format.md); if we
// blindly trust a "receiver" field that turns out to be OUR OWN id, every message
// we send afterwards gets addressed back to ourselves, and we start getting
// pushed notifications for our own messages. Prefer sender_id; fall back to the
// old receiver fields only if sender fields are missing entirely.
String? receiverUserId = data['SenderUserID'] ?? data['sender_id'] ?? data['ReceiverUserID'] ?? data['receiver_id'];
log("📦 Ad chat notification payload fields — "
"AdID: ${data['AdID']}, ad_id: ${data['ad_id']}, "
"SenderUserID: ${data['SenderUserID']}, sender_id: ${data['sender_id']}, "
"ReceiverUserID: ${data['ReceiverUserID']}, receiver_id: ${data['receiver_id']} "
"-> resolved receiverUserId: $receiverUserId");
final String? myUserId = AppState().getUser.data?.userInfo?.userId?.toString();
if (myUserId != null && receiverUserId == myUserId) {
log("⚠️ Resolved receiverUserId ($receiverUserId) matches the current user's own id — "
"the notification payload is likely still misidentifying sender/receiver. "
"Proceeding anyway, but messages sent from this chat may misroute.");
}
if (adId == 0 || receiverUserId == null) {
log("❌ Invalid AdID or sender/receiver id in notification data");
log(" AdID: ${data['AdID']}, resolved receiverUserId: $receiverUserId");
return;
}
// Check if user is already on this specific chat
// Try to get ChatVM from Provider, but don't fail if not available
try {
final chatVM = Provider.of<ChatVM>(context, listen: false);
if (chatVM.isOnAdChat(adId, receiverUserId)) {
log("✅ User already on ad chat (adId=$adId), skipping navigation");
return;
}
} catch (e) {
// ChatVM not available in context, proceed with navigation
log("⚠️ Could not check chat context: $e");
}
log("✅ Navigating to ad chat: adId=$adId");
final chatNavService = injector.get<ChatNavigationService>();
await chatNavService.navigateToAdChat(
context: context,
adsId: adId,
receiverUserId: receiverUserId,
);
} catch (e) {
logger.e("Error navigating to ad chat: $e");
}
}
Future<void> _navigateToGeneralChat(
BuildContext context,
Map<String, dynamic> data,
) async {
try {
// Try both backend format and our format
int requestId = int.tryParse(data['RequestID']?.toString() ?? data['request_id']?.toString() ?? '0') ?? 0;
if (requestId == 0) {
log("❌ Invalid or missing RequestID in notification data");
return;
}
log("✅ Navigating to general chat list for request: $requestId");
navigateWithName(
context,
AppRoutes.generalChatsListForProvider,
arguments: requestId,
);
} catch (e) {
logger.e("Error navigating to general chat: $e");
}
}
Future<void> displayNotification({
required String title,
required String body,
String? payload,
}) async {
const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(
'mowater_chat_channel', // Match the channel ID we created
'Chat Notifications',
channelDescription: 'Notifications for chat messages',
importance: Importance.max,
priority: Priority.high,
ticker: 'ticker',
);
const DarwinNotificationDetails iOSPlatformChannelSpecifics = DarwinNotificationDetails(threadIdentifier: 'thread_id');
const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails, iOS: iOSPlatformChannelSpecifics);
await flutterLocalNotifications.show(0, title, body, notificationDetails, payload: payload ?? 'item x');
}
}
@pragma('vm:entry-point')
Future<dynamic> backgroundMessageHandler(RemoteMessage message) async {
await Firebase.initializeApp();
}

@ -15,7 +15,6 @@ abstract class PaymentService {
required PaymentTypes paymentType,
required Function() onSuccess,
required Function() onFailure,
Function()? onExit,
});
Future<void> onBrowserLoadStart({
@ -27,34 +26,24 @@ abstract class PaymentService {
class PaymentServiceImp implements PaymentService {
MyInAppBrowser? myInAppBrowser;
var inAppBrowserOptions = InAppBrowserClassSettings(
webViewSettings: InAppWebViewSettings(
useShouldOverrideUrlLoading: false,
transparentBackground: false,
isInspectable: false,
applePayAPIEnabled: true,
cacheEnabled: false,
allowsBackForwardNavigationGestures: false,
),
browserSettings: InAppBrowserSettings(
hideUrlBar: true,
hideTitleBar: true,
hideDefaultMenuItems: true,
hideToolbarBottom: true,
hideToolbarTop: false,
hideCloseButton: false,
allowGoBackWithBackButton: false,
toolbarBottomBackgroundColor: Colors.black,
closeButtonColor: Colors.white,
presentationStyle: ModalPresentationStyle.FULL_SCREEN,
// toolbarTopBackgroundColor: Colors.black
),
);
var inAppBrowserOptions = InAppBrowserClassOptions(
inAppWebViewGroupOptions:
InAppWebViewGroupOptions(crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false), ios: IOSInAppWebViewOptions(applePayAPIEnabled: true)),
crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black),
android: AndroidInAppBrowserOptions(),
ios:
IOSInAppBrowserOptions(hideToolbarBottom: true, toolbarBottomBackgroundColor: Colors.white, closeButtonColor: Colors.white, presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN));
String getUrlRequestByPaymentId({required int id, List<int>? appointmentIds, required PaymentTypes paymentType}) {
@override
Future<void> placePayment({
required int id,
List<int>? appointmentIds,
required PaymentTypes paymentType,
required Function() onSuccess,
required Function() onFailure,
}) async {
String urlRequest = "";
int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0;
switch (paymentType) {
case PaymentTypes.subscription:
urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&OrderProviderSubscriptionID=$id";
@ -85,38 +74,16 @@ class PaymentServiceImp implements PaymentService {
urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&CustomerID=$customerId&RequestID=$id";
break;
}
return urlRequest;
}
@override
Future<void> placePayment({
required int id,
List<int>? appointmentIds,
required PaymentTypes paymentType,
required Function() onSuccess,
required Function() onFailure,
Function()? onExit,
}) async {
String urlRequest = getUrlRequestByPaymentId(id: id, paymentType: paymentType, appointmentIds: appointmentIds);
log("PaymentUrl: $urlRequest");
myInAppBrowser = MyInAppBrowser(onExitCallback: () {
log("Browser Exited");
if (onExit != null) {
onExit();
}
}, onLoadStartCallback: (String url) {
log("Browser LoadStart for : $url");
onBrowserLoadStart(onFailure: onFailure, onSuccess: onSuccess, url: url);
});
await myInAppBrowser!.openUrlRequest(
urlRequest: URLRequest(
url: WebUri(urlRequest, forceToStringRawValue: true),
allowsCellularAccess: true,
allowsConstrainedNetworkAccess: true,
allowsExpensiveNetworkAccess: true,
),
settings: inAppBrowserOptions,
urlRequest: URLRequest(url: Uri.parse(urlRequest)),
options: inAppBrowserOptions,
);
}

@ -5,14 +5,14 @@ import 'colors.dart';
class AppTheme {
static getTheme({required isArabic}) {
return ThemeData(
fontFamily: !isArabic ? MyFonts.poppinsFont : MyFonts.gessTwoFont,
fontFamily: !isArabic ? MyFonts.poppinsFont : null,
primaryColor: primaryColor,
useMaterial3: false,
primaryTextTheme: TextTheme(
titleLarge: TextStyle(color: Colors.white, fontFamily: !isArabic ? MyFonts.poppinsFont : MyFonts.gessTwoFont,)
),
colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange).copyWith(surface: Colors.white),
primaryTextTheme: const TextTheme(
titleLarge: TextStyle(color: Colors.white),
), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange).copyWith(background: Colors.white),
);
}
}

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
class MyColors {
static const Color darkPrimaryColor = Color(0xffF47F20);
static const Color primaryColor = Color(0xffF69521);
static const Color lightPrimaryColor = Color(0xffFFD077);
static const Color accentColor = Colors.blue;
static const Color lightTextColor = Color(0xff969696);
static const Color textColor = Color(0xff777777);
@ -39,10 +38,6 @@ class MyColors {
static const Color borderColor = Color(0xffE8E8E8);
static const Color greyAddBorderColor = Color(0xffEEEEEE);
static const Color lightGreyBgColor = Color(0xffFDFDFD);
static const Color lightGreyDDColor = Color(0xffDDDDDD);
static const Color greyColor = Color(0xff787878);
static const Color provTextColor = Color(0xFF28323A);
//AdStatusColors:
static const Color adActiveStatusColor = Color(0xff5FC16A);
@ -50,17 +45,6 @@ class MyColors {
static const Color adSoldStatusColor = Color(0xff22742B);
static const Color adPendingStatusColor = Color(0xffEDB947);
static const Color pendingColor = Colors.amber;
static const Color submittedColor = Colors.blue;
static const Color inProgressColor = Colors.indigo;
static const Color completedColor = Colors.green;
static const Color cancelledColor = Colors.red;
static const Color paidColor = Colors.teal;
static const Color expiredColor = Colors.grey;
static const Color shippingColor = Colors.purple;
static const Color deliveryColor = Colors.brown;
static const Color selfPickupColor = Colors.orange;
static Decoration gradient = BoxDecoration(
gradient: const LinearGradient(colors: [
darkPrimaryColor,

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class DateHelper {
@ -11,16 +10,6 @@ class DateHelper {
return formatter.parse(dateString);
}
/// True when [dateString] is at most [days] away from now, or already in the past
/// (e.g. an already-expired subscription still qualifies as "within 7 days").
static bool isWithinDays(String? dateString, int days) {
if (dateString == null || dateString.isEmpty) return false;
final DateTime date = parseStringToDate(formatDateT(dateString));
return date
.difference(DateTime.now())
.inDays <= days;
}
static String formatAsShortDate(DateTime date) {
final formatter = DateFormat.yMd();
return formatter.format(date);
@ -31,13 +20,8 @@ class DateHelper {
return formatter.format(date);
}
// static String formatAsTime(DateTime date) {
// final formatter = DateFormat.jm();
// return formatter.format(date);
// }
static String formatAsTime(DateTime date, {bool isArabic = false,}) {
final formatter = DateFormat.jm(
isArabic ? 'ar' : 'en',);
static String formatAsTime(DateTime date) {
final formatter = DateFormat.jm();
return formatter.format(date);
}
@ -51,15 +35,8 @@ class DateHelper {
return formatter.format(date);
}
// static String formatAsDayMonthYear(DateTime? date) {
// final formatter = DateFormat('d MMM, y');
// return date != null ? formatter.format(date) : "N/A";
// }
static String formatAsDayMonthYear(DateTime? date,
{ bool isArabic = false,}) {
final formatter = DateFormat('d MMM, y',
isArabic ? 'ar' : 'en',
);
static String formatAsDayMonthYear(DateTime? date) {
final formatter = DateFormat('d MMM, y');
return date != null ? formatter.format(date) : "N/A";
}
@ -73,44 +50,3 @@ class DateHelper {
return formatter.format(date);
}
}
extension TimeOfDayUtils on TimeOfDay {
bool isAfter(TimeOfDay other) {
final thisTime = DateTime(0, 1, 1, hour, minute);
final otherTime = DateTime(0, 1, 1, other.hour, other.minute);
return thisTime.isAfter(otherTime);
}
bool isBefore(TimeOfDay other) {
final thisTime = DateTime(0, 1, 1, hour, minute);
final otherTime = DateTime(0, 1, 1, other.hour, other.minute);
return thisTime.isBefore(otherTime);
}
static TimeOfDay convertStringToTimeOfDay(String timeString) {
bool is12HourFormat = timeString.contains(RegExp(r'AM|PM', caseSensitive: false));
int hour;
int minute;
if (is12HourFormat) {
List<String> parts = timeString.split(' '); // Split time and AM/PM part
List<String> timeParts = parts[0].split(':'); // Split hours and minutes
hour = int.parse(timeParts[0]);
minute = int.parse(timeParts[1]);
if (parts[1].toUpperCase() == 'PM' && hour != 12) {
hour += 12;
} else if (parts[1].toUpperCase() == 'AM' && hour == 12) {
hour = 0;
}
} else {
List<String> timeParts = timeString.split(':');
hour = int.parse(timeParts[0]);
minute = int.parse(timeParts[1]);
}
return TimeOfDay(hour: hour, minute: minute);
}
}

@ -1,6 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/utils/app_permission_handler.dart';
@ -13,7 +11,7 @@ Future<ConfirmAction?> showConfirmDialogs(context, msg, positiveText, negativeTe
builder: (context) {
return AlertDialog(
backgroundColor: Colors.white,
title: Text(msg, style: const TextStyle(fontSize: 16)),
title: Text(msg, style: TextStyle(fontSize: 16)),
actions: <Widget>[
TextButton(
child: Text(
@ -37,30 +35,19 @@ Future<ConfirmAction?> showConfirmDialogs(context, msg, positiveText, negativeTe
);
}
void actionConfirmationBottomSheet({required BuildContext context, required Widget title, required subtitle, required Widget actionButtonYes, required Widget actionButtonNo, Widget? checkBoxConfirmationWidget, bool isOnlyOneButton = false}) {
void actionConfirmationBottomSheet({required BuildContext context, required Widget title, required subtitle, required Widget actionButtonYes, required Widget actionButtonNo}) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
builder: (BuildContext context) {
return InfoBottomSheet(
title: title,
description: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"$subtitle".toText(fontSize: 14, fontWeight: MyFonts.Medium),
if (checkBoxConfirmationWidget != null) ...[
10.height,
checkBoxConfirmationWidget,
],
25.height,
if (isOnlyOneButton) ...[
Row(
children: [
actionButtonYes,
],
),
] else ...[
title: title,
description: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"$subtitle".toText(fontSize: 16),
25.height,
Row(
children: [
actionButtonYes,
@ -68,11 +55,9 @@ void actionConfirmationBottomSheet({required BuildContext context, required Widg
actionButtonNo,
],
),
19.height,
],
19.height,
],
),
);
));
},
);
}

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

Loading…
Cancel
Save