import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import type { HexagonLocation } from '../../lib/external-search'; import { apiUrl, logNonAbortError } from '../../lib/api'; interface StreetViewEmbedProps { location: HexagonLocation; } type Status = 'loading' | 'ok' | 'none' | 'error'; export default function StreetViewEmbed({ location }: StreetViewEmbedProps) { const { t } = useTranslation(); const [status, setStatus] = useState('loading'); const [panoId, setPanoId] = useState(null); useEffect(() => { setStatus('loading'); setPanoId(null); const controller = new AbortController(); const params = new URLSearchParams({ lat: String(location.lat), lon: String(location.lon), }); fetch(apiUrl('streetview', params), { signal: controller.signal }) .then((res) => { if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); }) .then((data: { status: string; pano_id?: string }) => { if (data.status === 'OK' && data.pano_id) { setPanoId(data.pano_id); setStatus('ok'); } else { setStatus('none'); } }) .catch((err) => { logNonAbortError('streetview', err); if (!controller.signal.aborted) { setStatus('error'); } }); return () => controller.abort(); }, [location.lat, location.lon]); if (status === 'none' || status === 'error') return null; return (
{t('streetView.title')}
{status === 'loading' ? (
) : (