import {useState} from 'react'; import {factText, sanitizeUnits} from '@o2o/shared'; import {useSite} from '@site/lib/site-context'; import {sectionName, unitSpec, unitViews, type UnitView} from '@site/lib/derive'; import {Car} from '../paper/Car'; import {BOOK_EVENT} from '../paper/Rooms'; import {Sheet} from '../paper/Sheet'; import {RoomArt} from './Art'; const HOME_UNITS = 4; function splitName(name: string): [string, string | undefined] { const m = /^(.+?)\s*\((.+)\)\s*$/.exec(name); return m ? [m[1], m[2]] : [name, undefined]; } function specRows(unit: UnitView, facts: Parameters[0]) { const bed = [factText(facts, 'bed_type'), factText(facts, 'room_size')].filter(Boolean).join(' · '); const std = factText(facts, 'standard_capacity'); const max = factText(facts, 'max_capacity'); const people = [std && `기준 ${std.replace(/명$/, '인')}`, max && `최대 ${max.replace(/명$/, '인')}`] .filter(Boolean) .join(' · '); const price = unit.priceText ?? unit.prices.map((p) => `${p.label} ${p.value}`).join(' · '); return [ ['침대', bed], ['정원', people], ['요금', price], ].filter(([, value]) => value) as [string, string][]; } function Cover({unit, index}: {unit: UnitView; index: number}) { const image = unit.images[0]; if (!image) return ; return (
{image.alt}
); } function UnitSheet({unit, onClose}: {unit: UnitView | null; onClose: () => void}) { return ( {unit && ( <> {unit.images[0] && {unit.images[0].alt}}

{unit.name}

{unit.intro &&

{unit.intro}

} {unit.rows.map((row) => (

{row.label} — {row.value}

))} )}
); } export function Rooms() { const payload = useSite(); const units = unitViews(payload); const spec = unitSpec(payload); const raw = new Map(sanitizeUnits(payload.units).map((unit) => [unit.unitId, unit])); const [open, setOpen] = useState(null); if (units.length === 0) return null; return ( <>
{spec.label}

{sectionName(payload, spec.path, `${spec.label} 안내`)}

{units.slice(0, HOME_UNITS).map((unit, i) => { const people = specRows(unit, raw.get(unit.unitId)?.facts ?? []).find(([label]) => label === '정원')?.[1]; return ( {unit.name} {people && {people}} ); })}
이용안내에서 전체 보기
{units.map((unit, i) => { const [main, sub] = splitName(unit.name); return (
{spec.label} {String.fromCharCode(65 + i)}

{main} {sub && {sub}}

{unit.images.length > 1 ? ( ( {image.alt} ))} /> ) : ( )}
{unit.intro &&

{unit.intro}

}
{specRows(unit, raw.get(unit.unitId)?.facts ?? []).map(([label, value]) => (
{label}
{value}
))}
); })}
setOpen(null)} /> ); }