"use client"; import { useState } from "react"; import { pixelLabel } from "@/lib/styles"; import type { ProviderId, ProviderInfo } from "@/lib/weather/types"; import { Slot } from "./Slot"; import { ChoiceChips } from "./ui/ChoiceChips"; const PROVIDER_KEY_HINTS: Record = { openweather: { envVar: "OPENWEATHER_API_KEY", summary: "5-day forecast, reverse location naming, and 5 extra map layers (precip, clouds, temp, wind, pressure).", }, weatherapi: { envVar: "WEATHERAPI_API_KEY", summary: "3-day hourly & daily forecast plus worldwide weather alerts (instant key activation).", }, tomorrow: { envVar: "TOMORROW_API_KEY", summary: "5-day hourly & 6-day daily timelines (free tier: 25 calls/hr, 500/day).", }, openmeteo: { envVar: null, summary: "14-day daily & 7-day hourly forecast — free out of the box, no API key required.", }, }; /** * Provider choices. Each shows how many forecast days it delivers on the * configured plan. Providers without an API key stay visible with an optional * setup guide so adding free keys to `.env.local` is self-explanatory. */ export function ProviderPicker({ providers, selected, onChange }: { providers: ProviderInfo[]; selected: ProviderId; onChange: (id: ProviderId) => void; }) { const [showKeyGuide, setShowKeyGuide] = useState(false); const missingProviders = providers.filter((p) => !p.ready); return (
Source ({ value: p.id, label: p.label, disabled: !p.ready, note: p.ready ? `${p.forecastDays}d` : "Locked", noteTone: p.ready ? "muted" : "subtle", }))} />
{missingProviders.length > 0 && ( )}
{showKeyGuide && missingProviders.length > 0 && (

Optional free API keys

Add keys to .env.local and reload.

    {missingProviders.map((p) => { const info = PROVIDER_KEY_HINTS[p.id]; return (
  • {p.label} {info.envVar && ( {info.envVar} )}

    {info.summary}

    Get free key
  • ); })}
)}
); }