fix(map): پاپآپ نقشهٔ صفحهٔ پروژه تصویر شاخص را تکرار نمیکند — فقط گالری؛ در نبود گالری قاب تصویر پنهان میشود
This commit is contained in:
@@ -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 />
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)}
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
Reference in New Issue
Block a user