import { useParams } from 'react-router-dom'; import ctaImage from '../assets/figma/checkup-cta-3d.webp'; import { api } from '../api.js'; import Breadcrumbs from '../components/Breadcrumbs.jsx'; import CtaBand from '../components/CtaBand.jsx'; import { useLeadModal } from '../context/LeadModalContext.jsx'; import { plural, priceLabel } from '../lib/format.js'; import { checkupMedia } from '../lib/media.js'; import { checklistItems, cleanText, introText } from '../lib/text.js'; import { useApi } from '../lib/useApi.js'; import { usePageTitle } from '../lib/usePageTitle.js'; import { pageMetadata } from '../lib/seo.js'; import { useInitialApiData } from '../context/ApiData.jsx'; import StubPage from './StubPage.jsx'; import './CheckupPage.css'; export default function CheckupPage() { const { slug } = useParams(); const { open } = useLeadModal(); const checkup = useApi((signal) => api.checkup(slug, { signal }), [slug], `checkup:${slug}`); const name = cleanText(checkup.data?.name); const siteURL = useInitialApiData('siteURL') || (typeof window !== 'undefined' ? window.location.origin : ''); usePageTitle(name || undefined, checkup.data ? pageMetadata(`/checkup/${slug}/`, name, siteURL, checkup.data.seo, checkup.data.lead) : undefined); if (checkup.error?.status === 404) return ; if (checkup.error) return

Не удалось загрузить программу. Обновите страницу.

; if (!checkup.data || checkup.data.slug !== slug) return

Загружаем…

; const c = checkup.data; const { hero, photo, cutout, heroBg, cutoutRatio } = checkupMedia(c); const items = c.items?.length ? c.items.map(cleanText) : checklistItems(c.blocks); const intro = introText(c.blocks); const lead = cleanText(c.lead); const book = () => open({ form: 'appointment', message: `Чек-ап: ${name}` }); const askPrice = () => open({ form: 'service_order', message: `Стоимость чек-апа: ${name}` }); // первый столбец списка заполняется сверху вниз, затем второй — как в макете const rows = Math.ceil(items.length / 2); return (
Комплексная программа

{name}

{lead &&

{lead}

} {intro &&

{intro}

}
{cutout ? (
) : hero ? (
) : ( photo && ( // крупного кадра нет — фото карточки в натуральном размере, без растягивания
) )}
{items.length > 0 && (
{items.length} {plural(items.length, 'исследование и анализ', 'исследования и анализа', 'исследований и анализов')}
)}
{c.price ? priceLabel({ price: c.price }) : 'По запросу'} {c.price && c.old_price ? `вместо ${priceLabel({ price: c.old_price })}` : 'стоимость уточнит администратор'}
Запись в удобное для вас время
{items.length > 0 && ( <>

Что входит в программу

Все ключевые этапы собраны в одном маршруте — от приёма специалиста до лабораторной диагностики.

    {items.map((it, i) => (
  1. {i + 1} {it}
  2. ))}
)}

Стоимость

{c.price ? `Стоимость программы — ${priceLabel({ price: c.price })}. Администратор подтвердит её при записи.` : 'Актуальную стоимость программы администратор назовёт при записи или по телефону.'}

Как подготовиться

Администратор расскажет о подготовке к анализам и исследованиям при подтверждении записи.

Состав программы и актуальную стоимость уточняйте у администратора клиники.

); }