diff --git a/src/features/custom-trip/CustomTripDestinationDetailPage.tsx b/src/features/custom-trip/CustomTripDestinationDetailPage.tsx index fa29763..0d98dcb 100644 --- a/src/features/custom-trip/CustomTripDestinationDetailPage.tsx +++ b/src/features/custom-trip/CustomTripDestinationDetailPage.tsx @@ -93,6 +93,7 @@ export default function CustomTripDestinationDetailPage() { const [destIsActive, setDestIsActive] = useState(true) const [isDestSavedSuccess, setIsDestSavedSuccess] = useState(false) const [isDestDeleteOpen, setIsDestDeleteOpen] = useState(false) + const [isEditDestModalOpen, setIsEditDestModalOpen] = useState(false) const [isTogglingStatus, setIsTogglingStatus] = useState(false) const [isSavingDestination, setIsSavingDestination] = useState(false) @@ -438,12 +439,9 @@ export default function CustomTripDestinationDetailPage() { if (primaryNameEn) setDestNameEn(primaryNameEn) if (primaryDesc) setDestDescription(primaryDesc) setIsDestSavedSuccess(true) - - // Slight smooth delay to let user see the button loading state - await new Promise((resolve) => setTimeout(resolve, 450)) - - // Navigate back to the destinations list tab with a fresh refresh token - navigate('/custom-trip/destinations', { state: { refresh: Date.now() } }) + setIsEditDestModalOpen(false) + setIsSavingDestination(false) + setTimeout(() => setIsDestSavedSuccess(false), 3000) } catch (err) { console.error('Failed to save destination:', err) setIsSavingDestination(false) @@ -872,190 +870,385 @@ export default function CustomTripDestinationDetailPage() { {/* ========================================================================= */} - {/* TAB 1: DESTINATION INFO */} + {/* TAB 1: DESTINATION INFO (شناسنامه و مشخصات مقصد) */} {/* ========================================================================= */} {currentTab === 'info' && (
-
-
-
+ {/* کارت اصلی شناسنامه شهر */} +
+ {/* هدر: نام شهر، وضعیت و دکمه‌های اکشن */} +
+
+ {destFlag || destination.flag || '📍'}
-

- {destFlag || '📍'} - اطلاعات و شناسنامه شهر {destination.name} -

-

- ویرایش مشخصات اصلی، موقعیت کشور و توضیحات مقصد -

-
- - {isDestSavedSuccess && ( -
- - تغییرات با موفقیت ذخیره شد -
- )} -
- - {/* تنظیمات کلی شهر مقصد (کشور و وضعیت) */} -
- {/* 1. Country Selection with Radix Select */} -
- - -
- - {/* 2. Active Status Toggle Switch with Mini Spinner */} -
- -
-
+
+

+ {destination.name} +

+ {destination.nameEn && ( + + ({destination.nameEn}) + + )} + - - {destIsActive ? 'شهر فعال' : 'شهر غیرفعال'} - -
- + {destIsActive ? 'شهر فعال در سامانه' : 'شهر غیرفعال'} +
+

+ شناسنامه شهر، اماکن متبرکه، هتل‌های مرتبط و ترجمه‌های بین‌المللی مقصد +

- {/* ماژول چندزبانه ترجمه با ServiceTranslation */} -
-
- setActiveLangTab(lang)} - completedLangs={{ - ar: Boolean(names.ar?.trim()), - fa: Boolean(names.fa?.trim()), - en: Boolean(names.en?.trim()), - ru: Boolean(names.ru?.trim()), - id: Boolean(names.id?.trim()), - }} - primaryLang="ar" - title="اطلاعات متنی و چندزبانه مقصد" - required - variant="pills" + {/* دکمه‌های عملیات */} +
+ + +
+
+ + {/* اعلان موفقیت ذخیره در صورت وجود */} + {isDestSavedSuccess && ( +
+ + مشخصات شهر مقصد با موفقیت در سامانه ذخیره و به‌روزرسانی شد. +
+ )} + + {/* کارت‌های آماری سریع */} +
+
+ کشور مقصد + + {destFlag || destination.flag || '📍'} + {destCountry || destination.country} + +
+
handleTabChange('hotels')} + className="p-3.5 rounded-xl bg-muted/30 border border-border/60 cursor-pointer hover:border-primary/50 transition-colors" + title="مشاهده هتل‌ها" + > + هتل‌های فعال + + + {toFa(destHotels.length)} هتل + +
+
handleTabChange('transports')} + className="p-3.5 rounded-xl bg-muted/30 border border-border/60 cursor-pointer hover:border-primary/50 transition-colors" + title="مشاهده مسیرهای حمل‌ونقل" + > + مسیرهای متصل + + + {toFa(destRelations.length)} مسیر + +
+
+ وضعیت در سامانه +
+ + {destIsActive ? 'فعال' : 'غیرفعال'} + +
+
+
+ + {/* ماژول نمایش مشخصات چندزبانه با ServiceTranslation در حالت Readonly */} +
+
+ setActiveLangTab(lang)} + completedLangs={{ + ar: Boolean(names.ar?.trim()), + fa: Boolean(names.fa?.trim()), + en: Boolean(names.en?.trim()), + ru: Boolean(names.ru?.trim()), + id: Boolean(names.id?.trim()), + }} + primaryLang="ar" + title="شناسنامه و متون چندزبانه مقصد" + variant="pills" + /> +
+ + {/* محتوای زبان انتخاب‌شده */} +
+
+ + نام شهر مقصد ({currentLang.name}): + +
+ {names[activeLangTab] || destination.name || '---'} +
+
- {/* فیلدهای ترجمه‌پذیر متناسب با زبان تب فعال */} -
- {/* نام شهر مقصد به زبان انتخاب‌شده */} + {holyPlacesMap[activeLangTab] && (
-
- - - {currentLang.dir.toUpperCase()} - + + اماکن مقدسه و زیارتگاه‌ها ({currentLang.name}): + +
+ {holyPlacesMap[activeLangTab] + .split(/[،,]/) + .map((p) => p.trim()) + .filter(Boolean) + .map((place, idx) => ( + + 🕌 + {place} + + ))}
- - setNames((prev) => ({ ...prev, [activeLangTab]: e.target.value })) - } - dir={currentLang.dir} - placeholder={`نام شهر به زبان ${currentLang.name}...`} - className="h-10 rounded-xl text-xs bg-card border-border/70 focus-visible:border-primary focus-visible:ring-1 focus-visible:ring-primary shadow-2xs" - required={activeLangTab === 'fa' || activeLangTab === 'ar'} - />
+ )} - {/* توضیحات و راهنمای شهر به زبان انتخاب‌شده */} -
- -