fix(map): پاپ‌آپ نقشهٔ صفحهٔ پروژه تصویر شاخص را تکرار نمی‌کند — فقط گالری؛ در نبود گالری قاب تصویر پنهان می‌شود

This commit is contained in:
aramesh-site deploy
2026-10-09 17:27:27 +00:00
parent afcace4fa3
commit 29dc8459f7
4 changed files with 10 additions and 5 deletions
+4 -1
View File
@@ -9,6 +9,8 @@ type ProjectImageSliderProps = {
images: string[]
alt: string
className?: string
/** در نبود تصویر، به‌جای جای‌نگهدار کل قاب پنهان شود (صفحه‌ای که تصویر را جای دیگر نشان می‌دهد) */
hideWhenEmpty?: boolean
}
/**
@@ -16,7 +18,7 @@ type ProjectImageSliderProps = {
* شمارندهٔ اسلاید و گوشه‌های گرد هم‌اندازهٔ کارت. همهٔ رویدادهای اشاره روی
* اسلایدر متوقف می‌شوند تا کلیک/کشیدن آن، نقشه را جابه‌جا یا پاپ‌آپ را نبندد.
*/
export function ProjectImageSlider({ images, alt, className = '' }: ProjectImageSliderProps) {
export function ProjectImageSlider({ images, alt, className = '', hideWhenEmpty = false }: ProjectImageSliderProps) {
const { t } = useLang()
const [index, setIndex] = useState(0)
@@ -26,6 +28,7 @@ export function ProjectImageSlider({ images, alt, className = '' }: ProjectImage
const frame = `relative aspect-[16/10] w-full overflow-hidden rounded-t-2xl bg-char ${className}`
if (!images.length) {
if (hideWhenEmpty) return null
return (
<div className={frame} onClick={stop} onPointerDown={stop} onMouseDown={stop}>
<ProjectImagePlaceholder />
+4 -2
View File
@@ -15,6 +15,8 @@ type ProjectPopupCardProps = {
project: MapProject
/** تصاویر پروژه — همان آرایهٔ صفحهٔ جزئیات؛ در نبودش جای‌نگهدار می‌آید */
images?: string[]
/** در نبود تصویر، قاب تصویر پنهان شود (نه جای‌نگهدار) — برای صفحهٔ خود پروژه */
hideImageWhenEmpty?: boolean
onClose: () => void
/** دکمه‌های پایهٔ کارت — هر نما اکشن‌های خودش را می‌دهد (عمودی روی هم) */
children: ReactNode
@@ -25,7 +27,7 @@ type ProjectPopupCardProps = {
* عنوان و توضیح، و در پایه دکمه‌های عمودی. راست‌به‌چپ، شیشه‌ای تیره و
* هم‌اندازهٔ کارت‌های سایت. سال پروژه عمداً نمایش داده نمی‌شود.
*/
export function ProjectPopupCard({ project, images = [], onClose, children }: ProjectPopupCardProps) {
export function ProjectPopupCard({ project, images = [], hideImageWhenEmpty = false, onClose, children }: ProjectPopupCardProps) {
const { t } = useLang()
const description = project.description.trim() || t('mapProjectDescription')
@@ -36,7 +38,7 @@ export function ProjectPopupCard({ project, images = [], onClose, children }: Pr
>
{/* اسلایدر تصویر: لبه‌تا‌لبه، بدون حاشیه، با فلش‌های چپ/راست */}
<div className="relative">
<ProjectImageSlider images={images} alt={project.name} />
<ProjectImageSlider images={images} alt={project.name} hideWhenEmpty={hideImageWhenEmpty} />
<button
type="button"
+1 -1
View File
@@ -45,7 +45,7 @@ export function ProjectsMapSingle({ location, images = [], className = '' }: Pro
{popupHost &&
activeProject &&
createPortal(
<ProjectPopupCard project={activeProject} images={images} onClose={closePopup}>
<ProjectPopupCard project={activeProject} images={images} hideImageWhenEmpty onClose={closePopup}>
{/* منطق دکمهٔ آدرس دست‌نخورده است — تنها اکشن این کارت */}
<a
href={buildNeshanUrl(activeProject)}
+1 -1
View File
@@ -27,7 +27,7 @@ export function ProjectDetail() {
const mapLocation = project
? (findMapProjectByName(project.title) ?? createPlaceholderProject(project.title, project.summary))
: null
const mapImages = project ? [project.image, ...(Array.isArray(project.gallery) ? project.gallery : [])].filter(Boolean) : []
const mapImages = project && Array.isArray(project.gallery) ? project.gallery.filter(Boolean) : []
// عنوان تب، توضیح متا، OG و JSON-LD از خود پروژه — هم‌ارز نسخهٔ سمت سرور (seo_pages.py)
useEffect(() => {