"use client"; import { useEffect, useState } from "react"; import { Clock } from "lucide-react"; import { cn } from "@/shared/lib/utils"; import { loadWaybackReleases, latestWaybackRelease, type WaybackRelease, } from "./wayback-catalog"; import { SENTINEL_YEARS, type SentinelYear } from "./sentinel-catalog"; export type BasemapId = | "liberty" | "dark" | "satellite" | "google" | "wayback" | "sentinel"; const OPTIONS: Array<{ id: BasemapId; label: string }> = [ { id: "liberty", label: "Liberty" }, { id: "dark", label: "Întunecat" }, { id: "satellite", label: "Satelit" }, { id: "google", label: "Google" }, { id: "wayback", label: "Istoric" }, { id: "sentinel", label: "S2" }, ]; interface Props { value: BasemapId; onChange: (id: BasemapId) => void; /** Selected Wayback release id (only meaningful when value=wayback). */ waybackReleaseId?: string | null; /** Fired when the user picks a different Wayback date. */ onWaybackReleaseChange?: (release: WaybackRelease) => void; /** Selected Sentinel-2 cloudless year (only meaningful when value=sentinel). */ sentinelYear?: string | null; /** Fired when the user picks a different Sentinel-2 year. */ onSentinelYearChange?: (year: SentinelYear) => void; } export function BasemapSwitcher({ value, onChange, waybackReleaseId, onWaybackReleaseChange, sentinelYear, onSentinelYearChange, }: Props) { const [releases, setReleases] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { if (value !== "wayback") return; if (releases || loading) return; setLoading(true); loadWaybackReleases() .then((rels) => { setReleases(rels); // Auto-select the latest release if caller hasn't picked one. if (!waybackReleaseId && onWaybackReleaseChange) { const latest = latestWaybackRelease(rels); if (latest) onWaybackReleaseChange(latest); } }) .catch((err) => { console.warn("[basemap] wayback catalog load failed:", err); }) .finally(() => setLoading(false)); }, [value, releases, loading, waybackReleaseId, onWaybackReleaseChange]); const selectedRelease = releases?.find((r) => r.id === waybackReleaseId); return (
{OPTIONS.map((opt) => ( ))}
{value === "sentinel" && (

Mozaic anual cloud-free Sentinel-2 (rezoluție ~10 m). Bun pentru schimbări rurale large-scale (defrișări, hale, sere). Nu vezi case sau detalii fine. © EOX / Copernicus. Uz comercial: cloudless.eox.at.

)} {value === "wayback" && (
{loading && !releases ? (
Se încarcă lista…
) : releases && releases.length > 0 ? ( ) : (
Catalog Wayback indisponibil.
)}

Imagini satelit Esri arhivate (193+ snapshot-uri din 2014). Acoperirea diferă per zonă — la unele date locația ta poate avea imagine identică cu un release anterior.

)}
); }