/* ===== Подари вторую жизнь — Animal detail ===== */
function Gallery({ urls, name }){
const [i, setI] = useState(0);
const [loaded, setLoaded] = useState(false);
useEffect(()=>{ setLoaded(false); },[i]);
const go = (d)=> setI(p=> (p+d+urls.length)%urls.length);
return (
{!loaded &&
}

setLoaded(true)}
style={{width:'100%',height:'100%',objectFit:'cover',opacity:loaded?1:0,transition:'opacity .35s',animation:'fadeUp .4s'}}/>
{urls.length>1 && <>
{urls.map((_,k)=>setI(k)} style={{width:k===i?22:8,height:8,borderRadius:99,background:k===i?'#fff':'rgba(255,255,255,.6)',cursor:'pointer',transition:'.2s'}}/>)}
>}
{urls.length>1 &&
{urls.map((u,k)=>(
))}
}
);
}
function ParamCard({ ico:Ico, label, value, accent }){
return (
);
}
function DetailScreen(){
const { route, go, favs, toggleFav } = useNav();
const a = PF.byId(route.params?.id);
const [adopt, setAdopt] = useState(false);
const [adoptDone, setAdoptDone] = useState(false);
useEffect(()=>{ setAdopt(false); setAdoptDone(false); window.scrollTo(0,0); },[route.params?.id]);
if(!a) return
go('catalog')}>Ко всем животным}/>
;
const on = favs.includes(a.id);
const similar = PF.animals.filter(x=>x.id!==a.id && x.species===a.species).slice(0,4);
const colorObj = PF.COLORS.find(c=>c.id===a.color);
return (
{PF.speciesOne(a.species)}
{a.breed}
{a.name}
{PF.sexLabel(a.sex)} · {a.ageText}
} label="Окрас" value={PF.colorLabel(a.color)}/>
О характере
{a.desc}
{a.needs &&
Особые потребности
{a.needs}
}
{!adoptDone
?
Хотите забрать {a.sex==='male'?'его':'её'} домой?
Оставьте заявку — пройдём короткую анкету, согласие на обработку данных и договор. После модерации куратор свяжется с вами.
{['Анкета','Согласие','Чек-лист','Договор'].map((s,i)=>({i+1}{s}))}
:
Заявка отправлена куратору
На модерации — обычно отвечаем в течение дня
Контакт куратора
{a.contact}
Проверенный куратор
}
{similar.length>0 &&
}
{adopt &&
setAdopt(false)} onDone={()=>{ setAdopt(false); setAdoptDone(true); }}/>}
);
}
window.DetailScreen = DetailScreen;