| 211 | // All overlay data is fetched via the local Next.js proxy (/api/overlay?layer=X) |
| 212 | // which handles external API calls server-side, bypassing the browser CSP connect-src policy. |
| 213 | async function fetchOverlayData(layer: OverlayLayer): Promise<GeoJSON.FeatureCollection> { |
| 214 | try { |
| 215 | const res = await fetch(`/api/overlay?layer=${layer}`); |
| 216 | if (!res.ok) throw new Error(`overlay proxy ${res.status}`); |
| 217 | return res.json() as Promise<GeoJSON.FeatureCollection>; |
| 218 | } catch (err) { |
| 219 | console.error(`[overlay] fetch failed for "${layer}":`, err); |
| 220 | return { type: "FeatureCollection", features: [] }; |
| 221 | } |
| 222 | } |
| 223 | |
| 224 | function WorldMapInner({ |
| 225 | markets, |