"use client"; import { useEffect, useState } from "react"; import DoctorAvatar from "@/app/component/DoctorAvatar"; import QrImg from "./QrImg"; import SiteLogoBase from "@/components/common/SiteLogo"; import { getStateInfoClient } from "@/lib/getStateInfoClient"; import { posterSpecialtyLine, splitSpecialties } from "@/lib/specialtyDisplay"; import { doctorTitle } from "@/helper"; import StarDI from "@/components/icons/StarDI"; import ClipBoard from "@/components/icons/ClipBoard"; import AddressPoster from "@/components/icons/AddressPoster"; import TelefonPoster from "@/components/icons/TelefonPoster"; import Instagram from "@/components/icons/Instagram"; import Telegram from "@/components/icons/Telegram"; import Whatsapp from "@/components/icons/Whatsapp"; import { FEATURES } from "@/config/features"; const POSTER_BG = "linear-gradient(160deg, #0B2A4A 0%, #16528C 52%, #2E77C4 100%)"; function SiteLogo(props) { return ; } function SectionTitle({ icon, children }) { return (
{icon} {children}
); } function Poster({ data, onQrReady }) { const [city, setCity] = useState(null); useEffect(() => { const { matchedCity } = getStateInfoClient(); setCity(matchedCity || null); }, []); // برش بر اساس طول متن است نه عدد ثابت: چهار چیپ با نام‌های بلند به سه ردیف // می‌رفت، بخش hero را بلند می‌کرد و بخش‌های پایین را از کادر ثابت بیرون می‌انداخت. const { primary, rest } = splitSpecialties(data?.specialties); const subSpecialties = posterSpecialtyLine(rest, 78); const services = (data?.expertise ?? []).filter((s) => s?.name); const shownServices = services.slice(0, 8); const moreServices = services.length - shownServices.length; const rawAddress = data?.address?.[0]?.address; const address = rawAddress && rawAddress.length > 120 ? `${rawAddress.slice(0, 120).trimEnd()}…` : rawAddress; const phones = (data?.address ?? []) .map((a) => a?.phone) .filter(Boolean) .slice(0, 2); const social = city?.social_media ?? {}; const socialItems = [ social.instagram && , social.telegram && , social.whatsapp && , ].filter(Boolean); const badges = [ Number(data?.experience) > 0 && { icon: , label: `${data.experience} سال تجربه`, }, FEATURES.posterRatings && (data?.point ?? 0) > 0 && { icon: , label: `امتیاز ${data.point}`, }, FEATURES.posterRatings && (data?.satisfaction ?? 0) > 0 && { icon: , label: `${data.satisfaction}% رضایت`, }, ].filter(Boolean); return (
{/* header */}
{city?.site_name || "نوبت ۷۲۴"} {city?.domain || "nobat724.com"}
نوبت‌دهی آنلاین
{city?.slogan && (

{city.slogan}

)} {/* hero */}

{doctorTitle(data?.name)}

{primary && (
{primary.name}
)} {/* زیرتخصص‌ها یک خط متنی‌اند نه چیپ: در چاپ نه کلیک هست نه Popover، پس «+N» بی‌معناست و متن خوانا جایش را می‌گیرد. max-h تور ایمنیِ کادر است اگر بودجهٔ کاراکتر روزی کوتاه تنظیم شود. */} {subSpecialties.text && (

{subSpecialties.text} {subSpecialties.hidden > 0 && ` و ${subSpecialties.hidden} تخصص دیگر`}

)}
{badges.map((b, i) => ( {b.icon} {b.label} ))}
{data?.medical_system_code && (

کد نظام پزشکی:{" "} {data.medical_system_code}

)}
{/* body */} {/* کارت‌ها به هم چسبیده می‌مانند و فاصلهٔ اضافیِ کاغذ A4 بالای فوتر می‌نشیند: حفرهٔ وسطِ صفحه شبیه محتوای جاافتاده دیده می‌شد. */}
{shownServices.length > 0 && (
}>خدمات
{shownServices.map((s, i) => ( {s.name} ))} {moreServices > 0 && ( + {moreServices} خدمت دیگر )}
)} {(address || phones.length > 0) && (
{address && (
}>آدرس

{address}

)} {phones.length > 0 && (
}>تلفن
{phones.map((p, i) => ( {p} ))}
)}
)}
{/* footer */}
); } export default Poster;