"use client"; import { useEffect, useMemo, useState } from "react"; const STORAGE_KEY = "9router.cliToolEndpointPresets"; function maskApiKey(apiKey) { if (!apiKey) return "No API key"; if (apiKey.length <= 12) return `${apiKey.slice(0, 4)}...`; return `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`; } function normalizePresets(value) { if (!Array.isArray(value)) return []; return value.filter((preset) => preset?.name && preset?.baseUrl && preset?.apiKey); } function readPresets() { if (typeof window === "undefined") return []; try { return normalizePresets(JSON.parse(window.localStorage.getItem(STORAGE_KEY) || "[]")); } catch { return []; } } function writePresets(presets) { if (typeof window === "undefined") return; window.localStorage.setItem(STORAGE_KEY, JSON.stringify(normalizePresets(presets))); } export default function EndpointPresetControl({ baseUrl, apiKey, onBaseUrlChange, onApiKeyChange, }) { const [presets, setPresets] = useState([]); const [selectedName, setSelectedName] = useState(""); useEffect(() => { setPresets(readPresets()); }, []); const selectedPreset = useMemo( () => presets.find((preset) => preset.name === selectedName) || null, [presets, selectedName] ); const handleSelect = (name) => { setSelectedName(name); const preset = presets.find((item) => item.name === name); if (!preset) return; onBaseUrlChange(preset.baseUrl); onApiKeyChange(preset.apiKey); }; const handleSave = () => { const trimmedBaseUrl = (baseUrl || "").trim(); const trimmedApiKey = (apiKey || "").trim(); if (!trimmedBaseUrl || !trimmedApiKey) return; let defaultName = selectedPreset?.name || trimmedBaseUrl; try { defaultName = selectedPreset?.name || new URL(trimmedBaseUrl).host; } catch { defaultName = selectedPreset?.name || trimmedBaseUrl; } const name = window.prompt("Preset name", defaultName); if (!name?.trim()) return; const nextPreset = { name: name.trim(), baseUrl: trimmedBaseUrl, apiKey: trimmedApiKey }; const nextPresets = [ ...presets.filter((preset) => preset.name !== nextPreset.name), nextPreset, ].sort((a, b) => a.name.localeCompare(b.name)); setPresets(nextPresets); setSelectedName(nextPreset.name); writePresets(nextPresets); }; const handleDelete = () => { if (!selectedPreset) return; const nextPresets = presets.filter((preset) => preset.name !== selectedPreset.name); setPresets(nextPresets); setSelectedName(""); writePresets(nextPresets); }; return (