"use client"; import { KeyRound } from "lucide-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { CopyField, FieldLabel, SettingsCard, SettingsSection, } from "@/components/settings/settings-parts"; import { API_BASE_URL } from "@/lib/api-client"; import { type EmailConfig, type EmailProvider, getEmailConfig, saveEmailConfig, testEmailConfig, } from "@/lib/email-settings"; import { notify } from "@/lib/toast"; const PROVIDERS: EmailProvider[] = [ "none", "resend", "postmark", "sendgrid", "smtp", ]; // Providers that authenticate with an API key (so we show the key field). const API_KEY_PROVIDERS: EmailProvider[] = ["resend", "postmark", "sendgrid"]; const controlClass = "h-9 w-full rounded-3xl border border-transparent bg-input/50 px-3 text-sm text-foreground outline-none transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/30"; function EmailProviderCard() { const { t } = useTranslation(); const [config, setConfig] = useState(null); const [provider, setProvider] = useState("none"); const [fromAddress, setFromAddress] = useState(""); const [credentials, setCredentials] = useState(""); // empty = untouched const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); useEffect(() => { getEmailConfig() .then((c) => { setConfig(c); setProvider(c.provider); setFromAddress(c.fromAddress); }) .catch(() => { /* non-admins won't reach this tab */ }); }, []); const save = async () => { setSaving(true); try { const saved = await saveEmailConfig({ provider, fromAddress: fromAddress.trim(), ...(credentials ? { credentials } : {}), }); setConfig(saved); setCredentials(""); notify.success(t("settings.developers.email.savedTitle")); } catch { notify.error(t("settings.developers.email.savedFailed")); } finally { setSaving(false); } }; const test = async () => { setTesting(true); try { const r = await testEmailConfig(); notify.success( t("settings.developers.email.testSentTitle"), t("settings.developers.email.testSentBody", { to: r.to }), ); } catch { notify.error(t("settings.developers.email.testFailed")); } finally { setTesting(false); } }; const needsKey = API_KEY_PROVIDERS.includes(provider); return ( {t(`settings.developers.email.providers.${config.provider}`)} ) : null } description={t("settings.developers.email.description")} title={t("settings.developers.email.title")} >
{t("settings.developers.email.provider")}
{t("settings.developers.email.from")} setFromAddress(e.target.value)} placeholder="temetro " value={fromAddress} />
{needsKey ? (
{t("settings.developers.email.apiKey")} setCredentials(e.target.value)} placeholder={ config?.hasCredentials ? t("settings.developers.email.apiKeySet") : t("settings.developers.email.apiKeyPlaceholder") } type="password" value={credentials} />
) : provider === "smtp" ? (

{t("settings.developers.email.smtpHint")}

) : null}
); } export function DevelopersPanel() { const { t } = useTranslation(); return ( <>

{t("settings.developers.authLabel")}

{t("settings.developers.authDescription")}

{t("settings.developers.comingSoon")} } description={t("settings.developers.tokensDescription")} title={t("settings.developers.tokensTitle")} >

{t("settings.developers.noTokens")}

{t("settings.developers.resourcesBody")}

); }