// News / Blog pages const { useState: p4S, useMemo: p4M } = React; // formatted RU date function newsDate(s) { if (!s) return ''; const months = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря']; const d = new Date((s + '').replace(' ', 'T')); if (isNaN(d)) return s; return `${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`; } // ============ NEWS LIST ============ const NewsListPage = ({ onBook }) => { const [cat, setCat] = p4S('Все'); const categories = p4M(() => { const set = new Set(); DATA.news.forEach(n => n.category && set.add(n.category)); return ['Все', ...Array.from(set)]; }, []); const list = p4M(() => { const all = DATA.news.slice().sort((a, b) => (b.published || '').localeCompare(a.published || '')); return cat === 'Все' ? all : all.filter(n => n.category === cat); }, [cat]); const featured = list[0]; const rest = list.slice(1); return ( <>
{DATA.news.length === 0 ? (

Пока нет публикаций

Скоро здесь появятся новости и статьи центра

) : ( <> {categories.length > 2 && (
{categories.map(c => ( ))}
)} {featured && (
{featured.cover ? {featured.title} : }
{featured.category} {newsDate(featured.published)}

{featured.title}

{featured.excerpt}

Читать статью
)} {rest.length > 0 && (
{rest.map(n => (
{n.cover ? {n.title} : }
{n.category} {newsDate(n.published)}

{n.title}

{n.excerpt}

))}
)} )}
); }; // ============ ARTICLE DETAIL ============ const ArticlePage = ({ articleId, onBook }) => { const article = p4M(() => DATA.news.find(n => n.id === articleId), [articleId]); React.useEffect(() => { if (article) { document.title = article.title + ' — НАЦЗДРАВ'; const m = document.querySelector('meta[name="description"]') || (() => { const el = document.createElement('meta'); el.setAttribute('name', 'description'); document.head.appendChild(el); return el; })(); if (article.excerpt) m.setAttribute('content', article.excerpt); } }, [article]); if (!article) { return (

Статья не найдена

Возможно, она была удалена или перемещена

Ко всем новостям
); } const paragraphs = (article.body || '').split(/\n{2,}/).map(s => s.trim()).filter(Boolean); const related = DATA.news.filter(n => n.id !== article.id && n.category === article.category).slice(0, 3); const fallback = DATA.news.filter(n => n.id !== article.id).slice(0, 3); const more = (related.length ? related : fallback); return ( <>
{article.category} {newsDate(article.published)}

{article.title}

{article.excerpt &&

{article.excerpt}

} {article.author && (
{(article.author[0] || 'Н')} {article.author}
)}
{article.cover ? {article.title} : }
{paragraphs.length ? paragraphs.map((p, i) =>

{p}

) :

Текст статьи появится позже.

}

Нужна консультация специалиста?

Запишитесь на приём — наши врачи помогут разобраться в вашей ситуации.

{more.length > 0 && (

Читайте также

{more.map(n => (
{n.cover ? {n.title} : }
{n.category} {newsDate(n.published)}

{n.title}

))}
)} ); }; // ============ STYLES ============ const NewsStyles = () => ( ); Object.assign(window, { NewsListPage, ArticlePage }); // ============ CONTACTS PAGE (восстановлена) ============ const ContactsPage = ({ onBook }) => { const b = DATA.brand; const [form, setForm] = p4S({ name: '', phone: '', message: '' }); const [sent, setSent] = p4S(false); const set = (k, v) => setForm(f => ({ ...f, [k]: v })); const canSend = form.name.trim() && form.phone.replace(/\D/g, '').length >= 10; const submit = (e) => { e.preventDefault(); if (!canSend) return; if (window.NZ_API) { NZ_API.createAppointment({ name: form.name, phone: form.phone, comment: form.message, direction: 'Обращение со страницы контактов', }).catch(() => {}); } setSent(true); }; const cards = [ { icon: 'phone', label: 'Телефон', value: b.phone, href: `tel:${b.phoneRaw}`, hint: 'Звонок бесплатный' }, { icon: 'pin', label: 'Адрес', value: b.address, hint: 'Парковка для пациентов' }, { icon: 'clock', label: 'Часы работы', value: b.hours, hint: 'Без выходных' }, { icon: 'mail', label: 'Email', value: b.email, href: `mailto:${b.email}`, hint: 'Ответим в течение дня' }, ]; return ( <>
{cards.map((c, i) => (
{c.label}
{c.href ? {c.value} :
{c.value}
}
{c.hint}
))}
{sent ? (

Спасибо, {form.name.split(' ')[0]}!

Мы получили ваше обращение и перезвоним на {form.phone} в ближайшее время.

) : (

Обратный звонок

Оставьте контакты — администратор перезвонит и поможет записаться.

set('name', e.target.value)} required />
set('phone', e.target.value)} required />