'use client'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { useI18n } from '@/lib/i18n'; import * as React from 'react'; export type ApiSettings = { apiKey: string; baseUrl: string; }; type ApiSettingsDialogProps = { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; settings: ApiSettings; onSave: (settings: ApiSettings) => void; getReturnFocusTarget: () => HTMLButtonElement | null; }; export function ApiSettingsDialog({ isOpen, onOpenChange, settings, onSave, getReturnFocusTarget }: ApiSettingsDialogProps) { const { t } = useI18n(); const [draft, setDraft] = React.useState(settings); const [saveStatus, setSaveStatus] = React.useState<'idle' | 'saved' | 'error'>('idle'); const [validationMessage, setValidationMessage] = React.useState(null); const closeTimerRef = React.useRef(null); const wasOpenRef = React.useRef(false); const clearCloseTimer = React.useCallback(() => { if (closeTimerRef.current === null) return; window.clearTimeout(closeTimerRef.current); closeTimerRef.current = null; }, []); React.useEffect(() => clearCloseTimer, [clearCloseTimer]); React.useEffect(() => { const wasOpen = wasOpenRef.current; wasOpenRef.current = isOpen; if (!isOpen) { clearCloseTimer(); return; } if (wasOpen) return; clearCloseTimer(); setSaveStatus('idle'); setValidationMessage(null); setDraft(settings); }, [clearCloseTimer, isOpen, settings]); const handleOpenChange = (open: boolean) => { if (!open) clearCloseTimer(); onOpenChange(open); }; const closeAfterSaved = () => { clearCloseTimer(); closeTimerRef.current = window.setTimeout(() => { closeTimerRef.current = null; onOpenChange(false); }, 450); }; const handleSave = () => { const trimmedApiKey = draft.apiKey.trim(); const trimmedBaseUrl = draft.baseUrl.trim(); if (trimmedBaseUrl.length > 0 && trimmedApiKey.length === 0) { setSaveStatus('error'); setValidationMessage(t('api.urlPairRequired')); return; } try { onSave({ apiKey: trimmedApiKey, baseUrl: trimmedBaseUrl }); setValidationMessage(null); setSaveStatus('saved'); closeAfterSaved(); } catch (error) { console.error('Failed to save API settings.', error); setSaveStatus('error'); setValidationMessage(null); } }; const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); handleSave(); }; const handleClear = () => { const emptySettings = { apiKey: '', baseUrl: '' }; try { setDraft(emptySettings); onSave(emptySettings); setValidationMessage(null); setSaveStatus('saved'); closeAfterSaved(); } catch (error) { console.error('Failed to clear API settings.', error); setSaveStatus('error'); setValidationMessage(null); } }; return ( { event.preventDefault(); getReturnFocusTarget()?.focus(); }}>
{t('api.title')} {t('api.description')}
{ setValidationMessage(null); setDraft((current) => ({ ...current, apiKey: event.target.value })); }} />
{ setValidationMessage(null); setDraft((current) => ({ ...current, baseUrl: event.target.value })); }} />

{t('api.urlHint')}

{t('api.urlPairHint')}

{saveStatus === 'saved' && (

{t('api.saved')}

)} {saveStatus === 'error' && (

{validationMessage ?? t('api.saveFailed')}

)}
); }