/* global React, BVH_D */
/* Services hub + service detail */
const DS = window.BVH_DATA;
const { useState: useStateS } = React;
function ServicesPage({ setRoute }) {
const [filter, setFilter] = useStateS("all");
const groups = {
all: DS.services,
urgent: DS.services.filter(s => s.tag === "URGENT" || s.id === "hospitalisation-icu"),
preventive: DS.services.filter(s => ["vaccinations","microchipping","dental"].includes(s.id)),
surgical: DS.services.filter(s => ["surgery","dental","diagnostics-imaging"].includes(s.id)),
relocation: DS.services.filter(s => ["pet-relocation","boarding","microchipping"].includes(s.id)),
};
const list = groups[filter];
return (
02 SERVICES — FULL HOSPITAL
A full hospital,under one roof.
Nine services that cover wellness through critical care. Pick a category, or browse all — every page is written conservatively, without guaranteed-outcome language. No public prices: we quote per case after consultation.
{[
{ k:'all', label:'All nine' },
{ k:'urgent', label:'Emergency & ICU' },
{ k:'surgical', label:'Surgical & imaging' },
{ k:'preventive', label:'Preventive & dental' },
{ k:'relocation', label:'Travel & boarding' },
].map(c => (
setFilter(c.k)}>{c.label}
))}
{list.map(svc => (
setRoute({type:'service', id:svc.id})} style={{gridColumn: 'span 1', minHeight:380}}>
{svc.tag &&
{svc.tag} }
↗
— {svc.num}
{svc.name}
{svc.blurb}
))}
);
}
function ServiceDetail({ id, setRoute }) {
const svc = DS.services.find(s => s.id === id);
if (!svc) return null;
const others = DS.services.filter(s => s.id !== id).slice(0,3);
return (
setRoute("services")} className="creds" style={{marginBottom:24, display:'inline-flex', gap:6}}>← All services
{svc.num}
SERVICE — {svc.name.toUpperCase()}
{svc.name.split(' ').map((w,i,arr) => (
{i === arr.length - 1 ? {w} : w}
{i < arr.length - 1 && ' '}
))}
{svc.blurb}
FIG. {svc.num} — {svc.name.toUpperCase()}
A WHO IT'S FOR
The right cases.
B WHAT TO EXPECT
Step by step.
{svc.expect.map((e,i) => (
STEP {String(i+1).padStart(2,'0')}
{e}
))}
{svc.aftercare}
NOTE
We don't publish guaranteed-outcome claims or fixed prices. Every estimate is per case, signed and shared with you before treatment starts.
D OTHER SERVICES
Often booked alongside.
{others.map(s => (
setRoute({type:'service', id:s.id})}>
↗
— {s.num}
{s.name}
{s.blurb}
))}
);
}
Object.assign(window, { ServicesPage, ServiceDetail });