"use client"; import { useCallback } from "react"; import { useTranslations } from "next-intl"; import { Button, Select, SegmentedControl } from "@/shared/components"; import { InfoTooltip } from "@/shared/components"; import { FORMAT_OPTIONS, FORMAT_META, getExampleTemplates } from "../exampleTemplates"; import type { FormatId, TranslateMode } from "../types"; interface SimpleControlsProps { source: FormatId; target: FormatId; provider: string; inputText: string; mode: TranslateMode; onSourceChange: (source: FormatId) => void; onTargetChange: (target: FormatId) => void; onProviderChange: (provider: string) => void; onInputChange: (text: string) => void; onModeChange: (mode: TranslateMode) => void; onSubmit: () => void; onOpenAdvanced: () => void; isLoading?: boolean; providerOptions: Array<{ value: string; label: string }>; loading?: boolean; } export default function SimpleControls({ source, target, provider, inputText, mode, onSourceChange, onTargetChange, onProviderChange, onInputChange, onModeChange, onSubmit, onOpenAdvanced, isLoading = false, providerOptions, loading = false, }: SimpleControlsProps) { const t = useTranslations("translator"); const tr = useCallback( (key: string, fallback: string): string => { try { const translated = t(key as Parameters[0]); return translated === key || translated === `translator.${key}` ? fallback : translated; } catch { return fallback; } }, [t] ); const examples = getExampleTemplates(t as (key: string) => string); // Map provider string to a FormatId when a provider is selected const providerToFormatId = useCallback((prov: string): FormatId => { const normalized = prov.toLowerCase(); if (normalized.includes("gemini")) return "gemini"; if (normalized.includes("claude") || normalized.includes("anthropic")) return "claude"; if (normalized.includes("cursor")) return "cursor"; if (normalized.includes("kiro")) return "kiro"; if (normalized.includes("antigravity")) return "antigravity"; // Check FORMAT_META directly const metaKeys = Object.keys(FORMAT_META) as FormatId[]; const exactMatch = metaKeys.find((k) => k === normalized); if (exactMatch) return exactMatch; return "openai"; }, []); const handleProviderChange = useCallback( (e: React.ChangeEvent) => { const prov = e.target.value; onProviderChange(prov); onTargetChange(providerToFormatId(prov)); }, [onProviderChange, onTargetChange, providerToFormatId] ); const handleExampleChange = useCallback( (e: React.ChangeEvent) => { const selectedId = e.target.value; if (selectedId === "__custom__") { onOpenAdvanced(); return; } const template = examples.find((ex) => ex.id === selectedId); if (!template) return; // Load template body for the current source format const body = template.formats[source] ?? template.formats["openai"] ?? Object.values(template.formats)[0]; if (body) { onInputChange(JSON.stringify(body, null, 2)); } }, [examples, source, onInputChange, onOpenAdvanced] ); const modeOptions = [ { value: "preview", label: tr("simpleModePreview", "Preview translation only") }, { value: "send", label: tr("simpleModeSend", "Send and see response") }, ]; const exampleSelectOptions = [ ...examples.map((ex) => ({ value: ex.id, label: ex.name })), { value: "__custom__", label: tr("simpleStartWithCustomOption", "Paste your request (advanced)") }, ]; const sourceOptions = FORMAT_OPTIONS; return (
{/* Row 1: source format + provider (destination) */}
{tr("simpleAppUsesLabel", "My app uses")}
0 ? providerOptions : [{ value: provider, label: provider }]} value={provider} onChange={handleProviderChange} disabled={loading} />
{/* Row 2: example picker */}
{tr("simpleStartWithLabel", "Start with")}