"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { AlertTriangle, ArrowLeft, CheckCircle2, Languages, Save, ShieldCheck } from "lucide-react"; import { Badge, Button, Card, CardContent, Input, Label, RadioGroup, RadioGroupItem } from "poyraz-ui/atoms"; import { Alert, AlertDescription, AlertTitle, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast } from "poyraz-ui/molecules"; import { useTranslations } from "@/components/i18n/i18n-provider"; import { DestructiveConfirmation } from "@/components/system/destructive-confirmation"; import type { LocaleStatus, TextDirection } from "@/server/db/schema"; import type { LocaleReadiness, LocaleUsage, NamespaceCompletion } from "@/server/i18n/service"; import { activateLanguageAction, archiveLanguageAction, setDetailDefaultLocaleAction, updateLanguageMetadataAction, } from "./actions"; type LocaleDetail = { builtIn: boolean; code: string; fallbackLocale: string | null; name: string; nativeName: string; status: LocaleStatus; textDirection: TextDirection; }; type LifecycleAction = "activate" | "archive" | "default"; export function LanguageDetail({ completion, defaultLocale, fallbackOptions, locale, namespaceCompletion, readiness, usage, }: { completion: number; defaultLocale: string; fallbackOptions: Array<{ code: string; nativeName: string }>; locale: LocaleDetail; namespaceCompletion: NamespaceCompletion[]; readiness: LocaleReadiness; usage: LocaleUsage; }) { const t = useTranslations(); const router = useRouter(); const [fallbackLocale, setFallbackLocale] = useState(locale.fallbackLocale ?? ""); const [dialog, setDialog] = useState(null); const [pending, startTransition] = useTransition(); const isDefault = defaultLocale === locale.code; const criticalComplete = readiness.missingCriticalKeys.length === 0; function updateMetadata(formData: FormData) { formData.set("fallbackLocale", fallbackLocale); startTransition(async () => { const result = await updateLanguageMetadataAction(locale.code, formData); if (result.errorKey) { toast.error(t(result.errorKey)); return; } toast.success(t("settings.languageDetail.messages.metadataSaved")); router.refresh(); }); } function confirmLifecycle() { if (!dialog) return; startTransition(async () => { const result = dialog === "activate" ? await activateLanguageAction(locale.code) : dialog === "default" ? await setDetailDefaultLocaleAction(locale.code) : await archiveLanguageAction(locale.code); if (result.errorKey) { toast.error(t(result.errorKey, { count: "missingCriticalCount" in result ? Number( result.missingCriticalCount ?? readiness.missingCriticalKeys.length, ) : readiness.archiveReferences, })); return; } toast.success(t(`settings.languageDetail.messages.${dialog}`)); setDialog(null); router.refresh(); }); } const dialogName = dialog ?? "activate"; return (

{locale.nativeName}

{locale.code} {t(`settings.languages.status.${locale.status}`)} {locale.builtIn && ( {t("settings.languages.badges.builtIn")} )} {isDefault && ( {t("settings.languages.badges.default")} )}

{locale.name}

{locale.builtIn ? ( ) : (
{t("settings.languageDetail.fields.direction")} {(["ltr", "rtl"] as const).map((direction) => ( ))}
)}

{t("settings.languageDetail.readiness.title")}

{t("settings.languageDetail.readiness.description")}

{!criticalComplete && ( )}
{locale.status !== "active" && ( )} {!isDefault && ( )} {!locale.builtIn && locale.status !== "archived" && ( )}

{t("settings.languageDetail.usage.title")}

{t("settings.languageDetail.usage.description")}

{Object.entries(usage).map(([key, count]) => (

{t(`settings.languageDetail.usage.${key}`)}

{count}

))}

{t("settings.languageDetail.completion.title")}

{t("settings.languageDetail.completion.description")}

{completion}%
{namespaceCompletion.map((item) => (
{t(`settings.languageDetail.namespaces.${item.namespace}`)} {item.percent}%

{t("settings.languageDetail.completion.value", { translated: item.translated, total: item.total, })}

))}
{ if (!open) setDialog(null); }} loading={pending} title={t(`settings.languageDetail.dialog.${dialogName}.title`)} description={t(`settings.languageDetail.dialog.${dialogName}.description`, { language: locale.nativeName, })} cancelLabel={t("settings.languageDetail.dialog.cancel")} confirmLabel={t(`settings.languageDetail.dialog.${dialogName}.confirm`)} onConfirm={confirmLifecycle} />
); } function ReadinessRow({ complete, label, }: { complete: boolean; label: string; }) { return (
{complete ? (
); }