import type { SelectMeta } from "../../lib/types"; const isEmoji = (s: string) => !!s && /\p{Extended_Pictographic}/u.test(s); const cleanTitle = (t?: string) => { if (!t) return t; return t .replace(/^(?:[a-z0-9]+-){1,3}(?=[A-Z])/i, "") // slug stuck to title (no space) .replace(/^(?:[a-z0-9]+-){1,3}\s+/i, ""); // slug + space }; export default function SelectedLocationCard({ selectedLL, selectedMeta, onClear, reactionsById, }: { selectedLL: [number, number] | null; selectedMeta: SelectMeta | null; onClear: () => void; reactionsById: Record; }) { const photoSrc = selectedMeta?.raw?.photo_url ?? selectedMeta?.raw?.photoUrl ?? selectedMeta?.raw?.image_url ?? selectedMeta?.raw?.imageUrl ?? (selectedMeta as any)?.photo_url ?? (selectedMeta as any)?.photoUrl ?? null; const rid = selectedMeta?.rid || selectedMeta?.raw?.rid; const rx = rid ? reactionsById[rid] : null; const verifyCount = rx?.verify_count ?? 0; const clearCount = rx?.clear_count ?? 0; const showEmoji = selectedMeta?.emoji && isEmoji(String(selectedMeta.emoji)) ? String(selectedMeta.emoji) : null; const displayTitle = cleanTitle(selectedMeta?.title) || "Selected"; return (
{selectedLL ? ( <>
{showEmoji ? ( {showEmoji} ) : null} {displayTitle}
{selectedMeta?.subtitle && (
{selectedMeta.subtitle}
)}
{selectedLL[0].toFixed(4)}, {selectedLL[1].toFixed(4)}
{(selectedMeta?.category || selectedMeta?.raw?.category) && (
Category:{" "} {selectedMeta.category || selectedMeta.raw?.category}
)} {(selectedMeta?.severity !== undefined || selectedMeta?.raw?.severity !== undefined) && (
Severity/Mag:{" "} {String( selectedMeta?.severity ?? selectedMeta?.raw?.severity )}
)}
Confidence:{" "} {(() => { const k = selectedMeta?.kind; const fromMeta = selectedMeta?.confidence ?? selectedMeta?.raw?.confidence; const official = k && ["nws", "quake", "eonet", "fire"].includes(k); const val = fromMeta ?? (official ? 1 : undefined); return val !== undefined ? String(val) : "โ€”"; })()}
{selectedMeta?.raw?.source ? (
Source: {selectedMeta.raw.source}
) : selectedMeta?.kind && ["nws", "quake", "eonet", "fire"].includes( selectedMeta.kind ) ? (
Source: {selectedMeta.kind.toUpperCase()}
) : null} {selectedMeta?.sourceUrl && (
Source
)}
) : (
Use search, ๐Ÿ“, or click the map.
)} {rid ? (
Verified: {verifyCount} ยท Cleared: {clearCount}
) : null} {photoSrc && (
Attached
)}
Only one point is active. Drag ๐Ÿ“ to fine-tune; chat uses this point.
{selectedLL && (
)}
); }