Compare commits

..

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

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.0 KiB

@ -76,7 +76,7 @@
"userRoleOrTitle": "عنوان المستخدم", "userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل", "codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل", "number": "موبايل",
"english": "عربي", "english": "English",
"title": "مرحبًا", "title": "مرحبًا",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language", "msg_named": "{} are written in the {lang} language",
@ -186,7 +186,7 @@
"updateBranch": "تحديث فرع", "updateBranch": "تحديث فرع",
"branches": "الفروع", "branches": "الفروع",
"requests": "الطلبات", "requests": "الطلبات",
"noBranchFound": "لم يتم العثور على فرع", "noBranchFound" : "لم يتم العثور على فرع",
"onlyProviderApp": "نأسف هذا التطبيق فقط لمقدمي الخدمات", "onlyProviderApp": "نأسف هذا التطبيق فقط لمقدمي الخدمات",
"pickAddress": "اختر العنوان", "pickAddress": "اختر العنوان",
"pickLocation": "اختر الموقع", "pickLocation": "اختر الموقع",
@ -202,19 +202,19 @@
"completeProfile2": "اكمل الملف الشخصي 2/3", "completeProfile2": "اكمل الملف الشخصي 2/3",
"completeProfile3": "اكمل الملف الشخصي 3/3", "completeProfile3": "اكمل الملف الشخصي 3/3",
"provider": "مزود", "provider": "مزود",
"noRequeststoShow": "لا توجد طلبات للعرض", "noRequeststoShow" : "لا توجد طلبات للعرض",
"myBranches": "فروعي", "myBranches": "فروعي",
"mergeAppointments": "دمج المواعيد", "mergeAppointments" : "دمج المواعيد",
"addService": "أضف الخدمة", "addService" : "أضف الخدمة",
"selectServicestoAdd": "حدد الخدمات التي تريد إضافتها", "selectServicestoAdd" : "حدد الخدمات التي تريد إضافتها",
"noServiceFound": "لم يتم العثور على الخدمة", "noServiceFound": "لم يتم العثور على الخدمة",
"selectItems": "اختيار العناصر", "selectItems" : "اختيار العناصر",
"noItemSelectedYet": "لم يتم تحديد أي عنصر بعد", "noItemSelectedYet" : "لم يتم تحديد أي عنصر بعد",
"totalAdditionalAmount": "إجمالي المبلغ الإضافي", "totalAdditionalAmount" : "إجمالي المبلغ الإضافي",
"sar": "ريال سعودي", "sar" : "ريال سعودي",
"cancel": "يلغي", "cancel" : "يلغي",
"add": "يضيف", "add" : "يضيف",
"itemsAddedSuccessfully": "تمت إضافة العناصر بنجاح", "itemsAddedSuccessfully" : "تمت إضافة العناصر بنجاح",
"pleaseSelectItems": "يرجى اختيار العناصر", "pleaseSelectItems": "يرجى اختيار العناصر",
"totalAmount": "المبلغ الإجمالي", "totalAmount": "المبلغ الإجمالي",
"searchItems": "البحث عن العناصر", "searchItems": "البحث عن العناصر",
@ -242,7 +242,6 @@
"payLater": "ادفع لاحقًا", "payLater": "ادفع لاحقًا",
"complete": "اكتمل", "complete": "اكتمل",
"makeAnOffer": "قدم عرضًا", "makeAnOffer": "قدم عرضًا",
"provideOffer": "تقديم العرض",
"enterAmount": "أدخل المبلغ", "enterAmount": "أدخل المبلغ",
"submit": "إرسال", "submit": "إرسال",
"viewChat": "عرض الدردشة", "viewChat": "عرض الدردشة",
@ -329,7 +328,7 @@
"vehiclePart": "جزء المركبة", "vehiclePart": "جزء المركبة",
"damagePartPictures": "صور الأجزاء المتضررة", "damagePartPictures": "صور الأجزاء المتضررة",
"vehicleDamagePart": "جزء المركبة المتضرر", "vehicleDamagePart": "جزء المركبة المتضرر",
"duration": "المدة", "duration": ":المدة",
"specialServices": "الخدمات الخاصة", "specialServices": "الخدمات الخاصة",
"specialService": "خدمة خاصة", "specialService": "خدمة خاصة",
"adContactDetails": "تفاصيل الاتصال بالإعلان", "adContactDetails": "تفاصيل الاتصال بالإعلان",
@ -357,7 +356,7 @@
"setupTouchID": "يرجى إعداد معرف اللمس", "setupTouchID": "يرجى إعداد معرف اللمس",
"reenableTouchID": "يرجى إعادة تمكين معرف اللمس", "reenableTouchID": "يرجى إعادة تمكين معرف اللمس",
"scanFaceIDAuthenticate": "امسح بصمة الإصبع أو معرف الوجه للتحقق", "scanFaceIDAuthenticate": "امسح بصمة الإصبع أو معرف الوجه للتحقق",
"adDeletedSuccessfully": "تم حذف الإعلان بنجاح!", "AdDeletedSuccessfully": "تم حذف الإعلان بنجاح!",
"yourReservationCancelled": "تم إلغاء حجزك.", "yourReservationCancelled": "تم إلغاء حجزك.",
"adDeactivatedSuccessfully": "تم إلغاء تفعيل الإعلان بنجاح!", "adDeactivatedSuccessfully": "تم إلغاء تفعيل الإعلان بنجاح!",
"vehicle": { "vehicle": {
@ -492,7 +491,8 @@
"submitAd": "إرسال الإعلان", "submitAd": "إرسال الإعلان",
"selectAdType": "اختر نوع الإعلان", "selectAdType": "اختر نوع الإعلان",
"validUntilSubscriptionExpiration": "صالح حتى انتهاء الاشتراك", "validUntilSubscriptionExpiration": "صالح حتى انتهاء الاشتراك",
"youLeftAdsGivenSubscription": "لقد تركت مع إعلانات محدودة الواردة في الاشتراك.", "adsRemaining": "الإعلانات المتبقية",
"youLeftAdsGivenSubscription": "لقد بقي لديك 05 من 50 إعلانًا في الاشتراك.",
"updateSubscription": "تحديث الاشتراك", "updateSubscription": "تحديث الاشتراك",
"workInProgress": "العمل جارٍ", "workInProgress": "العمل جارٍ",
"visitCompleted": "تمت الزيارة", "visitCompleted": "تمت الزيارة",
@ -516,6 +516,7 @@
"itemsSelected": "العناصر المحددة", "itemsSelected": "العناصر المحددة",
"workshopFullAccessServices": "بعض الخدمات غير متوفرة في الموقع المنزلي. قم بتغيير الموقع إلى ورشة العمل للوصول الكامل إلى الخدمات", "workshopFullAccessServices": "بعض الخدمات غير متوفرة في الموقع المنزلي. قم بتغيير الموقع إلى ورشة العمل للوصول الكامل إلى الخدمات",
"changeLocationService": "تغيير الموقع أو الخدمة:", "changeLocationService": "تغيير الموقع أو الخدمة:",
"noItemstoShow": "لا توجد عناصر لعرضها.",
"someDescriptionSubServices": "بعض الوصف عن الخدمات الفرعية", "someDescriptionSubServices": "بعض الوصف عن الخدمات الفرعية",
"selectServicesYouWant": "اختر الخدمات التي تريدها", "selectServicesYouWant": "اختر الخدمات التي تريدها",
"selectServiceType": "اختر نوع الخدمة", "selectServiceType": "اختر نوع الخدمة",
@ -560,259 +561,20 @@
"inviteFriends": "دعوة الأصدقاء", "inviteFriends": "دعوة الأصدقاء",
"more": "المزيد", "more": "المزيد",
"language": "اللغة", "language": "اللغة",
"mySubscription": "اشتراكاتي", "mySubscriptions": "اشتراكاتي",
"subscriptions": "الاشتراكات", "subscriptions": "الاشتراكات",
"defineLicenses": "تحديد التراخيص", "defineLicenses": "تحديد التراخيص",
"logOut": "تسجيل الخروج", "logOut": "تسجيل الخروج",
"customer": "العميل", "customer": "العميل",
"amountVAR": "كمية", "accept": "قبول"
"accept": "قبول",
"nowVar": "الآن",
"whendoyouWanttoUpgrade": "متى تريد الترقية",
"yourSubscriptionUpgradeAffectingFrom": "سيتم ترقية اشتراكك الآن. ساري المفعول من",
"upgradeAfterCurrentExpiry": "الترقية بعد انتهاء الاشتراك الحالي",
"yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom": "سيتم ترقية اشتراكك بعد انتهاء اشتراكك الحالي. ساري المفعول من",
"upgradeVar": "ترقية",
"whendoyouWanttoRenew": "متى تريد التجديد",
"renewVar": "تجديد",
"requestAlreadyInProgress": "هذا الطلب قيد التقدم بالفعل.",
"acceptOfferConfirmation": "هل تريد قبول هذا العرض؟",
"acceptOfferConfirmationMessage": "سيتم قبول هذا العرض وستدفع المبلغ المطلوب للمشتري في وقت معين وإلا سيتم إلغاء هذا العرض.",
"noUpcomingAppointments": "لا مواعيد قادم..",
"addNewAppointment": "إضافة موعد جديد",
"myNearbyBranches": "فروعي القريبة",
"myRecentBranches": "فروعي الأخيرة",
"favoriteList": "قائمة المفضلة",
"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": "البحث حسب طراز المركبة",
"customerCarePrompt": "هل لديك أي استفسار؟ نحن هنا لخدمتك. انقر هنا للتحدث مع خدمة العملاء لدينا الآن.",
"callNow": "اتصل الآن",
"condition": "الحالة",
"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": "تم المشاهدة",
"updateUserDetails": "تحديث تفاصيل المستخدم",
"enterNewFirstName": "أدخل الاسم الأول",
"enterNewLastName": "أدخل الاسم الأخير",
"userDetailsUpdated": "يتم تحديث تفاصيل المستخدم",
"itemNoLongerAvailable": "لم يعد هذا العنصر متاحًا.",
"reactivateAd": "إعادة تنشيط الإعلان",
"dealOutsideApp": "تمت الصفقة خارج التطبيق مع عميل آخر.",
"noAgreementCustomer": "لا يوجد اتفاق من جانب العميل.",
"dealNotCompleted": "لم تكتمل الصفقة",
"changedDesireToSell": "غيرت رغبتي في بيع المركبة.",
"vehicleDealOutsideApp": "تمت صفقة المركبة خارج التطبيق.",
"markAdAsSoldDesc": "سيتم وضع علامة 'تم البيع' على هذا الإعلان، ولن يتمكن المستخدمون الآخرون من التواصل معك.",
"ownerInformation": "معلومات المالك",
"acceptedRequests": "الطلبات المقبولة",
"specialRequestChat": "دردشة الطلب الخاص",
"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": "رجى إضافة عنوان صالح"
} }

@ -40,7 +40,7 @@
"forgetPass": "Forget Password ?", "forgetPass": "Forget Password ?",
"phoneNumberVerified": "Phone Number Verified", "phoneNumberVerified": "Phone Number Verified",
"verifyNewPassword": "Verify New Password", "verifyNewPassword": "Verify New Password",
"EnterPass": "Enter Password", "EnterPass": "Enter Password ?",
"alreadySigned": " Already Signed Up and Logged In", "alreadySigned": " Already Signed Up and Logged In",
"emailChangedSuccessfully": "Email is Changed Successfully", "emailChangedSuccessfully": "Email is Changed Successfully",
"passwordIsUpdated": "Password is Updated", "passwordIsUpdated": "Password is Updated",
@ -76,7 +76,7 @@
"userRoleOrTitle": "User role or title", "userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email", "codeSentToEmail": "Code is sent to email",
"number": "Number", "number": "Number",
"english": "English", "english": "عربي",
"title": "Hello", "title": "Hello",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language", "msg_named": "{} are written in the {lang} language",
@ -242,7 +242,6 @@
"payLater": "Pay Later", "payLater": "Pay Later",
"complete": "Complete", "complete": "Complete",
"makeAnOffer": "Make an offer", "makeAnOffer": "Make an offer",
"provideOffer": "Provide Offer",
"enterAmount": "Enter amount", "enterAmount": "Enter amount",
"submit": "Submit", "submit": "Submit",
"viewChat": "View Chat", "viewChat": "View Chat",
@ -329,7 +328,7 @@
"vehiclePart": "Vehicle Part", "vehiclePart": "Vehicle Part",
"damagePartPictures": "Damage Part Pictures", "damagePartPictures": "Damage Part Pictures",
"vehicleDamagePart": "Vehicle Damage Part", "vehicleDamagePart": "Vehicle Damage Part",
"duration": "Duration", "duration": "Duration:",
"specialServices": "Special Services", "specialServices": "Special Services",
"specialService": "Special Service", "specialService": "Special Service",
"adContactDetails": "Ad Contact Details", "adContactDetails": "Ad Contact Details",
@ -405,14 +404,14 @@
"passwordAcceptableStrong": "Your password is acceptable but not strong", "passwordAcceptableStrong": "Your password is acceptable but not strong",
"passwordIsStrong": "Your password is strong", "passwordIsStrong": "Your password is strong",
"passwordVeryStrong": "Your password is very 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", "selectDuration": "Select Duration",
"daysVar": "Days", "daysVar": "Days",
"adCharges": "Ad Charges", "adCharges": "Ad Charges",
"select": "Select", "select": "Select",
"deleteAdConfirmation": "Do you want to delete the ad?", "deleteAdConfirmation": "Do you want to delete the ad?",
"deleteAdConfirmationMessage": "Your ad will be permanently deleted and you cannot undo this action", "deleteAdConfirmationMessage": "Your ad will be permanently deleted and you cannot undo this action",
"mileage": "Mileage", "mileage": "mileage",
"transmission": "Transmission", "transmission": "Transmission",
"demand": "Demand", "demand": "Demand",
"adDurationExpired": "Your Ad Duration time is over", "adDurationExpired": "Your Ad Duration time is over",
@ -424,92 +423,93 @@
"reserveAd": "Reserve Ad", "reserveAd": "Reserve Ad",
"reservationAmount": "Reservation Amount", "reservationAmount": "Reservation Amount",
"belowAmountPayLater": "Below Amount that you will pay later", "belowAmountPayLater": "Below Amount that you will pay later",
"carPrice": "Car Price", "carPrice":"Car Price",
"vatExcluded": "VAT Excluded", "vatExcluded":"VAT Excluded",
"carInsuranceService": "Car insurance Service", "carInsuranceService":"Car insurance Service",
"toBeDecided": "To be Decided", "toBeDecided":"To be Decided",
"registrationCarPlates": "Registration & Car Plates", "registrationCarPlates":"Registration & Car Plates",
"homeDeliveryService": "Home Delivery Service", "homeDeliveryService":"Home Delivery Service",
"specialServicechargesInsuranceDeliveryLocation": "Special service charges will be added based on desired insurance and delivery Location", "specialServicechargesInsuranceDeliveryLocation":"Special service charges will be added based on desired insurance and delivery Location",
"estimated": "Estimated", "estimated":"Estimated",
"servicesReservingAd": "Some services are mandatory while reserving Ad", "servicesReservingAd":"Some services are mandatory while reserving Ad",
"completeReservation": "Complete Reservation", "completeReservation":"Complete Reservation",
"contact": "Contact", "contact":"Contact",
"setDateandTime": "Set Date and Time", "setDateandTime":"Set Date and Time",
"selectOffice": "Select Office", "selectOffice":"Select Office",
"availableSlots": "Available Slots", "availableSlots":"Available Slots",
"bookAndPay": "Book and Pay", "bookAndPay":"Book and Pay",
"reservationAmounts": "Reservation Amounts", "reservationAmounts":"Reservation Amounts",
"tax": "Tax", "tax":"Tax",
"adsFilter": "Ads Filter", "adsFilter": "Ads Filter",
"searchByCity": "Search By City", "searchByCity":"Search By City",
"selectCity": "Select City", "selectCity":"Select City",
"searchByBrandName": "Search By Brand Name", "searchByBrandName":"Search By Brand Name",
"selectVehicleBrand": "Select Vehicle Brand", "selectVehicleBrand":"Select Vehicle Brand",
"searchByVehicleYear": "Search By Vehicle Year", "searchByVehicleYear":"Search By Vehicle Year",
"selectYear": "Select Year", "selectYear":"Select Year",
"searchByAdOwner": "Search By Ad Owner", "searchByAdOwner":"Search By Ad Owner",
"selectOwner": "Select Owner", "selectOwner":"Select Owner",
"search": "Search", "search":"Search",
"clearFilters": "Clear Filters", "clearFilters":"Clear Filters",
"book": "Book", "book":"Book",
"markAsSold": "Mark As Sold", "markAsSold":"Mark As Sold",
"deactivateAd": "Deactivate Ad", "deactivateAd":"Deactivate Ad",
"doWantDeactivateAd": "Do you want to the Deactivate this Ad?", "doWantDeactivateAd":"Do you want to the Deactivate this Ad?",
"stoptheBuyers": "We will stop showing this ad to the buyers", "stoptheBuyers":"We will stop showing this ad to the buyers",
"cancelReservation": "Cancel Reservation", "cancelReservation":"Cancel Reservation",
"reasonForCancellation": "Reason for Cancellation", "reasonForCancellation":"Reason for Cancellation",
"doWantCancelReservation": "Do you want to cancel the reservation", "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", "yourAdVisibletoBuy.":"Your ad reservation will be cancelled and this ad will be again visible to everyone to buy",
"completeDeal": "Complete Deal", "completeDeal":"Complete Deal",
"uploadBankReceipt": "Upload Bank Receipt", "uploadBankReceipt":"Upload Bank Receipt",
"notesForAdmin": "Notes For Admin", "notesForAdmin":"Notes For Admin",
"extendAd": "Extend Ad", "extendAd":"Extend Ad",
"updateAdDetails": "Do you want to update the Ad Details", "updateAdDetails":"Do you want to update the Ad Details",
"durationExtendingAd": "You can change the ad duration and details before extending the ad", "durationExtendingAd":"You can change the ad duration and details before extending the ad",
"waitingAdminsResponse": "Waiting for Admins Response", "waitingAdminsResponse":"Waiting for Admins Response",
"cancelledByOwner": "Cancelled by Owner", "cancelledByOwner":"Cancelled by Owner",
"cancelledByAdmin": "Cancelled by Admin", "cancelledByAdmin":"Cancelled by Admin",
"reservationTimeOver": "Reservation Time Over", "reservationTimeOver":"Reservation Time Over",
"paymentVerified": "Payment Verified", "paymentVerified":"Payment Verified",
"rejectedFormAdmin": "Rejected form Admin", "rejectedFormAdmin":"Rejected form Admin",
"waitingAdminPost": "Waiting for admin to post", "waitingAdminPost":"Waiting for admin to post",
"waitingAdminsApproval": "Waiting for Admins Approval", "waitingAdminsApproval":"Waiting for Admins Approval",
"sold": "Sold", "sold":"Sold",
"noAdsShow": "No Ads to show", "noAdsShow":"No Ads to show",
"damagePartList": "Damage Part List", "damagePartList":"Damage Part List",
"searchPart": "Search Part", "searchPart":"Search Part",
"addSpecialService": "Add Special Service", "addSpecialService":"Add Special Service",
"vehicleVar": "Vehicle", "vehicleVar":"Vehicle",
"detailsVar": "Details", "detailsVar":"Details",
"damageVar": "Damage", "damageVar":"Damage",
"partsVar": "Parts", "partsVar": "Parts",
"additional": "Additional", "additional":"Additional",
"review": "Review", "review":"Review",
"adVar": "Ad", "adVar": "Ad",
"updateAd": "Update Ad", "updateAd":"Update Ad",
"createAd": "Create Ad", "createAd":"Create Ad",
"next": "Next", "next":"Next",
"submitAd": "Submit Ad", "submitAd":"Submit Ad",
"selectAdType": "Select Ad Type", "selectAdType":"Select Ad Type",
"validUntilSubscriptionExpiration": "Valid Until Subscription Expiration", "validUntilSubscriptionExpiration":"Valid Until Subscription Expiration",
"youLeftAdsGivenSubscription": "You have left with limited ads given in the subscription.", "adsRemaining ":"Ads Remaining",
"updateSubscription": "Update Subscription", "youLeftAdsGivenSubscription":"You have left with 05 out of 50 ads given in the subscription.",
"workInProgress": "Work In Progress", "updateSubscription":"Update Subscription",
"visitCompleted": "Visit Completed", "workInProgress":"Work In Progress",
"youWantCancelAppointment": "Do you want to cancel this appointment?", "visitCompleted":"Visit Completed",
"appointmentCancelledCannotUndoAction": "Your appointment will be cancelled and you cannot undo this action.", "youWantCancelAppointment":"Do you want to cancel this appointment?",
"appointment": "Appointment", "appointmentCancelledCannotUndoAction":"Your appointment will be cancelled and you cannot undo this action.",
"rescheduleAppointment": "Reschedule Appointment", "appointment":"Appointment",
"payforAppointment": "Pay for Appointment", "rescheduleAppointment":"Reschedule Appointment",
"appointmentsFilter": "Appointments Filter", "payforAppointment":"Pay for Appointment",
"searchByProvider": "Search By Provider", "appointmentsFilter":"Appointments Filter",
"selectProvider": "Select Provider", "searchByProvider":"Search By Provider",
"searchByBranch": "Search By Branch", "selectProvider":"Select Provider",
"searchByCategory": "Search By Category", "searchByBranch":"Search By Branch",
"selectCategory": "Select Category", "searchByCategory":"Search By Category",
"searchByService": "Search By Service", "selectCategory":"Select Category",
"selectServices": "Select Services", "searchByService":"Search By Service",
"selectServices":"Select Services",
"modifyPackage": "Modify Package", "modifyPackage": "Modify Package",
"schedule": "Schedule", "schedule": "Schedule",
"serviceLocation": "Service Location:", "serviceLocation": "Service Location:",
@ -517,6 +517,7 @@
"itemsSelected": "Item(s) Selected", "itemsSelected": "Item(s) Selected",
"workshopFullAccessServices": "Few services are not available on home location. Change the location to workshop to full access the services", "workshopFullAccessServices": "Few services are not available on home location. Change the location to workshop to full access the services",
"changeLocationService": "Change location or service:", "changeLocationService": "Change location or service:",
"noItemstoShow": "No Items to show.",
"someDescriptionSubServices": "Some description about the sub-services", "someDescriptionSubServices": "Some description about the sub-services",
"selectServicesYouWant": "Select services you want", "selectServicesYouWant": "Select services you want",
"selectServiceType": "Select service type", "selectServiceType": "Select service type",
@ -526,13 +527,13 @@
"dateAndTime": "Date and Time", "dateAndTime": "Date and Time",
"timeLocation": "Time & Location", "timeLocation": "Time & Location",
"serviceCharges": "Service Charges", "serviceCharges": "Service Charges",
"locationCharges": "Location Charges", "locationCharges" : "Location Charges",
"payableNow": "Payable Now", "payableNow": "Payable Now",
"remainingAmount": "Remaining Amount", "remainingAmount": "Remaining Amount",
"branchesFilter": "Branches Filter", "branchesFilter": "Branches Filter",
"searchByDistance": "Search By Distance", "searchByDistance": "Search By Distance",
"searchByMinimumRatings": "Search By Minimum Ratings", "searchByMinimumRatings": "Search By Minimum Ratings",
"chat": "Chat", "chat": "Chat",
"noRequestsShow": "No Requests to show.", "noRequestsShow": "No Requests to show.",
"typeMessageHere": "Type your message here..", "typeMessageHere": "Type your message here..",
"reject": "Reject", "reject": "Reject",
@ -560,257 +561,11 @@
"termPrivacy": "Term & Privacy", "termPrivacy": "Term & Privacy",
"inviteFriends": "Invite Friends", "inviteFriends": "Invite Friends",
"more": "More", "more": "More",
"language": "Language", "language" :"Language",
"mySubscription": "My Subscription", "mySubscriptions": "My Subscriptions",
"subscriptions": "Subscriptions", "subscriptions": "Subscriptions",
"defineLicenses": "Define Licenses", "defineLicenses": "Define Licenses",
"logOut": "Log Out", "logOut": "Log Out",
"customer": "Customer", "customer": "Customer",
"accept": "Accept", "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",
"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",
"customerCarePrompt": "Got any question? We are here to service. Click here to talk to our customer care right now.",
"callNow": "Call Now",
"condition": "Condition",
"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",
"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",
"specialRequestChat": "Special 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"
} }

