/* ============================================================ Extra screens: ownerAuth · ShareSheet (QR) · chat · sleep · insurance · services · reference ============================================================ */ const { useState: useStateX } = React; /* ---------- QR placeholder (simple squares only) ---------- */ function QR({ size=158 }){ const n=21, cell=size/n; const rng=(i)=> Math.abs((Math.sin(i*12.9898)*43758.5453)%1); const sq=[]; for(let r=0;r=n-8)||(r>=n-8&&c<8); if(inFinder) continue; if(rng(r*n+c+1)>0.52) sq.push(); } const finder=(gx,gy)=>( ); return ( {sq}{finder(0,0)}{finder(n-7,0)}{finder(0,n-7)} ); } /* ---------- Share profile sheet (QR) ---------- */ const SHARE_TARGETS = { clinic:{ icon:(s)=>, label:"Клиника", hint:"Ветклиника или врач", fields:["Имя и фото","Вид и порода","Возраст","Вес и рост","Вакцинации","Хронические болезни","Кастрация","Аллергии"] }, hotel:{ icon:(s)=>, label:"Гостиница / передержка", hint:"Зоогостиница", fields:["Имя и фото","Порода","Возраст","Питание и режим","Кастрация","Особенности поведения","Контакты хозяина"] }, store:{ icon:(s)=>, label:"Магазин продуктов", hint:"Зоомагазин, корма", fields:["Вид и порода","Вес и размер","Питание / диета","Аллергии","Возраст"] }, }; function ShareSheet({ open, onClose }){ const [target,setTarget]=useStateX(null); if(!open) return null; const close=()=>{ setTarget(null); onClose(); }; const t = target ? SHARE_TARGETS[target] : null; return (
e.stopPropagation()} style={{width:"100%",background:"#fff", borderRadius:"30px 30px 0 0",padding:"12px 20px 30px",maxHeight:"88%",overflowY:"auto",boxShadow:"var(--shadow-float)"}}>
{!t && <>
Поделиться профилем
Выберите, с кем поделиться
{Object.keys(SHARE_TARGETS).map(k=>{ const o=SHARE_TARGETS[k]; return ( ); })}
Передаются только выбранные поля профиля
} {t && <>
{t.label}
{t.icon(15)} Покажите код {t.label.toLowerCase()}
Будут переданы поля
{t.fields.map((f,i)=>( {f} ))}
}
); } window.ShareSheet = ShareSheet; /* ---------- Owner auth / registration ---------- */ function AuthField({ icon, label, value }){ return (
{icon}
{label}
{value}
); } function OwnerAuthScreen({ go }){ const [mode,setMode]=useStateX("login"); const reg = mode==="reg"; return (
Цифровой двойник питомца
{reg?"Создайте профиль хозяина":"Вход в личный кабинет хозяина"}
{[["login","Войти"],["reg","Регистрация"]].map(([k,l])=>( ))}
{reg && } label="имя" value="Алексей"/>} } label="телефон" value="+7 999 123-45-67"/> {reg && } label="e-mail" value="alex@mail.ru"/>} } label={reg?"придумайте пароль":"пароль"} value="••••••••"/>
или
Продолжая, вы соглашаетесь с условиями
и политикой обработки данных
); } window.OwnerAuthScreen = OwnerAuthScreen; /* ---------- Chat list (support + doctors) ---------- */ function ChatRow({ avatar, name, role, msg, time, unread, online, onClick }){ return ( ); } function SupportAvatar({ size=52 }){ return
; } function ChatScreen({ go }){ return (
go("home")}/>
Чат
Поддержка и ваши врачи
Поиск по чатам
Поддержка
} name="Поддержка сервиса" role="Онлайн · отвечаем за 2 мин" msg="Подскажите, как добавить второго питомца?" time="9:24" unread={1} online onClick={()=>go("chatThread")}/>
Врачи
} name="Анна Соколова" role="Дерматолог · ВетПлюс" msg="Пришлите фото лап после прогулки" time="Вчера" unread={2} online onClick={()=>go("chatThread")}/> } name="Илья Морозов" role="Гастроэнтеролог · Белый хвост" msg="Продолжайте диету ещё неделю" time="Пн" unread={0} onClick={()=>go("chatThread")}/> } name="Клиника ДокВет" role="Регистратура" msg="Приём перенесён на 18 июня, 11:30" time="28 мая" unread={0} onClick={()=>go("chatThread")}/>
); } window.ChatScreen = ChatScreen; /* ---------- A chat thread (doctor) ---------- */ function CBubble({ bot, time, children }){ return (
{children}
{time}
); } function ChatThreadScreen({ go }){ return (
go("chat")} title={null} right={}/>
Анна Соколова
Дерматолог · онлайн
Сегодня
Здравствуйте! Видела наблюдения Лилу в дневнике — зуд и беспокойный сон. Давно началось? Третий день. После того как сменили корм. Понятно. Пришлите, пожалуйста, фото лап и живота после прогулки.
Спасибо. Похоже на пищевую реакцию. Предлагаю записаться на приём — посмотрю вживую.
Сообщение…
); } window.ChatThreadScreen = ChatThreadScreen; /* ---------- Sleep dynamics ---------- */ function SleepChart({ data }){ const W=320,H=170,padL=22,padR=10,padT=14,padB=24; const max=12; const bw=(W-padL-padR)/data.length; const y=h=> padT+(H-padT-padB)*(1-h/max); return ( {[3,6,9,12].map(v=>( {v} ))} {data.map((d,i)=>{ const x=padL+bw*i+bw*0.22, w=bw*0.56, top=y(d.h); return {d.x} ; })} ); } const sleepData=[{x:"Пн",h:8.2},{x:"Вт",h:7.8},{x:"Ср",h:7.1},{x:"Чт",h:6.4,bad:true},{x:"Пт",h:6.5,bad:true},{x:"Сб",h:6.1,bad:true},{x:"Вс",h:7.0}]; function SleepScreen({ go }){ return (
go("diary")} right={}/>
Динамика сна
Наблюдения хозяина · 7 дней
AI-комментарий
За последние 3 ночи сон сократился до 6 часов и стал беспокойным. Совпадает с зудом — стоит показать врачу.
Сон в среднем
6,5 ч
ниже нормы
Пробуждений
3–4 / ночь
беспокойный сон
Часы сна по дням
Записи о сне
{[["Сегодня","6,1 ч","Часто вставал, чесался"],["Вчера","6,5 ч","Беспокойный сон"],["2 дня назад","6,4 ч","Долго не мог уснуть"]].map((e,i)=>(
{e[0]} {e[1]} {e[2]}
))}
); } window.SleepScreen = SleepScreen; /* ---------- ДМС / страховка / антиклещ ---------- */ function PolicyCard({ icon, color="var(--green)", bg="var(--green-soft)", title, status, statusVar, lines, cta }){ return (
{icon}
{title}
{status}
{lines.map((l,i)=>(
{l[0]} {l[1]}
))}
); } function InsuranceScreen({ go }){ return (
go("home")}/>
ДМС, страховка
и защита
Полисы и подписки для Лилу
} title="ДМС для питомца" status="активен до 12.2026" lines={[["Покрытие","до 150 000 ₽"],["Клиники","8 рядом"],["Осталось приёмов","6 из 10"]]} cta="Открыть полис"/> } bg="#EAF0FB" color="#2A6FDB" title="Страховка от травм" status="не оформлена" statusVar="gray" lines={[["Стоимость","от 390 ₽ / мес"],["Выплата","до 100 000 ₽"]]} cta="Оформить"/> } title="Подписка «Антиклещ»" status="продлится 18 мая" statusVar="warn" lines={[["Препарат","Бравекто 20–40 кг"],["Доставка","каждые 12 недель"],["Напоминания","включены"]]} cta="Управлять подпиской"/>
); } window.InsuranceScreen = InsuranceScreen; /* ---------- Прочие услуги ---------- */ function ServicesScreen({ go }){ const items=[ {icon:,t:"Груминг",m:"Стрижка, мытьё, когти",p:"от 1 500 ₽",hue:false}, {icon:,t:"Передержка и гостиница",m:"Когда вы в отъезде",p:"от 900 ₽ / сутки",hue:true}, {icon:,t:"Дрессировка",m:"Кинолог, коррекция поведения",p:"от 2 000 ₽",hue:false}, {icon:,t:"Зоотакси",m:"Поездка в клинику",p:"от 600 ₽",hue:true}, {icon:,t:"Доставка корма",m:"Гипоаллергенный, по подписке",p:"от 1 200 ₽",hue:false}, {icon:,t:"Фотосессия питомца",m:"Студия или на прогулке",p:"от 3 000 ₽",hue:true}, ]; return (
go("home")}/>
Прочие услуги
Проверенные партнёры рядом
Поиск услуги
{items.map((it,i)=>( ))}
); } window.ServicesScreen = ServicesScreen; /* ---------- Справочник по питомцу ---------- */ function RefSection({ icon, title, children }){ return (
{icon}
{title}
{children}
); } function ReferenceScreen({ go }){ return (
go("home")} right={}/>
Справочник
по питомцу
Корги · подобрано для Лилу
Крупная порода 25–36 кг 10–12 лет
} title="Характер">Дружелюбный, общительный и энергичный. Хорошо ладит с детьми, нуждается в активности и внимании каждый день. } title="Питание">Склонны к набору веса — следите за порциями. Рекомендован корм с контролем калорий; при аллергии — гипоаллергенная линейка. } title="Уход">Короткая шерсть, линяет дважды в год. Регулярно проверяйте уши и когти, вычёсывайте 1–2 раза в неделю. } title="Частые болезни">Дисплазия суставов, склонность к аллергиям и проблемам с кожей, ожирение. Рекомендованы регулярные осмотры.
Спросить AI о породе
Задайте вопрос с учётом истории Лилу — например, про вес или аллергию.
); } window.ReferenceScreen = ReferenceScreen;