import { useState } from 'react'; import { Dialog, DialogContent, DialogTitle, DialogDescription, DialogClose } from '@/components/ui/dialog'; import { firImageUrl, firRoomName, type FirRoom } from '@/lib/fir'; import { firTranslate } from '@/lib/firLocale'; const LIBRARY = (import.meta.env.VITE_FIR_API_BASE || '/fir-library').replace(/\/$/, ''); type Props = { room: FirRoom; language?: number }; export function FirRoomDetailsBody({ room, language }: Props) { const t = (key: string) => firTranslate(language, key); const imageUrl = firImageUrl(room.image_url, LIBRARY); const [failedImage, setFailedImage] = useState(null); const metadata = room.metadata || {}; const value = (key: string) => metadata[key]?.trim() || '—'; // Only attach units to scalar values; preserve CSV configuration annotations verbatim. const unit = (text: string, suffix: string) => /^[+-]?\d+(?:\.\d+)?$/.test(text) ? `${text} ${suffix}` : text; const groups: { title: string; fields: [string, string][] }[] = [ { title: 'detailRoom', fields: [ ['detailName', firRoomName(room) || t('unnamed')], ['detailId', room.room_id], ['detailLocation', value('Room Location')], ['detailType', value('Room Type')], ['detailDimensions', value('Room Dimensions (m) (l x w x h)')], ] }, { title: 'detailAcoustics', fields: [ ['detailRt60', unit(value('RT60 (s)'), 's')], ['detailReduced', /^(yes|no)$/i.test(value('Reduced Reverberation?')) ? t(value('Reduced Reverberation?').toLowerCase() === 'yes' ? 'detailYes' : 'detailNo') : value('Reduced Reverberation?')], ['detailListener', value('Listener')], ['detailDistance', unit(value('Source Distance (m)'), 'm')], ['detailAzimuthRange', value('Source Azimuth Range')], ['detailElevationRange', value('Source Elevation Range')], ['detailConfigurations', value('Measurement Configurations')], ] }, ]; const renderGroup = (group: typeof groups[number]) =>

{t(group.title)}

{group.fields.map(([label, text]) =>
{t(label)}
{text}
)}
; const hasImage = imageUrl && failedImage !== imageUrl; return
{hasImage &&
{firRoomName(room)} setFailedImage(imageUrl)} />
{t('detailDiagram')} {t('detailEnlarge')} ↗
} {!hasImage && groups.map(renderGroup)}
; } export default function FirRoomDetails({ room, language, open, onOpenChange }: Props & { open: boolean; onOpenChange: (open: boolean) => void }) { const t = (key: string) => firTranslate(language, key); return
{firRoomName(room) || t('unnamed')} {t('detailTitle')}
{t('detailClose')}
; }