@ -4,18 +4,15 @@ import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:http/io_client.dart'; import 'package:http/io_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/exceptions/api_exception.dart';
import 'package:mc_common_app/main.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/refresh_token.dart';
import 'package:mc_common_app/models/user_models/user.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/shared_prefrence.dart';
import 'package:mc_common_app/utils/utils.dart';
typedef FactoryConstructor<U> = U Function(dynamic); typedef FactoryConstructor<U> = U Function(dynamic);
@ -168,10 +165,6 @@ class ApiClientImp implements ApiClient {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} on TimeoutException catch (e) { } on TimeoutException catch (e) {
BuildContext? context = navigatorKey.currentContext;
if (context != null) {
NoInternetDialog.show(context);
}
throw APIException(APIException.TIMEOUT, arguments: e); throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
@ -252,6 +245,7 @@ class ApiClientImp implements ApiClient {
var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60)); var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60));
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i("Url:$url");
logger.i(jsonDecode(response.body)); logger.i(jsonDecode(response.body));
} }
if (response.statusCode >= 200 && response.statusCode < 500) { if (response.statusCode >= 200 && response.statusCode < 500) {
@ -282,10 +276,6 @@ class ApiClientImp implements ApiClient {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} on TimeoutException catch (e) { } on TimeoutException catch (e) {
final context = navigatorKey.currentContext;
if (context != null) {
NoInternetDialog.show(context);
}
throw APIException(APIException.TIMEOUT, arguments: e); throw APIException(APIException.TIMEOUT, arguments: e);
} on ClientException catch (e) { } on ClientException catch (e) {
if (retryTimes > 0) { if (retryTimes > 0) {
@ -313,7 +303,7 @@ class ApiClientImp implements ApiClient {
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async { Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken}; var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? ""; // 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 { Future<String> updateUserToken() async {

@ -1,10 +1,7 @@
import 'package:google_maps_flutter/google_maps_flutter.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/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/models/user_models/user.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
class AppState { class AppState {
static final AppState _instance = AppState._internal(); static final AppState _instance = AppState._internal();
@ -19,22 +16,6 @@ class AppState {
bool? get getIsLogged => isLogged; 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;
}
AppType currentAppType = AppType.provider; AppType currentAppType = AppType.provider;
UserType userType = UserType.customer; UserType userType = UserType.customer;
@ -42,7 +23,7 @@ class AppState {
currentAppType = appType; currentAppType = appType;
} }
User? _user; User? _user = null;
set setUser(v) => _user = v; set setUser(v) => _user = v;
@ -63,30 +44,4 @@ class AppState {
set setCurrentLocation(v) => currentLocation = v; set setCurrentLocation(v) => currentLocation = v;
LatLng get getCurrentLocation => currentLocation; 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: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/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 { class ApiConsts {
// static String baseUrl = "http://10.200.204.20:2801/"; // Local server // static String baseUrl = "http://10.200.204.20:2801/"; // Local server
static String baseUrl = "https://ms.hmg.com/"; // production server static String baseUrl = "https://ms.hmg.com/"; // production server
static String baseUrlServices = baseUrl; // production server static String baseUrlServices = "$baseUrl"; // production server
static String basicOTP = "${baseUrlServices}api/Register/BasicOTP"; static String BasicOTP = "${baseUrlServices}api/Register/BasicOTP";
static String basicVerify = "${baseUrlServices}api/Register/BasicVerify"; static String BasicVerify = "${baseUrlServices}api/Register/BasicVerify";
static String basicComplete = "${baseUrlServices}api/Register/BasicComplete"; static String BasicComplete = "${baseUrlServices}api/Register/BasicComplete";
static String refreshToken = "${baseUrlServices}api/Account/RefreshToken"; static String RefreshToken = "${baseUrlServices}api/Account/RefreshToken";
static String signalRUrl = "${baseUrl}McHub";
//User //User
static String loginV1 = "${baseUrlServices}api/Account/Login_V1"; static String Login_V1 = "${baseUrlServices}api/Account/Login_V1";
static String loginV2OTP = "${baseUrlServices}api/Account/Login_V2_OTP"; static String Login_V2_OTP = "${baseUrlServices}api/Account/Login_V2_OTP";
static String loginV2OTPVerify = "${baseUrlServices}api/Account/Login_V2_OTPVerify"; static String Login_V2_OTPVerify = "${baseUrlServices}api/Account/Login_V2_OTPVerify";
static String user = "${baseUrlServices}api/User/"; static String user = "${baseUrlServices}api/User/";
static String getAllCountry = "${baseUrlServices}api/Master/Country_Get"; static String GetAllCountry = "${baseUrlServices}api/Master/Country_Get";
static String getProviderRoles = "${baseUrlServices}api/Master/RoleServiceProvider_Get"; static String GetProviderRoles = "${baseUrlServices}api/Master/RoleServiceProvider_Get";
static String getAllCities = "${baseUrlServices}api/Master/City_Get"; static String GetAllCities = "${baseUrlServices}api/Master/City_Get";
static String forgetPasswordOTPRequest = "${baseUrlServices}api/Account/ForgetPasswordOTPRequest"; static String ForgetPasswordOTPRequest = "${baseUrlServices}api/Account/ForgetPasswordOTPRequest";
static String forgetPasswordOTPCompare = "${baseUrlServices}api/Account/ForgetPasswordOTPCompare"; static String ForgetPasswordOTPCompare = "${baseUrlServices}api/Account/ForgetPasswordOTPCompare";
static String forgetPassword = "${baseUrlServices}api/Account/ForgetPassword"; static String ForgetPassword = "${baseUrlServices}api/Account/ForgetPassword";
static String loginEmailOTP = "${baseUrlServices}api/Account/EmailVerify"; static String Login_Email_OTP = "${baseUrlServices}api/Account/EmailVerify";
static String loginEmailOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify"; static String Login_Email_OTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String changePassword = "${baseUrlServices}api/Account/ChangePassword"; static String ChangePassword = "${baseUrlServices}api/Account/ChangePassword";
static String changeMobileNoOTPRequest = "${baseUrlServices}api/Account/ChangeMobileNoOTPRequest"; static String ChangeMobileNoOTPRequest = "${baseUrlServices}api/Account/ChangeMobileNoOTPRequest";
static String changeMobileNo = "${baseUrlServices}api/Account/ChangeMobileNo"; static String ChangeMobileNo = "${baseUrlServices}api/Account/ChangeMobileNo";
static String changeEmailOTPRequest = "${baseUrlServices}api/Account/ChangeEmailOTPRequest"; static String ChangeEmailOTPRequest = "${baseUrlServices}api/Account/ChangeEmailOTPRequest";
static String changeEmail = "${baseUrlServices}api/Account/ChangeEmail"; static String ChangeEmail = "${baseUrlServices}api/Account/ChangeEmail";
static String emailVerify = "${baseUrlServices}api/Account/EmailVerify"; static String EmailVerify = "${baseUrlServices}api/Account/EmailVerify";
static String emailVerifyOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify"; static String EmailVerifyOTPVerify = "${baseUrlServices}api/Account/EmailVerifyOTPVerify";
static String logoutUser = "${baseUrlServices}api/Account/Logout"; static String UpdateUserImage = "${baseUrlServices}api/User_UpdateProfileImage";
static String updateUserImage = "${baseUrlServices}api/User_UpdateProfileImage"; static String GetUserImage = "${baseUrlServices}api/ProfileImage";
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";
//Profile //Profile
static String fetProviderDocument = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Get"; static String GetProviderDocument = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Get";
static String serviceProviderDocumentUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Update"; static String ServiceProviderDocument_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderDocument_Update";
//Branch //Branch
static String getProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get"; static String getProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get";
static String createProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Create"; static String createProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Create";
static String updateProviderBranch = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Update"; 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 serviceProviderBranchGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranch_Get"; static String ServiceCategory_Get = "${baseUrlServices}api/Master/ServiceCategory_Get";
static String serviceCategoryGet = "${baseUrlServices}api/Master/ServiceCategory_Get"; static String Services_Get = "${baseUrlServices}api/ServiceProviders/Services_Get";
static String servicesGet = "${baseUrlServices}api/ServiceProviders/Services_Get"; static String ServiceProviderService_Create = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create";
static String serviceProviderServiceCreate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create"; static String ServiceProviderService_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update";
static String serviceProviderServiceUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update"; static String GetProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String serviceProviderServiceStatusUpdate = "${baseUrlServices}api/ServiceProviders/CategoryAndService_ActivateDeactivateBySP";
static String getProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String setScheduleInactive = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_IsActiveUpdate"; 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 ServiceProviderService_Get = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String branchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get"; static String BranchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get";
static String serviceProviderDDLGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderDDL_Get"; static String serviceProviderDDLGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderDDL_Get";
static String getAllNearBranches = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchDetail_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";
//Appointment APIs //Appointment APIs
static String serviceProvidersAppointmentGet = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointment_Get"; static String serviceProvidersAppointmentGet = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointment_Get";
static String customersAppointmentGetByFilters = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentSearchFiltersByCustomer_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 serviceItemsGet = "${baseUrlServices}api/ServiceProviders/ServiceItem_Get";
static String getServiceItemAppointmentScheduleSlots = "${baseUrlServices}api/ServiceProviders/ServiceItemAppointmentScheduleSlots_GetByAppointmentType"; static String GetServiceItemAppointmentScheduleSlots = "${baseUrlServices}api/ServiceProviders/ServiceItemAppointmentScheduleSlots_GetByAppointmentType";
static String serviceProvidersAppointmentCreate = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentList_Create"; static String ServiceProvidersAppointmentCreate = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentList_Create";
static String serviceProviderAppointmentRescheduleCancelAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_RescheduleCancelAppointment"; static String ServiceProviderAppointmentRescheduleCancelAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_RescheduleCancelAppointment";
static String addNewServicesInAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_ServiceItemAdd"; static String AddNewServicesInAppointment = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_ServiceItemAdd";
static String getAppointmentSlots = "${baseUrlServices}api/ServiceProviders/ScheduleSlotsInfo_Get"; static String getAppointmentSlots = "${baseUrlServices}api/ServiceProviders/ScheduleSlotsInfo_Get";
static String updateAppointmentStatus = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentStatus_Update"; static String updateAppointmentStatus = "${baseUrlServices}api/ServiceProviders/ServiceProvidersAppointmentStatus_Update";
@ -104,7 +85,6 @@ class ApiConsts {
static String updateSchedule = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_Update"; static String updateSchedule = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_Update";
static String createGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Create"; static String createGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Create";
static String updateGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Update"; static String updateGroup = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Update";
static String checkGroupServiceInBranchSchedule = "${baseUrlServices}api/ServiceProviders/BranchScheduleGroupService_Check";
//Advertisement APIs //Advertisement APIs
static String vehicleTypeGet = "${baseUrlServices}api/ServiceProviders/VehicleType_Get"; static String vehicleTypeGet = "${baseUrlServices}api/ServiceProviders/VehicleType_Get";
@ -125,7 +105,6 @@ class ApiConsts {
static String vehicleAdsSpecialServicesGet = "${baseUrlServices}api/Common/SpecialService_Get"; static String vehicleAdsSpecialServicesGet = "${baseUrlServices}api/Common/SpecialService_Get";
static String vehicleAdsSingleStepCreate = "${baseUrlServices}api/Advertisement/AdsSingleStep_Create"; static String vehicleAdsSingleStepCreate = "${baseUrlServices}api/Advertisement/AdsSingleStep_Create";
static String vehicleAdsSingleStepUpdate = "${baseUrlServices}api/Advertisement/AdsSingleStep_Update"; 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 vehicleAdsGet = "${baseUrlServices}api/Advertisement/Ads_Get";
static String myAdsReserveGet = "${baseUrlServices}api/Advertisement/AdsReserve_Get"; static String myAdsReserveGet = "${baseUrlServices}api/Advertisement/AdsReserve_Get";
static String reserveAdsBankDetailsGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get"; static String reserveAdsBankDetailsGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get";
@ -137,23 +116,18 @@ class ApiConsts {
static String adsMCBankAccountAdGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get"; static String adsMCBankAccountAdGet = "${baseUrlServices}api/Advertisement/MCBankAccountAd_Get";
static String adsReserveCreate = "${baseUrlServices}api/Advertisement/AdsReserve_Create"; static String adsReserveCreate = "${baseUrlServices}api/Advertisement/AdsReserve_Create";
static String reserveAdPaymentOnDealDoneCreate = "${baseUrlServices}api/Advertisement/ReserveAdPaymentOnDealDone_Create"; 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 //Subscription
static String getMySubscriptions = "${baseUrlServices}api/ServiceProviders/ProviderSubscription_Get"; static String getMySubscriptions = "${baseUrlServices}api/ServiceProviders/ProviderSubscription_Get";
static String getAllSubscriptions = "${baseUrlServices}api/Common/Subscription_Get"; static String getAllSubscriptions = "${baseUrlServices}api/Common/Subscription_Get";
static String getSubscriptionBySP = "${baseUrlServices}api/Common/SubscriptionBySP_Get"; static String getSubscriptionBySP = "${baseUrlServices}api/Common/SubscriptionBySP_Get";
static String calculationUpgradePrice = "${baseUrlServices}api/ServiceProviders/CalculationUpgradePrice"; static String calculationUpgradePrice = "${baseUrlServices}api/ServiceProviders/CalculationUpgradePrice";
static String payFortOrderProviderSubscriptionCreate = "${baseUrlServices}api/Payment/PayFortOrder_ProviderSubscription_Create"; static String payFortOrder_ProviderSubscription_Create = "${baseUrlServices}api/Payment/PayFortOrder_ProviderSubscription_Create";
static String getSPBranchUserGet = "${baseUrlServices}api/ServiceProviders/SPBranchUser_Get"; static String getSPBranchUser_Get = "${baseUrlServices}api/ServiceProviders/SPBranchUser_Get";
// Payment // Payment
static String paymentWebViewUrl = "https://ms.hmg.com/pay/PaymentHome"; static String paymentWebViewUrl = "https://ms.hmg.com/pay/PaymentHome";
static String payForOrderDetailGet = "${baseUrlServices}api/Payment/PayFortOrderDetail_Get"; static String payForOrderDetailGet = "${baseUrlServices}api/Payment/PayFortOrderDetail_Get";
static String payForOrderIsPaidGet = "${baseUrlServices}api/Payment/PayFortOrderIsPaid_Get";
//Duplicate Services //Duplicate Services
static String getMatchedServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchServicesMapping_Get"; static String getMatchedServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderBranchServicesMapping_Get";
@ -161,6 +135,9 @@ class ApiConsts {
//Branch Users //Branch Users
static String getAllProviderDealers = "${baseUrlServices}api/ServiceProviders/DealershipUserBranchWise_Get"; static String getAllProviderDealers = "${baseUrlServices}api/ServiceProviders/DealershipUserBranchWise_Get";
// /api/ServiceProviders/BranchUser_Get
//DealershipUserBranchWise_Get
static String getBranchUser = "${baseUrlServices}api/ServiceProviders/BranchUser_Get"; static String getBranchUser = "${baseUrlServices}api/ServiceProviders/BranchUser_Get";
static String assignDealerToBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Create"; static String assignDealerToBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Create";
static String removeDealerFromBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Update"; static String removeDealerFromBranch = "${baseUrlServices}api/ServiceProviders/BranchUser_Update";
@ -172,58 +149,18 @@ class ApiConsts {
static String createRequest = "${baseUrlServices}api/RequestManagement/Request_Create"; static String createRequest = "${baseUrlServices}api/RequestManagement/Request_Create";
static String getRequest = "${baseUrlServices}api/RequestManagement/Request_Get"; static String getRequest = "${baseUrlServices}api/RequestManagement/Request_Get";
static String getRequestOffers = "${baseUrlServices}api/RequestManagement/ReqOffer_Get"; static String getRequestOffers = "${baseUrlServices}api/RequestManagement/ReqOffer_Get";
static String updateRequestOfferStatus = "${baseUrlServices}api/RequestManagement/RequestOffer_UpdateStatus"; static String updateRequestOffer = "${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 requestOffersSpsGet = "${baseUrlServices}api/RequestManagement/Request_OfferSPs_Get"; 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 //Chat
static String chatHubUrl = "$baseUrlServices/McHub"; static String chatHubUrl = "$baseUrlServices/McHub";
static String messageIsReadUpdateForRequests = "${baseUrlServices}api/RequestManagement/ReqOfferChatIsRead_Update"; static String messageIsReadUpdate = "${baseUrlServices}api/RequestManagement/ReqOfferChatIsRead_Update";
static String messageIsReadUpdateForAds = "${baseUrlServices}api/Advertisement/AdsChatIsRead_Update"; static String getChatMessages = "${baseUrlServices}api/RequestManagement/ReqOfferChat_Get";
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 List<String> closingUrls = ["PayFortResponse"]; static List<String> closingUrls = ["PayFortResponse"];
} }
class GlobalConsts { class GlobalConsts {
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 isRememberMe = "remember_me";
static String email = "email"; static String email = "email";
static String password = "password"; static String password = "password";
@ -232,10 +169,8 @@ class GlobalConsts {
static String welcomeVideoUrl = "welcomeVideoUrl"; static String welcomeVideoUrl = "welcomeVideoUrl";
static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo";
static String demandAmountError = "Amount Cannot be Empty"; 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 reservationCancelError = "Cancellation Reason Cannot be Empty";
static String descriptionError = "Description should be more than 5 letters."; static String descriptionError = "Description Cannot be Empty";
static String acceptingThisOffer = "I am accepting this offer.";
static String vehicleVinError = "Vehicle VIN Cannot be Empty"; static String vehicleVinError = "Vehicle VIN Cannot be Empty";
static String vehicleTitleError = "Vehicle Title Cannot be Empty"; static String vehicleTitleError = "Vehicle Title Cannot be Empty";
static String warrantyError = "Warranty Duration Cannot be Empty"; static String warrantyError = "Warranty Duration Cannot be Empty";
@ -246,43 +181,8 @@ class GlobalConsts {
static String adDurationPhoneNumberError = "Phone number cannot be empty"; static String adDurationPhoneNumberError = "Phone number cannot be empty";
static String adReservablePriceErrorConst = "Ad Reservable price cannot be empty"; static String adReservablePriceErrorConst = "Ad Reservable price cannot be empty";
static String homeLocationEmptyError = "Home location 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 = 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."; "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;
} }
class MyAssets { class MyAssets {
@ -375,8 +275,6 @@ class MyAssets {
static String visaPng = "${assetPath}icons/payments/visa.png"; static String visaPng = "${assetPath}icons/payments/visa.png";
static String whatsAppIcon = "${assetPath}icons/whatsapp_icon.svg"; 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";
} }
RegExp numReg = RegExp(r".*[0-9].*"); RegExp numReg = RegExp(r".*[0-9].*");
@ -392,79 +290,5 @@ class MyLocales {
} }
class MyFonts { class MyFonts {
static const poppinsFont = 'packages/mc_common_app/Poppins'; 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";
// 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,
},
);
} }

@ -1,8 +1,6 @@
// import 'package:firebase_crashlytics/firebase_crashlytics.dart'; // import 'package:firebase_crashlytics/firebase_crashlytics.dart';
// import 'package:flutter/material.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:injector/injector.dart';
import 'package:mc_common_app/api/api_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/app_state.dart';
@ -12,13 +10,9 @@ import 'package:mc_common_app/repositories/branch_repo.dart';
import 'package:mc_common_app/repositories/chat_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/common_repo.dart';
import 'package:mc_common_app/repositories/payments_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/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.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/services/payments_service.dart';
import 'package:mc_common_app/utils/location/Location.dart';
import '../repositories/request_repo.dart'; import '../repositories/request_repo.dart';
@ -31,11 +25,6 @@ class AppDependencies {
injector.registerSingleton<ApiClient>(() => ApiClientImp()); injector.registerSingleton<ApiClient>(() => ApiClientImp());
injector.registerSingleton<CommonAppServices>(() => CommonServicesImp()); injector.registerSingleton<CommonAppServices>(() => CommonServicesImp());
injector.registerSingleton<PaymentService>(() => PaymentServiceImp()); injector.registerSingleton<PaymentService>(() => PaymentServiceImp());
injector.registerSingleton<Location>(() => LocationService());
injector.registerSingleton<FirebaseMessagingService>(() => FirebaseMessagingServiceImp(
firebaseMessaging: FirebaseMessaging.instance,
flutterLocalNotifications: FlutterLocalNotificationsPlugin(),
));
//repos //repos
injector.registerSingleton<UserRepo>(() => UserRepoImp()); injector.registerSingleton<UserRepo>(() => UserRepoImp());
@ -46,9 +35,5 @@ class AppDependencies {
injector.registerSingleton<AppointmentRepo>(() => AppointmentRepoImp()); injector.registerSingleton<AppointmentRepo>(() => AppointmentRepoImp());
injector.registerSingleton<ChatRepo>(() => ChatRepoImp()); injector.registerSingleton<ChatRepo>(() => ChatRepoImp());
injector.registerSingleton<BranchRepo>(() => BranchRepoImp()); 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/requests_models/offers_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/provider_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/requests_models/request_model.dart';
import 'package:mc_common_app/models/user_models/register_user.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/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/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/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_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_language.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/user/change_email_page.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_mobile_page.dart';
import 'package:mc_common_app/views/user/change_password_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_provider_page.dart';
import 'package:mc_common_app/views/user/register_selection_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/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:mc_common_app/views/user/vertify_password_page.dart';
import 'package:flutter/material.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 { class AppRoutes {
//User //User
@ -77,47 +50,12 @@ class AppRoutes {
static const String changeEmailPage = "/changeEmailPage"; static const String changeEmailPage = "/changeEmailPage";
static const String editAccountPage = "/editAccoundPage"; 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 dashboard = "/dashboard";
static const String bookProviderAppView = "/bookProviderAppView"; static const String bookProviderAppView = "/bookProviderAppView";
// Appointments
// Appoinments
static const String appointmentDetailView = "/appointmentDetailView"; static const String appointmentDetailView = "/appointmentDetailView";
static const String bookAppointmenServicesView = "/bookAppointmenServicesView"; static const String bookAppointmenServicesView = "/bookAppointmenServicesView";
static const String bookAppointmenSchedulesView = "/bookAppointmenSchedulesView"; static const String bookAppointmenSchedulesView = "/bookAppointmenSchedulesView";
@ -130,54 +68,40 @@ class AppRoutes {
static const String adsDetailView = "/adsDetailView"; static const String adsDetailView = "/adsDetailView";
static const String createAdView = "/createAdView"; static const String createAdView = "/createAdView";
static const String adsFilterView = "/adsFilterView"; static const String adsFilterView = "/adsFilterView";
static const String adsBuyerChatsListView = "/adsBuyersChatListView";
static const String myDraftAdsView = "/myDraftAdsView";
// Payments // Payments
static const String paymentMethodsView = "/paymentMethodsView"; static const String paymentMethodsView = "/paymentMethodsView";
//Shipping
static const shippingManagementView = "/shippingManagementView";
//Customer APP: Provider & Services //Customer APP: Provider & Services
static const String branchDetailView = "/branchDetailPage"; static const String branchDetailPage = "/branchDetailPage";
static const String branchSearchFilterPage = "/branchSearchFilterPage"; static const String branchSearchFilterPage = "/branchSearchFilterPage";
static const String providerProfileView = "/providerProfilePage"; static const String providerProfilePage = "/providerProfilePage";
static const String favoriteListView = "/favoriteListView";
// Subscriptions
static const String mySubscriptionsPage = "/mySubscriptionsPage";
static const String subscriptionsPage = "/subscriptionsPage";
//Requests //Requests
static const String requestsDetailPage = "/requestsDetailPage";
static const String sendOfferPage = "/sendOfferPage";
static const String myRequestsPage = "/myRequestsPage"; static const String myRequestsPage = "/myRequestsPage";
static const String requestsFilterView = "/requestsFilterView";
static const String createRequestPage = "/createRequestPage"; static const String createRequestPage = "/createRequestPage";
static const String offersListPage = "/offersListPage"; static const String offersListPage = "/offersListPage";
static const String reviewRequestOffer = "/reviewRequestOffer"; static const String requestsDetailPage = "/requestsDetailPage";
static const String providerAcceptedRequestsView = "/providerAcceptedRequestsView"; static const String sendOfferPage = "/sendOfferPage";
static const String providersChatListPage = "/providersChatListPage";
//Setting Options //Setting Options
static const String settingOptionsFaqs = "/settingOptionsFaqs"; static const String settingOptionsFaqs = "/settingOptionsFaqs";
static const String settingOptionsContactUs = "/settingOptionsContactUs"; static const String settingOptionsLanguages = "/settingOptionsLanguages";
static const String settingOptionsAppInfo = "/settingOptionsAppInfo";
static const String settingOptionsTermsAndConditions = "/settingOptionsTermsAndConditions";
static const String settingOptionsMore = "/settingOptionsLanguages";
static const String settingOptionsInviteFriends = "/settingOptionsInviteFriends"; static const String settingOptionsInviteFriends = "/settingOptionsInviteFriends";
static const String settingOptionsHelp = "/settingOptionsHelp"; static const String settingOptionsHelp = "/settingOptionsHelp";
//MediaViewer
static const String mediaViewerScreen = "/mediaViewer";
//Profile Screen //Profile Screen
static const String profileView = "/profileView"; static const String profileView = "/profileView";
static const providerLicensePage = "/providerLicensePage";
static const String generalChatsListForProvider = "/generalChatsListForProvider"; static const providerLicensePage = "/providerLicensePage";
//Chat //Chat
static const String chatView = "/chatView"; static const String chatView = "/chatView";
static const String updateUserDetails = "/updateUserDetails";
static const String updateUserCity = "/updateUserCity";
static const String initialRoute = splash; static const String initialRoute = splash;
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
@ -189,57 +113,40 @@ class AppRoutes {
registerProvider: (context) => const RegisterProviderPage(), registerProvider: (context) => const RegisterProviderPage(),
forgetPassword: (context) => const ForgetPasswordPage(), forgetPassword: (context) => const ForgetPasswordPage(),
loginVerification: (context) => const LoginVerificationPage(), loginVerification: (context) => const LoginVerificationPage(),
loginWithPassword: (context) => LoginWithPassword(isRemoveBackButton: (ModalRoute.of(context)!.settings.arguments ?? true) as bool), loginWithPassword: (context) => const LoginWithPassword(),
loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String), loginMethodSelection: (context) =>
completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUserRespModel), LoginMethodSelectionPage(ModalRoute
.of(context)!
.settings
.arguments as String),
completeProfile: (context) =>
CompleteProfilePage(ModalRoute
.of(context)!
.settings
.arguments as RegisterUserRespModel),
verifyPassword: (context) => VerifyPasswordPage(), verifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String), confirmNewPasswordPage: (context) =>
forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String), 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(), changeMobilePage: (context) => ChangeMobilePage(),
changeEmailPage: (context) => const ChangeEmailPage(), changeEmailPage: (context) => const ChangeEmailPage(),
updateUserDetails: (context) => const UpdateUserDetails(),
updateUserCity: (context) => const UpdateUserCityCountry(),
changePassword: (context) => const ChangePasswordPage(),
editAccountPage: (context) => const EditAccountPage(), editAccountPage: (context) => const EditAccountPage(),
profileView: (context) => const ProfileScreen(), profileView: (context) => const ProfileScreen(),
settingOptionsMore: (context) => const SettingOptionsMore(), settingOptionsLanguages: (context) => const SettingOptionsLanguage(),
settingOptionsHelp: (context) => const SettingOptionsHelp(), settingOptionsHelp: (context) => const SettingOptionsHelp(),
providerLicensePage: (context) => const ProviderLicensePage(), providerLicensePage: (context) => 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(),
}; };
} }
class ChatViewArgumentsForRequest { class ChatViewArguments {
final int? requestId; final int? requestId;
final ChatTypeEnum chatTypeEnum; final ChatTypeEnum chatTypeEnum;
final String senderId; final String senderId;
@ -248,7 +155,7 @@ class ChatViewArgumentsForRequest {
final int requestIndex; final int requestIndex;
final RequestModel? requestModel; final RequestModel? requestModel;
ChatViewArgumentsForRequest({ ChatViewArguments({
required this.chatTypeEnum, required this.chatTypeEnum,
this.requestId, this.requestId,
required this.senderId, required this.senderId,
@ -259,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 { class OfferListPageArguments {
final List<ServiceProvidersOffers> serviceProviderOffers; final List<ServiceProvidersOffers> serviceProviderOffers;
final int? requestId; final int? requestId;

@ -1,49 +1,38 @@
import 'dart:developer';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.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/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
extension EmailValidator on String { extension EmailValidator on String {
Widget toText( Widget toText(
{Color? color, {Color? color,
bool isBold = false, bool isBold = false,
double? fontSize, double? fontSize,
bool isUnderLine = false, bool isUnderLine = false,
bool isItalic = false, bool isItalic = false,
TextDecoration? textDecoration, TextDecoration? textDecoration,
double letterSpacing = 0, double letterSpacing = -0.4,
TextAlign? textAlign, TextAlign? textAlign,
FontWeight? fontWeight, FontWeight? fontWeight,
double? height, double? height,
Color? decorationColor, Color? decorationColor,
TextOverflow? overflow, int? maxLines}) =>
bool isUpperCase = false, AutoSizeText(
int? maxLines}) { this,
bool isArabic = AppState().postParamsObject!.languageID == 1; // arabic -> 1 , English -> 2 textAlign: textAlign,
return AutoSizeText( maxLines: maxLines,
isUpperCase ? toUpperCase() : this, style: TextStyle(
textAlign: textAlign, fontStyle: isItalic ? FontStyle.italic : null,
maxLines: maxLines, height: height,
style: TextStyle( decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none,
overflow: overflow, decorationColor: decorationColor,
fontStyle: isItalic ? FontStyle.italic : null, fontSize: fontSize ?? 10,
height: height, fontWeight: isBold ? FontWeight.bold : fontWeight ?? FontWeight.w600,
decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none, color: color ?? MyColors.darkTextColor,
decorationColor: decorationColor ?? color ?? MyColors.darkTextColor, letterSpacing: letterSpacing,
fontSize: fontSize ?? 10, ),
fontFamily: isArabic ? MyFonts.gessTwoFont : MyFonts.poppinsFont, );
fontWeight: isBold ? FontWeight.bold : fontWeight ?? MyFonts.SemiBold,
color: color ?? MyColors.darkTextColor,
letterSpacing: letterSpacing,
),
);
}
bool isValidEmail() { 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); 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);
@ -165,57 +154,23 @@ extension FormatDate on String {
} }
extension RequestEnum on int { extension RequestEnum on int {
RequestStatusEnum toRequestStatusEnum() { RequestStatus toRequestStatusEnum() {
if (this == 1) { if (this == 1) {
return RequestStatusEnum.submitted; return RequestStatus.submitted;
} else if (this == 2) { } else if (this == 2) {
return RequestStatusEnum.inProgress; return RequestStatus.inProgress;
} else if (this == 3) { } else if (this == 3) {
return RequestStatusEnum.completed; return RequestStatus.completed;
} else if (this == 4) { } else if (this == 4) {
return RequestStatusEnum.cancelled; return RequestStatus.cancelled;
} else if (this == 5) { } else if (this == 5) {
return RequestStatusEnum.paid; return RequestStatus.paid;
} else if (this == 6) { } else if (this == 6) {
return RequestStatusEnum.expired; return RequestStatus.expired;
} else if (this == 7) { } else if (this == 7) {
return RequestStatusEnum.shipping; return RequestStatus.shipping;
} else if (this == 8) {
return RequestStatusEnum.delivery;
} else if (this == 9) {
return RequestStatusEnum.selfPickup;
} else { } else {
return RequestStatusEnum.pending; return RequestStatus.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;
} }
} }
} }
@ -244,10 +199,6 @@ extension AdPostEnum on int {
return AdPostStatus.buyingService; return AdPostStatus.buyingService;
} else if (this == 11) { } else if (this == 11) {
return AdPostStatus.reserveCancel; return AdPostStatus.reserveCancel;
} else if (this == 12) {
return AdPostStatus.deActive;
} else if (this == 13) {
return AdPostStatus.pendingForActive;
} else if (this == 0) { } else if (this == 0) {
return AdPostStatus.allAds; return AdPostStatus.allAds;
} else { } else {
@ -274,55 +225,21 @@ extension AppointmentStatusToInt on AppointmentStatusEnum {
case AppointmentStatusEnum.rescheduled: case AppointmentStatusEnum.rescheduled:
return 5; return 5;
case AppointmentStatusEnum.upcoming:
return 6;
case AppointmentStatusEnum.workStarted: case AppointmentStatusEnum.workStarted:
return 7; return 7;
case AppointmentStatusEnum.visitCompleted: case AppointmentStatusEnum.visitCompleted:
return 8; return 8;
case AppointmentStatusEnum.today:
return 9;
case AppointmentStatusEnum.past:
return 10;
case AppointmentStatusEnum.upcoming:
return 11;
case AppointmentStatusEnum.allAppointments:
return 0;
default: default:
return 0; 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 { extension AppointmentStatusToString on AppointmentStatusEnum {
String getAppointmentNameFromEnum() { String getAppointmentNameFromEnum() {
switch (this) { switch (this) {
@ -350,18 +267,14 @@ extension AppointmentStatusToString on AppointmentStatusEnum {
case AppointmentStatusEnum.visitCompleted: case AppointmentStatusEnum.visitCompleted:
return "Visit Completed"; return "Visit Completed";
case AppointmentStatusEnum.past:
return "Past";
case AppointmentStatusEnum.today:
return "Today";
default: default:
return "Booked"; return "Booked";
} }
} }
} }
//TODO: Need to verify Enum on upcoming and inprogress with the database
//TODO: 6 is service Deactivated
extension AppointmentEnum on int { extension AppointmentEnum on int {
AppointmentStatusEnum toAppointmentStatusEnum() { AppointmentStatusEnum toAppointmentStatusEnum() {
if (this == 1) { if (this == 1) {
@ -374,16 +287,12 @@ extension AppointmentEnum on int {
return AppointmentStatusEnum.cancelled; return AppointmentStatusEnum.cancelled;
} else if (this == 5) { } else if (this == 5) {
return AppointmentStatusEnum.rescheduled; return AppointmentStatusEnum.rescheduled;
} else if (this == 6) {
return AppointmentStatusEnum.upcoming;
} else if (this == 7) { } else if (this == 7) {
return AppointmentStatusEnum.workStarted; return AppointmentStatusEnum.workStarted;
} else if (this == 8) { } else if (this == 8) {
return AppointmentStatusEnum.visitCompleted; 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 { } else {
return AppointmentStatusEnum.allAppointments; return AppointmentStatusEnum.allAppointments;
} }
@ -432,8 +341,8 @@ extension AppointmentPaymentEnum on int {
} }
} }
extension RequestTypeTypEnum on int { extension RequestTypeTypeEnum on int {
RequestsTypeEnum toRequestTypeEnum() { RequestsTypeEnum toRequestTypeStatusEnum() {
if (this == 1) { if (this == 1) {
return RequestsTypeEnum.specialCarRequest; return RequestsTypeEnum.specialCarRequest;
} else if (this == 2) { } else if (this == 2) {
@ -444,7 +353,7 @@ extension RequestTypeTypEnum on int {
} }
extension RequestTypeStatusToInt on RequestsTypeEnum { extension RequestTypeStatusToInt on RequestsTypeEnum {
int getIdFromRequestTypeEnum() { int getIdFromRequestTypeStatusEnum() {
switch (this) { switch (this) {
case RequestsTypeEnum.specialCarRequest: case RequestsTypeEnum.specialCarRequest:
return 1; return 1;
@ -458,12 +367,13 @@ extension RequestTypeStatusToInt on RequestsTypeEnum {
} }
} }
// 290223243016
extension AdPostStatusToInt on AdPostStatus { extension AdPostStatusToInt on AdPostStatus {
int getIdFromAdPostStatusEnum() { int getIdFromAdPostStatusEnum() {
switch (this) { switch (this) {
case AdPostStatus.pendingForReview: case AdPostStatus.pendingForReview:
return 1; return 1;
case AdPostStatus.pendingForPayment: case AdPostStatus.pendingForPayment:
return 2; return 2;
@ -493,13 +403,6 @@ extension AdPostStatusToInt on AdPostStatus {
case AdPostStatus.reserveCancel: case AdPostStatus.reserveCancel:
return 11; return 11;
case AdPostStatus.deActive:
return 12;
case AdPostStatus.pendingForActive:
return 13;
default: default:
return 0; return 0;
} }
@ -511,12 +414,16 @@ extension PaymentTypesToInt on PaymentTypes {
switch (this) { switch (this) {
case PaymentTypes.subscription: case PaymentTypes.subscription:
return 1; return 1;
case PaymentTypes.appointment: case PaymentTypes.appointment:
return 2; return 2;
case PaymentTypes.adReserve: case PaymentTypes.adReserve:
return 4; return 4;
case PaymentTypes.ads: case PaymentTypes.ads:
return 3; return 3;
case PaymentTypes.request: case PaymentTypes.request:
return 5; return 5;
case PaymentTypes.extendAds: case PaymentTypes.extendAds:
@ -530,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 { extension CreatedByRoleEnumToInt on CreatedByRoleEnum {
int getIdFromCreatedByRoleEnum() { int getIdFromCreatedByRoleEnum() {
switch (this) { switch (this) {
@ -648,40 +531,12 @@ 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 { extension DateTimeConversions on DateTime {
String getTimeAgo({bool numericDates = true}) { String getTimeAgo({bool numericDates = true}) {
final date2 = DateTime.now(); final date2 = DateTime.now();
final difference = date2.difference(this); final difference = date2.difference(this);
if ((difference.inDays / 7).floor() >= 2) {
return DateHelper.formatAsDayMonthYear(this); if ((difference.inDays / 7).floor() >= 1) {
} else if ((difference.inDays / 7).floor() >= 1) {
return (numericDates) ? '1 week ago' : 'Last week'; return (numericDates) ? '1 week ago' : 'Last week';
} else if (difference.inDays >= 2) { } else if (difference.inDays >= 2) {
return '${difference.inDays} days ago'; return '${difference.inDays} days ago';
@ -692,11 +547,11 @@ extension DateTimeConversions on DateTime {
} else if (difference.inHours >= 1) { } else if (difference.inHours >= 1) {
return (numericDates) ? '1 hour ago' : 'An hour ago'; return (numericDates) ? '1 hour ago' : 'An hour ago';
} else if (difference.inMinutes >= 2) { } else if (difference.inMinutes >= 2) {
return '${difference.inMinutes} min ago'; return '${difference.inMinutes} minutes ago';
} else if (difference.inMinutes >= 1) { } else if (difference.inMinutes >= 1) {
return (numericDates) ? '1 min ago' : 'A min ago'; return (numericDates) ? '1 minute ago' : 'A minute ago';
} else if (difference.inSeconds >= 3) { } else if (difference.inSeconds >= 3) {
return '${difference.inSeconds} sec ago'; return '${difference.inSeconds} seconds ago';
} else { } else {
return 'Just now'; return 'Just now';
} }
@ -799,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 { extension ChatMessageTypeEnumExt on int {
//FreeText = 1, //FreeText = 1,
// Image = 2, // Image = 2,
@ -966,194 +804,3 @@ extension SubscriptionTypeEnumToString on SubscriptionTypeEnum {
} }
} }
} }
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;
}
}
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 "Delivery";
case RequestDeliveryOptionEnum.selfPickup:
return "Self Pickup";
case RequestDeliveryOptionEnum.both:
return "Delivery, Self Pickup";
default:
return "Self Pickup";
}
}
}
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;
}
}

@ -92,7 +92,7 @@ class CodegenLoader extends AssetLoader{
"userRoleOrTitle": "عنوان المستخدم", "userRoleOrTitle": "عنوان المستخدم",
"codeSentToEmail": "تم ارسال الرمز للايميل", "codeSentToEmail": "تم ارسال الرمز للايميل",
"number": "موبايل", "number": "موبايل",
"english": "عربي", "english": "English",
"title": "مرحبًا", "title": "مرحبًا",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language", "msg_named": "{} are written in the {lang} language",
@ -258,7 +258,6 @@ class CodegenLoader extends AssetLoader{
"payLater": "ادفع لاحقًا", "payLater": "ادفع لاحقًا",
"complete": "اكتمل", "complete": "اكتمل",
"makeAnOffer": "قدم عرضًا", "makeAnOffer": "قدم عرضًا",
"provideOffer": "تقديم العرض",
"enterAmount": "أدخل المبلغ", "enterAmount": "أدخل المبلغ",
"submit": "إرسال", "submit": "إرسال",
"viewChat": "عرض الدردشة", "viewChat": "عرض الدردشة",
@ -345,7 +344,7 @@ class CodegenLoader extends AssetLoader{
"vehiclePart": "جزء المركبة", "vehiclePart": "جزء المركبة",
"damagePartPictures": "صور الأجزاء المتضررة", "damagePartPictures": "صور الأجزاء المتضررة",
"vehicleDamagePart": "جزء المركبة المتضرر", "vehicleDamagePart": "جزء المركبة المتضرر",
"duration": "المدة", "duration": ":المدة",
"specialServices": "الخدمات الخاصة", "specialServices": "الخدمات الخاصة",
"specialService": "خدمة خاصة", "specialService": "خدمة خاصة",
"adContactDetails": "تفاصيل الاتصال بالإعلان", "adContactDetails": "تفاصيل الاتصال بالإعلان",
@ -373,7 +372,7 @@ class CodegenLoader extends AssetLoader{
"setupTouchID": "يرجى إعداد معرف اللمس", "setupTouchID": "يرجى إعداد معرف اللمس",
"reenableTouchID": "يرجى إعادة تمكين معرف اللمس", "reenableTouchID": "يرجى إعادة تمكين معرف اللمس",
"scanFaceIDAuthenticate": "امسح بصمة الإصبع أو معرف الوجه للتحقق", "scanFaceIDAuthenticate": "امسح بصمة الإصبع أو معرف الوجه للتحقق",
"adDeletedSuccessfully": "تم حذف الإعلان بنجاح!", "AdDeletedSuccessfully": "تم حذف الإعلان بنجاح!",
"yourReservationCancelled": "تم إلغاء حجزك.", "yourReservationCancelled": "تم إلغاء حجزك.",
"adDeactivatedSuccessfully": "تم إلغاء تفعيل الإعلان بنجاح!", "adDeactivatedSuccessfully": "تم إلغاء تفعيل الإعلان بنجاح!",
"vehicle": { "vehicle": {
@ -508,7 +507,8 @@ class CodegenLoader extends AssetLoader{
"submitAd": "إرسال الإعلان", "submitAd": "إرسال الإعلان",
"selectAdType": "اختر نوع الإعلان", "selectAdType": "اختر نوع الإعلان",
"validUntilSubscriptionExpiration": "صالح حتى انتهاء الاشتراك", "validUntilSubscriptionExpiration": "صالح حتى انتهاء الاشتراك",
"youLeftAdsGivenSubscription": "لقد تركت مع إعلانات محدودة الواردة في الاشتراك.", "adsRemaining": "الإعلانات المتبقية",
"youLeftAdsGivenSubscription": "لقد بقي لديك 05 من 50 إعلانًا في الاشتراك.",
"updateSubscription": "تحديث الاشتراك", "updateSubscription": "تحديث الاشتراك",
"workInProgress": "العمل جارٍ", "workInProgress": "العمل جارٍ",
"visitCompleted": "تمت الزيارة", "visitCompleted": "تمت الزيارة",
@ -532,6 +532,7 @@ class CodegenLoader extends AssetLoader{
"itemsSelected": "العناصر المحددة", "itemsSelected": "العناصر المحددة",
"workshopFullAccessServices": "بعض الخدمات غير متوفرة في الموقع المنزلي. قم بتغيير الموقع إلى ورشة العمل للوصول الكامل إلى الخدمات", "workshopFullAccessServices": "بعض الخدمات غير متوفرة في الموقع المنزلي. قم بتغيير الموقع إلى ورشة العمل للوصول الكامل إلى الخدمات",
"changeLocationService": "تغيير الموقع أو الخدمة:", "changeLocationService": "تغيير الموقع أو الخدمة:",
"noItemstoShow": "لا توجد عناصر لعرضها.",
"someDescriptionSubServices": "بعض الوصف عن الخدمات الفرعية", "someDescriptionSubServices": "بعض الوصف عن الخدمات الفرعية",
"selectServicesYouWant": "اختر الخدمات التي تريدها", "selectServicesYouWant": "اختر الخدمات التي تريدها",
"selectServiceType": "اختر نوع الخدمة", "selectServiceType": "اختر نوع الخدمة",
@ -576,261 +577,12 @@ class CodegenLoader extends AssetLoader{
"inviteFriends": "دعوة الأصدقاء", "inviteFriends": "دعوة الأصدقاء",
"more": "المزيد", "more": "المزيد",
"language": "اللغة", "language": "اللغة",
"mySubscription": "اشتراكاتي", "mySubscriptions": "اشتراكاتي",
"subscriptions": "الاشتراكات", "subscriptions": "الاشتراكات",
"defineLicenses": "تحديد التراخيص", "defineLicenses": "تحديد التراخيص",
"logOut": "تسجيل الخروج", "logOut": "تسجيل الخروج",
"customer": "العميل", "customer": "العميل",
"amountVAR": "كمية", "accept": "قبول"
"accept": "قبول",
"nowVar": "الآن",
"whendoyouWanttoUpgrade": "متى تريد الترقية",
"yourSubscriptionUpgradeAffectingFrom": "سيتم ترقية اشتراكك الآن. ساري المفعول من",
"upgradeAfterCurrentExpiry": "الترقية بعد انتهاء الاشتراك الحالي",
"yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom": "سيتم ترقية اشتراكك بعد انتهاء اشتراكك الحالي. ساري المفعول من",
"upgradeVar": "ترقية",
"whendoyouWanttoRenew": "متى تريد التجديد",
"renewVar": "تجديد",
"requestAlreadyInProgress": "هذا الطلب قيد التقدم بالفعل.",
"acceptOfferConfirmation": "هل تريد قبول هذا العرض؟",
"acceptOfferConfirmationMessage": "سيتم قبول هذا العرض وستدفع المبلغ المطلوب للمشتري في وقت معين وإلا سيتم إلغاء هذا العرض.",
"noUpcomingAppointments": "لا مواعيد قادم..",
"addNewAppointment": "إضافة موعد جديد",
"myNearbyBranches": "فروعي القريبة",
"myRecentBranches": "فروعي الأخيرة",
"favoriteList": "قائمة المفضلة",
"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": "البحث حسب طراز المركبة",
"customerCarePrompt": "هل لديك أي استفسار؟ نحن هنا لخدمتك. انقر هنا للتحدث مع خدمة العملاء لدينا الآن.",
"callNow": "اتصل الآن",
"condition": "الحالة",
"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": "تم المشاهدة",
"updateUserDetails": "تحديث تفاصيل المستخدم",
"enterNewFirstName": "أدخل الاسم الأول",
"enterNewLastName": "أدخل الاسم الأخير",
"userDetailsUpdated": "يتم تحديث تفاصيل المستخدم",
"itemNoLongerAvailable": "لم يعد هذا العنصر متاحًا.",
"reactivateAd": "إعادة تنشيط الإعلان",
"dealOutsideApp": "تمت الصفقة خارج التطبيق مع عميل آخر.",
"noAgreementCustomer": "لا يوجد اتفاق من جانب العميل.",
"dealNotCompleted": "لم تكتمل الصفقة",
"changedDesireToSell": "غيرت رغبتي في بيع المركبة.",
"vehicleDealOutsideApp": "تمت صفقة المركبة خارج التطبيق.",
"markAdAsSoldDesc": "سيتم وضع علامة 'تم البيع' على هذا الإعلان، ولن يتمكن المستخدمون الآخرون من التواصل معك.",
"ownerInformation": "معلومات المالك",
"acceptedRequests": "الطلبات المقبولة",
"specialRequestChat": "دردشة الطلب الخاص",
"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": "رجى إضافة عنوان صالح"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -874,7 +626,7 @@ static const Map<String,dynamic> en_US = {
"forgetPass": "Forget Password ?", "forgetPass": "Forget Password ?",
"phoneNumberVerified": "Phone Number Verified", "phoneNumberVerified": "Phone Number Verified",
"verifyNewPassword": "Verify New Password", "verifyNewPassword": "Verify New Password",
"EnterPass": "Enter Password", "EnterPass": "Enter Password ?",
"alreadySigned": " Already Signed Up and Logged In", "alreadySigned": " Already Signed Up and Logged In",
"emailChangedSuccessfully": "Email is Changed Successfully", "emailChangedSuccessfully": "Email is Changed Successfully",
"passwordIsUpdated": "Password is Updated", "passwordIsUpdated": "Password is Updated",
@ -910,7 +662,7 @@ static const Map<String,dynamic> en_US = {
"userRoleOrTitle": "User role or title", "userRoleOrTitle": "User role or title",
"codeSentToEmail": "Code is sent to email", "codeSentToEmail": "Code is sent to email",
"number": "Number", "number": "Number",
"english": "English", "english": "عربي",
"title": "Hello", "title": "Hello",
"msg": "Hello {} in the {} world ", "msg": "Hello {} in the {} world ",
"msg_named": "{} are written in the {lang} language", "msg_named": "{} are written in the {lang} language",
@ -1076,7 +828,6 @@ static const Map<String,dynamic> en_US = {
"payLater": "Pay Later", "payLater": "Pay Later",
"complete": "Complete", "complete": "Complete",
"makeAnOffer": "Make an offer", "makeAnOffer": "Make an offer",
"provideOffer": "Provide Offer",
"enterAmount": "Enter amount", "enterAmount": "Enter amount",
"submit": "Submit", "submit": "Submit",
"viewChat": "View Chat", "viewChat": "View Chat",
@ -1163,7 +914,7 @@ static const Map<String,dynamic> en_US = {
"vehiclePart": "Vehicle Part", "vehiclePart": "Vehicle Part",
"damagePartPictures": "Damage Part Pictures", "damagePartPictures": "Damage Part Pictures",
"vehicleDamagePart": "Vehicle Damage Part", "vehicleDamagePart": "Vehicle Damage Part",
"duration": "Duration", "duration": "Duration:",
"specialServices": "Special Services", "specialServices": "Special Services",
"specialService": "Special Service", "specialService": "Special Service",
"adContactDetails": "Ad Contact Details", "adContactDetails": "Ad Contact Details",
@ -1239,14 +990,14 @@ static const Map<String,dynamic> en_US = {
"passwordAcceptableStrong": "Your password is acceptable but not strong", "passwordAcceptableStrong": "Your password is acceptable but not strong",
"passwordIsStrong": "Your password is strong", "passwordIsStrong": "Your password is strong",
"passwordVeryStrong": "Your password is very 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", "selectDuration": "Select Duration",
"daysVar": "Days", "daysVar": "Days",
"adCharges": "Ad Charges", "adCharges": "Ad Charges",
"select": "Select", "select": "Select",
"deleteAdConfirmation": "Do you want to delete the ad?", "deleteAdConfirmation": "Do you want to delete the ad?",
"deleteAdConfirmationMessage": "Your ad will be permanently deleted and you cannot undo this action", "deleteAdConfirmationMessage": "Your ad will be permanently deleted and you cannot undo this action",
"mileage": "Mileage", "mileage": "mileage",
"transmission": "Transmission", "transmission": "Transmission",
"demand": "Demand", "demand": "Demand",
"adDurationExpired": "Your Ad Duration time is over", "adDurationExpired": "Your Ad Duration time is over",
@ -1327,7 +1078,8 @@ static const Map<String,dynamic> en_US = {
"submitAd": "Submit Ad", "submitAd": "Submit Ad",
"selectAdType": "Select Ad Type", "selectAdType": "Select Ad Type",
"validUntilSubscriptionExpiration": "Valid Until Subscription Expiration", "validUntilSubscriptionExpiration": "Valid Until Subscription Expiration",
"youLeftAdsGivenSubscription": "You have left with limited ads given in the subscription.", "adsRemaining ": "Ads Remaining",
"youLeftAdsGivenSubscription": "You have left with 05 out of 50 ads given in the subscription.",
"updateSubscription": "Update Subscription", "updateSubscription": "Update Subscription",
"workInProgress": "Work In Progress", "workInProgress": "Work In Progress",
"visitCompleted": "Visit Completed", "visitCompleted": "Visit Completed",
@ -1351,6 +1103,7 @@ static const Map<String,dynamic> en_US = {
"itemsSelected": "Item(s) Selected", "itemsSelected": "Item(s) Selected",
"workshopFullAccessServices": "Few services are not available on home location. Change the location to workshop to full access the services", "workshopFullAccessServices": "Few services are not available on home location. Change the location to workshop to full access the services",
"changeLocationService": "Change location or service:", "changeLocationService": "Change location or service:",
"noItemstoShow": "No Items to show.",
"someDescriptionSubServices": "Some description about the sub-services", "someDescriptionSubServices": "Some description about the sub-services",
"selectServicesYouWant": "Select services you want", "selectServicesYouWant": "Select services you want",
"selectServiceType": "Select service type", "selectServiceType": "Select service type",
@ -1395,258 +1148,12 @@ static const Map<String,dynamic> en_US = {
"inviteFriends": "Invite Friends", "inviteFriends": "Invite Friends",
"more": "More", "more": "More",
"language": "Language", "language": "Language",
"mySubscription": "My Subscription", "mySubscriptions": "My Subscriptions",
"subscriptions": "Subscriptions", "subscriptions": "Subscriptions",
"defineLicenses": "Define Licenses", "defineLicenses": "Define Licenses",
"logOut": "Log Out", "logOut": "Log Out",
"customer": "Customer", "customer": "Customer",
"accept": "Accept", "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",
"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",
"customerCarePrompt": "Got any question? We are here to service. Click here to talk to our customer care right now.",
"callNow": "Call Now",
"condition": "Condition",
"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",
"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",
"specialRequestChat": "Special 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"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -222,7 +222,6 @@ abstract class LocaleKeys {
static const payLater = 'payLater'; static const payLater = 'payLater';
static const complete = 'complete'; static const complete = 'complete';
static const makeAnOffer = 'makeAnOffer'; static const makeAnOffer = 'makeAnOffer';
static const provideOffer = 'provideOffer';
static const enterAmount = 'enterAmount'; static const enterAmount = 'enterAmount';
static const submit = 'submit'; static const submit = 'submit';
static const viewChat = 'viewChat'; static const viewChat = 'viewChat';
@ -337,7 +336,7 @@ abstract class LocaleKeys {
static const setupTouchID = 'setupTouchID'; static const setupTouchID = 'setupTouchID';
static const reenableTouchID = 'reenableTouchID'; static const reenableTouchID = 'reenableTouchID';
static const scanFaceIDAuthenticate = 'scanFaceIDAuthenticate'; static const scanFaceIDAuthenticate = 'scanFaceIDAuthenticate';
static const adDeletedSuccessfully = 'adDeletedSuccessfully'; static const AdDeletedSuccessfully = 'AdDeletedSuccessfully';
static const yourReservationCancelled = 'yourReservationCancelled'; static const yourReservationCancelled = 'yourReservationCancelled';
static const adDeactivatedSuccessfully = 'adDeactivatedSuccessfully'; static const adDeactivatedSuccessfully = 'adDeactivatedSuccessfully';
static const vehicle_selectVehicleType = 'vehicle.selectVehicleType'; static const vehicle_selectVehicleType = 'vehicle.selectVehicleType';
@ -471,6 +470,7 @@ abstract class LocaleKeys {
static const submitAd = 'submitAd'; static const submitAd = 'submitAd';
static const selectAdType = 'selectAdType'; static const selectAdType = 'selectAdType';
static const validUntilSubscriptionExpiration = 'validUntilSubscriptionExpiration'; static const validUntilSubscriptionExpiration = 'validUntilSubscriptionExpiration';
static const adsRemaining = 'adsRemaining';
static const youLeftAdsGivenSubscription = 'youLeftAdsGivenSubscription'; static const youLeftAdsGivenSubscription = 'youLeftAdsGivenSubscription';
static const updateSubscription = 'updateSubscription'; static const updateSubscription = 'updateSubscription';
static const workInProgress = 'workInProgress'; static const workInProgress = 'workInProgress';
@ -495,6 +495,7 @@ abstract class LocaleKeys {
static const itemsSelected = 'itemsSelected'; static const itemsSelected = 'itemsSelected';
static const workshopFullAccessServices = 'workshopFullAccessServices'; static const workshopFullAccessServices = 'workshopFullAccessServices';
static const changeLocationService = 'changeLocationService'; static const changeLocationService = 'changeLocationService';
static const noItemstoShow = 'noItemstoShow';
static const someDescriptionSubServices = 'someDescriptionSubServices'; static const someDescriptionSubServices = 'someDescriptionSubServices';
static const selectServicesYouWant = 'selectServicesYouWant'; static const selectServicesYouWant = 'selectServicesYouWant';
static const selectServiceType = 'selectServiceType'; static const selectServiceType = 'selectServiceType';
@ -539,260 +540,11 @@ abstract class LocaleKeys {
static const inviteFriends = 'inviteFriends'; static const inviteFriends = 'inviteFriends';
static const more = 'more'; static const more = 'more';
static const language = 'language'; static const language = 'language';
static const mySubscription = 'mySubscription'; static const mySubscriptions = 'mySubscriptions';
static const subscriptions = 'subscriptions'; static const subscriptions = 'subscriptions';
static const defineLicenses = 'defineLicenses'; static const defineLicenses = 'defineLicenses';
static const logOut = 'logOut'; static const logOut = 'logOut';
static const customer = 'customer'; static const customer = 'customer';
static const amountVAR = 'amountVAR';
static const accept = 'accept'; 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 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 customerCarePrompt = 'customerCarePrompt';
static const callNow = 'callNow';
static const condition = 'condition';
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 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 specialRequestChat = 'specialRequestChat';
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';
} }

@ -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: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 // todo terminal command to genertate translation files
// flutter pub run easy_localization:generate --source-dir ./assets/langs // flutter pub run easy_localization:generate --source-dir ./assets/langs
// todo terminal command to genertate translation keys // todo terminal command to genertate translation keys
// flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart // flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart
// command to generate languages data from json // 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/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/special_service_model.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'; import 'package:mc_common_app/utils/enums.dart';
class AdDetailsModel { class AdDetailsModel {
@ -32,14 +31,11 @@ class AdDetailsModel {
String? qrCodePath; String? qrCodePath;
bool? isCustomerAcknowledged; bool? isCustomerAcknowledged;
int? createdByRole; int? createdByRole;
AdCreationStepsEnum? adCreationStepsEnum;
int? totalViews; int? totalViews;
String? createdOn; String? createdOn;
double? priceExcludingDiscount; double? priceExcludingDiscount;
double? reservePrice; double? reservePrice;
bool? isMCHandled; bool? isMCHandled;
bool? showContactDetail;
bool? isOnWhatsApp;
String? modifiedOn; String? modifiedOn;
AdPostStatus? adPostStatus; AdPostStatus? adPostStatus;
AdReserveStatus? adReserveStatus; AdReserveStatus? adReserveStatus;
@ -47,63 +43,47 @@ class AdDetailsModel {
bool? isReservedByMe; bool? isReservedByMe;
String? phoneNo; String? phoneNo;
String? whatsAppNo; String? whatsAppNo;
String? adOwnerName;
String? adOwnerEmail;
AdOwnerDetails? adOwnerDetails;
String? warrantyYears;
CreatedByRoleEnum? createdByRoleEnum; CreatedByRoleEnum? createdByRoleEnum;
List<ChatMessageModel>? adMessages;
int? totalItemsCount; AdDetailsModel(
{this.id,
AdDetailsModel({ this.startdate,
this.id, this.enddate,
this.startdate, this.vehicle,
this.enddate, this.specialservice,
this.vehicle, // this.reserved,
this.specialservice, this.statusID,
// this.reserved, this.statuslabel,
this.statusID, this.adsDurationPrice,
this.statuslabel, this.adsDurationDiscount,
this.adsDurationPrice, this.adsDurationDiscountPrice,
this.adsDurationDiscount, this.comment,
this.adsDurationDiscountPrice, this.active,
this.comment, this.isPaid,
this.active, this.isSubscription,
this.isPaid, this.isVerified,
this.isSubscription, this.netPrice,
this.isVerified, this.specialServiceTotalPrice,
this.netPrice, this.taxPrice,
this.specialServiceTotalPrice, this.totalPrice,
this.taxPrice, this.userID,
this.totalPrice, this.vehiclePostingID,
this.userID, this.qrCodePath,
this.vehiclePostingID, this.isCustomerAcknowledged,
this.qrCodePath, this.createdByRole,
this.isCustomerAcknowledged, this.totalViews,
this.createdByRole, this.createdOn,
this.adCreationStepsEnum, this.priceExcludingDiscount,
this.totalViews, this.reservePrice,
this.createdOn, this.isMCHandled,
this.priceExcludingDiscount, this.adPostStatus,
this.reservePrice, this.adReserveStatus,
this.isMCHandled, this.isMyAd,
this.showContactDetail, this.isReservedByMe,
this.isOnWhatsApp, this.phoneNo,
this.adPostStatus, this.whatsAppNo,
this.adReserveStatus, this.createdByRoleEnum,
this.isMyAd, this.modifiedOn});
this.isReservedByMe,
this.phoneNo,
this.whatsAppNo,
this.adOwnerName,
this.adOwnerEmail,
this.adOwnerDetails,
this.warrantyYears,
this.createdByRoleEnum,
this.modifiedOn,
this.adMessages,
this.totalItemsCount,
});
int getRandomValue({required int min, required int max}) { int getRandomValue({required int min, required int max}) {
Random random = Random(); Random random = Random();
@ -111,7 +91,7 @@ class AdDetailsModel {
return randomNumber; return randomNumber;
} }
AdDetailsModel.fromJson(Map<String, dynamic> json, bool isMyAds, int totalItems) { AdDetailsModel.fromJson(Map<String, dynamic> json, bool isMyAds) {
id = json['id']; id = json['id'];
startdate = json['startdate']; startdate = json['startdate'];
enddate = json['enddate']; enddate = json['enddate'];
@ -137,31 +117,26 @@ class AdDetailsModel {
taxPrice = json['taxPrice']; taxPrice = json['taxPrice'];
totalPrice = json['totalPrice']; totalPrice = json['totalPrice'];
userID = json['userID']; userID = json['userID'];
vehiclePostingID = (json['vehiclePostingID'] == null || json['vehiclePostingID'] == 0) ? json['id'] : 0; vehiclePostingID = json['vehiclePostingID'];
qrCodePath = json['qrCodePath']; qrCodePath = json['qrCodePath'];
isCustomerAcknowledged = json['isCustomerAcknowledged']; isCustomerAcknowledged = json['isCustomerAcknowledged'];
createdByRole = json['createdByRole']; createdByRole = json['createdByRole'];
adCreationStepsEnum = json['stepNo'] != null ? (json['stepNo'] as int).toAdCreationStepsEnumFromInt() : AdCreationStepsEnum.vehicleDetails;
totalViews = json['totalViews']; totalViews = json['totalViews'];
createdOn = json['createdOn']; createdOn = json['createdOn'];
priceExcludingDiscount = json['priceExcludingDiscount']; priceExcludingDiscount = json['priceExcludingDiscount'];
reservePrice = json['reservePrice']; reservePrice = json['reservePrice'];
isMCHandled = json['isMCHandled']; isMCHandled = json['isMCHandled'];
showContactDetail = json['showContactDetail'];
isOnWhatsApp = json['isOnWhatsApp'];
modifiedOn = json['modifiedOn']; modifiedOn = json['modifiedOn'];
phoneNo = json['vehicle'] != null ? (json['vehicle']['mobileNo'] ?? "") : ""; whatsAppNo = json['phoneNo'];
whatsAppNo = json['vehicle'] != null ? (json['vehicle']['whatsAppNo'] ?? "") : ""; modifiedOn = json['whatsAppNo'];
warrantyYears = json['vehicle'] != null ? (json['vehicle']['warantyYears'] != null ? ((json['vehicle']['warantyYears']).toString()) : "") : ""; // adPostStatus = AdPostStatus.expired;
adOwnerName = json['vehicle'] != null ? (json['vehicle']['adOwnerName'] ?? "") : ""; adPostStatus = (json['statusID'] as int).toAdPostEnum();
adOwnerEmail = json['vehicle'] != null ? (json['vehicle']['adOwnerEmail'] ?? "") : ""; //TODO: THIS ID SHOULD BE UPDATED!
adOwnerDetails = (json['vehicle'] != null && json['vehicle']['aDsUser'] != null) ? (AdOwnerDetails.fromJson(json['vehicle']['aDsUser'])) : null;
adPostStatus = ((json['statusID'] ?? 1) as int).toAdPostEnum();
adReserveStatus = AdReserveStatus.defaultStatus; adReserveStatus = AdReserveStatus.defaultStatus;
// createdByRoleEnum = CreatedByRoleEnum.admin;
createdByRoleEnum = (json['createdByRole'] as int).toCreatedByRoleEnum(); createdByRoleEnum = (json['createdByRole'] as int).toCreatedByRoleEnum();
isMyAd = isMyAds; isMyAd = isMyAds;
isReservedByMe = false; isReservedByMe = false;
totalItemsCount = totalItems;
} }
} }
@ -173,7 +148,7 @@ class Vehicle {
bool? isActive; bool? isActive;
bool? isFinanceAvailable; bool? isFinanceAvailable;
int? status; int? status;
String? statusText; String? statustext;
Category? category; Category? category;
Category? color; Category? color;
Condition? condition; Condition? condition;
@ -182,8 +157,8 @@ class Vehicle {
ModelYear? modelyear; ModelYear? modelyear;
Condition? sellertype; Condition? sellertype;
Condition? transmission; Condition? transmission;
AdsDuration? duration; Duration? duration;
List<GenericImageModel>? image; List<AdImage>? image;
List<DamageReport>? damagereport; List<DamageReport>? damagereport;
String? vehicleDescription; String? vehicleDescription;
String? vehicleTitle; String? vehicleTitle;
@ -200,7 +175,7 @@ class Vehicle {
this.isActive, this.isActive,
this.isFinanceAvailable, this.isFinanceAvailable,
this.status, this.status,
this.statusText, this.statustext,
this.category, this.category,
this.color, this.color,
this.condition, this.condition,
@ -227,7 +202,7 @@ class Vehicle {
isActive = json['isActive']; isActive = json['isActive'];
isFinanceAvailable = json['isFinanceAvailable']; isFinanceAvailable = json['isFinanceAvailable'];
status = json['status']; status = json['status'];
statusText = json['statustext']; statustext = json['statustext'];
category = json['category'] != null ? Category.fromJson(json['category']) : null; category = json['category'] != null ? Category.fromJson(json['category']) : null;
color = json['color'] != null ? Category.fromJson(json['color']) : null; color = json['color'] != null ? Category.fromJson(json['color']) : null;
condition = json['condition'] != null ? Condition.fromJson(json['condition']) : null; condition = json['condition'] != null ? Condition.fromJson(json['condition']) : null;
@ -236,11 +211,11 @@ class Vehicle {
modelyear = json['modelyear'] != null ? ModelYear.fromJson(json['modelyear']) : null; modelyear = json['modelyear'] != null ? ModelYear.fromJson(json['modelyear']) : null;
sellertype = json['sellertype'] != null ? Condition.fromJson(json['sellertype']) : null; sellertype = json['sellertype'] != null ? Condition.fromJson(json['sellertype']) : null;
transmission = json['transmission'] != null ? Condition.fromJson(json['transmission']) : 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) { if (json['image'] != null) {
image = <GenericImageModel>[]; image = <AdImage>[];
json['image'].forEach((v) { json['image'].forEach((v) {
image!.add(GenericImageModel.fromJson(v)); image!.add(AdImage.fromJson(v));
}); });
} }
if (json['damagereport'] != null) { if (json['damagereport'] != null) {
@ -351,16 +326,16 @@ class ModelYear {
} }
} }
class AdsDuration { class Duration {
int? id; int? id;
String? label; String? label;
int? days; int? days;
double? price; double? price;
ModelYear? country; 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']; id = json['id'];
label = json['label']; label = json['label'];
days = json['days']; days = json['days'];
@ -381,15 +356,15 @@ class AdsDuration {
} }
} }
class GenericImageModel { class AdImage {
int? id; int? id;
String? imageName; String? imageName;
String? imageUrl; String? imageUrl;
bool? isActive; 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']; id = json['id'];
imageName = json['imageName']; imageName = json['imageName'];
imageUrl = json['imageUrl']; imageUrl = json['imageUrl'];
@ -423,7 +398,6 @@ class DamageReport {
isActive = json['isActive']; isActive = json['isActive'];
vehicleDamagePartID = json['vehicleDamagePartID']; vehicleDamagePartID = json['vehicleDamagePartID'];
partName = json['partName']; partName = json['partName'];
comment = json['comment'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -437,28 +411,3 @@ class DamageReport {
return data; 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; 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,28 +6,9 @@ class AdsDurationModel {
int? countryID; int? countryID;
bool? isActive; bool? isActive;
String? countryName; String? countryName;
String? currency;
double? discountValue;
double? discountPercent;
double? priceAfterDiscount;
int? roleID;
bool? isSelected; bool? isSelected;
AdsDurationModel({ AdsDurationModel({this.id, this.name, this.days, this.price, this.countryID, this.isActive, this.countryName, this.isSelected});
this.id,
this.name,
this.days,
this.price,
this.countryID,
this.isActive,
this.countryName,
this.currency,
this.discountValue,
this.discountPercent,
this.priceAfterDiscount,
this.roleID,
this.isSelected,
});
AdsDurationModel.fromJson(Map<String, dynamic> json) { AdsDurationModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -37,11 +18,6 @@ class AdsDurationModel {
countryID = json['countryID']; countryID = json['countryID'];
isActive = json['isActive']; isActive = json['isActive'];
countryName = json['countryName']; countryName = json['countryName'];
currency = json['currency'];
discountValue = json['discountValue'];
discountPercent = json['discountPercent'];
priceAfterDiscount = json['priceAfterDiscount'];
roleID = json['roleID'];
isSelected = false; isSelected = false;
} }
@ -54,11 +30,6 @@ class AdsDurationModel {
data['countryID'] = countryID; data['countryID'] = countryID;
data['isActive'] = isActive; data['isActive'] = isActive;
data['countryName'] = countryName; data['countryName'] = countryName;
data['currency'] = currency;
data['discountValue'] = discountValue;
data['discountPercent'] = discountPercent;
data['priceAfterDiscount'] = priceAfterDiscount;
data['roleID'] = roleID;
return data; return data;
} }
} }

@ -81,7 +81,7 @@ class Office {
String? officeAreaName; String? officeAreaName;
String? officeAreaNameN; String? officeAreaNameN;
int? cityID; int? cityID;
CitySSModel? city; String? city;
int? specialServiceID; int? specialServiceID;
Office({this.id, this.officeAreaName, this.officeAreaNameN, this.cityID, this.city, this.specialServiceID}); Office({this.id, this.officeAreaName, this.officeAreaNameN, this.cityID, this.city, this.specialServiceID});
@ -91,41 +91,11 @@ class Office {
officeAreaName = json['officeAreaName']; officeAreaName = json['officeAreaName'];
officeAreaNameN = json['officeAreaNameN']; officeAreaNameN = json['officeAreaNameN'];
cityID = json['cityID']; cityID = json['cityID'];
if (json['city'] != null) { city = json['city'];
city = json['city'] != null ? CitySSModel.fromJson(json['city']) : null;
}
specialServiceID = json['specialServiceID']; 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 { class SpecialServiceModelForAds {
int? adsID; int? adsID;
int? specialServiceID; int? specialServiceID;
@ -156,6 +126,7 @@ class SpecialServiceModelForAds {
appointmentStatusEnum = (json['appointmentStatus'] as int).toAppointmentStatusEnum(); appointmentStatusEnum = (json['appointmentStatus'] as int).toAppointmentStatusEnum();
appointmentDate = json['appointmentDate']; appointmentDate = json['appointmentDate'];
appointmentStatusId = json['appointmentStatus']; appointmentStatusId = json['appointmentStatus'];
} }
@override @override

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

@ -451,11 +451,10 @@ class VehicleBrandsModel {
String? vehicleTypeVal; String? vehicleTypeVal;
String? vehicleBrandDescription; String? vehicleBrandDescription;
String? vehicleBrandDescriptionN; String? vehicleBrandDescriptionN;
String? imageUrl;
bool? isActive; bool? isActive;
bool? isSelected; 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) { VehicleBrandsModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -464,7 +463,6 @@ class VehicleBrandsModel {
vehicleBrandDescription = json['vehicleBrand_Description']; vehicleBrandDescription = json['vehicleBrand_Description'];
vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN']; vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN'];
isActive = json['isActive']; isActive = json['isActive'];
imageUrl = json['imageUrl'];
isSelected = false; isSelected = false;
} }
@ -475,7 +473,6 @@ class VehicleBrandsModel {
data['vehicleTypeVal'] = vehicleTypeVal; data['vehicleTypeVal'] = vehicleTypeVal;
data['vehicleBrand_Description'] = vehicleBrandDescription; data['vehicleBrand_Description'] = vehicleBrandDescription;
data['vehicleBrand_DescriptionN'] = vehicleBrandDescriptionN; data['vehicleBrand_DescriptionN'] = vehicleBrandDescriptionN;
data['imageUrl'] = imageUrl;
data['isActive'] = isActive; data['isActive'] = isActive;
return data; 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? customerName;
String? customerMobileNum; String? customerMobileNum;
int? appointmentType; int? appointmentType;
AppointmentTypeEnum? appointmentTypeEnum;
String? providerName; String? providerName;
String? duration; String? duration;
String? appointmentDate; String? appointmentDate;
String? appointmentCreatedOn;
String? paymentType;
String? appointmentAddress;
String? appointmentLatitude;
String? appointmentLongitude;
String? branchName; String? branchName;
int? branchId; int? branchId;
int? servicePaymentStatus; int? servicePaymentStatus;
bool? isPaymentRequiredAtBooking;
double? totalAmount; double? totalAmount;
double? remainingAmount; double? remainingAmount;
bool? isSelected; bool? isSelected;
@ -39,8 +32,7 @@ class AppointmentListModel {
List<AppointmentListModel>? customerAppointmentList; List<AppointmentListModel>? customerAppointmentList;
List<MergeAppointmentList>? mergeAppointmentList; List<MergeAppointmentList>? mergeAppointmentList;
AppointmentListModel({ AppointmentListModel({this.id,
this.id,
this.serviceSlotID, this.serviceSlotID,
this.appointmentStatusID, this.appointmentStatusID,
this.appointmentStatusText, this.appointmentStatusText,
@ -53,29 +45,21 @@ class AppointmentListModel {
this.customerName, this.customerName,
this.customerMobileNum, this.customerMobileNum,
this.appointmentType, this.appointmentType,
this.appointmentTypeEnum,
this.providerName, this.providerName,
this.paymentType, this.duration,
this.appointmentAddress,
this.appointmentLatitude,
this.appointmentLongitude,
this.branchName, this.branchName,
this.branchId, this.branchId,
this.servicePaymentStatus, this.servicePaymentStatus,
this.isPaymentRequiredAtBooking,
this.totalAmount, this.totalAmount,
this.remainingAmount, this.remainingAmount,
this.isSelected, this.isSelected,
this.appointmentDate, this.appointmentDate,
this.appointmentCreatedOn,
this.appointmentServicesList, this.appointmentServicesList,
this.customerAppointmentList, this.customerAppointmentList, this.mergeAppointmentList,});
this.mergeAppointmentList,
});
@override @override
String toString() { 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) { AppointmentListModel.fromJson(Map<String, dynamic> json) {
@ -92,31 +76,31 @@ class AppointmentListModel {
customerName = json['customerName']; customerName = json['customerName'];
customerMobileNum = json['customerMobile']; customerMobileNum = json['customerMobile'];
appointmentType = json['appointmentType']; appointmentType = json['appointmentType'];
appointmentTypeEnum = json['appointmentType'] != null ? (json['appointmentType'] as int).toAppointmentTypeEnum() : AppointmentTypeEnum.workshop;
providerName = json['providerName']; providerName = json['providerName'];
duration = json['duration']; duration = json['duration'];
appointmentDate = json['appointmentDate']; appointmentDate = json['appointmentDate'];
appointmentCreatedOn = json['createdOn'];
paymentType = json['paymentType'];
appointmentAddress = json['address'] ?? "";
appointmentLatitude = json['branchLatitude'];
appointmentLongitude = json['branchLongitude'];
branchName = json['branchName']; branchName = json['branchName'];
branchId = json['branchID']; branchId = json['branchID'];
servicePaymentStatus = json['servicePaymentStatus']; servicePaymentStatus = json['servicePaymentStatus'];
isPaymentRequiredAtBooking = json['isPaymentRequiredAtBooking'];
totalAmount = json['amountTotal']; totalAmount = json['amountTotal'];
remainingAmount = json['amountRem']; remainingAmount = json['amountRem'];
isSelected = false; isSelected = false;
appointmentStatusEnum = (json['appointmentStatusID'] as int).toAppointmentStatusEnum(); appointmentStatusEnum =
appointmentPaymentStatusEnum = (json['servicePaymentStatus'] as int).toAppointmentPaymentStatusEnum(); (json['appointmentStatusID'] as int).toAppointmentStatusEnum();
appointmentPaymentStatusEnum =
(json['servicePaymentStatus'] as int).toAppointmentPaymentStatusEnum();
if (json['serviceList'] != null) { if (json['serviceList'] != null) {
appointmentServicesList = <ServiceModel>[]; appointmentServicesList = <ServiceModel>[];
json['serviceList'].forEach((v) { 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? serviceItemName;
String? serviceItemDescription; 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) { ServiceAppointmentItems.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -151,9 +138,12 @@ class CustomerData {
final String customerName; final String customerName;
final List<AppointmentListModel> appointmentList; 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 { class MergeAppointmentList {
int? id; int? id;
int? mergeAppointmentId; int? mergeAppointmentId;
@ -165,13 +155,15 @@ class MergeAppointmentList {
this.serviceAppointmentId, this.serviceAppointmentId,
}); });
factory MergeAppointmentList.fromJson(Map<String, dynamic> json) => MergeAppointmentList( factory MergeAppointmentList.fromJson(Map<String, dynamic> json) =>
MergeAppointmentList(
id: json["id"], id: json["id"],
mergeAppointmentId: json["mergeAppointmentID"], mergeAppointmentId: json["mergeAppointmentID"],
serviceAppointmentId: json["serviceAppointmentID"], serviceAppointmentId: json["serviceAppointmentID"],
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() =>
{
"id": id, "id": id,
"mergeAppointmentID": mergeAppointmentId, "mergeAppointmentID": mergeAppointmentId,
"serviceAppointmentID": serviceAppointmentId, "serviceAppointmentID": serviceAppointmentId,

@ -1,7 +1,6 @@
import 'package:mc_common_app/extensions/string_extensions.dart'; 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/services_models/service_model.dart';
import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/models/general_models/widgets_models.dart';
import 'package:mc_common_app/utils/enums.dart';
class CustomTimeDateSlotModel { class CustomTimeDateSlotModel {
TimeSlotModel? date; TimeSlotModel? date;
@ -11,7 +10,6 @@ class CustomTimeDateSlotModel {
} }
class ServiceAppointmentScheduleModel { class ServiceAppointmentScheduleModel {
String? scheduleName;
List<ServiceSlotList>? serviceSlotList; List<ServiceSlotList>? serviceSlotList;
List<ServiceModel>? servicesListInAppointment; List<ServiceModel>? servicesListInAppointment;
int? selectedDateIndex; int? selectedDateIndex;
@ -21,12 +19,8 @@ class ServiceAppointmentScheduleModel {
double? amountTotal; double? amountTotal;
double? amountRem; double? amountRem;
int? appointmentType; int? appointmentType;
double? totalLocationCharges;
CurrentLocationInfoModel? locationInfoModel;
AppointmentTypeEnum? appointmentTypeEnum;
ServiceAppointmentScheduleModel({ ServiceAppointmentScheduleModel({
this.scheduleName,
this.serviceSlotList, this.serviceSlotList,
this.servicesListInAppointment, this.servicesListInAppointment,
this.selectedDateIndex, this.selectedDateIndex,
@ -36,9 +30,6 @@ class ServiceAppointmentScheduleModel {
this.amountTotal, this.amountTotal,
this.amountRem, this.amountRem,
this.appointmentType, this.appointmentType,
this.totalLocationCharges,
this.locationInfoModel,
this.appointmentTypeEnum,
}); });
List<CustomTimeDateSlotModel> getFormattedDateTimeSlotPackage() { List<CustomTimeDateSlotModel> getFormattedDateTimeSlotPackage() {
@ -78,7 +69,7 @@ class ServiceAppointmentScheduleModel {
.toList(); .toList();
List<TimeSlotModel> slotTime = []; List<TimeSlotModel> slotTime = [];
for (var element in slotTimeData) { 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; return slotTime;
@ -96,8 +87,6 @@ class ServiceAppointmentScheduleModel {
} }
ServiceAppointmentScheduleModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) { ServiceAppointmentScheduleModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) {
scheduleName = json['scheduleName'];
if (json['serviceSlotList'] != null) { if (json['serviceSlotList'] != null) {
serviceSlotList = <ServiceSlotList>[]; serviceSlotList = <ServiceSlotList>[];
json['serviceSlotList'].forEach((v) { json['serviceSlotList'].forEach((v) {
@ -116,9 +105,6 @@ class ServiceAppointmentScheduleModel {
amountTotal = json['amountTotal']; amountTotal = json['amountTotal'];
amountRem = json['amountRem']; amountRem = json['amountRem'];
appointmentType = json['appointmentType']; 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? serviceProviderID;
int? offerStatus; int? offerStatus;
ReqOffer? reqOffer; ReqOffer? reqOffer;
List<MessageImageModel>? messageImages;
bool? isRead; bool? isRead;
String? readOn; String? readOn;
bool? isMyMessage; bool? isMyMessage;
@ -35,7 +34,6 @@ class ChatMessageModel {
this.serviceProviderID, this.serviceProviderID,
this.offerStatus, this.offerStatus,
this.reqOffer, this.reqOffer,
this.messageImages,
this.isRead, this.isRead,
this.readOn, this.readOn,
this.isMyMessage, this.isMyMessage,
@ -43,10 +41,10 @@ class ChatMessageModel {
@override @override
String toString() { 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(); final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase();
id = json['id']; id = json['id'];
senderUserID = json['senderUserID']; senderUserID = json['senderUserID'];
@ -59,13 +57,7 @@ class ChatMessageModel {
reqOfferID = json['reqOfferID']; reqOfferID = json['reqOfferID'];
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus']; offerStatus = json['offerStatus'];
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer'], isFromNetwork, isForReqOfferImagesURLs) : null; reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null;
if (json['reqOfferImages'] != null) {
messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
messageImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
isRead = json['isRead']; isRead = json['isRead'];
readOn = json['readOn']; readOn = json['readOn'];
isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId; isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId;
@ -79,15 +71,8 @@ class ReqOffer {
int? offerStatus; int? offerStatus;
String? offerStatusText; String? offerStatusText;
String? comment; String? comment;
String? serviceItemName;
String? manufacturedByName;
String? manufacturedOn;
double? price; double? price;
bool? isDeliveryAvailable;
RequestDeliveryOptionEnum? requestDeliveryOption;
RequestsTypeEnum? requestsTypeEnum;
RequestOfferStatusEnum? requestOfferStatusEnum; RequestOfferStatusEnum? requestOfferStatusEnum;
List<MessageImageModel>? reqOfferImages;
ReqOffer({ ReqOffer({
this.id, this.id,
@ -96,52 +81,19 @@ class ReqOffer {
this.offerStatus, this.offerStatus,
this.offerStatusText, this.offerStatusText,
this.comment, this.comment,
this.serviceItemName,
this.manufacturedByName,
this.manufacturedOn,
this.price, this.price,
this.isDeliveryAvailable,
this.requestDeliveryOption,
this.requestOfferStatusEnum, 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']; id = json['id'];
requestID = json['requestID']; requestID = json['requestID'];
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus']; offerStatus = json['offerStatus'];
offerStatusText = json['offerStatusText']; offerStatusText = json['offerStatusText'];
comment = json['comment']; comment = json['comment'];
serviceItemName = json['serviceItem'];
manufacturedByName = json['offeredItemCreatedByName'].toString();
manufacturedOn = json['offeredItemCreatedOn'] ?? json["createdOn"];
price = json['price']; price = json['price'];
isDeliveryAvailable = json['isDeliveryAvailable'];
requestDeliveryOption = ((json['offerDeliveryOption'] ?? 0) as int).toRequestDeliveryOptionEnum();
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum(); 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}); 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,7 +2,6 @@ class EnumsModel {
int id; int id;
int enumTypeId; int enumTypeId;
String enumValueStr; String enumValueStr;
String enumValueStrDes;
int enumValue; int enumValue;
bool isActive; bool isActive;
@ -10,7 +9,6 @@ class EnumsModel {
required this.id, required this.id,
required this.enumTypeId, required this.enumTypeId,
required this.enumValueStr, required this.enumValueStr,
required this.enumValueStrDes,
required this.enumValue, required this.enumValue,
required this.isActive, required this.isActive,
}); });
@ -19,13 +17,20 @@ class EnumsModel {
id: json["id"], id: json["id"],
enumTypeId: json["enumTypeID"], enumTypeId: json["enumTypeID"],
enumValueStr: json["enumValueStr"], enumValueStr: json["enumValueStr"],
enumValueStrDes: json["enumValueStrDes"] ?? json["enumValueStr"],
enumValue: json["enumValue"], enumValue: json["enumValue"],
isActive: json["isActive"], isActive: json["isActive"],
); );
@override @override
String toString() { String toString() {
return 'EnumsModel{id: $id, enumTypeId: $enumTypeId, enumValueStr: $enumValueStr,enumValueStrDes: $enumValueStrDes, enumValue: $enumValue, isActive: $isActive}'; 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 'dart:io';
import 'package:mc_common_app/utils/utils.dart';
class GenericRespModel { class GenericRespModel {
GenericRespModel({ GenericRespModel({
this.data, this.data,
@ -15,19 +13,12 @@ class GenericRespModel {
int? totalItemsCount; int? totalItemsCount;
String? message; String? message;
factory GenericRespModel.fromJson(Map<String, dynamic> json) { factory GenericRespModel.fromJson(Map<String, dynamic> json) => GenericRespModel(
if (json.containsKey('StatusMessage')) { data: json["data"],
if ((json['StatusMessage'] as String).contains('Internal server error')) { messageStatus: json["messageStatus"],
Utils.showToast("${json['StatusMessage']}"); totalItemsCount: json["totalItemsCount"],
} message: json["message"],
} );
return GenericRespModel(
data: json["data"],
messageStatus: json["messageStatus"],
totalItemsCount: json["totalItemsCount"],
message: json["message"],
);
}
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"data": data, "data": data,
@ -47,6 +38,17 @@ class AdsCreationPayloadModel {
ads = json['ads'] != null ? Ads.fromJson(json['ads']) : null; ads = json['ads'] != null ? Ads.fromJson(json['ads']) : null;
vehiclePosting = json['vehiclePosting'] != null ? VehiclePosting.fromJson(json['vehiclePosting']) : 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 { class Ads {
@ -56,19 +58,8 @@ class Ads {
int? countryId; int? countryId;
List<int>? specialServiceIDs; List<int>? specialServiceIDs;
bool? isMCHandled; bool? isMCHandled;
bool? showContactDetail;
bool? isOnWhatsApp; Ads({this.id, this.adsDurationID, this.startDate, this.countryId, this.specialServiceIDs, this.isMCHandled});
Ads({
this.id,
this.adsDurationID,
this.startDate,
this.countryId,
this.specialServiceIDs,
this.isMCHandled,
this.showContactDetail,
this.isOnWhatsApp,
});
Ads.fromJson(Map<String, dynamic> json) { Ads.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -77,8 +68,6 @@ class Ads {
countryId = json['countryId']; countryId = json['countryId'];
specialServiceIDs = json['specialServiceIDs'].cast<int>(); specialServiceIDs = json['specialServiceIDs'].cast<int>();
isMCHandled = json['isMCHandled']; isMCHandled = json['isMCHandled'];
showContactDetail = json['showContactDetail'];
isOnWhatsApp = json['isOnWhatsApp'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -125,33 +114,32 @@ class VehiclePosting {
String? phoneNo; String? phoneNo;
String? whatsAppNo; String? whatsAppNo;
VehiclePosting({ VehiclePosting(
this.id, {this.id,
this.userID, this.userID,
this.vehicleType, this.vehicleType,
this.vehicleModelID, this.vehicleModelID,
this.vehicleModelYearID, this.vehicleModelYearID,
this.vehicleColorID, this.vehicleColorID,
this.vehicleCategoryID, this.vehicleCategoryID,
this.vehicleConditionID, this.vehicleConditionID,
this.vehicleMileageID, this.vehicleMileageID,
this.vehicleTransmissionID, this.vehicleTransmissionID,
this.vehicleSellerTypeID, this.vehicleSellerTypeID,
this.cityID, this.cityID,
this.price, this.price,
this.vehicleVIN, this.vehicleVIN,
this.vehicleDescription, this.vehicleDescription,
this.vehicleTitle, this.vehicleTitle,
this.vehicleDescriptionN, this.vehicleDescriptionN,
this.isFinanceAvailable, this.isFinanceAvailable,
this.warantyYears, this.warantyYears,
this.demandAmount, this.demandAmount,
this.adStatus, this.adStatus,
this.phoneNo, this.phoneNo,
this.whatsAppNo, this.whatsAppNo,
this.vehiclePostingImages, this.vehiclePostingImages,
this.vehiclePostingDamageParts, this.vehiclePostingDamageParts});
});
VehiclePosting.fromJson(Map<String, dynamic> json) { VehiclePosting.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -191,6 +179,40 @@ 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 @override
String toString() { 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}'; 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}';
@ -297,24 +319,8 @@ class VehiclePostingDamageParts {
return data; return data;
} }
@override @override
String toString() { String toString() {
return 'VehiclePostingDamageParts{id: $id, comment: $comment, vehicleImageBase64: $vehicleImageBase64, vehicleDamagePartID: $vehicleDamagePartID, vehiclePostingID: $vehiclePostingID, isActive: $isActive}'; 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,10 +1,9 @@
class FilterListModel { class FilterListModel {
String title; String title;
String iconUrl;
int id; int id;
bool isSelected; bool isSelected;
FilterListModel({required this.id, required this.isSelected, this.iconUrl = "", required this.title}); FilterListModel({required this.id, required this.isSelected, required this.title});
} }
class SelectionModel { class SelectionModel {
@ -12,20 +11,13 @@ class SelectionModel {
int selectedId; int selectedId;
String errorValue; String errorValue;
String itemPrice; String itemPrice;
String currency;
SelectionModel({ SelectionModel({
this.selectedOption = "", this.selectedOption = "",
this.errorValue = "", this.errorValue = "",
this.selectedId = 0, this.selectedId = 0,
this.itemPrice = "", this.itemPrice = "",
this.currency = "",
}); });
@override
String toString() {
return 'SelectionModel{selectedOption: $selectedOption, selectedId: $selectedId, errorValue: $errorValue, itemPrice: $itemPrice, currency: $currency}';
}
} }
class TimeSlotModel { class TimeSlotModel {

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

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

@ -4,8 +4,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:mc_common_app/utils/enums.dart';
Document documentFromJson(String str) => Document.fromJson(json.decode(str)); Document documentFromJson(String str) => Document.fromJson(json.decode(str));
String documentToJson(Document data) => json.encode(data.toJson()); String documentToJson(Document data) => json.encode(data.toJson());
@ -24,103 +22,65 @@ class Document {
String? message; String? message;
factory Document.fromJson(Map<String, dynamic> json) => Document( factory Document.fromJson(Map<String, dynamic> json) => Document(
totalItemsCount: json["totalItemsCount"], totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"],
data: json["data"] == null ? null : List<DocumentData>.from(json["data"].map((x) => DocumentData.fromJson(x))), data: json["data"] == null ? null : List<DocumentData>.from(json["data"].map((x) => DocumentData.fromJson(x))),
messageStatus: json["messageStatus"], messageStatus: json["messageStatus"] == null ? null : json["messageStatus"],
message: json["message"], message: json["message"] == null ? null : json["message"],
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount, "totalItemsCount": totalItemsCount == null ? null : totalItemsCount,
"data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())), "data": data == null ? null : List<dynamic>.from(data!.map((x) => x.toJson())),
"messageStatus": messageStatus, "messageStatus": messageStatus == null ? null : messageStatus,
"message": message, "message": message == null ? null : message,
}; };
} }
class DocumentData { class DocumentData {
DocumentData( DocumentData({
{this.id, this.id,
this.serviceProviderId, this.serviceProviderId,
this.documentId, this.documentId,
this.documentUrl, this.documentUrl,
this.status, this.status,
this.statusText, this.comment,
this.comment, this.isActive,
this.isActive, this.document,
this.document, this.fileExt,
this.fileExt, this.documentName,
this.documentName, });
this.isLocalFile,
this.description,
this.dateExpire,
this.isAllowUpdate,
this.isExpired});
int? id; int? id;
int? serviceProviderId; int? serviceProviderId;
int? documentId; int? documentId;
String? documentUrl; dynamic? documentUrl;
DocumentStatusEnum? status; int? status;
String? comment; dynamic? comment;
bool? isActive; bool? isActive;
String? document; String? document;
String? fileExt; String? fileExt;
String? statusText;
String? documentName; String? documentName;
bool? isLocalFile;
String? description;
String? dateExpire;
bool? isExpired;
bool? isAllowUpdate;
factory DocumentData.fromJson(Map<String, dynamic> json) => DocumentData( factory DocumentData.fromJson(Map<String, dynamic> json) => DocumentData(
id: json["id"], id: json["id"] == null ? null : json["id"],
serviceProviderId: json["serviceProviderID"], serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"],
documentId: json["documentID"], documentId: json["documentID"] == null ? null : json["documentID"],
documentUrl: json["documentURL"], documentUrl: json["documentURL"],
status: json.containsKey("status") ? (json['status'] as int).toDocumentStatusEnum() : null, status: json["status"] == null ? null : json["status"],
statusText: json["statusText"], comment: json["comment"],
comment: json["comment"], isActive: json["isActive"] == null ? null : json["isActive"],
isActive: json["isActive"], document: null,
dateExpire: json["dateExpire"], fileExt: null,
isExpired: json["isExpired"], documentName: json["documentName"] == null ? null : json["documentName"],
isAllowUpdate: json["isAllowUpdate"], );
document: null,
fileExt: null,
documentName: json["documentName"],
isLocalFile: false,
description: null);
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"id": id, "id": id == null ? null : id,
"serviceProviderID": serviceProviderId, "serviceProviderID": serviceProviderId == null ? null : serviceProviderId,
"documentID": documentId, "documentID": documentId == null ? null : documentId,
"documentURL": documentUrl, "documentURL": documentUrl,
"status": status, "status": status == null ? null : status,
"comment": comment, "comment": comment,
"isActive": isActive, "isActive": isActive == null ? null : 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
}
}
} }

@ -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)); ProviderModel branch2FromJson(String str) => ProviderModel.fromJson(json.decode(str));
String branch2ToJson(ProviderModel data) => json.encode(data.toJson());
class ProviderModel { class ProviderModel {
ProviderModel({ ProviderModel({
this.messageStatus, this.messageStatus,
@ -27,6 +29,13 @@ class ProviderModel {
data: json["data"] == null ? null : ProviderModelData.fromJson(json["data"]), data: json["data"] == null ? null : ProviderModelData.fromJson(json["data"]),
message: json["message"], message: json["message"],
); );
Map<String, dynamic> toJson() => {
"messageStatus": messageStatus,
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"message": message,
};
} }
class ProviderModelData { class ProviderModelData {
@ -63,6 +72,16 @@ class ProviderModelData {
userId: json["userID"], userId: json["userID"],
serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<BranchDetailModel>.from(json["serviceProviderBranch"].map((x) => BranchDetailModel.fromJson(x))), 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 { 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'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
class ProviderProfileModel { class ProviderProfileModel {
ProviderProfileModel({ ProviderProfileModel({
this.id, this.id,
this.companyName, this.companyName,
this.profileImage,
this.name,
this.countryName, this.countryName,
this.companyDescription, this.companyDescription,
this.allDocStatus, this.allDocStatus,
this.isValidSubscription, this.isValidSubscription,
this.userId, this.userId,
this.memberSince,
this.serviceProviderBranch, this.serviceProviderBranch,
this.countryID, this.countryID,
this.isFavorite,
this.providerID,
this.noOfBranches,
this.customerID,
}); });
final int? id; final int? id;
final String? profileImage;
final String? companyName; final String? companyName;
final String? companyDescription;
int? countryID;
final String? countryName; final String? countryName;
int? countryID;
final String? companyDescription;
final int? allDocStatus; final int? allDocStatus;
final bool? isValidSubscription; final bool? isValidSubscription;
final String? name;
final String? userId; final String? userId;
final String? memberSince;
bool? isFavorite;
final int? providerID;
final int? customerID;
final int? noOfBranches;
final List<BranchDetailModel>? serviceProviderBranch; final List<BranchDetailModel>? serviceProviderBranch;
factory ProviderProfileModel.fromJson(Map<String, dynamic> json) => ProviderProfileModel( factory ProviderProfileModel.fromJson(Map<String, dynamic> json) => ProviderProfileModel(
id: json["id"], id: json["id"],
companyName: json["companyName"], companyName: json["companyName"],
profileImage: json["profileImage"] ?? "",
name: json["name"],
countryName: json["countryName"], countryName: json["countryName"],
countryID: json["countryID"], countryID: json["countryID"],
companyDescription: json["companyDescription"], companyDescription: json["companyDescription"],
allDocStatus: json["allDocStatus"], allDocStatus: json["allDocStatus"],
isValidSubscription: json["isValidSubscription"], isValidSubscription: json["isValidSubscription"],
userId: json["userID"], 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))), 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 { class OffersModel {
int? id; int? id;
int? requestID; int? requestID;
int? serviceProviderID; int? serviceProviderID;
ServiceProvider? serviceProvider; ServiceProvider? serviceProvider;
int? offerStatus; int? offerStatus;
RequestOfferStatusEnum? requestOfferStatusEnum;
String? offerStatusText; String? offerStatusText;
String? comment; String? comment;
double? price; 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) { OffersModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
requestID = json['requestID']; requestID = json['requestID'];
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
serviceProvider = json['serviceProvider'] != null ? ServiceProvider.fromJson(json['serviceProvider']) : null; serviceProvider = json['serviceProvider'] != null
? ServiceProvider.fromJson(json['serviceProvider'])
: null;
offerStatus = json['offerStatus']; offerStatus = json['offerStatus'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();
offerStatusText = json['offerStatusText']; offerStatusText = json['offerStatusText'];
comment = json['comment']; comment = json['comment'];
price = json['price']; 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 { class ServiceProvider {
@ -58,32 +78,32 @@ class ServiceProvider {
ServiceProvider( ServiceProvider(
{this.providerId, {this.providerId,
this.providerGUID, this.providerGUID,
this.firstName, this.firstName,
this.lastName, this.lastName,
this.name, this.name,
this.gender, this.gender,
this.genderName, this.genderName,
this.mobileNo, this.mobileNo,
this.email, this.email,
this.isEmailVerfied, this.isEmailVerfied,
this.isCompleted, this.isCompleted,
this.city, this.city,
this.cityName, this.cityName,
this.country, this.country,
this.countryName, this.countryName,
this.accountStatus, this.accountStatus,
this.accountStatusText, this.accountStatusText,
this.activityStatus, this.activityStatus,
this.activityStatusText, this.activityStatusText,
this.bankName, this.bankName,
this.iBanNo, this.iBanNo,
this.isActive, this.isActive,
this.subscriptionDate, this.subscriptionDate,
this.companyName, this.companyName,
this.currency, this.currency,
this.branch, this.branch,
this.requestOffer}); this.requestOffer});
ServiceProvider.fromJson(Map<String, dynamic> json) { ServiceProvider.fromJson(Map<String, dynamic> json) {
providerId = json['providerId']; 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 '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/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ProviderOffersModel { class ProviderOffersModel {
int? id; int? id;
@ -34,7 +31,7 @@ class ProviderOffersModel {
this.serviceProviders, this.serviceProviders,
}); });
ProviderOffersModel.fromJson(Map<String, dynamic> json, int? reqId) { ProviderOffersModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
customerID = json['customerID']; customerID = json['customerID'];
requestType = json['requestType']; requestType = json['requestType'];
@ -49,7 +46,7 @@ class ProviderOffersModel {
if (json['serviceProviders'] != null) { if (json['serviceProviders'] != null) {
serviceProviders = <ServiceProvidersOffers>[]; serviceProviders = <ServiceProvidersOffers>[];
json['serviceProviders'].forEach((v) { json['serviceProviders'].forEach((v) {
serviceProviders!.add(ServiceProvidersOffers.fromJson(v, reqId)); serviceProviders!.add(ServiceProvidersOffers.fromJson(v));
}); });
} }
} }
@ -62,51 +59,19 @@ class ServiceProvidersOffers {
String? mobileNo; String? mobileNo;
String? email; String? email;
String? companyName; String? companyName;
String? createdOn;
RequestOfferStatusEnum? requestOfferStatusEnum;
int? offerCount; int? offerCount;
int? requestId;
String? providerAddress;
String? providerLatitude;
String? providerLongitude;
List<ChatMessageModel>? chatMessages; List<ChatMessageModel>? chatMessages;
ServiceProvidersOffers({ ServiceProvidersOffers({this.providerId, this.name, this.mobileNo, this.email, this.companyName, this.offerCount, this.chatMessages, this.providerUserId});
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.fromJson(Map<String, dynamic> json, int? reqId) { ServiceProvidersOffers.fromJson(Map<String, dynamic> json) {
providerId = json['providerID']; 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']; name = json['name'];
mobileNo = json['mobileNo']; mobileNo = json['mobileNo'];
email = json['email']; email = json['email'];
companyName = json['companyName']; companyName = json['companyName'];
offerCount = json['offerCount']; 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 = []; 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,5 +1,4 @@
import 'package:mc_common_app/extensions/string_extensions.dart'; 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/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
@ -7,25 +6,17 @@ class RequestModel {
int requestType; int requestType;
String requestTypeName; String requestTypeName;
String requestStatusName; String requestStatusName;
RequestStatusEnum requestStatus; RequestStatus requestStatus;
int? shippingStatus;
ShippingRequestStatusEnum? shippingStatusEnum;
SelfPickupRequestStatusEnum? selfPickupRequestStatusEnum;
String cityName; String cityName;
String vehicleTypeName; String vehicleTypeName;
String countryName; String countryName;
String customerName; String customerName;
String customerID; String customerID;
String address;
String additionalAddressDetails;
dynamic serviceProviders; dynamic serviceProviders;
int offerCount; int offerCount;
int id; int id;
int customerId; int customerId;
bool isChatted; bool isChatted;
bool isOfferAccepted;
RequestDeliveryOptionEnum offerDeliveryOption;
RequestDeliveryOptionEnum selectedDeliveryOptionByCustomer;
String customerUserID; String customerUserID;
dynamic customer; dynamic customer;
String brand; String brand;
@ -33,7 +24,7 @@ class RequestModel {
int year; int year;
bool isNew; bool isNew;
String description; String description;
List<GenericImageModel>? requestImages; List<dynamic> requestImages;
int cityId; int cityId;
dynamic city; dynamic city;
double price; double price;
@ -43,9 +34,9 @@ class RequestModel {
List<dynamic> requestProviderItem; List<dynamic> requestProviderItem;
bool isActive; bool isActive;
int createdBy; int createdBy;
String? createdOn; DateTime createdOn;
int? modifiedBy; dynamic modifiedBy;
String? modifiedOn; dynamic modifiedOn;
List<ChatMessageModel> chatMessages; List<ChatMessageModel> chatMessages;
RequestModel({ RequestModel({
@ -53,9 +44,6 @@ class RequestModel {
required this.requestTypeName, required this.requestTypeName,
required this.requestStatusName, required this.requestStatusName,
required this.requestStatus, required this.requestStatus,
required this.shippingStatus,
required this.shippingStatusEnum,
required this.selfPickupRequestStatusEnum,
required this.cityName, required this.cityName,
required this.vehicleTypeName, required this.vehicleTypeName,
required this.countryName, required this.countryName,
@ -66,13 +54,8 @@ class RequestModel {
required this.id, required this.id,
required this.customerId, required this.customerId,
required this.isChatted, required this.isChatted,
required this.isOfferAccepted,
required this.offerDeliveryOption,
required this.selectedDeliveryOptionByCustomer,
required this.customerUserID, required this.customerUserID,
required this.customer, required this.customer,
required this.address,
required this.additionalAddressDetails,
required this.brand, required this.brand,
required this.model, required this.model,
required this.year, required this.year,
@ -94,40 +77,22 @@ class RequestModel {
required this.chatMessages, required this.chatMessages,
}); });
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) { factory RequestModel.fromJson(Map<String, dynamic> json) {
return RequestModel( return RequestModel(
requestType: json["requestType"], requestType: json["requestType"],
requestTypeName: json["requestTypeName"], requestTypeName: json["requestTypeName"],
requestStatusName: json["requestStatusName"], requestStatusName: json["requestStatusName"],
requestStatus: (json['requestStatus'] as int).toRequestStatusEnum(), 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"], cityName: json["cityName"],
vehicleTypeName: json["vehicleTypeName"], vehicleTypeName: json["vehicleTypeName"],
countryName: json["countryName"], countryName: json["countryName"],
customerName: json["customerName"] ?? "", customerName: json["customerName"],
address: json["address"] ?? "",
additionalAddressDetails: json['additionalAddress'] ?? "",
customerID: json["customerUserID"], customerID: json["customerUserID"],
serviceProviders: json["serviceProviders"], serviceProviders: json["serviceProviders"],
offerCount: json["offerCount"], offerCount: json["offerCount"],
id: json["id"], id: json["id"],
customerId: json["customerID"], customerId: json["customerID"],
isChatted: json["isChatted"], isChatted: json["isChatted"],
isOfferAccepted: json["isOfferAccepted"],
offerDeliveryOption: ((json["offerDeliveryOption"] ?? 0) as int).toRequestDeliveryOptionEnum(),
selectedDeliveryOptionByCustomer: ((json["deliveryOption"] ?? 0) as int).toRequestDeliveryOptionEnum(),
customerUserID: json["customerUserID"], customerUserID: json["customerUserID"],
customer: json["customer"], customer: json["customer"],
brand: json["brand"], brand: json["brand"],
@ -135,7 +100,7 @@ class RequestModel {
year: json["year"], year: json["year"],
isNew: json["isNew"], isNew: json["isNew"],
description: json["description"], 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"], cityId: json["cityID"],
city: json["city"], city: json["city"],
price: json["price"], price: json["price"],
@ -145,7 +110,7 @@ class RequestModel {
requestProviderItem: List<dynamic>.from(json["requestProviderItem"].map((x) => x)), requestProviderItem: List<dynamic>.from(json["requestProviderItem"].map((x) => x)),
isActive: json["isActive"], isActive: json["isActive"],
createdBy: json["createdBy"], createdBy: json["createdBy"],
createdOn: json["createdOn"], createdOn: DateTime.parse(json["createdOn"]),
modifiedBy: json["modifiedBy"], modifiedBy: json["modifiedBy"],
modifiedOn: json["modifiedOn"], modifiedOn: json["modifiedOn"],
chatMessages: [], chatMessages: [],

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

@ -1,6 +1,4 @@
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/models/services_models/item_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ServiceModel { class ServiceModel {
final int? serviceProviderServiceId; final int? serviceProviderServiceId;
@ -11,21 +9,19 @@ class ServiceModel {
final String? serviceDescription; final String? serviceDescription;
final String? serviceDescriptionN; final String? serviceDescriptionN;
final int? serviceStatus; final int? serviceStatus;
final ServiceStatusEnum? serviceStatusEnum;
final dynamic statusText; final dynamic statusText;
final bool? isAllowAppointment; final bool? isAllowAppointment;
final bool? isAllowAppointmentHome; final bool? isAllowAppointmentHome;
final int? customerLocationRange; final int? customerLocationRange;
String? rangePricePerKm; final String? rangePricePerKm;
final int? itemsCount; final int? itemsCount;
List<ItemData>? serviceItems; List<ItemData>? serviceItems;
bool isExpandedOrSelected; bool isExpandedOrSelected;
int providerServiceId; int providerServiceId;
String providerServiceName; String providerServiceName;
bool isHomeSelected; bool isHomeSelected;
String homeLocation;
double currentTotalServicePrice; double currentTotalServicePrice;
CurrentLocationInfoModel servicelocationInfo;
bool isActive;
ServiceModel({ ServiceModel({
this.serviceProviderServiceId, this.serviceProviderServiceId,
@ -36,7 +32,6 @@ class ServiceModel {
this.serviceDescription, this.serviceDescription,
this.serviceDescriptionN, this.serviceDescriptionN,
this.serviceStatus, this.serviceStatus,
this.serviceStatusEnum,
this.statusText, this.statusText,
this.isAllowAppointment, this.isAllowAppointment,
this.isAllowAppointmentHome, this.isAllowAppointmentHome,
@ -45,12 +40,11 @@ class ServiceModel {
this.itemsCount, this.itemsCount,
this.serviceItems, this.serviceItems,
this.isHomeSelected = false, this.isHomeSelected = false,
this.homeLocation = "",
this.currentTotalServicePrice = 0.0, this.currentTotalServicePrice = 0.0,
this.isActive = true,
required this.isExpandedOrSelected, required this.isExpandedOrSelected,
required this.providerServiceId, required this.providerServiceId,
required this.providerServiceName, required this.providerServiceName,
required this.servicelocationInfo,
}); });
factory ServiceModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) => ServiceModel( factory ServiceModel.fromJson(Map<String, dynamic> json, {bool isForAppointment = false}) => ServiceModel(
@ -62,12 +56,11 @@ class ServiceModel {
serviceDescription: json["serviceDescription"] ?? json["serviceName"], serviceDescription: json["serviceDescription"] ?? json["serviceName"],
serviceDescriptionN: json["serviceDescriptionN"] ?? json["serviceNameN"], serviceDescriptionN: json["serviceDescriptionN"] ?? json["serviceNameN"],
serviceStatus: json["serviceStatus"], serviceStatus: json["serviceStatus"],
serviceStatusEnum: ((json["serviceStatus"] ?? 0) as int).toServiceStatusEnum(),
statusText: json["statusText"], statusText: json["statusText"],
isAllowAppointment: json["isAllowAppointment"], isAllowAppointment: json["isAllowAppointment"],
isAllowAppointmentHome: json["isAllowAppointmentHome"], isAllowAppointmentHome: json["isAllowAppointmentHome"],
customerLocationRange: json["customerLocationRange"], customerLocationRange: json["customerLocationRange"],
rangePricePerKm: json["rangePricePerKm"]?.toString(), rangePricePerKm: json["rangePricePerKm"].toString(),
itemsCount: json["itemsCount"], itemsCount: json["itemsCount"],
serviceItems: isForAppointment serviceItems: isForAppointment
? json["serviceItemList"] == null ? json["serviceItemList"] == null
@ -78,10 +71,9 @@ class ServiceModel {
: List<ItemData>.from(json["branchServiceItems"]!.map((x) => ItemData.fromJson(x))), : List<ItemData>.from(json["branchServiceItems"]!.map((x) => ItemData.fromJson(x))),
isExpandedOrSelected: false, isExpandedOrSelected: false,
providerServiceId: 0, providerServiceId: 0,
providerServiceName: json['serviceName'] ?? "", providerServiceName: "",
isHomeSelected: false, isHomeSelected: false,
isActive: json["isActive"] ?? true, homeLocation: "",
servicelocationInfo: CurrentLocationInfoModel(address: '', distanceToBranch: 0.0, homeChargesInCurrentService: 0.0, latitude: 0.0, longitude: 0.0),
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
@ -107,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}'; 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,32 +0,0 @@
class FAQsModel {
int? id;
String? question;
String? answer;
int? sequenceNo;
bool? isActive;
int? channel;
bool? isCollapsed;
FAQsModel({this.id, this.question, this.answer, this.sequenceNo, this.isActive, this.channel, this.isCollapsed});
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;
}
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;
return data;
}
}

@ -1,83 +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;
ShippingRequestModel({
this.id,
this.requestID,
this.request,
this.pickupOrshippingStatus,
this.deliveredorCollectedOn,
this.comment,
this.createdOn,
this.customerID,
this.customerName,
this.vehicleTypeID,
this.vehicleType,
});
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'];
}
}
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? isUpgradeLater;
bool? isTrialSubscription; bool? isTrialSubscription;
dynamic currentSubscription; dynamic currentSubscription;
int? totalBranches;
int? totalSubUsers;
int? totalAds;
ProviderSubscriptionModel({ ProviderSubscriptionModel({
this.id, this.id,
@ -40,10 +36,7 @@ class ProviderSubscriptionModel {
this.isUpgradeLater, this.isUpgradeLater,
this.isTrialSubscription, this.isTrialSubscription,
this.currentSubscription, this.currentSubscription,
this.subscriptionID, this.subscriptionID
this.totalAds,
this.totalBranches,
this.totalSubUsers,
}); });
factory ProviderSubscriptionModel.fromRawJson(String str) => ProviderSubscriptionModel.fromJson(json.decode(str)); factory ProviderSubscriptionModel.fromRawJson(String str) => ProviderSubscriptionModel.fromJson(json.decode(str));
@ -51,48 +44,42 @@ class ProviderSubscriptionModel {
String toRawJson() => json.encode(toJson()); String toRawJson() => json.encode(toJson());
factory ProviderSubscriptionModel.fromJson(Map<String, dynamic> json) => ProviderSubscriptionModel( factory ProviderSubscriptionModel.fromJson(Map<String, dynamic> json) => ProviderSubscriptionModel(
id: json["id"], id: json["id"],
subscriptionAppliedId: json["subscriptionAppliedID"], subscriptionAppliedId: json["subscriptionAppliedID"],
serviceProviderId: json["serviceProviderID"], serviceProviderId: json["serviceProviderID"],
subscriptionID: json["subscriptionID"], subscriptionID: json["subscriptionID"],
subscriptionName: json["subscriptionName"], subscriptionName: json["subscriptionName"],
subscriptionDescription: json["subscriptionDescription"], subscriptionDescription: json["subscriptionDescription"],
dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]), dateStart: json["dateStart"] == null ? null : DateTime.parse(json["dateStart"]),
dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]), dateEnd: json["dateEnd"] == null ? null : DateTime.parse(json["dateEnd"]),
branchesRemaining: json["branchesRemaining"], branchesRemaining: json["branchesRemaining"],
subUsersRemaining: json["subUsersRemaining"], subUsersRemaining: json["subUsersRemaining"],
adsRemaining: json["adsRemaining"], adsRemaining: json["adsRemaining"],
isExpired: json["isExpired"], isExpired: json["isExpired"],
isActive: json["isActive"], isActive: json["isActive"],
isUpgradeNow: json["isUpgradeNow"], isUpgradeNow: json["isUpgradeNow"],
isUpgradeLater: json["isUpgradeLater"], isUpgradeLater: json["isUpgradeLater"],
isTrialSubscription: json["isTrialSubscription"], isTrialSubscription: json["isTrialSubscription"],
currentSubscription: json["currentSubscription"], currentSubscription: json["currentSubscription"],
totalBranches: json["totalBranches"], );
totalAds: json["totalAds"],
totalSubUsers: json["totalSubUsers"],
);
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"id": id, "id": id,
"subscriptionAppliedID": subscriptionAppliedId, "subscriptionAppliedID": subscriptionAppliedId,
"serviceProviderID": serviceProviderId, "serviceProviderID": serviceProviderId,
"subscriptionID": subscriptionID, "subscriptionID": subscriptionID,
"subscriptionName": subscriptionName, "subscriptionName": subscriptionName,
"subscriptionDescription": subscriptionDescription, "subscriptionDescription": subscriptionDescription,
"dateStart": dateStart?.toIso8601String(), "dateStart": dateStart?.toIso8601String(),
"dateEnd": dateEnd?.toIso8601String(), "dateEnd": dateEnd?.toIso8601String(),
"branchesRemaining": branchesRemaining, "branchesRemaining": branchesRemaining,
"subUsersRemaining": subUsersRemaining, "subUsersRemaining": subUsersRemaining,
"adsRemaining": adsRemaining, "adsRemaining": adsRemaining,
"isExpired": isExpired, "isExpired": isExpired,
"isActive": isActive, "isActive": isActive,
"isUpgradeNow": isUpgradeNow, "isUpgradeNow": isUpgradeNow,
"isUpgradeLater": isUpgradeLater, "isUpgradeLater": isUpgradeLater,
"isTrialSubscription": isTrialSubscription, "isTrialSubscription":isTrialSubscription,
"currentSubscription": currentSubscription, "currentSubscription": currentSubscription,
"totalAds": totalAds, };
"totalSubUsers": totalSubUsers,
"totalBranches": totalBranches,
};
} }

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

@ -25,18 +25,16 @@ class User {
int? messageStatus; int? messageStatus;
String? message; String? message;
factory User.fromJson(Map<String, dynamic> json) => factory User.fromJson(Map<String, dynamic> json) => User(
User(
totalItemsCount: json["totalItemsCount"], totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : UserData.fromJson(json["data"]), data: json["data"] == null ? null : UserData.fromJson(json["data"]),
messageStatus: json["messageStatus"], messageStatus: json["messageStatus"],
message: json["message"], message: json["message"],
); );
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() => {
{
"totalItemsCount": totalItemsCount, "totalItemsCount": totalItemsCount,
"data": data?.toJson(), "data": data == null ? null : data!.toJson(),
"messageStatus": messageStatus, "messageStatus": messageStatus,
"message": message, "message": message,
}; };
@ -55,61 +53,48 @@ class UserData {
DateTime? expiryDate; DateTime? expiryDate;
UserInfo? userInfo; UserInfo? userInfo;
factory UserData.fromJson(Map<String, dynamic> json) => factory UserData.fromJson(Map<String, dynamic> json) => UserData(
UserData(
accessToken: json["accessToken"], accessToken: json["accessToken"],
refreshToken: json["refreshToken"], refreshToken: json["refreshToken"],
expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]), expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]),
userInfo: json["userInfo"] == null ? null : UserInfo.fromJson(json["userInfo"]), userInfo: json["userInfo"] == null ? null : UserInfo.fromJson(json["userInfo"]),
); );
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() => {
{
"accessToken": accessToken, "accessToken": accessToken,
"refreshToken": refreshToken, "refreshToken": refreshToken,
"expiryDate": expiryDate?.toIso8601String(), "expiryDate": expiryDate == null ? null : expiryDate!.toIso8601String(),
"userInfo": userInfo?.toJson(), "userInfo": userInfo == null ? null : userInfo!.toJson(),
}; };
} }
class UserInfo { class UserInfo {
UserInfo({this.id, UserInfo(
this.userId, {this.id,
this.firstName, this.userId,
this.lastName, this.firstName,
this.mobileNo, this.lastName,
this.email, this.mobileNo,
this.userImageUrl, this.email,
this.roleId, this.userImageUrl,
this.roleName, this.roleId,
this.genderID, this.roleName,
this.genderName, this.isEmailVerified,
this.isEmailVerified, this.serviceProviderBranch,
this.serviceProviderBranch, this.isVerified,
this.isVerified, this.userRoles,
this.userRoles, this.isCustomer,
this.isCustomer, this.isProviderDealership,
this.isProviderDealership, this.isDealershipUser,
this.isDealershipUser, this.providerId,
this.providerId, this.customerId,
this.customerId, this.dealershipId,
this.countryId, this.userLocalImage});
this.cityId,
this.dealershipId,
this.userLocalImage,
this.cityName,
this.countryName,
});
int? id; int? id;
String? userId; String? userId;
String? firstName; String? firstName;
String? lastName; String? lastName;
String? countryName;
String? cityName;
int? genderID;
String? genderName;
String? mobileNo; String? mobileNo;
String? email; String? email;
dynamic userImageUrl; dynamic userImageUrl;
@ -124,8 +109,6 @@ class UserInfo {
bool? isDealershipUser; bool? isDealershipUser;
dynamic providerId; dynamic providerId;
int? customerId; int? customerId;
int? cityId;
int? countryId;
dynamic dealershipId; dynamic dealershipId;
File? userLocalImage; File? userLocalImage;
@ -134,8 +117,6 @@ class UserInfo {
AppState().userType = UserType.providerDealer; AppState().userType = UserType.providerDealer;
} else if (json["roleID"] == 6) { } else if (json["roleID"] == 6) {
AppState().userType = UserType.providerIndividual; AppState().userType = UserType.providerIndividual;
} else if (json["roleID"] == 7) {
AppState().userType = UserType.providerIndividual;
} else { } else {
AppState().userType = UserType.customer; AppState().userType = UserType.customer;
} }
@ -143,10 +124,6 @@ class UserInfo {
userId = json["userID"]; userId = json["userID"];
firstName = json["firstName"]; firstName = json["firstName"];
lastName = json["lastName"]; lastName = json["lastName"];
cityName = json["cityName"];
genderID = json["genderID"];
genderName = json["genderName"];
countryName = json["countryName"];
mobileNo = json["mobileNo"]; mobileNo = json["mobileNo"];
email = json["email"]; email = json["email"];
userImageUrl = json["userImageUrl"]; userImageUrl = json["userImageUrl"];
@ -161,8 +138,6 @@ class UserInfo {
isDealershipUser = json["isDealershipUser"]; isDealershipUser = json["isDealershipUser"];
providerId = json["providerID"]; providerId = json["providerID"];
customerId = json["customerID"]; customerId = json["customerID"];
countryId = json["countryId"] ?? 1;
cityId = json["cityId"] ?? 1;
dealershipId = json["dealershipID"]; dealershipId = json["dealershipID"];
userLocalImage = null; userLocalImage = null;
} }
@ -189,14 +164,11 @@ class UserInfo {
// dealershipId: json["dealershipID"], // dealershipId: json["dealershipID"],
// ); // );
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() => {
{
"id": id, "id": id,
"userID": userId, "userID": userId,
"firstName": firstName, "firstName": firstName,
"lastName": lastName, "lastName": lastName,
"countryName": countryName,
"cityName": cityName,
"mobileNo": mobileNo, "mobileNo": mobileNo,
"email": email, "email": email,
"userImageUrl": userImageUrl, "userImageUrl": userImageUrl,
@ -212,12 +184,5 @@ class UserInfo {
"providerID": providerId, "providerID": providerId,
"customerID": customerId, "customerID": customerId,
"dealershipID": dealershipId, "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,57 +1,30 @@
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/api/api_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/app_state.dart';
import 'package:mc_common_app/classes/consts.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/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/ad_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart'; 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/pdf_receipt_model.dart';
import 'package:mc_common_app/models/advertisment_models/reserved_ads_models.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/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/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class AdsRepo { abstract class AdsRepo {
Future<List<AdsDurationModel>> getAdsDuration({required int? countryId}); Future<List<AdsDurationModel>> getAdsDuration();
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceType, required int cityId, required int countryId}); Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceId});
Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required bool isExtendAdEditEnabled}); Future<GenericRespModel> createOrUpdateAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew});
Future<GenericRespModel> createOrUpdateDraftAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required AdCreationStepsEnum stepNo}); Future<List<AdDetailsModel>> getAllAds({required bool isMyAds});
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>? createdByRolesIdsList,
List<String>? vehicleAdConditionIdsList,
List<String>? vehicleAdCreatedDateList,
List<String>? mobileNumbersList,
int? startPriceDemand,
int? endPriceDemand,
int page,
bool isMyAds = false,
});
Future<List<AdDetailsModel>> getMyReservedAds(); Future<List<AdDetailsModel>> getMyReservedAds();
@ -59,7 +32,7 @@ abstract class AdsRepo {
Future<AdsBankDetailsModel?> getAdBankingAccountInfo({required int adId}); 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> createAppointmentForAdSpecialService({required int adId, required int photoOfficeID, required int photoOfficeSlotID, required int adsSpecialServiceID});
@ -70,10 +43,6 @@ abstract class AdsRepo {
Future<GenericRespModel> createReserveAd({required int adId}); Future<GenericRespModel> createReserveAd({required int adId});
Future<GenericRespModel> uploadBankReceiptsOnReserveDealDone({required int adId, required String detailNote, required List<PdfReceiptModel> pdfReceiptsList}); 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 { class AdsRepoImp implements AdsRepo {
@ -81,16 +50,10 @@ class AdsRepoImp implements AdsRepo {
AppState appState = injector.get<AppState>(); AppState appState = injector.get<AppState>();
@override @override
Future<List<AdsDurationModel>> getAdsDuration({required int? countryId}) async { Future<List<AdsDurationModel>> getAdsDuration() async {
int roleID = appState.getUser.data!.userInfo!.roleId ?? 0;
var param = {
"CountryID": countryId.toString(),
"roleID": roleID.toString(),
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
queryParameters: param,
ApiConsts.vehicleAdsDurationGet, ApiConsts.vehicleAdsDurationGet,
); );
List<AdsDurationModel> vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => AdsDurationModel.fromJson(adsGenericModel.data[index])); List<AdsDurationModel> vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => AdsDurationModel.fromJson(adsGenericModel.data[index]));
@ -98,83 +61,54 @@ class AdsRepoImp implements AdsRepo {
} }
@override @override
Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceType, required int cityId, required int countryId}) async { Future<List<SpecialServiceModel>> getSpecialServices({required int specialServiceId}) async {
log("getSpecialServices cityId: $cityId");
var params = { var params = {
"SpecialServiceType": specialServiceType.toString(), "SpecialServiceType": specialServiceId.toString(),
"CountryID": countryId.toString(),
}; };
GenericRespModel adsGenericModel = GenericRespModel adsGenericModel =
await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.vehicleAdsSpecialServicesGet, queryParameters: params); 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> vehicleAdsDuration = List.generate(adsGenericModel.data.length, (index) => SpecialServiceModel.fromJson(adsGenericModel.data[index]));
return vehicleAdsDuration;
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;
} }
@override @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 = []; List vehiclePostingImages = [];
log("isExtendAdEditEnabled: $isExtendAdEditEnabled");
log("adsCreationPayloadModel.ads!.adsDurationID,: ${adsCreationPayloadModel.ads!.adsDurationID}");
adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages?.forEach((element) { adsCreationPayloadModel.vehiclePosting!.vehiclePostingImages?.forEach((element) {
var imageMap = { var imageMap = {
"id": element.id ?? 0, "id": element.id ?? 0,
"imageName": element.imageName, "imageName": element.imageName,
"imageUrl": element.imageUrl, "imageUrl": element.imageUrl,
"imageStr": element.imageStr, "imageStr": element.imageStr,
"vehiclePostingID": isCreateNew ? 0 : element.vehiclePostingID ?? 0, "vehiclePostingID": element.vehiclePostingID ?? 0,
"vehiclePosting": null, "vehiclePosting": null,
}; };
vehiclePostingImages.add(imageMap); vehiclePostingImages.add(imageMap);
}); });
List vehiclePostingDamageParts = []; List vehiclePostingDamageParts = [];
int sellerTypeID = AppState().getUser.data!.userInfo!.roleId ?? 0;
adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts?.forEach((element) { adsCreationPayloadModel.vehiclePosting!.vehiclePostingDamageParts?.forEach((element) {
log("comment: ${element.comment}");
var imageMap = { var imageMap = {
"id": element.id ?? 0, "id": element.id ?? 0,
"comment": element.comment, "comment": element.comment,
"vehicleImageBase64": element.vehicleImageBase64, "vehicleImageBase64": element.vehicleImageBase64,
"vehicleDamagePartID": element.vehicleDamagePartID, "vehicleDamagePartID": element.vehicleDamagePartID,
"vehiclePostingID": isCreateNew ? 0 : element.vehiclePostingID ?? 0, "vehiclePostingID": element.vehiclePostingID ?? 0,
"isActive": true "isActive": true
}; };
vehiclePostingDamageParts.add(imageMap); vehiclePostingDamageParts.add(imageMap);
}); });
var postParams = { var postParams = {
"ads": { "ads": {
"id": isCreateNew ? 0 : adsCreationPayloadModel.ads!.id ?? 0, "id": adsCreationPayloadModel.ads!.id ?? 0,
"adsDurationID": adsCreationPayloadModel.ads!.adsDurationID, "adsDurationID": adsCreationPayloadModel.ads!.adsDurationID,
"startDate": adsCreationPayloadModel.ads!.startDate, "startDate": adsCreationPayloadModel.ads!.startDate,
"countryId": adsCreationPayloadModel.ads!.countryId, "countryId": adsCreationPayloadModel.ads!.countryId,
"specialServiceIDs": adsCreationPayloadModel.ads!.specialServiceIDs, "specialServiceIDs": adsCreationPayloadModel.ads!.specialServiceIDs,
"isMCHandled": false, "isMCHandled": false
"showContactDetail": adsCreationPayloadModel.ads!.showContactDetail ?? false,
"isOnWhatsApp": adsCreationPayloadModel.ads!.isOnWhatsApp ?? false,
}, },
"vehiclePosting": { "vehiclePosting": {
"id": isCreateNew ? 0 : adsCreationPayloadModel.vehiclePosting!.id ?? 0, "id": adsCreationPayloadModel.vehiclePosting!.id ?? 0,
"userID": adsCreationPayloadModel.vehiclePosting!.userID, "userID": adsCreationPayloadModel.vehiclePosting!.userID,
"vehicleType": adsCreationPayloadModel.vehiclePosting!.vehicleType, "vehicleType": adsCreationPayloadModel.vehiclePosting!.vehicleType,
"vehicleModelID": adsCreationPayloadModel.vehiclePosting!.vehicleModelID, "vehicleModelID": adsCreationPayloadModel.vehiclePosting!.vehicleModelID,
@ -184,7 +118,7 @@ class AdsRepoImp implements AdsRepo {
"vehicleConditionID": adsCreationPayloadModel.vehiclePosting!.vehicleConditionID, "vehicleConditionID": adsCreationPayloadModel.vehiclePosting!.vehicleConditionID,
"vehicleMileageID": adsCreationPayloadModel.vehiclePosting!.vehicleMileageID, "vehicleMileageID": adsCreationPayloadModel.vehiclePosting!.vehicleMileageID,
"vehicleTransmissionID": adsCreationPayloadModel.vehiclePosting!.vehicleTransmissionID, "vehicleTransmissionID": adsCreationPayloadModel.vehiclePosting!.vehicleTransmissionID,
"vehicleSellerTypeID": sellerTypeID, "vehicleSellerTypeID": adsCreationPayloadModel.vehiclePosting!.vehicleSellerTypeID,
"cityID": adsCreationPayloadModel.vehiclePosting!.cityID, "cityID": adsCreationPayloadModel.vehiclePosting!.cityID,
"price": adsCreationPayloadModel.vehiclePosting!.price, "price": adsCreationPayloadModel.vehiclePosting!.price,
"vehicleVIN": adsCreationPayloadModel.vehiclePosting!.vehicleVIN, "vehicleVIN": adsCreationPayloadModel.vehiclePosting!.vehicleVIN,
@ -196,109 +130,14 @@ class AdsRepoImp implements AdsRepo {
"demandAmount": adsCreationPayloadModel.vehiclePosting!.demandAmount, "demandAmount": adsCreationPayloadModel.vehiclePosting!.demandAmount,
// "adStatus": 1, // "adStatus": 1,
"vehiclePostingImages": vehiclePostingImages, "vehiclePostingImages": vehiclePostingImages,
"vehiclePostingDamageParts": vehiclePostingDamageParts, "vehiclePostingDamageParts": vehiclePostingDamageParts
"mobileNo": adsCreationPayloadModel.vehiclePosting!.phoneNo,
"whatsAppNo": adsCreationPayloadModel.vehiclePosting!.whatsAppNo,
} }
}; };
String token = appState.getUser.data!.accessToken ?? ""; String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
isExtendAdEditEnabled isCreateNew ? ApiConsts.vehicleAdsSingleStepCreate : ApiConsts.vehicleAdsSingleStepUpdate,
? ApiConsts.vehicleAdsSingleStepUpdateExtend
: isCreateNew
? ApiConsts.vehicleAdsSingleStepCreate
: ApiConsts.vehicleAdsSingleStepUpdate,
postParams,
token: token,
);
return Future.value(adsGenericModel);
}
@override
Future<GenericRespModel> createOrUpdateDraftAd({required AdsCreationPayloadModel adsCreationPayloadModel, required bool isCreateNew, required AdCreationStepsEnum stepNo}) async {
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,
// "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, postParams,
token: token, token: token,
); );
@ -307,127 +146,22 @@ class AdsRepoImp implements AdsRepo {
} }
@override @override
Future<List<AdDetailsModel>> getMyDraftAds({int? page}) async { Future<List<AdDetailsModel>> getAllAds({required isMyAds}) async {
var draftAdsParams = { var onlyMyAdsParams = {
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "0",
"userID": appState.getUser.data!.userInfo!.userId ?? "", "userID": appState.getUser.data!.userInfo!.userId ?? "",
}; };
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json),
ApiConsts.getMyDraftAds,
queryParameters: draftAdsParams,
);
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 = {
"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 = { var allAdsParams = {
"AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS "AdsStatuses": ["${AdPostStatus.active.getIdFromAdPostStatusEnum()}"], //only Active ADS
"isActive": "true", //only Active ADS "IsPaid": "true", //only Active ADS
"isExplore": "true",
"PageSize": "30",
"PageIndex": page != null ? page.toString() : "0",
}; };
if (!isMyAds && createdByRoleEnum != null) {
allAdsParams.addAll({
"CreatedByRoles": ["${createdByRoleEnum.getIdFromCreatedByRoleEnum()}"],
});
}
if (!isMyAds && vehicleBrandId != null && vehicleBrandId != 0) {
allAdsParams.addAll({
"VehicleBrandIDs": ["$vehicleBrandId"],
});
}
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.vehicleAdsGet, ApiConsts.vehicleAdsGet,
queryParameters: isMyAds ? onlyMyAdsParams : allAdsParams, queryParameters: isMyAds ? onlyMyAdsParams : allAdsParams,
); );
List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], isMyAds, adsGenericModel.totalItemsCount ?? 1)); List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], isMyAds));
return vehicleAdsDetails;
}
@override
Future<List<AdDetailsModel>> getExploreAdsBasedOnFilters({
List<String>? adIdsList,
List<String>? cityIdsList,
List<String>? vehicleModelYearIdsList,
List<String>? vehicleTypeIdsList,
List<String>? vehicleBrandIdsList,
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 ?? [],
"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));
return vehicleAdsDetails; return vehicleAdsDetails;
} }
@ -443,11 +177,6 @@ class AdsRepoImp implements AdsRepo {
ApiConsts.myAdsReserveGet, ApiConsts.myAdsReserveGet,
queryParameters: params, queryParameters: params,
); );
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) {
Utils.showToast(adsGenericModel.message ?? LocaleKeys.somethingWrong.tr());
return [];
}
List<MyReservedAdsRespModel> reservedAds = List.generate(adsGenericModel.data.length, (index) => MyReservedAdsRespModel.fromJson(adsGenericModel.data[index])); List<MyReservedAdsRespModel> reservedAds = List.generate(adsGenericModel.data.length, (index) => MyReservedAdsRespModel.fromJson(adsGenericModel.data[index]));
List<String> selectedIdsString = reservedAds.map((component) => component.adsID.toString()).toList(); List<String> selectedIdsString = reservedAds.map((component) => component.adsID.toString()).toList();
@ -461,8 +190,6 @@ class AdsRepoImp implements AdsRepo {
Future<List<AdDetailsModel>> getAdsPerSpecificIds({required List<String> ids, required List<MyReservedAdsRespModel> reservedAds}) async { Future<List<AdDetailsModel>> getAdsPerSpecificIds({required List<String> ids, required List<MyReservedAdsRespModel> reservedAds}) async {
var params = { var params = {
"AdsIDs": ids, "AdsIDs": ids,
"isActive": "true",
"PageSize": "30",
}; };
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
@ -470,11 +197,7 @@ class AdsRepoImp implements AdsRepo {
queryParameters: params, queryParameters: params,
ApiConsts.vehicleAdsGet, ApiConsts.vehicleAdsGet,
); );
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true));
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));
for (int i = 0; i < vehicleAdsDetails.length; i++) { for (int i = 0; i < vehicleAdsDetails.length; i++) {
vehicleAdsDetails[i].adReserveStatus = (reservedAds[i].adsReserveStatus ?? 0).toAdRserveStatusEnum(); vehicleAdsDetails[i].adReserveStatus = (reservedAds[i].adsReserveStatus ?? 0).toAdRserveStatusEnum();
@ -488,7 +211,6 @@ class AdsRepoImp implements AdsRepo {
Future<List<AdDetailsModel>> getMyAds() async { Future<List<AdDetailsModel>> getMyAds() async {
var params = { var params = {
"userID": appState.getUser.data!.userInfo!.userId ?? "", "userID": appState.getUser.data!.userInfo!.userId ?? "",
"PageSize": "30",
}; };
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
@ -496,11 +218,7 @@ class AdsRepoImp implements AdsRepo {
queryParameters: params, queryParameters: params,
ApiConsts.vehicleAdsGet, ApiConsts.vehicleAdsGet,
); );
if (adsGenericModel.messageStatus != 1 || adsGenericModel.data == null) { List<AdDetailsModel> vehicleAdsDetails = List.generate(adsGenericModel.data.length, (index) => AdDetailsModel.fromJson(adsGenericModel.data[index], true));
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));
return vehicleAdsDetails; return vehicleAdsDetails;
} }
@ -525,11 +243,11 @@ class AdsRepoImp implements AdsRepo {
} }
@override @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 = { var postParams = {
"id": adId, "id": adId,
"status": adStatusToUpdate.getIdFromAdPostStatusEnum().toString(), "status": adStatusToUpdate.getIdFromAdPostStatusEnum().toString(),
"comment": comment ?? "", "comment": "",
}; };
String token = appState.getUser.data!.accessToken ?? ""; String token = appState.getUser.data!.accessToken ?? "";
@ -543,25 +261,6 @@ class AdsRepoImp implements AdsRepo {
return Future.value(adsGenericModel); 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 @override
Future<GenericRespModel> deleteAd({required int adId}) async { Future<GenericRespModel> deleteAd({required int adId}) async {
var postParams = { var postParams = {
@ -629,14 +328,14 @@ class AdsRepoImp implements AdsRepo {
required int photoOfficeSlotID, required int photoOfficeSlotID,
required int adsSpecialServiceID, required int adsSpecialServiceID,
}) async { }) async {
String? userId = AppState().getUser.data!.userInfo!.userId ?? ""; int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0;
var postParams = { var postParams = {
"adsID": adId, "adsID": adId,
"photoOfficeID": photoOfficeID, "photoOfficeID": photoOfficeID,
"photoOfficeSlotID": photoOfficeSlotID, "photoOfficeSlotID": photoOfficeSlotID,
"adsSpecialServiceID": adsSpecialServiceID, "adsSpecialServiceID": adsSpecialServiceID,
"UserID": userId, "customerID": customerId,
}; };
String token = appState.getUser.data!.accessToken ?? ""; String token = appState.getUser.data!.accessToken ?? "";
@ -675,27 +374,11 @@ class AdsRepoImp implements AdsRepo {
String token = appState.getUser.data!.accessToken ?? ""; String token = appState.getUser.data!.accessToken ?? "";
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
"", ApiConsts.adsPhotoOfficeAppointmentCreate,
postParams, postParams,
token: token, token: token,
); );
return Future.value(adsGenericModel); 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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/appointments_models/appointment_list_model.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/schedule_model.dart';
import 'package:mc_common_app/models/appointments_models/service_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/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/models/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class AppointmentRepo { abstract class AppointmentRepo {
Future<List<AppointmentListModel>> getMyAppointmentsForProvider(Map<String, dynamic> map); 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({ Future<List<AppointmentListModel>> getMyAppointmentsForCustomersByFilters({
List<String>? providerIdsList, List<int>? providerIdsList,
List<String>? categoryIdsList, List<int>? categoryIdsList,
List<String>? serviceIdsList, List<int>? serviceIdsList,
List<String>? itemIdsList, List<int>? branchIdsList,
List<String>? branchIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
}); });
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<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<List<ScheduleData>> getSchedules(String branchId);
Future<GenericRespModel> updateServicesInSchedule(Map map); Future<MResponse> updateServicesInSchedule(Map map);
Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({ Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
required List<String> serviceItemIdsForHome, required List<String> serviceItemIdsForHome,
@ -77,15 +63,15 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<GenericRespModel> createSchedule(Map map) async { Future<MResponse> createSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> addServicesInSchedule(Map map) async { Future<MResponse> addServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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 @override
@ -104,41 +90,35 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<GenericRespModel> updateSchedule(Map map) async { Future<MResponse> updateSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> updateServicesInSchedule(Map map) async { Future<MResponse> updateServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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({ Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
required List<String> serviceItemIdsForHome, required List<String> serviceItemIdsForHome,
required List<String> serviceItemIdsForWorkshop, required List<String> serviceItemIdsForWorkshop,
}) async { }) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
var queryParameters = []; var queryParameters = [
// {
if (serviceItemIdsForWorkshop.isNotEmpty) { // "appointmentType": 2,
queryParameters.add({ // "ServiceItemIDs": serviceItemIdsForHome,
// },
{
"appointmentType": 1, "appointmentType": 1,
"ServiceItemIDs": serviceItemIdsForWorkshop, "ServiceItemIDs": serviceItemIdsForWorkshop,
}); }
} ];
if (serviceItemIdsForHome.isNotEmpty) {
queryParameters.add({
"appointmentType": 2,
"ServiceItemIDs": serviceItemIdsForHome,
});
}
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceItemAppointmentScheduleSlots, ApiConsts.GetServiceItemAppointmentScheduleSlots,
queryParameters, queryParameters,
token: t, token: t,
); );
@ -150,46 +130,30 @@ class AppointmentRepoImp implements AppointmentRepo {
return serviceAppointmentScheduleModel; return serviceAppointmentScheduleModel;
} }
@override
Future<GenericRespModel> createServiceAppointment({required List<ServiceAppointmentScheduleModel> schedules, required int serviceProviderID}) async { Future<GenericRespModel> createServiceAppointment({required List<ServiceAppointmentScheduleModel> schedules, required int serviceProviderID}) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
int customerId = appState.getUser.data!.userInfo!.customerId ?? 0; int customerId = appState.getUser.data!.userInfo!.customerId ?? 0;
List<Map<String, dynamic>> mapList = []; List<Map<String, dynamic>> mapList = [];
for (var schedule in schedules) { schedules.forEach((schedule) {
List<int> serviceItemIds = []; List<int> serviceItemIds = [];
for (var service in schedule.servicesListInAppointment!) { schedule.servicesListInAppointment!.forEach((service) {
for (var item in service.serviceItems!) { service.serviceItems!.forEach((item) {
serviceItemIds.add(item.id!); 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;
mapList.add({ mapList.add({
"serviceSlotID": slotId, "serviceSlotID": schedule.selectedCustomTimeDateSlotModel!.date!.slotId,
"serviceProviderID": serviceProviderID, "serviceProviderID": serviceProviderID,
"customerID": customerId, "customerID": customerId,
"serviceItemID": serviceItemIds, "serviceItemID": serviceItemIds,
"amountCustomerLocation": schedule.totalLocationCharges.toString(),
"customerLocLat": (schedule.locationInfoModel!.latitude).toString(),
"customerLocLong": (schedule.locationInfoModel!.longitude).toString(),
"customerLocAddress": (schedule.locationInfoModel!.address).toString(),
}); });
} });
log("maplist: ${mapList.toString()}"); log("maplist: ${mapList.toString()}");
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProvidersAppointmentCreate, ApiConsts.ServiceProvidersAppointmentCreate,
mapList, mapList,
token: t, token: t,
); );
@ -209,7 +173,7 @@ class AppointmentRepoImp implements AppointmentRepo {
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( GenericRespModel adsGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProviderAppointmentRescheduleCancelAppointment, ApiConsts.ServiceProviderAppointmentRescheduleCancelAppointment,
payload, payload,
token: t, token: t,
); );
@ -227,69 +191,49 @@ class AppointmentRepoImp implements AppointmentRepo {
queryParameters: map, queryParameters: map,
ApiConsts.serviceProvidersAppointmentGet, 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; return appointmentList;
} }
@override @override
Future<List<AppointmentListModel>> getMyAppointmentsForProvidersByFilters({ Future<List<AppointmentListModel>> getMyAppointmentsForCustomersByFilters({
required int branchID, List<int>? providerIdsList,
List<String>? serviceProviderServiceIdsList, List<int>? categoryIdsList,
List<String>? customerNamesList, List<int>? serviceIdsList,
List<String>? customerPhonesList, List<int>? branchIdsList,
List<String>? deliveryTypeIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
String? fromDate,
String? toDate,
}) async { }) async {
String t = appState.getUser.data!.accessToken ?? ""; List<String> providerIds = [];
String providerId = appState.getUser.data!.userInfo!.providerId.toString(); if (providerIdsList != null) {
var params = { for (var element in providerIdsList) {
"ServiceProviderID": providerId.toString(), providerIds.add(element.toString());
"ProviderBranchID": branchID.toString(), }
"IsSearchFilter": true.toString(), }
"SPServiceIDs": serviceProviderServiceIdsList ?? [], List<String> categoryIds = [];
"CustomerNames": customerNamesList ?? [], if (categoryIdsList != null) {
"CustomerMobileNos": customerPhonesList ?? [], for (var element in categoryIdsList) {
"AppointmentTypes": deliveryTypeIdsList ?? [], categoryIds.add(element.toString());
"FromDate": fromDate ?? "", }
"DateTo": toDate ?? "", }
}; List<String> serviceIds = [];
if (serviceIdsList != null) {
if (appointmentStatusEnum != null) { for (var element in serviceIdsList) {
params.addAll({"AppointmentStatusID": appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString()}); serviceIds.add(element.toString());
}
}
List<String> branchIds = [];
if (branchIdsList != null) {
for (var element in branchIdsList) {
branchIds.add(element.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]));
return appointmentList;
}
@override
Future<List<AppointmentListModel>> getMyAppointmentsForCustomersByFilters({
List<String>? providerIdsList,
List<String>? categoryIdsList,
List<String>? serviceIdsList,
List<String>? itemIdsList,
List<String>? branchIdsList,
AppointmentStatusEnum? appointmentStatusEnum,
}) async {
var params = { var params = {
"customerID": appState.getUser.data!.userInfo!.customerId.toString(), "customerID": appState.getUser.data!.userInfo!.customerId.toString(),
"ServiceProviderIDs": providerIdsList ?? [], "ServiceProviderIDs": providerIds,
"ProviderBranchIDs": branchIdsList ?? [], "ProviderBranchIDs": categoryIds,
"ServiceIDs": serviceIdsList ?? [], "ServiceIDs": serviceIds,
"ServiceItemIDs": itemIdsList ?? [], "CategoryIDs": categoryIds,
"CategoryIDs": categoryIdsList ?? [],
}; };
if (appointmentStatusEnum != null) {
params.addAll({"AppointmentStatusID": appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString()});
}
GenericRespModel genericRespModel = await apiClient.getJsonForObject( GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
@ -301,12 +245,11 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @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 ?? ""; String t = appState.getUser.data!.accessToken ?? "";
final map = {"ProviderBranchID": branchID.toString(), "FromDate": fromDate, "ToDate": toDate};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( MResponse adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => MResponse.fromJson(json),
ApiConsts.getAppointmentSlots, ApiConsts.getAppointmentSlots,
token: t, token: t,
queryParameters: map, queryParameters: map,
@ -316,24 +259,20 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<GenericRespModel> updateAppointmentPaymentStatus(Map<String, dynamic> map) async { Future<MResponse> updateAppointmentPaymentStatus(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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 @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 ?? ""; String t = appState.getUser.data!.accessToken ?? "";
var params = { return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateAppointmentStatus, map, token: t);
"appointmentID": appointmentId.toString(),
"appointmentStatusID": appointmentStatusEnum.getIdFromAppointmentStatusEnum().toString(),
};
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateAppointmentStatus, params, token: t);
} }
@override @override
Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map) async { Future<MResponse> createMergeAppointment(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; 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 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/api/api_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/app_state.dart';
import 'package:mc_common_app/classes/consts.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/appointments_models/appointment_basic_detail_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_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: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_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/branch.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.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'; 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_model.dart';
import 'package:mc_common_app/models/provider_branches_models/provider_profile_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/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 { abstract class BranchRepo {
Future<GenericRespModel> createBranch({ Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude);
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<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(); Future<Branch> fetchAllBranches();
@ -57,47 +30,39 @@ abstract class BranchRepo {
Future<Services> fetchProviderServices(String branchID, String serviceCategoryId); Future<Services> fetchProviderServices(String branchID, String serviceCategoryId);
Future<List<ServiceModel>> fetchProviderServicesModelByCategoryIdAndBranchID(String branchID, String serviceCategoryId); Future<MResponse> createNewService(List<Map<String, dynamic>> map);
Future<GenericRespModel> createNewService(List<Map<String, dynamic>> map);
Future<Document> getServiceProviderDocument(dynamic userId); Future<Document> getServiceProviderDocument(dynamic userId);
Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents); Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
Future<ProviderModel> getBranchAndServices(); Future<ProviderModel> getBranchAndServices();
Future<List<ProviderBasicDataModel>> getAllProvidersWitheBasicData(); 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<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId);
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<List<BranchDetailModel>> getBranchesByFilters({ Future<List<BranchDetailModel>> getBranchesByFilters({
List<int>? providerIdsList, List<int>? providerIdsList,
@ -108,18 +73,6 @@ abstract class BranchRepo {
double? latitude, double? latitude,
double? longitude, 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 { class BranchRepoImp implements BranchRepo {
@ -127,70 +80,46 @@ class BranchRepoImp implements BranchRepo {
AppState appState = injector.get<AppState>(); AppState appState = injector.get<AppState>();
@override @override
Future<GenericRespModel> createBranch({ Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
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);
}
var postParams = { var postParams = {
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName, "branchName": branchName,
"branchDescription": branchDescription, "branchDescription": branchDescription,
"cityID": cityId.toString(), "cityID": cityId,
"address": address, "address": address,
"openTime": openTime,
"closeTime": closeTime,
"latitude": latitude, "latitude": latitude,
"longitude": longitude, "longitude": longitude,
"isActive": true, "isActive": true
"serviceProviderBranchImages": serviceProviderBranchImages,
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<Branch> fetchAllBranches() async { Future<Branch> fetchAllBranches() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<Category> fetchBranchCategory() async { Future<Category> fetchBranchCategory() async {
var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async { Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async {
var postParams = {"ServiceCategoryID": serviceCategoryId.toString()}; var postParams = {"ServiceCategoryID": serviceCategoryId.toString()};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @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 ?? ""; 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 @override
@ -202,11 +131,11 @@ class BranchRepoImp implements BranchRepo {
debugPrint(token); debugPrint(token);
return await injector return await injector
.get<ApiClient>() .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 @override
Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async { Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
List<Map<String, dynamic>> map = []; List<Map<String, dynamic>> map = [];
for (int i = 0; i < documents!.length; i++) { for (int i = 0; i < documents!.length; i++) {
if (documents[i].document != null) { if (documents[i].document != null) {
@ -216,21 +145,20 @@ class BranchRepoImp implements BranchRepo {
"documentID": documents[i].documentId, "documentID": documents[i].documentId,
"documentExt": documents[i].fileExt, "documentExt": documents[i].fileExt,
"documentImage": documents[i].document, "documentImage": documents[i].document,
"isActive": true, "isActive": true
"dateExpire": documents[i].dateExpire,
}; };
map.add(postParams); map.add(postParams);
} }
} }
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<ProviderModel> getBranchAndServices() async { Future<ProviderModel> getBranchAndServices() async {
var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -247,179 +175,78 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<GenericRespModel> updateBranch({ Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async {
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);
}
String lat = "0", long = "0"; String lat = "0", long = "0";
try { try {
lat = latitude.toString().substring(0, 9); lat = latitude.substring(0, 9);
long = longitude.toString().substring(0, 9); long = longitude.substring(0, 9);
} catch (e) {} } catch (e) {}
var postParams = { var postParams = {
"id": branchId, "id": id,
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName, "branchName": branchName,
"branchDescription": branchDescription, "branchDescription": branchDescription,
"openTime": openTime,
"closeTime": closeTime,
"cityID": cityId, "cityID": cityId,
"address": address, "address": address,
"latitude": lat, "latitude": lat,
"longitude": long, "longitude": long,
"serviceProviderBranchImages": serviceProviderBranchImages,
"isActive": isNeedToDelete "isActive": isNeedToDelete
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> deleteBranch({required int branchId}) async { Future<MResponse> createService(List<Map<String, dynamic>> map) async {
var postParams = {
"id": branchId,
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.deleteProviderBranch, postParams, token: t);
}
@override
Future<GenericRespModel> createService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> updateService(List<Map<String, dynamic>> map) async { Future<MResponse> updateService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t); return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Update, map, token: t);
} }
@override @override
Future<GenericRespModel> updateServiceStatus({required int branchId, required List<int> serviceIds, required ServiceStatusEnum serviceStatusEnum}) async { Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) 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 {
var postParams = { var postParams = {
"ProviderBranchIDExisted": oldBranchId.toString(), "ProviderBranchIDExisted": oldBranchId.toString(),
"ProviderBranchIDNew": newBranchId.toString(), "ProviderBranchIDNew": newBranchId.toString(),
"CategoryID": categoryId.toString(), "CategoryID": categoryId.toString(),
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @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 ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
Map<String, dynamic> map = { return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.duplicateItems, map, token: t);
"providerBranchID": providerBranchID,
"serviceItems": items,
};
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.duplicateItems, map, token: t);
} }
@override @override
Future<GenericRespModel> getAllProviderDealers(Map<String, dynamic> map) async { Future<MResponse> getAllProviderDealers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> getBranchUsers(Map<String, dynamic> map) async { Future<MResponse> getBranchUsers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map) async { Future<MResponse> assignDealerToBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map) async { Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -429,68 +256,25 @@ class BranchRepoImp implements BranchRepo {
"ProviderBranchID": branchID, "ProviderBranchID": branchID,
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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],
};
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 [];
} }
@override @override
Future<GenericRespModel> addNewServicesInAppointment(Map<String, dynamic> map) async { Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.addNewServicesInAppointment, map, token: t); return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.AddNewServicesInAppointment, map, token: t);
} }
@override @override
Future<List<BranchDetailModel>> getAllNearBranchAndServices({required double latitude, required double longitude}) async { Future<List<BranchDetailModel>> getAllNearBranchAndServices() async {
var queryParameters = { GenericRespModel adsGenericModel = await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.GetAllNearBranches, token: appState.getUser.data!.accessToken);
"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,
);
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return nearBranches; return nearBranches;
} }
@override @override
Future<List<BranchDetailModel>> getMyRecentBranchesWithServices() async { Future<List<ItemData>> getServiceItems(int serviceId) 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 {
var queryParameters = { var queryParameters = {
"ServiceProviderServiceID": serviceId.toString(), "ServiceProviderServiceID": serviceId.toString(),
}; };
@ -499,24 +283,17 @@ class BranchRepoImp implements BranchRepo {
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getServiceItems, ApiConsts.getServiceItems,
token: appState.getUser.data!.accessToken, 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])); List<ItemData> serviceItems = List.generate(adsGenericModel.data.length, (index) => ItemData.fromJson(adsGenericModel.data[index]));
return serviceItems; return serviceItems;
} }
@override @override
Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId, {double? latitude, double? longitude}) async { Future<ProviderProfileModel> getBranchAndServicesByProviderId(int providerId) async {
var postParams = { var postParams = {"serviceProviderID": providerId.toString()};
"serviceProviderID": providerId.toString(),
};
if (latitude != null && longitude != null) {
postParams.addAll({"Longitude": "$longitude"});
postParams.addAll({"Latitude": "$latitude"});
}
GenericRespModel adsGenericModel = GenericRespModel adsGenericModel =
await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.branchesAndServices, token: appState.getUser.data!.accessToken, queryParameters: postParams); await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.BranchesAndServices, token: appState.getUser.data!.accessToken, queryParameters: postParams);
return ProviderProfileModel.fromJson(adsGenericModel.data); return ProviderProfileModel.fromJson(adsGenericModel.data);
} }
@ -557,87 +334,15 @@ class BranchRepoImp implements BranchRepo {
"Rating": "${rating ?? 0}", "Rating": "${rating ?? 0}",
"Latitude": latitude.toString(), "Latitude": latitude.toString(),
"Longitude": longitude.toString(), "Longitude": longitude.toString(),
"Status": "3",
}; };
GenericRespModel adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getAllNearBranches, ApiConsts.GetAllNearBranches,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
queryParameters: postParams, queryParameters: postParams,
); );
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index]));
return nearBranches; 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, "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(),
"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 = {"customerID": customerID.toString()};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.favouriteServiceProviderGet,
token: appState.getUser.data!.accessToken,
queryParameters: postParams,
);
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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/main.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.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/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:signalr_core/signalr_core.dart'; import 'package:signalr_core/signalr_core.dart';
abstract class ChatRepo { abstract class ChatRepo {
Future<HubConnection> getHubConnection(); Future<HubConnection> getHubConnection();
Future<bool> markMessageAsRead({required List<int> messageIds, required ChatTypeEnum chatTypeEnum}); Future<void> markMessageAsRead({required int messageId});
Future<List<ChatMessageModel>> getUsersChatMessagesForRequests({ Future<List<ChatMessageModel>> getUsersChatMessages({required int providerId, required int customerId, required int requestOfferId, required int requestId, int pageIndex = 0, int pageSize = 0});
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,
});
} }
class ChatRepoImp implements ChatRepo { class ChatRepoImp implements ChatRepo {
@ -51,7 +25,7 @@ class ChatRepoImp implements ChatRepo {
@override @override
Future<HubConnection> getHubConnection() async { Future<HubConnection> getHubConnection() async {
final userId = AppState().getUser.data!.userInfo!.userId ?? ""; 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)"); logger.i("Connecting with Hub ($hubUrl)");
HubConnection hub; HubConnection hub;
@ -62,42 +36,26 @@ class ChatRepoImp implements ChatRepo {
client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true), client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true),
logging: (level, message) {}, logging: (level, message) {},
)) ))
.withAutomaticReconnect()
.build(); .build();
return hub; return hub;
} }
@override @override
Future<bool> markMessageAsRead({required List<int> messageIds, required ChatTypeEnum chatTypeEnum}) async { Future<void> markMessageAsRead({required int messageId}) async {
String url = ""; var queryParameters = {
"id": messageId.toString(),
if (chatTypeEnum == ChatTypeEnum.ads) { };
url = ApiConsts.messageIsReadUpdateForAds; await apiClient.postJsonForObject(
} 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(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
url, ApiConsts.messageIsReadUpdate,
queryParameters, queryParameters,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
); );
return genericRespModel.message == "";
} }
@override @override
Future<List<ChatMessageModel>> getUsersChatMessagesForRequests({ Future<List<ChatMessageModel>> getUsersChatMessages(
required int providerId, {required int providerId, required int customerId, required int requestOfferId, required int requestId, int pageIndex = 0, int pageSize = 0}) async {
required int customerId,
required int requestOfferId,
required int requestId,
int pageIndex = 0,
int pageSize = 0,
}) async {
var queryParameters = { var queryParameters = {
"ReqOfferID": requestOfferId.toString(), "ReqOfferID": requestOfferId.toString(),
"RequestID": requestId.toString(), "RequestID": requestId.toString(),
@ -108,75 +66,7 @@ class ChatRepoImp implements ChatRepo {
}; };
GenericRespModel genericRespModel = await apiClient.getJsonForObject( GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getChatMessagesForRequests, ApiConsts.getChatMessages,
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,
queryParameters: queryParameters, queryParameters: queryParameters,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
); );

@ -1,18 +1,16 @@
import 'package:mc_common_app/api/api_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/app_state.dart';
import 'package:mc_common_app/classes/consts.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_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/ss_photo_schedule_model.dart';
import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.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/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/enums_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_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/cities.dart';
import 'package:mc_common_app/models/user_models/country.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/models/user_models/role.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class CommonRepo { abstract class CommonRepo {
Future<Country> getAllCountries(); Future<Country> getAllCountries();
@ -47,18 +45,15 @@ abstract class CommonRepo {
Future<Role> getRoles(); Future<Role> getRoles();
Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long}); 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. //TODO: Needs to remove common methods from AD's repo and delete all repeated methods.
Future<VehicleDetailsModel> getVehicleDetails({int? vehicleTypeId, int? vehicleBrandId}); Future<VehicleDetailsModel> getVehicleDetails({int? vehicleTypeId, int? vehicleBrandId});
Future<List<EnumsModel>> getEnumTypeValues({int? enumTypeID, String? enumTypeName}); 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 { class CommonRepoImp implements CommonRepo {
@ -67,7 +62,7 @@ class CommonRepoImp implements CommonRepo {
@override @override
Future<Country> getAllCountries() async { 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 @override
@ -75,14 +70,16 @@ class CommonRepoImp implements CommonRepo {
var postParams = { var postParams = {
"CountryID": countryId, "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 @override
Future<Role> getRoles() async { 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 @override
Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long}) async { Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long}) async {
var params = { var params = {
@ -100,11 +97,10 @@ class CommonRepoImp implements CommonRepo {
} }
@override @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 = { var params = {
"Latitude": lat.toString(), "Latitude": lat.toString(),
"Longitude": long.toString(), "Longitude": long.toString(),
"cityID": cityID.toString(),
}; };
GenericRespModel genericRespModel = await apiClient.getJsonForObject( GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
@ -128,33 +124,6 @@ class CommonRepoImp implements CommonRepo {
@override @override
Future<List<EnumsModel>> getEnumTypeValues({int? enumTypeID, String? enumTypeName}) async { 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 ?? ""}; var postParams = {"enumTypeID": (enumTypeID ?? 0).toString(), "enumTypeName": enumTypeName ?? ""};
GenericRespModel enumGenericModel = await apiClient.postJsonForObject( GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
@ -349,36 +318,22 @@ class CommonRepoImp implements CommonRepo {
return vehicleParts; return vehicleParts;
} }
@override //
Future<GenericRespModel> createComplainFromProvider({required int customerId, required String comment, required int complainType}) async { // @override
final providerId = appState.getUser.data!.userInfo!.providerId; // Future<List<ProviderCategoryModel>> getProviderServiceCategories() async {
final parameters = { // GenericRespModel adsGenericModel = await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.serviceCategoryGet);
"serviceProviderID": providerId, // List<ProviderCategoryModel> providerCategories = List.generate(adsGenericModel.data.length, (index) => ProviderCategoryModel.fromJson(adsGenericModel.data[index]));
"customerID": customerId, // return providerCategories;
"detail": comment, // }
"complaintType": complainType,
}; // @override
GenericRespModel adsGenericModel = await apiClient.postJsonForObject( // Future<List<ProviderServiceModel>> getProviderServices({required int categoryId}) async {
(json) => GenericRespModel.fromJson(json), // var postParams = {
ApiConsts.providerComplaintCreate, // "ServiceCategoryID": categoryId.toString(),
parameters, // };
token: appState.getUser.data!.accessToken, // GenericRespModel adsGenericModel =
); // await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.serviceCategoryGet, queryParameters: postParams);
return adsGenericModel; // List<ProviderServiceModel> providerServices = List.generate(adsGenericModel.data.length, (index) => ProviderServiceModel.fromJson(adsGenericModel.data[index]));
} // return providerServices;
// }
@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;
}
} }

@ -3,24 +3,25 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/api/api_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/app_state.dart';
import 'package:mc_common_app/classes/consts.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/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
abstract class ItemsRepo { abstract class ItemsRepo {
Future<GenericRespModel> createServiceItems(Map map); Future<MResponse> createServiceItems(Map map);
Future<ItemModel> getServiceItems(int serviceId); Future<ItemModel> getServiceItems(int serviceId);
Future<GenericRespModel> updateServiceItem(Map map); Future<MResponse> updateServiceItem(Map map);
} }
class ItemsRepoImp implements ItemsRepo { class ItemsRepoImp implements ItemsRepo {
@override @override
Future<GenericRespModel> createServiceItems(Map map) async { Future<MResponse> createServiceItems(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -29,15 +30,17 @@ class ItemsRepoImp implements ItemsRepo {
"ServiceProviderServiceID": serviceId.toString(), "ServiceProviderServiceID": serviceId.toString(),
}; };
String? token = AppState().getUser.data?.accessToken; String? token = AppState().getUser.data?.accessToken;
debugPrint(token);
return await injector return await injector
.get<ApiClient>() .get<ApiClient>()
.getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); .getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? "");
} }
@override @override
Future<GenericRespModel> updateServiceItem(Map map) async { Future<MResponse> updateServiceItem(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/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/models/payment_models/pay_order_detail_resp_model.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class PaymentsRepo { abstract class PaymentsRepo {
Future<bool> verifyPayment({required int paymentTypeId, required int id, bool isForAppointments = false, List<int>? appointmentIds}); Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentId, required int adId});
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentTypeId, required int adId});
} }
class PaymentsRepoImp implements PaymentsRepo { class PaymentsRepoImp implements PaymentsRepo {
@ -18,67 +14,9 @@ class PaymentsRepoImp implements PaymentsRepo {
AppState appState = injector.get<AppState>(); AppState appState = injector.get<AppState>();
@override @override
Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentTypeId, required int adId}) async { Future<PayOrderDetailRespModel> getPayOrderDetails({required int paymentId, required int adId}) async {
var queryParameters = { GenericRespModel adsGenericModel = await apiClient.getJsonForObject(token: appState.getUser.data!.accessToken, (json) => GenericRespModel.fromJson(json), ApiConsts.payForOrderDetailGet);
"AdsID": adId.toString(),
"PaymentType": paymentTypeId.toString(),
};
GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken,
queryParameters: queryParameters,
(json) => GenericRespModel.fromJson(json),
ApiConsts.payForOrderDetailGet,
);
PayOrderDetailRespModel payOrderDetailRespModel = PayOrderDetailRespModel.fromJson(adsGenericModel.data); PayOrderDetailRespModel payOrderDetailRespModel = PayOrderDetailRespModel.fromJson(adsGenericModel.data);
return payOrderDetailRespModel; 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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/extensions/string_extensions.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.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/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/models/requests_models/request_model.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
abstract class RequestRepo { abstract class RequestRepo {
Future<GenericRespModel> createRequest({ Future<GenericRespModel> createRequest(Map<String, dynamic> map);
required int requestTypeId,
required int vehicleTypeId,
required String brand,
required String model,
required String year,
required bool isNew,
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<OffersUnreadChatModel> getOffersChatsUnreadList({required String userId}); Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0});
Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId}); Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId});
Future<List<RequestModel>> getRequests({required int providerOrCustomerID}); Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams);
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<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 { class RequestRepoImp implements RequestRepo {
@ -82,37 +26,7 @@ class RequestRepoImp implements RequestRepo {
AppState appState = injector.get<AppState>(); AppState appState = injector.get<AppState>();
@override @override
Future<GenericRespModel> createRequest({ Future<GenericRespModel> createRequest(Map<String, dynamic> postParams) async {
required int requestTypeId,
required int vehicleTypeId,
required String brand,
required String model,
required String year,
required bool isNew,
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 = {
"customerID": appState.getUser.data!.userInfo!.customerId ?? 0,
"requestType": requestTypeId,
"vehicleTypeID": vehicleTypeId,
"brand": brand,
"model": model,
"year": year,
"isNew": isNew,
"countryID": countryID,
"cityID": cityID,
"price": price,
"description": description,
"address": address,
"isSpecialServiceNeeded": false,
"requestImages": requestImages,
};
GenericRespModel enumGenericModel = await apiClient.postJsonForObject( GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.createRequest, ApiConsts.createRequest,
@ -123,21 +37,11 @@ class RequestRepoImp implements RequestRepo {
} }
@override @override
Future<List<RequestModel>> getRequests({required int providerOrCustomerID}) async { Future<List<RequestModel>> getRequests(Map<String, dynamic> postParams) async {
final paramsForGetRequests = {
"pageSize": 100,
"pageIndex": 0,
};
if (appState.currentAppType == AppType.provider) {
paramsForGetRequests.addEntries([MapEntry("providerID", providerOrCustomerID)]);
} else {
paramsForGetRequests.addEntries([MapEntry("customerID", providerOrCustomerID)]);
}
GenericRespModel enumGenericModel = await apiClient.postJsonForObject( GenericRespModel enumGenericModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getRequest, ApiConsts.getRequest,
paramsForGetRequests, postParams,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
); );
List<RequestModel> requests = List.generate( List<RequestModel> requests = List.generate(
@ -150,141 +54,7 @@ class RequestRepoImp implements RequestRepo {
} }
@override @override
Future<List<RequestModel>> getRequestsBasedOnFilters({ Future<List<OffersModel>> getOffersByRequest({required int requestId, int serviceProviderId = 0}) async {
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(),
"isNew": conditionId == 0 ? "" : conditionId == 1,
};
if (appState.currentAppType == AppType.customer) {
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 {
var queryParameters = { var queryParameters = {
"RequestID": requestId.toString(), "RequestID": requestId.toString(),
"ServiceProviderID": serviceProviderId.toString(), "ServiceProviderID": serviceProviderId.toString(),
@ -295,29 +65,13 @@ class RequestRepoImp implements RequestRepo {
queryParameters: queryParameters, queryParameters: queryParameters,
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
); );
List<ProviderOffersChatsModel> offersList = List.generate( List<OffersModel> offersList = List.generate(
genericRespModel.data.length, genericRespModel.data.length,
(index) => ProviderOffersChatsModel.fromJson(genericRespModel.data[index]), (index) => OffersModel.fromJson(genericRespModel.data[index]),
); );
return offersList; 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 @override
Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId}) async { Future<ProviderOffersModel> getOffersFromProvidersByRequest({required int requestId}) async {
final customerId = appState.getUser.data!.userInfo!.customerId; final customerId = appState.getUser.data!.userInfo!.customerId;
@ -333,106 +87,16 @@ class RequestRepoImp implements RequestRepo {
); );
ProviderOffersModel providerOffersModel = ProviderOffersModel(); ProviderOffersModel providerOffersModel = ProviderOffersModel();
if (genericRespModel.data != null && genericRespModel.data.length > 0) { if (genericRespModel.data != null && genericRespModel.data.length > 0) {
providerOffersModel = ProviderOffersModel.fromJson(genericRespModel.data.first, requestId); providerOffersModel = ProviderOffersModel.fromJson(genericRespModel.data.first);
} }
return providerOffersModel; return providerOffersModel;
} }
@override @override
Future<GenericRespModel> updateRequestStatus({required RequestStatusEnum requestStatusEnum, required int requestId}) async { Future<GenericRespModel> updateOfferRequestStatus({required RequestOfferStatusEnum requestOfferStatusEnum, required int requestOfferId}) 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 {
var queryParameters = { var queryParameters = {
"requestOfferId": requestOfferId.toString(), "requestOfferId": requestOfferId.toString(),
"offerStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum().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( GenericRespModel genericRespModel = await apiClient.postJsonForObject(
(json) => GenericRespModel.fromJson(json), (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/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/models/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/api/api_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/app_state.dart';
import 'package:mc_common_app/classes/consts.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 { abstract class ScheduleRepo {
Future<Services> getAllServices(String branchId); 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<MResponse> updateSchedule(Map map);
Future<GenericRespModel> updateSchedule(Map map);
Future<Schedule> getSchedules(String branchId); 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 { class ScheduleRepoImp implements ScheduleRepo {
@ -33,21 +31,15 @@ class ScheduleRepoImp implements ScheduleRepo {
} }
@override @override
Future<GenericRespModel> createSchedule(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.createSchedule, map, token: t);
}
@override
Future<GenericRespModel> checkServiceGroupInBranchSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> addServicesInSchedule(Map map) async { Future<MResponse> addServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -58,25 +50,25 @@ class ScheduleRepoImp implements ScheduleRepo {
} }
@override @override
Future<GenericRespModel> setScheduleInActive(int scheduleId, int branchId) async { Future<MResponse> setScheduleInActive(int scheduleId, int branchId) async {
Map<String, dynamic> map = { Map<String, dynamic> map = {
"id": scheduleId, "id": scheduleId,
"serviceProviderBranchID": branchId, "serviceProviderBranchID": branchId,
"isActive": false, "isActive": false,
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> updateSchedule(Map map) async { Future<MResponse> updateSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> updateServicesInSchedule(Map map) async { Future<MResponse> updateServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; 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,214 +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) {
params.addAll({
"customerID": (appState.getUser.data!.userInfo!.customerId ?? "0").toString(),
"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,125 +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});
Future<GenericRespModel> updateSelfPickupRequestStatus({required SelfPickupRequestStatusEnum selfPickupStatusEnum, required int shippingRequestId, String? comment});
}
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}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {
"id": "$shippingRequestId",
"shippingStatus": "${shippingStatusEnum.getIdFromShippingStatusEnum()}",
"comment": comment ?? "",
};
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}) async {
String token = appState.getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {
"id": "$shippingRequestId",
"selfPickUpStatus": "${selfPickupStatusEnum.getIdFromSelfPickupStatusEnum()}",
"comment": comment ?? "",
};
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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/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/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/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/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/models/user_models/branch_user.dart'; import 'package:mc_common_app/models/user_models/branch_user.dart';
abstract class SubscriptionRepo { abstract class SubscriptionRepo {
// Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID); Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID);
// Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID});
Future<SubscriptionModel> getMySubscriptions(String? serviceProviderID); Future<SubscriptionModel> getMySubscriptions(String? serviceProviderID);
Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID});
Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew); 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 { class SubscriptionRepoImp extends SubscriptionRepo {
ApiClient apiClient = injector.get<ApiClient>(); ApiClient apiClient = injector.get<ApiClient>();
AppState appState = injector.get<AppState>(); 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 @override
Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew) async { Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
Map<String, dynamic> queryParameters = {}; Map<String, String> queryParameters = {};
if (serviceProviderID != null) { if (serviceProviderID != null) {
queryParameters = { queryParameters = {
"ProviderID": serviceProviderID, "ProviderID": serviceProviderID,
@ -48,7 +63,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
@override @override
Future<GenericRespModel> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async { Future<MResponse> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {}; Map<String, String> queryParameters = {};
if (serviceProviderID != null) { if (serviceProviderID != null) {
@ -59,7 +74,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
return await injector.get<ApiClient>().getJsonForObject( return await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => MResponse.fromJson(json),
ApiConsts.calculationUpgradePrice, ApiConsts.calculationUpgradePrice,
token: t, token: t,
queryParameters: queryParameters, queryParameters: queryParameters,
@ -67,24 +82,24 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
@override @override
Future<GenericRespModel> payForProviderSubscription(Map<String, dynamic> map) async { Future<MResponse> payForProviderSubscription(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject( return await injector.get<ApiClient>().postJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => MResponse.fromJson(json),
ApiConsts.payFortOrderProviderSubscriptionCreate, ApiConsts.payFortOrder_ProviderSubscription_Create,
map, map,
token: t, token: t,
); );
} }
@override @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 ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject( GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getSPBranchUserGet, ApiConsts.getSPBranchUser_Get,
token: t, token: t,
queryParameters: map, 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); return await injector.get<ApiClient>().getJsonForObject((json) => SubscriptionModel.fromJson(json), ApiConsts.getAllSubscriptions, token: t, queryParameters: queryParameters);
} }
// @override @override
// Future<SubscriptionModel> getAllSubscriptions(String? serviceProviderID) async { Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID}) async {
// String t = AppState().getUser.data!.accessToken ?? ""; Map<String, String> queryParameters = {};
// Map<String, String> queryParameters = {}; if (serviceProviderID != null) {
// if (serviceProviderID != null) { queryParameters = {
// queryParameters = { "ServiceProviderID": serviceProviderID,
// "ID": serviceProviderID, "IsActiveSubscriptionForProvider": "true",
// }; };
// } }
//
// return await injector.get<ApiClient>().getJsonForObject((json) => SubscriptionModel.fromJson(json), ApiConsts.getAllSubscriptions, token: t, queryParameters: queryParameters);
// }
// @override GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
// Future<List<ProviderSubscriptionModel>> getProviderSubscription({String? serviceProviderID}) async { token: appState.getUser.data!.accessToken,
// Map<String, String> queryParameters = {}; (json) => GenericRespModel.fromJson(json),
// if (serviceProviderID != null) { ApiConsts.getMySubscriptions,
// queryParameters = { queryParameters: queryParameters,
// "ServiceProviderID": serviceProviderID, );
// "IsActiveSubscriptionForProvider": "true", 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 // @override
// Future<SubscriptionModel> getProviderSubscription( // 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/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/user_models/basic_otp.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_email.dart';
import 'package:mc_common_app/models/user_models/change_mobile.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> 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<Response> loginV1(String phoneNo, String password);
Future<LoginPasswordRespModel> loginV2OTP(String userToken, String loginType); 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); Future<RefreshToken> refreshTokenAPI(String token, String refreshToken);
@ -53,9 +53,7 @@ abstract class UserRepo {
Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword); Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword);
Future<GenericRespModel> changePassword(String currentPassword, String newPassword); Future<MResponse> changePassword(String currentPassword, String newPassword);
Future<Map<String, dynamic>> updateUserInfo(String firstName, String lastName, String? city);
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password); Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password);
@ -67,14 +65,12 @@ abstract class UserRepo {
Future<VerifyEmailRespModel> emailVerify(String email, String userID); 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> updateUserImage(String image);
Future<ImageResponse> getUserImage(String image); Future<ImageResponse> getUserImage(String image);
Future<Response> logoutUser();
Future<String> updateUserToken(); Future<String> updateUserToken();
} }
@ -87,7 +83,7 @@ class UserRepoImp implements UserRepo {
t = AppState().getUser.data!.accessToken ?? ""; t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); 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 @override
@ -102,23 +98,23 @@ class UserRepoImp implements UserRepo {
t = AppState().getUser.data!.accessToken ?? ""; t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); 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 @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; Map<String, Object> postParams;
if (email.isEmpty) { 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 { } 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; String? t;
if (isNeedToPassToken) { if (isNeedToPassToken) {
t = AppState().getUser.data!.accessToken ?? ""; t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); 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 @override
@ -127,7 +123,7 @@ class UserRepoImp implements UserRepo {
"mobileorEmail": phoneNo, "mobileorEmail": phoneNo,
"password": password, "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); //return await injector.get<ApiClient>().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams);
} }
@ -138,50 +134,40 @@ class UserRepoImp implements UserRepo {
"loginType": loginType, "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)); LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body));
return user; return user;
} }
@override @override
Future<Response> loginV2OTPVerify( Future<Response> loginV2OTPVerify(String userToken, String otp) async {
String userToken, var postParams = {"userToken": userToken, "userOTP": otp};
String otp, return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams);
String deviceType,
String deviceToken,
) async {
var postParams = {"userToken": userToken, "userOTP": otp, "deviceType": deviceType, "deviceToken": deviceToken};
return await injector.get<ApiClient>().postJsonForResponse(ApiConsts.loginV2OTPVerify, postParams);
} }
@override @override
Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async { Future<RefreshToken> refreshTokenAPI(String token, String refreshToken) async {
var postParams = {"token": token, "refreshToken": refreshToken}; var postParams = {"token": token, "refreshToken": refreshToken};
// String t = AppState().getUser.data!.accessToken ?? ""; // 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 @override
Future<Country> getAllCountries() async { 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 @override
Future<Cities> getAllCites(String countryId) async { Future<Cities> getAllCites(String countryId) async {
var postParams = { var postParams = {
"CountryID": countryId, "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 @override
Future<Role> getRoles() async { 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 @override
@ -190,14 +176,14 @@ class UserRepoImp implements UserRepo {
"userName": userName, "userName": userName,
"otpType": 1, "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); //return await injector.get<ApiClient>().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams);
} }
@override @override
Future<PasswordOTPCompareResModel> forgetPasswordOTPCompare(String userToken, String userOTP) async { Future<PasswordOTPCompareResModel> forgetPasswordOTPCompare(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP}; 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)); PasswordOTPCompareResModel otpCompare = PasswordOTPCompareResModel.fromJson(jsonDecode(response.body));
return otpCompare; return otpCompare;
@ -210,7 +196,7 @@ class UserRepoImp implements UserRepo {
"newPassword": newPassword, "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)); ConfirmPasswordRespModel data = ConfirmPasswordRespModel.fromJson(jsonDecode(response.body));
return data; return data;
@ -218,7 +204,7 @@ class UserRepoImp implements UserRepo {
} }
@override @override
Future<GenericRespModel> changePassword(String currentPassword, String newPassword) async { Future<MResponse> changePassword(String currentPassword, String newPassword) async {
var postParams = { var postParams = {
"currentPassword": currentPassword, "currentPassword": currentPassword,
"newPassword": newPassword, "newPassword": newPassword,
@ -227,14 +213,14 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); 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 @override
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password) async { Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password) async {
var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password}; var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -244,28 +230,21 @@ class UserRepoImp implements UserRepo {
"userOTP": userOTP, "userOTP": userOTP,
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<ChanEmailRespModel> changeEmailOTPRequest(String email, String password) async { Future<ChanEmailRespModel> changeEmailOTPRequest(String email, String password) async {
var postParams = {"email": email, "password": password}; var postParams = {"email": email, "password": password};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<ConfirmEmailRespModel> changeEmail(String userToken, String userOTP) async { Future<ConfirmEmailRespModel> changeEmail(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP}; var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.changeEmail, postParams, token: t); 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);
} }
@override @override
@ -278,15 +257,15 @@ class UserRepoImp implements UserRepo {
}; };
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
Future<GenericRespModel> emailVerifyOTPVerify(String userToken, String userOTP) async { Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP}; var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? ""; 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 @override
@ -296,12 +275,7 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); debugPrint("token $t");
return await injector.get<ApiClient>().postJsonForObject( return await injector.get<ApiClient>().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t,);
(json) => ImageResponse.fromJson(json),
ApiConsts.updateUserImage,
postParams,
token: t,
);
} }
@override @override
@ -311,7 +285,7 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); 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 @override
@ -329,10 +303,4 @@ class UserRepoImp implements UserRepo {
AppState().setUser = user; AppState().setUser = user;
return refresh.data!.accessToken ?? ""; 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);
}
} }

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

@ -1,31 +1,19 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:image_picker/image_picker.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/app_permission_handler.dart';
import 'package:mc_common_app/utils/utils.dart';
abstract class CommonAppServices { abstract class CommonAppServices {
Future<List<File>> pickMultipleImages(); Future<List<File>> pickMultipleImages();
Future<File?> pickImageFromPhone(int sourceFlag); 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}); 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,
});
} }
class CommonServicesImp implements CommonAppServices { class CommonServicesImp implements CommonAppServices {
@ -40,12 +28,12 @@ class CommonServicesImp implements CommonAppServices {
} }
@override @override
Future<List<File>?> pickMultipleFiles(BuildContext context, {bool allowMultiple = true}) async { Future<List<File>?> pickMultipleFiles(BuildContext context) async {
FilePickerResult? result; FilePickerResult? result;
final status = await AppPermissions.checkStoragePermissions(context); final status = await AppPermissions.checkStoragePermissions(context);
if (status) { 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 = []; List<File> pickedFiles = [];
@ -62,41 +50,32 @@ class CommonServicesImp implements CommonAppServices {
@override @override
Future<List<File>> pickMultipleImages() async { Future<List<File>> pickMultipleImages() async {
final picker = ImagePicker(); final picker = ImagePicker();
List<File> imageModels = []; final pickedImagesXFiles = await picker.pickMultiImage();
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 [];
}
if (await element.length() > GlobalConsts.maxFileSizeInBytes) { List<File> pickedImages = [];
Utils.showToast(LocaleKeys.maxFileSize); if (pickedImagesXFiles == null) {
return []; return [];
}
imageModels.add(File(element.path));
} }
if (pickedImagesXFiles.isEmpty) {
if (imageModels.length > GlobalConsts.maxFileCount) { return [];
Utils.showToast(LocaleKeys.maxFileSelection.tr()); }
imageModels = imageModels.sublist(0, GlobalConsts.maxFileCount); // Keep only the first 7 images for (var element in pickedImagesXFiles) {
pickedImages.add(File(element.path));
} }
pickedImages.addAll(imageModels);
return pickedImages; return pickedImages;
} }
@override @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; FilePickerResult? result;
final status = await AppPermissions.checkStoragePermissions(context); final status = await AppPermissions.checkStoragePermissions(context);
if (status) { 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 = []; List<File> pickedFiles = [];
@ -107,23 +86,6 @@ class CommonServicesImp implements CommonAppServices {
} }
} }
} }
return pickedFiles.isNotEmpty ? pickedFiles.first : null; return pickedFiles.length > 0 ? 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;
}
} }
} }

@ -1,115 +0,0 @@
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/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/main.dart';
import 'package:permission_handler/permission_handler.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();
}
});
// 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) {}, );
RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
if (initialMessage != null) _handleNotification(initialMessage);
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
if (message.notification != null) _handleNotification(message);
});
FirebaseMessaging.onMessageOpenedApp.listen(_handleNotification);
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 _handleNotification(RemoteMessage message) async {
logger.i(message.notification!.title);
logger.i(message.notification!.body);
displayNotification(title: message.notification!.title ?? '', body: message.notification!.body ?? '');
}
Future<void> displayNotification({required String title, required String body}) async {
const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(
"0",
'mowater',
channelDescription: 'mowater_notifications',
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: 'item x');
}
}
@pragma('vm:entry-point')
Future<dynamic> backgroundMessageHandler(RemoteMessage message) async {
await Firebase.initializeApp();
}

@ -26,34 +26,24 @@ abstract class PaymentService {
class PaymentServiceImp implements PaymentService { class PaymentServiceImp implements PaymentService {
MyInAppBrowser? myInAppBrowser; MyInAppBrowser? myInAppBrowser;
var inAppBrowserOptions = InAppBrowserClassSettings( var inAppBrowserOptions = InAppBrowserClassOptions(
webViewSettings: InAppWebViewSettings( inAppWebViewGroupOptions:
useShouldOverrideUrlLoading: false, InAppWebViewGroupOptions(crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false), ios: IOSInAppWebViewOptions(applePayAPIEnabled: true)),
transparentBackground: false, crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black),
isInspectable: false, android: AndroidInAppBrowserOptions(),
applePayAPIEnabled: true, ios:
cacheEnabled: false, IOSInAppBrowserOptions(hideToolbarBottom: true, toolbarBottomBackgroundColor: Colors.white, closeButtonColor: Colors.white, presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN));
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
),
);
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 = ""; String urlRequest = "";
int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0; int customerId = AppState().getUser.data!.userInfo!.customerId ?? 0;
switch (paymentType) { switch (paymentType) {
case PaymentTypes.subscription: case PaymentTypes.subscription:
urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&OrderProviderSubscriptionID=$id"; urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&OrderProviderSubscriptionID=$id";
@ -84,19 +74,6 @@ class PaymentServiceImp implements PaymentService {
urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&CustomerID=$customerId&RequestID=$id"; urlRequest = "${ApiConsts.paymentWebViewUrl}?PaymentType=${paymentType.getIdFromPaymentTypesEnum()}&CustomerID=$customerId&RequestID=$id";
break; break;
} }
return urlRequest;
}
@override
Future<void> placePayment({
required int id,
List<int>? appointmentIds,
required PaymentTypes paymentType,
required Function() onSuccess,
required Function() onFailure,
}) async {
String urlRequest = getUrlRequestByPaymentId(id: id, paymentType: paymentType, appointmentIds: appointmentIds);
log("PaymentUrl: $urlRequest"); log("PaymentUrl: $urlRequest");
myInAppBrowser = MyInAppBrowser(onExitCallback: () { myInAppBrowser = MyInAppBrowser(onExitCallback: () {
log("Browser Exited"); log("Browser Exited");
@ -105,13 +82,8 @@ class PaymentServiceImp implements PaymentService {
onBrowserLoadStart(onFailure: onFailure, onSuccess: onSuccess, url: url); onBrowserLoadStart(onFailure: onFailure, onSuccess: onSuccess, url: url);
}); });
await myInAppBrowser!.openUrlRequest( await myInAppBrowser!.openUrlRequest(
urlRequest: URLRequest( urlRequest: URLRequest(url: Uri.parse(urlRequest)),
url: WebUri(urlRequest, forceToStringRawValue: true), options: inAppBrowserOptions,
allowsCellularAccess: true,
allowsConstrainedNetworkAccess: true,
allowsExpensiveNetworkAccess: true,
),
settings: inAppBrowserOptions,
); );
} }

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

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
class MyColors { class MyColors {
static const Color darkPrimaryColor = Color(0xffF47F20); static const Color darkPrimaryColor = Color(0xffF47F20);
static const Color primaryColor = Color(0xffF69521); static const Color primaryColor = Color(0xffF69521);
static const Color lightPrimaryColor = Color(0xffFFD077);
static const Color accentColor = Colors.blue; static const Color accentColor = Colors.blue;
static const Color lightTextColor = Color(0xff969696); static const Color lightTextColor = Color(0xff969696);
static const Color textColor = Color(0xff777777); static const Color textColor = Color(0xff777777);
@ -39,10 +38,6 @@ class MyColors {
static const Color borderColor = Color(0xffE8E8E8); static const Color borderColor = Color(0xffE8E8E8);
static const Color greyAddBorderColor = Color(0xffEEEEEE); static const Color greyAddBorderColor = Color(0xffEEEEEE);
static const Color lightGreyBgColor = Color(0xffFDFDFD); 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: //AdStatusColors:
static const Color adActiveStatusColor = Color(0xff5FC16A); static const Color adActiveStatusColor = Color(0xff5FC16A);
@ -50,17 +45,6 @@ class MyColors {
static const Color adSoldStatusColor = Color(0xff22742B); static const Color adSoldStatusColor = Color(0xff22742B);
static const Color adPendingStatusColor = Color(0xffEDB947); 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( static Decoration gradient = BoxDecoration(
gradient: const LinearGradient(colors: [ gradient: const LinearGradient(colors: [
darkPrimaryColor, darkPrimaryColor,

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

@ -5,30 +5,6 @@
// unverified, // unverified,
// } // }
//
//
class AppEnums {
static const int requestFilterEnumId = 16; // Requests Filter Enums
static const int branchServicesEnumId = 6; // Branch Services Filter Enums
static const int myAdsFilterEnumId = 18; // My Ads Filter Enums
static const int adOwnersFilterEnumId = 23; // Explore Ads Filter Enums
static const int appointmentsFilterEnumId = 13; // Appointments Filter Enums
static const int requestStatusesFilterEnumId = 15; // Appointments Filter Enums
static const int conditionEnumId = -1; // to get the Condition Filter Enums
static const int serviceDeliveryTypeEnumId = 24; // to get the serviceDeliveryType
static const int shippingStatusEnumId = 30; // to get the Shipping Filter Enums
static const int selfPickupStatusEnumId = 33; // to get the SelfPickup Status Enums
static const int deliveryOptionEnumId = 32; // to get the SelfPickup Status Enums
}
enum DashboardRouteEnum {
fromAdsPayment,
fromAdsSubmit,
none,
}
enum VehicleType { enum VehicleType {
car, car,
motorCycle, motorCycle,
@ -66,12 +42,10 @@ enum AdPostStatus {
reserved, reserved,
buyingService, buyingService,
reserveCancel, reserveCancel,
deActive,
pendingForActive,
allAds, allAds,
} }
enum RequestStatusEnum { enum RequestStatus {
pending, pending,
submitted, submitted,
inProgress, inProgress,
@ -80,9 +54,21 @@ enum RequestStatusEnum {
paid, paid,
expired, expired,
shipping, shipping,
delivery,
selfPickup,
} }
//TODO: Needs to remove
// public enum RequestType : int
// {
// Special_Car_Request = 1,
// Service_Request = 2 //SparePart
// }
// public enum OfferStatus : int
// {
// Offer = 1,//SP
// Negotiate = 2,
// Accepted = 3,
// Rejected = 4,
// Cancelled = 5 //SP
// }
enum PaymentMethods { enum PaymentMethods {
mada, mada,
@ -99,10 +85,10 @@ enum PaymentTypes {
ads, ads,
request, request,
extendAds, extendAds,
partialAppointment, partialAppointment
} }
enum AdCreationStepsEnum { enum AdCreationSteps {
vehicleDetails, vehicleDetails,
damageParts, damageParts,
adDuration, adDuration,
@ -141,7 +127,6 @@ enum ServiceStatusEnum {
rejected, //4 rejected, //4
blocked, //5 blocked, //5
deactivated, //6 deactivated, //6
allServices, //0
} }
enum DocumentStatusEnum { enum DocumentStatusEnum {
@ -161,11 +146,6 @@ enum BranchStatusEnum {
deactivated // 6 deactivated // 6
} }
enum AppointmentTypeEnum {
workshop,
home,
}
enum AppointmentStatusEnum { enum AppointmentStatusEnum {
booked, booked,
confirmed, confirmed,
@ -173,11 +153,9 @@ enum AppointmentStatusEnum {
cancelled, cancelled,
rescheduled, rescheduled,
allAppointments, allAppointments,
upcoming,
workStarted, workStarted,
visitCompleted, visitCompleted,
today,
past,
upcoming,
} }
enum AppointmentPaymentStatusEnum { enum AppointmentPaymentStatusEnum {
@ -217,44 +195,7 @@ enum ChatTypeEnum {
} }
enum SubscriptionTypeEnum { enum SubscriptionTypeEnum {
current, //1 current,
upgrade, //2 upgrade,
downgrade, //3 downgrade,
}
enum SubscriptionActionTypeEnum {
ads,
users,
branches,
subscription,
}
enum ShippingRequestStatusEnum {
allRequests,
pending,
initiated,
inTransit,
outForDelivery,
delivered,
}
enum SelfPickupRequestStatusEnum {
allRequests,
pending,
preparingToCollect,
readyToCollect,
collected,
}
enum RequestDeliveryOptionEnum {
none,
delivery,
selfPickup,
both,
}
enum InviteTypeEnum {
whatsapp,
sms,
email,
} }

@ -7,29 +7,17 @@ import 'package:flutter/rendering.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/utils/app_permission_handler.dart'; import 'package:mc_common_app/utils/app_permission_handler.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
// import 'package:geodesy/geodesy.dart' as geodesy; // import 'package:geodesy/geodesy.dart' as geodesy;
abstract class Location { //Created By Mr.Zohaib
void handleLocationPermission(); class Location {
void havePermission(Function(bool) callback);
void isEnabled(Function(bool) callback);
void listenGPS({bool change = true, Function(bool)? onChange});
void getCurrentLocation(Function(LatLng?) callback);
}
class LocationService implements Location {
static _Map map = _Map(); static _Map map = _Map();
void havePermission(Function(bool) callback) { static void havePermission(Function(bool) callback) {
Geolocator.checkPermission().then((value) async { Geolocator.checkPermission().then((value) async {
if (value == LocationPermission.denied) { if (value == LocationPermission.denied) {
value = await Geolocator.requestPermission(); value = await Geolocator.requestPermission();
@ -40,26 +28,13 @@ class LocationService implements Location {
}); });
} }
void isEnabled(Function(bool) callback) { static void isEnabled(Function(bool) callback) {
Geolocator.isLocationServiceEnabled().then((value) => callback(value)); Geolocator.isLocationServiceEnabled().then((value) => callback(value));
} }
void handleLocationPermission() {
havePermission((val) {
if (val) {
print(val);
getCurrentLocation((LatLng? latlng) {
print(latlng);
AppState().currentLocation = latlng ?? const LatLng(0, 0);
print("App State Location${AppState().currentLocation.toJson()}");
});
}
});
}
static bool _listeningSettingChange = true; static bool _listeningSettingChange = true;
void listenGPS({bool change = true, Function(bool)? onChange}) async { static void listenGPS({bool change = true, Function(bool)? onChange}) async {
_listeningSettingChange = change; _listeningSettingChange = change;
if (change == false) return; if (change == false) return;
@ -71,8 +46,10 @@ class LocationService implements Location {
}); });
} }
void getCurrentLocation(Function(LatLng?) callback) { static void getCurrentLocation(Function(LatLng?) callback) {
void done(Position position) { void done(Position position) {
//AppStorage.sp.saveLocation(position);
LatLng? myCurrentLocation = LatLng(position.latitude, position.longitude); LatLng? myCurrentLocation = LatLng(position.latitude, position.longitude);
callback(myCurrentLocation); callback(myCurrentLocation);
} }
@ -81,8 +58,7 @@ class LocationService implements Location {
if (granted) { if (granted) {
Geolocator.getLastKnownPosition(forceAndroidLocationManager: true).then((value) { Geolocator.getLastKnownPosition(forceAndroidLocationManager: true).then((value) {
if (value == null) { if (value == null) {
Geolocator.getCurrentPosition().then((value) async { Geolocator.getCurrentPosition().then((value) {
if(value == null) await Geolocator.openAppSettings();
done(value); done(value);
}); });
} else { } else {
@ -112,7 +88,8 @@ class LocationService implements Location {
} }
class _Map { class _Map {
Marker createMarker(String id, { Marker createMarker(
String id, {
required LatLng coordinates, required LatLng coordinates,
BitmapDescriptor? icon, BitmapDescriptor? icon,
VoidCallback? onTap, VoidCallback? onTap,
@ -162,7 +139,7 @@ class _Map {
} }
void goToCurrentLocation({Completer<GoogleMapController>? mapController, double? direction = 0.0, bool? animation}) { void goToCurrentLocation({Completer<GoogleMapController>? mapController, double? direction = 0.0, bool? animation}) {
LocationService().getCurrentLocation((location) { Location.getCurrentLocation((location) {
moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!); moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!);
}); });
} }

@ -2,19 +2,8 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; 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/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
@ -24,7 +13,6 @@ import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/loading_dialog.dart'; import 'package:mc_common_app/widgets/loading_dialog.dart';
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@ -50,28 +38,16 @@ class Utils {
} }
} }
static Future<void> openEmailViaEmailApp({required String emailAddress}) async {
Uri emailLaunchUrl = Uri.parse('mailto:$emailAddress');
if (await canLaunchUrl(emailLaunchUrl)) {
try {
await launchUrl(emailLaunchUrl);
} catch (e) {
await launchUrl(emailLaunchUrl);
}
}
}
static Future<void> openNumberViaWhatsApp({required String phoneNumber}) async { static Future<void> openNumberViaWhatsApp({required String phoneNumber}) async {
final url = 'https://wa.me/$phoneNumber?text='; final url = 'https://wa.me/$phoneNumber?text=';
await launchUrlString(url, mode: LaunchMode.externalApplication); await launchUrlString(url, mode: LaunchMode.externalApplication);
} }
static Future<String> pickDateFromDatePicker(BuildContext context, {DateTime? initial, DateTime? firstDate, DateTime? lastDate}) async { static Future<String> pickDateFromDatePicker(BuildContext context, {DateTime? firstDate, DateTime? lastDate}) async {
DateTime? pickedDate = await showDatePicker( DateTime? pickedDate = await showDatePicker(
context: context, context: context,
initialDate: initial ?? DateTime.now(), //get today's date initialDate: DateTime.now(), //get today's date
firstDate: firstDate ?? DateTime.now(), //DateTime.now() - not to allow to choose before today. firstDate: firstDate ?? DateTime.now(), //DateTime.now() - not to allow to choose before today.
lastDate: lastDate ?? DateTime(2101)); lastDate: lastDate ?? DateTime(2101));
@ -84,10 +60,7 @@ class Utils {
} }
static Future<String> pickTime(BuildContext context, {TimeOfDay? initialTime}) async { static Future<String> pickTime(BuildContext context, {TimeOfDay? initialTime}) async {
TimeOfDay? timeOfDay = await showTimePicker( TimeOfDay? timeOfDay = await showTimePicker(context: context, initialTime: initialTime ?? TimeOfDay.now());
context: context,
initialTime: initialTime ?? TimeOfDay.now(),
);
if (timeOfDay == null) { if (timeOfDay == null) {
return ""; return "";
@ -220,7 +193,7 @@ class Utils {
return MyColors.adPendingStatusColor; return MyColors.adPendingStatusColor;
case AdPostStatus.pendingForPayment: case AdPostStatus.pendingForPayment:
return MyColors.submittedColor; return MyColors.adPendingStatusColor;
case AdPostStatus.rejected: case AdPostStatus.rejected:
return MyColors.adCancelledStatusColor; return MyColors.adCancelledStatusColor;
@ -229,11 +202,10 @@ class Utils {
return MyColors.adCancelledStatusColor; return MyColors.adCancelledStatusColor;
case AdPostStatus.pendingForPost: case AdPostStatus.pendingForPost:
case AdPostStatus.pendingForActive: return MyColors.adPendingStatusColor;
return MyColors.inProgressColor;
case AdPostStatus.active: case AdPostStatus.active:
return MyColors.greenColor; return MyColors.adActiveStatusColor;
case AdPostStatus.expired: case AdPostStatus.expired:
return MyColors.adCancelledStatusColor; return MyColors.adCancelledStatusColor;
@ -244,9 +216,6 @@ class Utils {
case AdPostStatus.reserved: case AdPostStatus.reserved:
return MyColors.primaryColor; return MyColors.primaryColor;
case AdPostStatus.deActive:
return MyColors.textColor;
case AdPostStatus.buyingService: case AdPostStatus.buyingService:
case AdPostStatus.reserveCancel: case AdPostStatus.reserveCancel:
case AdPostStatus.allAds: case AdPostStatus.allAds:
@ -254,202 +223,45 @@ class Utils {
} }
} }
static Color getChipColorByRequestStatus(RequestStatusEnum requestStatus) { static Color getChipColorByRequestStatus(RequestStatus requestStatus) {
switch (requestStatus) { switch (requestStatus) {
case RequestStatusEnum.pending: case RequestStatus.pending:
return MyColors.pendingColor;
case RequestStatusEnum.submitted:
return MyColors.submittedColor;
case RequestStatusEnum.inProgress:
return MyColors.inProgressColor;
case RequestStatusEnum.completed:
return MyColors.completedColor;
case RequestStatusEnum.cancelled:
return MyColors.cancelledColor;
case RequestStatusEnum.paid:
return MyColors.paidColor;
case RequestStatusEnum.expired:
return MyColors.expiredColor;
case RequestStatusEnum.shipping:
return MyColors.shippingColor;
case RequestStatusEnum.delivery:
return MyColors.deliveryColor;
case RequestStatusEnum.selfPickup:
return MyColors.selfPickupColor;
}
}
static Color getChipColorByRequestOfferStatusEnum(RequestOfferStatusEnum requestOfferStatusEnum) {
switch (requestOfferStatusEnum) {
case RequestOfferStatusEnum.offer:
return MyColors.pendingColor;
case RequestOfferStatusEnum.negotiate:
return MyColors.submittedColor;
case RequestOfferStatusEnum.accepted:
return MyColors.completedColor;
case RequestOfferStatusEnum.rejected:
return MyColors.cancelledColor;
case RequestOfferStatusEnum.cancel:
return MyColors.cancelledColor;
}
}
static String getNameByRequestOfferStatusEnum(RequestOfferStatusEnum requestOfferStatusEnum) {
switch (requestOfferStatusEnum) {
case RequestOfferStatusEnum.offer:
return "Offer";
case RequestOfferStatusEnum.negotiate:
return "Negotiate";
case RequestOfferStatusEnum.accepted:
return "Accepted";
case RequestOfferStatusEnum.rejected:
return "Rejected";
case RequestOfferStatusEnum.cancel:
return "Cancelled";
}
}
static String getNameByShippingRequestStatusEnum(ShippingRequestStatusEnum shippingRequestStatusEnum) {
switch (shippingRequestStatusEnum) {
case ShippingRequestStatusEnum.allRequests:
return "All Requests";
case ShippingRequestStatusEnum.initiated:
return "Initiated";
case ShippingRequestStatusEnum.inTransit:
return "In Transit";
case ShippingRequestStatusEnum.outForDelivery:
return "Out For Delivery";
case ShippingRequestStatusEnum.delivered:
return "Delivered";
case ShippingRequestStatusEnum.pending:
return "Pending";
}
}
static String getNameBySelfPickupRequestStatusEnum(SelfPickupRequestStatusEnum selfPickupRequestStatusEnum) {
switch (selfPickupRequestStatusEnum) {
case SelfPickupRequestStatusEnum.allRequests:
return "All Requests";
case SelfPickupRequestStatusEnum.pending:
return "Pending";
case SelfPickupRequestStatusEnum.preparingToCollect:
return "Preparing To Collect";
case SelfPickupRequestStatusEnum.readyToCollect:
return "Ready To Collect";
case SelfPickupRequestStatusEnum.collected:
return "Collected";
}
}
static Color getChipColorByShippingRequestStatusEnum(ShippingRequestStatusEnum shippingRequestStatusEnum) {
switch (shippingRequestStatusEnum) {
case ShippingRequestStatusEnum.allRequests:
return MyColors.submittedColor;
case ShippingRequestStatusEnum.initiated:
return MyColors.submittedColor;
case ShippingRequestStatusEnum.inTransit:
return MyColors.shippingColor;
case ShippingRequestStatusEnum.outForDelivery:
return MyColors.deliveryColor;
case ShippingRequestStatusEnum.delivered:
return MyColors.greenColor;
case ShippingRequestStatusEnum.pending:
return MyColors.pendingColor;
}
}
static Color getChipColorBySelfPickupRequestStatusEnum(SelfPickupRequestStatusEnum selfPickupRequestStatusEnum) {
switch (selfPickupRequestStatusEnum) {
case SelfPickupRequestStatusEnum.allRequests:
return MyColors.submittedColor;
case SelfPickupRequestStatusEnum.pending:
return MyColors.pendingColor;
case SelfPickupRequestStatusEnum.preparingToCollect:
return MyColors.submittedColor;
case SelfPickupRequestStatusEnum.readyToCollect:
return MyColors.shippingColor;
case SelfPickupRequestStatusEnum.collected:
return MyColors.deliveryColor;
}
}
static Color getChipColorByBranchStatus(BranchStatusEnum branchStatusEnum) {
switch (branchStatusEnum) {
case BranchStatusEnum.pending:
return MyColors.adPendingStatusColor;
case BranchStatusEnum.review:
return MyColors.adPendingStatusColor; return MyColors.adPendingStatusColor;
case RequestStatus.submitted:
return MyColors.lightTextColor;
case BranchStatusEnum.rejected: case RequestStatus.inProgress:
return MyColors.adCancelledStatusColor; return MyColors.lightTextColor;
case BranchStatusEnum.deactivated:
return MyColors.adCancelledStatusColor;
case BranchStatusEnum.blocked:
return MyColors.expiredColor;
case BranchStatusEnum.approvedOrActive: case RequestStatus.completed:
return MyColors.greenColor; return MyColors.greenColor;
}
}
static String getChipStatusTextByBranchStatus(BranchStatusEnum branchStatusEnum) {
switch (branchStatusEnum) {
case BranchStatusEnum.pending:
return "Pending Approval";
case BranchStatusEnum.review:
return "In Review";
case BranchStatusEnum.rejected: case RequestStatus.cancelled:
return "Rejected"; return MyColors.redColor;
case BranchStatusEnum.deactivated: case RequestStatus.paid:
return "Deactivated"; return MyColors.greenColor;
case BranchStatusEnum.blocked: case RequestStatus.expired:
return "Blocked"; return MyColors.redColor;
case BranchStatusEnum.approvedOrActive: case RequestStatus.shipping:
return "Active"; return MyColors.greenColor;
} }
} }
static statusContainerChip({ static statusContainerChip(
required String text, {required String text, EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 3, horizontal: 6), Color chipColor = MyColors.greenColor, Color textColor = MyColors.white}) {
EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 3, horizontal: 6),
Color chipColor = MyColors.greenColor,
Color textColor = MyColors.white,
}) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: chipColor, color: chipColor,
borderRadius: const BorderRadius.all(Radius.circular(200)),
), ),
padding: padding, padding: padding,
child: text.toText(fontSize: 10, color: textColor, letterSpacing: -0.50)); child: text.toText(
fontSize: 10,
color: textColor,
));
} }
static InputDecoration txtField(String label) { static InputDecoration txtField(String label) {
@ -626,176 +438,15 @@ class Utils {
} }
static String getAdsPaymentBrowserForm({required int paymentId, required int adId}) { static String getAdsPaymentBrowserForm({required int paymentId, required int adId}) {
return '<html> <head></head><body><form id="paymentForm" action="${ApiConsts.paymentWebViewUrl}" method="post"><input type="hidden" name="PaymentType" value="$paymentId"><input type="hidden" name="AdsID" value="$adId"></form><script type="text/javascript"> document.getElementById("paymentForm").submit(); </script></body></html>'; return '<html> ' +
} '<head></head>' +
'<body>' +
// BOTTOM SHEETS '<form id="paymentForm" action="${ApiConsts.paymentWebViewUrl}" method="post">' +
static void showHelpBottomSheet(BuildContext context) { '<input type="hidden" name="PaymentType" value="$paymentId">' +
return actionConfirmationBottomSheet( '<input type="hidden" name="AdsID" value="$adId">' +
context: context, '</form>' +
title: LocaleKeys.help.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44), '<script type="text/javascript"> document.getElementById("paymentForm").submit(); </script>' +
subtitle: LocaleKeys.customerCarePrompt.tr(), '</body>' +
isOnlyOneButton: true, '</html>';
actionButtonYes: Expanded(
child: ShowFillButton(
maxHeight: 55,
title: LocaleKeys.callNow.tr(),
fontSize: 18,
onPressed: () {
pop(context);
},
),
),
actionButtonNo: const SizedBox(),
);
}
static Widget buildStatusContainer(String text, {double marginAll = 8, double fontSize = 14}) {
if (text.isEmpty) {
return const SizedBox();
}
return Center(
child: text.toText(color: MyColors.lightTextColor, fontSize: fontSize),
).toContainer(
marginAll: marginAll,
paddingAll: 15,
borderRadius: 8,
width: double.infinity,
backgroundColor: MyColors.grey98Color.withOpacity(0.1),
);
}
static Future<void> openLocationInMaps({required double latitude, required double longitude}) async {
final Uri googleMapsUrl = Uri.parse('https://www.google.com/maps/search/?api=1&query=$latitude,$longitude');
if (await canLaunchUrl(googleMapsUrl)) {
try {
await launchUrl(googleMapsUrl);
} catch (e) {
await launchUrl(googleMapsUrl);
}
}
}
static Future<ShareResult> shareAppInvitation() async {
ShareResult result = await Share.share(GlobalConsts.getAppInvitationLink(), subject: 'Join Mowater');
return result;
}
static Future<void> inviteFriend({required InviteTypeEnum inviteTypeEnum, required String message}) async {
String url;
switch (inviteTypeEnum) {
case InviteTypeEnum.whatsapp:
// WhatsApp requires a phone number and message, format like this:
url = 'https://wa.me/?text=${Uri.encodeComponent(message)}';
break;
case InviteTypeEnum.sms:
// SMS: 'sms:<phone_number>?body=<message>'
// You can add a phone number, or keep it empty to allow the user to input one.
url = 'sms:?body=${Uri.encodeComponent(message)}';
break;
case InviteTypeEnum.email:
// Email: 'mailto:<email>?subject=<subject>&body=<message>'
url = 'mailto:?subject=MowaterInvitation&body=${Uri.encodeComponent(message)}';
break;
}
// Try to launch the URL and catch any exceptions.
if (await canLaunchUrl(Uri.parse(url))) {
try {
await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication);
} catch (e) {
await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication);
}
}
}
static buildProviderContactInfoBottomSheet({required BuildContext context, required String? email, required String? mobileNo}) {
return showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
builder: (BuildContext context) {
return InfoBottomSheet(
title: LocaleKeys.contactDetails.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
description: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (mobileNo != null && mobileNo.isNotEmpty) ...[
CustomSettingOptionsTile(
leadingWidget: const Icon(
Icons.call,
size: 20,
color: MyColors.greyColor,
),
titleText: LocaleKeys.phoneNumber.tr(),
subTitle: " $mobileNo",
needBorderBelow: true,
showTrailingArrow: false,
subtitleTextColor: MyColors.greyColor,
onTap: () {
Utils.openNumberViaCaller(phoneNumber: mobileNo);
},
),
],
if (email != null && email.isNotEmpty) ...[
CustomSettingOptionsTile(
leadingWidget: const Icon(
Icons.email_outlined,
size: 20,
color: MyColors.greyColor,
),
titleText: LocaleKeys.emailAddress.tr(),
subTitle: " $email",
needBorderBelow: false,
showTrailingArrow: false,
subtitleTextColor: MyColors.greyColor,
onTap: () {
Utils.openEmailViaEmailApp(emailAddress: email);
},
),
],
30.height,
],
),
);
},
);
}
}
class NoInternetDialog {
static void show(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(
LocaleKeys.connectionProblem.tr(),
textAlign: TextAlign.center,
),
content: Text(
LocaleKeys.pleaseCheckConnection.tr(),
textAlign: TextAlign.center,
),
actions: [
ElevatedButton(
onPressed: () {
// // if (AppState().currentAppType == AppType.provider) {
// Navigator.of(context).pop();
Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.registerSelection, (Route<dynamic> route) => true);
},
child: const Text(
LocaleKeys.ok,
style: TextStyle(color: Colors.white),
),
),
],
);
},
);
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,7 +1,7 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
class BaseVM extends ChangeNotifier { class BaseVM extends ChangeNotifier {
ViewState _state = ViewState.idle; ViewState _state = ViewState.idle;
bool isInternetConnection = true; bool isInternetConnection = true;

@ -1,10 +1,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
@ -16,21 +13,18 @@ import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart'; import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
import 'package:mc_common_app/repositories/chat_repo.dart'; import 'package:mc_common_app/repositories/chat_repo.dart';
import 'package:mc_common_app/repositories/request_repo.dart'; import 'package:mc_common_app/repositories/request_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:signalr_core/signalr_core.dart'; import 'package:signalr_core/signalr_core.dart';
import 'package:easy_localization/easy_localization.dart';
class ChatVM extends BaseVM { class ChatVM extends ChangeNotifier {
final ChatRepo chatRepo; final ChatRepo chatRepo;
final RequestRepo requestRepo; final RequestRepo requestRepo;
final CommonAppServices commonServices;
ChatVM({required this.chatRepo, required this.requestRepo, required this.commonServices}); ChatVM({required this.chatRepo, required this.requestRepo});
HubConnection? hubConnection; HubConnection? hubConnection;
@ -52,110 +46,25 @@ class ChatVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
bool acknowledgePaymentToMowaterStatus = false;
updateAcknowledgePaymentToMowaterStatus(var value) {
acknowledgePaymentToMowaterStatus = value;
notifyListeners();
}
bool isUserOnChatScreen = false;
final ScrollController scrollController = ScrollController();
void scrollChatDown() {
if (!isUserOnChatScreen) {
return;
}
if (scrollController.hasClients) {
scrollController.animateTo(
scrollController.position.maxScrollExtent + 200, // for the text field
duration: const Duration(seconds: 1),
curve: Curves.fastOutSlowIn,
);
}
}
List<OfferRequestCommentModel> dealOptionsModelList = [
OfferRequestCommentModel(
index: 0,
isSelected: false,
title: LocaleKeys.dealCompleted.tr(),
),
OfferRequestCommentModel(
index: 1,
isSelected: false,
title: LocaleKeys.theDealNotCompleted.tr(),
),
];
updateIsSelectedInDealOptionsModelList(int index, bool value) {
for (var element in dealOptionsModelList) {
element.isSelected = false;
}
dealOptionsModelList[index].isSelected = true;
notifyListeners();
}
List<int> indexesForCancelSpecialCarOffer = [0, 1, 6, 10];
List<int> indexesForCancelSparePartOffer = [2, 10];
List<int> indexesForRejectOffer = [3, 4, 10];
List<int> indexesForDealNotCompleted = [7, 4, 8, 9, 10];
List<OfferRequestCommentModel> offerRejectModelList = [ List<OfferRequestCommentModel> offerRejectModelList = [
OfferRequestCommentModel( OfferRequestCommentModel(
index: 0, index: 0,
isSelected: true,
title: LocaleKeys.dealOutsideApp.tr(),
),
OfferRequestCommentModel(
index: 1,
isSelected: false,
title: LocaleKeys.noAgreementCustomer.tr(),
),
OfferRequestCommentModel(
index: 2,
isSelected: false, isSelected: false,
title: LocaleKeys.itemNoLongerAvailable.tr(),
),
OfferRequestCommentModel(
index: 3,
isSelected: true,
title: LocaleKeys.changedMind.tr(), title: LocaleKeys.changedMind.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 4, index: 1,
isSelected: false, isSelected: false,
title: LocaleKeys.veryHighPrice.tr(), title: LocaleKeys.veryHighPrice.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 5, index: 2,
isSelected: false, isSelected: false,
title: LocaleKeys.alreadySold.tr(), title: LocaleKeys.alreadySold.tr(),
), ),
OfferRequestCommentModel( OfferRequestCommentModel(
index: 6, index: 3,
isSelected: false, isSelected: true,
title: LocaleKeys.customerNotResponding.tr(),
),
OfferRequestCommentModel(
index: 7,
isSelected: false,
title: LocaleKeys.cancelRequest.tr(),
),
OfferRequestCommentModel(
index: 8,
isSelected: false,
title: LocaleKeys.offerNotMatched.tr(),
),
OfferRequestCommentModel(
index: 9,
isSelected: false,
title: LocaleKeys.testTheService.tr(),
),
OfferRequestCommentModel(
index: 10,
isSelected: false,
title: LocaleKeys.otherVar.tr(), title: LocaleKeys.otherVar.tr(),
), ),
]; ];
@ -164,17 +73,10 @@ class ChatVM extends BaseVM {
for (var value in offerRejectModelList) { for (var value in offerRejectModelList) {
value.isSelected = false; value.isSelected = false;
} }
selectedOfferRequestCommentModel = offerRejectModelList[index];
offerRejectModelList[index].isSelected = true; offerRejectModelList[index].isSelected = true;
notifyListeners(); notifyListeners();
} }
OfferRequestCommentModel selectedOfferRequestCommentModel = OfferRequestCommentModel(
index: 0,
isSelected: true,
title: LocaleKeys.changedMind.tr(),
);
String rejectOfferDescription = ""; String rejectOfferDescription = "";
String rejectOfferDescriptionError = ""; String rejectOfferDescriptionError = "";
@ -187,9 +89,6 @@ class ChatVM extends BaseVM {
//REJECTING OFFER //REJECTING OFFER
bool isRejectOfferButtonValidated() { bool isRejectOfferButtonValidated() {
if (selectedOfferRequestCommentModel.index != offerRejectModelList.length - 1) {
return true;
}
bool isValidated = true; bool isValidated = true;
if (rejectOfferDescription.isEmpty) { if (rejectOfferDescription.isEmpty) {
rejectOfferDescriptionError = GlobalConsts.descriptionError; rejectOfferDescriptionError = GlobalConsts.descriptionError;
@ -203,307 +102,159 @@ class ChatVM extends BaseVM {
return isValidated; return isValidated;
} }
Future<void> onNewMessageReceivedForRequestOffer({required List<ChatMessageModel> messages, bool isMyOwnOffer = false, required RequestsVM requestsVM}) async { Future<void> onNewMessageReceived(
{required List<ChatMessageModel> messages,
required BuildContext context,
bool isMyOwnOffer = false}) async {
// log("message I received in onNewMessageReceived ${messages.first.toString()}");
if (AppState().currentAppType == AppType.customer) { if (AppState().currentAppType == AppType.customer) {
for (var currentMessage in messages) { for (var msg in messages) {
logger.i(currentMessage); int providerIndex = serviceProviderOffersList.indexWhere(
(element) => element.providerUserId == msg.senderUserID);
int providerIndex = serviceProviderOffersList.indexWhere((element) => element.providerUserId == currentMessage.senderUserID);
if (providerIndex != -1) { if (providerIndex != -1) {
if (currentMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer) { serviceProviderOffersList[providerIndex].chatMessages!.add(msg);
for (var chatMessage in serviceProviderOffersList[providerIndex].chatMessages!) {
if (chatMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer && chatMessage.reqOffer!.id == currentMessage.reqOffer!.id) {
chatMessage.reqOffer!.requestOfferStatusEnum = currentMessage.reqOffer!.requestOfferStatusEnum;
}
}
}
serviceProviderOffersList[providerIndex].chatMessages!.add(currentMessage);
scrollChatDown();
} }
} }
} else { } else {
for (var currentMessage in messages) { for (var msg in messages) {
logger.i(currentMessage);
// Where we need to call this function for saving a message in chat we will use receiverUserID and in those cases where received ID is null , it means it is a signal R call // Where we need to call this function for saving a message in chat we will use receiverUserID and in those cases where received ID is null , it means it is a signal R call
int requestIndex = -1; int providerIndex = -1;
if (isMyOwnOffer) { if (isMyOwnOffer) {
requestIndex = requestsVM.myFilteredRequests.indexWhere((element) => (element.customerUserID == currentMessage.receiverUserID && element.id == currentMessage.requestID)); providerIndex =
context.read<RequestsVM>().myFilteredRequests.indexWhere(
(element) => element.customerUserID == msg.receiverUserID,
);
} else { } else {
requestIndex = requestsVM.myFilteredRequests.indexWhere((element) => (element.customerUserID == currentMessage.senderUserID && element.id == currentMessage.requestID)); providerIndex =
context.read<RequestsVM>().myFilteredRequests.indexWhere(
(element) => element.customerUserID == msg.senderUserID,
);
} }
log("requestIndex: $requestIndex"); // log("here is it: $providerIndex");
if (requestIndex != -1) { // log("here is it: ${msg.senderUserID}");
if (currentMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer) { // log("here is it: ${context.read<RequestsVM>().myFilteredRequests.first.customerUserID.toString()}");
for (var chatMessage in requestsVM.myFilteredRequests[requestIndex].chatMessages) { if (providerIndex != -1) {
if (chatMessage.chatMessageTypeEnum == ChatMessageTypeEnum.offer && chatMessage.reqOffer!.id == currentMessage.reqOffer!.id) { context
logger.i("chatMessage reqOfferID: ${chatMessage.reqOffer!.id.toString()}"); .read<RequestsVM>()
logger.i("currentMessage reqOfferID: ${currentMessage.reqOffer!.id.toString()}"); .addChatMessagesInRequestsModel(msg: msg, index: providerIndex);
chatMessage.reqOffer!.requestOfferStatusEnum = currentMessage.reqOffer!.requestOfferStatusEnum;
}
}
}
requestsVM.addChatMessagesInRequestsModel(msg: currentMessage, index: requestIndex);
scrollChatDown();
} }
} }
} }
notifyListeners();
}
void _subscribeToReceiveRequestOfferMessages(BuildContext context) {
hubConnection!.on(SignalrConsts.receiveMessageRequestOffer, (List<Object?>? arguments) {
logger.i(arguments);
if (arguments == null || arguments.isEmpty) return;
List<ChatMessageModel> chat = [];
for (var message in arguments) {
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>, isForReqOfferImagesURLs: true);
chat.add(chatMessage);
}
onNewMessageReceivedForRequestOffer(messages: chat, requestsVM: context.read<RequestsVM>());
// Utils.showToast(arguments.toString());
});
}
Future<bool> markMessagesAsRead(BuildContext context, List<int> messageIds, ChatTypeEnum chatTypeEnum) async { notifyListeners();
bool status = false;
try {
// Utils.showLoading(context);
status = await chatRepo.markMessageAsRead(messageIds: messageIds, chatTypeEnum: chatTypeEnum);
// Utils.hideLoading(context);
} catch (e) {
logger.i(e.toString());
Utils.showToast(e.toString());
// Utils.hideLoading(context);
status = false;
}
return status;
}
int _retryCount = 0;
final int _maxRetries = 5; // Maximum number of retries
bool _isReconnecting = false;
Future<void> _reconnectWithBackoff(BuildContext context) async {
if (_retryCount >= _maxRetries) {
logger.e("Maximum retry attempts reached. Stopping reconnection.");
return;
}
final delay = Duration(seconds: 2 * (_retryCount + 1)); // Exponential backoff
logger.i("Retrying connection in ${delay.inSeconds} seconds...");
await Future.delayed(delay);
_retryCount++;
await buildHubConnection(context); // Try reconnecting
} }
Future<void> buildHubConnection(BuildContext context) async { Future<void> buildHubConnection(BuildContext context) async {
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) { if (hubConnection == null ||
if (_isReconnecting) { hubConnection!.state != HubConnectionState.connected) {
logger.i("Reconnection already in progress");
return;
}
if (_isReconnecting) {
logger.i("Reconnection already in progress");
return;
}
try { try {
_isReconnecting = true;
hubConnection = await chatRepo.getHubConnection(); hubConnection = await chatRepo.getHubConnection();
await hubConnection!.start(); await hubConnection!.start();
hubConnection!.on("ReceiveMessageRequestOffer",
// Reset retry count on successful connection (List<Object?>? arguments) {
_retryCount = 0; if (arguments == null || arguments.isEmpty) return;
_isReconnecting = false; List<ChatMessageModel> chat = [];
for (var message in arguments) {
// Subscribe to messages final chatMessage =
_subscribeToReceiveRequestOfferMessages(context); ChatMessageModel.fromJson(message as Map<String, dynamic>);
_subscribeToReceiveAdMessages(context); chat.add(chatMessage);
_subscribeToReceiveGeneralMessages(context); }
onNewMessageReceived(messages: chat, context: context);
// Configure handlers logger.i("I received ping : ${arguments.toString()}");
hubConnection!.onclose((exception) async {
logger.i("onClose: ${exception.toString()}");
await _reconnectWithBackoff(context);
});
hubConnection!.onreconnecting((exception) {
logger.i("onReconnecting: ${exception?.toString()}");
});
hubConnection!.onreconnected((connectionId) {
logger.i("onReconnected: ${connectionId.toString()}");
}); });
} catch (e) { } catch (e) {
logger.e("Error during hub connection setup: ${e.toString()}"); logger.i("Error: ${e.toString()}");
_isReconnecting = false; // Reset on failure
} }
notifyListeners(); notifyListeners();
} else {
logger.i("Hub Already Connected: ${hubConnection!.connectionId.toString()}");
}
}
Future<void> closeHubConnection() async {
if (hubConnection != null && hubConnection!.state == HubConnectionState.connected) {
hubConnection!.stop();
} }
} }
Future<bool> onOfferSendForRequest({ Future<bool> onSendMessageForRequestOffer({
required String receiverId, required String receiverId,
required ChatMessageTypeEnum chatMessageType, required ChatMessageTypeEnum chatMessageType,
required String message, required String message,
required int requestId, required int requestId,
required String offerPrice, required String offerPrice,
required bool isDeliveryAvailable,
required RequestDeliveryOptionEnum offerDeliveryOption,
required String serviceItemName,
required String manufacturedByName,
required String manufacturedOn,
required List<dynamic> offerImages,
required BuildContext context, required BuildContext context,
}) async { }) async {
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) { if (hubConnection == null ||
logger.i("Hub Not Connected!!"); hubConnection!.state != HubConnectionState.connected) {
await buildHubConnection(context); await buildHubConnection(context);
} }
if (hubConnection!.state == HubConnectionState.connected) { if (hubConnection!.state == HubConnectionState.connected) {
final providerId = AppState().getUser.data!.userInfo!.providerId; final providerId = AppState().getUser.data!.userInfo!.providerId;
final obj = <String, dynamic>{
"ReceiverUserID": receiverId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": message,
"RequestID": requestId,
"ReqOfferID": 0,
"ReqOffer": <String, dynamic>{
"RequestID": requestId,
"Price": double.parse(offerPrice),
"IsDeliveryAvailable": isDeliveryAvailable,
"OfferDeliveryOption": offerDeliveryOption.getIdRequestDeliveryOptionEnum(),
"ServiceItem": serviceItemName,
"ReqOfferImages": offerImages,
"OfferedItemCreatedByName": manufacturedByName,
// "OfferedItemCreatedOn": manufacturedOn, // TODO: This should be in String on Server, Right now it is in DateTime
"ServiceProviderID": providerId,
"OfferStatus": RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(),
"Comment": message,
},
};
logger.i(obj);
hubConnection!.invoke( hubConnection!.invoke(
SignalrConsts.sendMessageRequestOffer, "SendMessageRequestOffer",
args: <Object>[obj], args: <Object>[
<String, dynamic>{
"ReceiverUserID": receiverId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": message,
"RequestID": requestId,
"ReqOfferID": 0,
"ReqOffer": <String, dynamic>{
"RequestID": requestId,
"Price": double.parse(offerPrice),
"ServiceProviderID": providerId,
"OfferStatus": RequestOfferStatusEnum.offer
.getIdFromRequestOfferStatusEnum(),
"Comment": message,
},
}
],
).catchError((e) { ).catchError((e) {
logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}"); logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}");
Utils.showToast(e.toString()); Utils.showToast(e.toString());
return false; return false;
}); });
} }
return true; return true;
} }
MessageImageModel convertFileToMessageImageModel({required File file}) { Future<bool> onTextMessageSend({
List<int> imageBytes = file.readAsBytesSync();
String image = base64Encode(imageBytes);
MessageImageModel vehiclePostingImages = MessageImageModel(imageStr: image, id: 0, isFromNetwork: false, reqOfferID: latestOfferId, imagePath: file.path);
return vehiclePostingImages;
}
List<MessageImageModel> getMessagesImageList() {
List<MessageImageModel> requestImages = [];
for (var image in pickedImagesForMessage) {
var value = convertFileToMessageImageModel(file: File(image.filePath!));
requestImages.add(value);
}
return requestImages;
}
List<ImageModel> pickedImagesForMessage = [];
void removeImageFromList(String filePath) {
int index = pickedImagesForMessage.indexWhere((element) => element.filePath == filePath);
if (index == -1) {
return;
}
pickedImagesForMessage.removeAt(index);
notifyListeners();
}
void pickMultipleImages() async {
List<ImageModel> imageModels = [];
List<File> images = await commonServices.pickMultipleImages();
for (var element in images) {
imageModels.add(ImageModel(filePath: element.path, isFromNetwork: false));
}
pickedImagesForMessage.addAll(imageModels);
if (pickedImagesForMessage.length > GlobalConsts.maxFileCount) {
pickedImagesForMessage = pickedImagesForMessage.sublist(0, GlobalConsts.maxFileCount);
Utils.showToast(LocaleKeys.maxFileSelection);
}
notifyListeners();
}
void clearPickedImagesForMessage() {
pickedImagesForMessage.clear();
notifyListeners();
}
Future<bool> onMessageSendForRequest({
required String receiverId, required String receiverId,
required ChatMessageTypeEnum chatMessageType, required ChatMessageTypeEnum chatMessageType,
required String message, required String message,
required int requestId, required int requestId,
required String offerPrice,
required BuildContext context, required BuildContext context,
}) async { }) async {
if (chatMessageType == ChatMessageTypeEnum.freeText && message.isEmpty) return false; if (message.isEmpty) return false;
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) { if (hubConnection == null ||
logger.i("Hub Not Connected!!"); hubConnection!.state != HubConnectionState.connected) {
await buildHubConnection(context); await buildHubConnection(context);
} }
if (hubConnection!.state == HubConnectionState.connected) { if (hubConnection!.state == HubConnectionState.connected) {
final userId = AppState().getUser.data!.userInfo!.userId.toString(); final userId = AppState().getUser.data!.userInfo!.userId.toString();
final name = AppState().getUser.data!.userInfo!.firstName.toString(); final name = AppState().getUser.data!.userInfo!.firstName.toString();
List<Map<String, dynamic>> requestImagesMap = [];
List<MessageImageModel> messageImages = getMessagesImageList(); log("I have saved this: ${(<String, dynamic>{
if (messageImages.isNotEmpty && chatMessageType == ChatMessageTypeEnum.image) {
for (var element in messageImages) {
requestImagesMap.add(element.toJson());
}
}
final obj = <String, dynamic>{
"ReceiverUserID": receiverId, "ReceiverUserID": receiverId,
"SenderUserID": userId, "SenderUserID": userId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(), "MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": chatMessageType == ChatMessageTypeEnum.image ? "${messageImages.length} Image(s)" : message, "ChatText": message,
"RequestID": requestId, "RequestID": requestId,
"ReqOfferID": latestOfferId, "ReqOfferID": latestOfferId,
}; }).toString()}");
if (chatMessageType == ChatMessageTypeEnum.image) {
obj.addAll({"ReqOfferImages": requestImagesMap});
}
logger.i(obj);
hubConnection!.invoke( hubConnection!.invoke(
SignalrConsts.sendMessageRequestOffer, "SendMessageRequestOffer",
args: <Object>[obj], args: <Object>[
<String, dynamic>{
"ReceiverUserID": receiverId,
"SenderUserID": userId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": message,
"RequestID": requestId,
"ReqOfferID": latestOfferId,
}
],
).catchError((e) { ).catchError((e) {
logger.i("error in invoking SendMessage: ${e.toString()}"); logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}");
Utils.showToast(e.toString()); Utils.showToast(e.toString());
return false; return false;
}); });
ChatMessageModel chatMessageModel = ChatMessageModel( ChatMessageModel chatMessageModel = ChatMessageModel(
messageType: chatMessageType.getIdFromChatMessageTypeEnum(), messageType: chatMessageType.getIdFromChatMessageTypeEnum(),
chatText: message, chatText: message,
@ -511,21 +262,26 @@ class ChatVM extends BaseVM {
requestID: requestId, requestID: requestId,
senderName: name, senderName: name,
senderUserID: userId, senderUserID: userId,
chatMessageTypeEnum: chatMessageType, chatMessageTypeEnum: ChatMessageTypeEnum.freeText,
receiverUserID: receiverId, receiverUserID: receiverId,
messageImages: messageImages,
); );
if (AppState().currentAppType == AppType.customer) { if (AppState().currentAppType == AppType.customer) {
int providerIndex = serviceProviderOffersList.indexWhere((element) => element.providerUserId == receiverId); int providerIndex = serviceProviderOffersList
.indexWhere((element) => element.providerUserId == receiverId);
if (providerIndex != -1) { if (providerIndex != -1) {
serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel); serviceProviderOffersList[providerIndex]
.chatMessages!
.add(chatMessageModel);
} }
} else { } else {
int providerIndex = context.read<RequestsVM>().myFilteredRequests.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId)); int providerIndex = context
log("providerIndex2:$providerIndex"); .read<RequestsVM>()
.myFilteredRequests
.indexWhere((element) => element.customerUserID == receiverId);
if (providerIndex != -1) { if (providerIndex != -1) {
context.read<RequestsVM>().addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex); context.read<RequestsVM>().addChatMessagesInRequestsModel(
msg: chatMessageModel, index: providerIndex);
} }
} }
return true; return true;
@ -535,28 +291,24 @@ class ChatVM extends BaseVM {
List<ServiceProvidersOffers> serviceProviderOffersList = []; List<ServiceProvidersOffers> serviceProviderOffersList = [];
Future<void> getOffersFromProvidersByRequest({required int requestId, bool isNeedLoading = true}) async { Future<void> getOffersFromProvidersByRequest(
{required int requestId, required BuildContext context}) async {
try { try {
if (isNeedLoading) { Utils.showLoading(context);
setState(ViewState.busy); ProviderOffersModel providerOffersModel = await requestRepo
} .getOffersFromProvidersByRequest(requestId: requestId);
ProviderOffersModel providerOffersModel = await requestRepo.getOffersFromProvidersByRequest(requestId: requestId); Utils.hideLoading(context);
if (isNeedLoading) {
setState(ViewState.idle);
}
serviceProviderOffersList.clear(); serviceProviderOffersList.clear();
serviceProviderOffersList = providerOffersModel.serviceProviders ?? []; serviceProviderOffersList = providerOffersModel.serviceProviders ?? [];
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {
logger.i(e.toString()); logger.i(e.toString());
Utils.showToast(e.toString()); Utils.showToast(e.toString());
if (isNeedLoading) { Utils.hideLoading(context);
setState(ViewState.idle);
}
} }
} }
Future<void> getRequestsChatMessagesForCustomer({ Future<void> getUsersChatMessagesForCustomer({
required BuildContext context, required BuildContext context,
required int providerId, required int providerId,
required int requestOfferId, required int requestOfferId,
@ -566,32 +318,21 @@ class ChatVM extends BaseVM {
try { try {
int customerId = AppState().getUser.data!.userInfo!.customerId!; int customerId = AppState().getUser.data!.userInfo!.customerId!;
Utils.showLoading(context); Utils.showLoading(context);
List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessagesForRequests(providerId: providerId, customerId: customerId, requestOfferId: requestOfferId, requestId: requestId); List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessages(
providerId: providerId,
customerId: customerId,
requestOfferId: requestOfferId,
requestId: requestId);
serviceProviderOffersList[providerOfferIndex].chatMessages = chatMessages; serviceProviderOffersList[providerOfferIndex].chatMessages = chatMessages;
if (serviceProviderOffersList[providerOfferIndex].chatMessages != null) { if (serviceProviderOffersList[providerOfferIndex].chatMessages != null) {
for (var message in serviceProviderOffersList[providerOfferIndex].chatMessages!) { for (var message
in serviceProviderOffersList[providerOfferIndex].chatMessages!) {
if (message.chatMessageTypeEnum == ChatMessageTypeEnum.offer) { if (message.chatMessageTypeEnum == ChatMessageTypeEnum.offer) {
updateLatestOfferId(message.reqOfferID ?? 0); updateLatestOfferId(message.reqOfferID ?? 0);
if (message.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted) {
context.read<RequestsVM>().updateAcceptedReqOffer(message.reqOffer!);
context.read<RequestsVM>().updateAcceptedRequestOfferProviderName(serviceProviderOffersList[providerOfferIndex].name ?? "");
}
log("latestOfferId: $latestOfferId"); log("latestOfferId: $latestOfferId");
} }
} }
} }
List<int> unreadMessageIds = [];
for (var msg in chatMessages) {
if (!msg.isRead! && !msg.isMyMessage!) {
unreadMessageIds.add(msg.id!);
}
}
if (unreadMessageIds.isNotEmpty) {
log("unreadMessageIds: ${unreadMessageIds.toString()}");
await markMessagesAsRead(context, unreadMessageIds, ChatTypeEnum.requestOffer);
}
Utils.hideLoading(context); Utils.hideLoading(context);
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {
@ -601,7 +342,7 @@ class ChatVM extends BaseVM {
} }
} }
Future<void> getRequestsChatMessagesForProvider({ Future<void> getUsersChatMessagesForProvider({
required BuildContext context, required BuildContext context,
required int customerId, required int customerId,
required int requestOfferId, required int requestOfferId,
@ -611,17 +352,13 @@ class ChatVM extends BaseVM {
try { try {
int providerId = AppState().getUser.data!.userInfo!.providerId!; int providerId = AppState().getUser.data!.userInfo!.providerId!;
Utils.showLoading(context); Utils.showLoading(context);
List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessagesForRequests(providerId: providerId, customerId: customerId, requestOfferId: requestOfferId, requestId: requestId); List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessages(
await context.read<RequestsVM>().overwriteChatMessagesInRequestsModel(messages: chatMessages, index: customerRequestIndex, context: context); providerId: providerId,
List<int> unreadMessageIds = []; customerId: customerId,
for (var msg in chatMessages) { requestOfferId: requestOfferId,
if (!msg.isRead! && !msg.isMyMessage!) { requestId: requestId);
unreadMessageIds.add(msg.id!); context.read<RequestsVM>().overwriteChatMessagesInRequestsModel(
} messages: chatMessages, index: customerRequestIndex);
}
if (unreadMessageIds.isNotEmpty) {
await markMessagesAsRead(context, unreadMessageIds, ChatTypeEnum.requestOffer);
}
Utils.hideLoading(context); Utils.hideLoading(context);
} catch (e) { } catch (e) {
logger.i(e.toString()); logger.i(e.toString());
@ -630,11 +367,16 @@ class ChatVM extends BaseVM {
} }
} }
Future<int> onActionOfferTapped({required BuildContext context, required RequestOfferStatusEnum requestOfferStatusEnum, required int reqOfferId, required String comments}) async { Future<int> onActionOfferTapped(
Utils.showLoading(context); {required BuildContext context,
required RequestOfferStatusEnum requestOfferStatusEnum,
required int reqOfferId}) async {
try { try {
GenericRespModel genericRespModel = await requestRepo.updateRequestOfferStatus(requestOfferStatusEnum: requestOfferStatusEnum, requestOfferId: reqOfferId, comments: comments); Utils.showLoading(context);
Utils.showToast(genericRespModel.message.toString()); GenericRespModel genericRespModel =
await requestRepo.updateOfferRequestStatus(
requestOfferStatusEnum: requestOfferStatusEnum,
requestOfferId: reqOfferId);
Utils.hideLoading(context); Utils.hideLoading(context);
return genericRespModel.messageStatus == 1 ? reqOfferId : -1; return genericRespModel.messageStatus == 1 ? reqOfferId : -1;
} catch (e) { } catch (e) {
@ -644,275 +386,4 @@ class ChatVM extends BaseVM {
return -1; return -1;
} }
} }
Future<bool> onSendMessageForActionOnRequestOffer({
required String receiverId,
required ChatMessageTypeEnum chatMessageType,
required String comments,
required int requestId,
required int serviceProviderID,
required int requestOfferID,
required String offerPrice,
required bool isDeliveryAvailable,
required RequestDeliveryOptionEnum offerDeliveryOption,
required String serviceItemName,
required String manufacturedByName,
required String manufacturedOn,
required RequestOfferStatusEnum requestOfferStatusEnum,
required BuildContext context,
}) async {
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!");
await buildHubConnection(context);
}
if (hubConnection!.state == HubConnectionState.connected) {
var obj = <String, dynamic>{
"ReceiverUserID": receiverId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": comments,
"RequestID": requestId,
"ReqOfferID": requestOfferID,
"ReqOffer": <String, dynamic>{
"ID": requestOfferID,
"RequestID": requestId,
"Price": double.parse(offerPrice),
"ServiceItem": serviceItemName,
"OfferedItemCreatedByName": manufacturedByName,
"IsDeliveryAvailable": isDeliveryAvailable,
"OfferDeliveryOption": offerDeliveryOption.getIdRequestDeliveryOptionEnum(),
// We have commented this because Backend Team is using their server time for this. It was the time offer created by
// "OfferedItemCreatedOn": manufacturedOn,
"ServiceProviderID": serviceProviderID,
"OfferStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum(),
"Comment": comments,
},
};
logger.i(obj);
hubConnection!.invoke(
SignalrConsts.sendMessageRequestOffer,
args: <Object>[obj],
).catchError((e) {
logger.i("error in invoking SendMessageRequestOffer: ${e.toString()}");
Utils.showToast(e.toString());
return false;
});
}
return true;
}
// =================== Ads ======================
List<ChatMessageModel> currentMessagesForAds = [];
Future<void> getUsersChatMessagesForAd({required BuildContext context, int? adID, int? adsChatBuyerId, String? userID, String? senderName, required bool isForBuyer}) async {
try {
Utils.showLoading(context);
currentMessagesForAds = await chatRepo.getUsersChatMessagesForAds(userID: userID, adID: adID, isForBuyer: isForBuyer, adsChatBuyerId: adsChatBuyerId);
Utils.hideLoading(context);
List<int> unreadMessageIds = [];
for (var msg in currentMessagesForAds) {
msg.senderName = senderName ?? "";
if (!msg.isRead! && !msg.isMyMessage!) {
unreadMessageIds.add(msg.id!);
}
}
if (unreadMessageIds.isNotEmpty) {
await markMessagesAsRead(context, unreadMessageIds, ChatTypeEnum.ads);
}
notifyListeners();
} catch (e) {
logger.i(e.toString());
Utils.showToast(e.toString());
Utils.hideLoading(context);
}
}
void _subscribeToReceiveAdMessages(BuildContext context) {
hubConnection!.on(SignalrConsts.receiveMessageAds, (List<Object?>? arguments) {
if (arguments == null || arguments.isEmpty) return;
List<ChatMessageModel> chat = [];
for (var message in arguments) {
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>);
chat.add(chatMessage);
}
onNewMessageReceivedForAds(messages: chat);
logger.i(arguments);
// Utils.showToast(arguments.toString());
});
}
Future<void> onNewMessageReceivedForAds({required List<ChatMessageModel> messages}) async {
for (var msg in messages) {
currentMessagesForAds.add(msg);
}
scrollChatDown();
notifyListeners();
}
Future<bool> onTextMessageSendForAds({
required String receiverId,
required ChatMessageTypeEnum chatMessageType,
required String message,
required int adId,
required BuildContext context,
}) async {
if (message.isEmpty) return false;
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!");
await buildHubConnection(context);
}
if (hubConnection!.state == HubConnectionState.connected) {
final userId = AppState().getUser.data!.userInfo!.userId.toString();
final name = AppState().getUser.data!.userInfo!.firstName.toString();
final obj = <String, dynamic>{
"ReceiverUserID": receiverId,
// "SenderUserID": userId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": message,
"AdsID": adId,
};
logger.i("$obj");
hubConnection!.invoke(
SignalrConsts.sendMessageAds,
args: <Object>[obj],
).catchError((e) {
logger.i("error in invoking SendMessage: ${e.toString()}");
Utils.showToast(e.toString());
return false;
});
ChatMessageModel chatMessageModel = ChatMessageModel(
messageType: chatMessageType.getIdFromChatMessageTypeEnum(),
chatText: message,
isMyMessage: true,
senderName: name,
senderUserID: userId,
chatMessageTypeEnum: ChatMessageTypeEnum.freeText,
receiverUserID: receiverId,
);
currentMessagesForAds.add(chatMessageModel);
notifyListeners();
if (AppState().currentAppType == AppType.customer) {
} else {}
return true;
}
return false;
}
// ========================General ==================
List<ChatMessageModel> currentMessagesForGeneralChat = [];
Future<void> getUsersChatMessagesForGeneralChat({required BuildContext context, int? adID, int? adsChatBuyerId, String? userID, String? senderName, required bool isForBuyer}) async {
try {
Utils.showLoading(context);
currentMessagesForGeneralChat = await chatRepo.getUsersChatMessagesForGeneralChat(userID: userID, adID: adID, isForBuyer: isForBuyer, adsChatBuyerId: adsChatBuyerId);
Utils.hideLoading(context);
List<int> unreadMessageIds = [];
for (var msg in currentMessagesForGeneralChat) {
msg.senderName = senderName ?? "";
if (!msg.isRead! && !msg.isMyMessage!) {
unreadMessageIds.add(msg.id!);
}
}
if (unreadMessageIds.isNotEmpty) {
await markMessagesAsRead(context, unreadMessageIds, ChatTypeEnum.general);
}
notifyListeners();
} catch (e) {
logger.i(e.toString());
Utils.showToast(e.toString());
Utils.hideLoading(context);
}
}
Future<void> onNewMessageReceivedForGeneral({required List<ChatMessageModel> messages}) async {
for (var msg in messages) {
currentMessagesForAds.add(msg);
}
scrollChatDown();
notifyListeners();
}
void _subscribeToReceiveGeneralMessages(BuildContext context) {
hubConnection!.on(SignalrConsts.receiveMessageGeneral, (List<Object?>? arguments) {
if (arguments == null || arguments.isEmpty) return;
List<ChatMessageModel> chat = [];
for (var message in arguments) {
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>);
chat.add(chatMessage);
}
onNewMessageReceivedForGeneral(messages: chat);
logger.i(arguments);
// Utils.showToast(arguments.toString());
});
}
Future<bool> onTextMessageSendForGeneralChat({
required String receiverId,
required ChatMessageTypeEnum chatMessageType,
required String message,
required int adId,
required BuildContext context,
}) async {
if (message.isEmpty) return false;
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!");
await buildHubConnection(context);
}
if (hubConnection!.state == HubConnectionState.connected) {
final userId = AppState().getUser.data!.userInfo!.userId.toString();
final name = AppState().getUser.data!.userInfo!.firstName.toString();
final obj = <String, dynamic>{
"ReceiverUserID": receiverId,
"MessageType": chatMessageType.getIdFromChatMessageTypeEnum(),
"ChatText": message,
};
logger.i("$obj");
hubConnection!.invoke(
SignalrConsts.sendMessageGeneral,
args: <Object>[obj],
).catchError((e) {
logger.i("error in invoking SendMessage: ${e.toString()}");
Utils.showToast(e.toString());
return false;
});
ChatMessageModel chatMessageModel = ChatMessageModel(
messageType: chatMessageType.getIdFromChatMessageTypeEnum(),
chatText: message,
isMyMessage: true,
senderName: name,
senderUserID: userId,
chatMessageTypeEnum: ChatMessageTypeEnum.freeText,
receiverUserID: receiverId,
);
currentMessagesForGeneralChat.add(chatMessageModel);
notifyListeners();
if (AppState().currentAppType == AppType.customer) {
} else {}
return true;
}
return false;
}
} }

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

Loading…
Cancel
Save