"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useMemo, useState, useTransition } from "react"; import { Check, Languages, Plus, Settings2 } from "lucide-react"; import { Badge, Button, Card, CardContent } from "poyraz-ui/atoms"; import { toast } from "poyraz-ui/molecules"; import { useTranslations } from "@/components/i18n/i18n-provider"; import { DestructiveConfirmation } from "@/components/system/destructive-confirmation"; import type { LocaleStatus } from "@/server/db/schema"; import { setInstanceDefaultLocaleAction } from "./actions"; type LanguageListItem = { builtIn: boolean; code: string; completion: number; fallbackName: string | null; name: string; nativeName: string; status: LocaleStatus; usage: number; }; const filters = ["all", "draft", "active", "archived"] as const; type Filter = (typeof filters)[number]; export function LanguagesList({ initialDefaultLocale, languages, }: { initialDefaultLocale: string; languages: LanguageListItem[]; }) { const t = useTranslations(); const router = useRouter(); const [filter, setFilter] = useState("all"); const [defaultLocale, setDefaultLocale] = useState(initialDefaultLocale); const [pendingLocale, setPendingLocale] = useState(null); const [pending, startTransition] = useTransition(); const filtered = useMemo( () => filter === "all" ? languages : languages.filter((language) => language.status === filter), [filter, languages], ); function confirmDefault() { if (!pendingLocale) return; startTransition(async () => { const result = await setInstanceDefaultLocaleAction(pendingLocale.code); if (result.errorKey) { toast.error(t(result.errorKey)); return; } setDefaultLocale(result.defaultLocale ?? pendingLocale.code); setPendingLocale(null); toast.success(t("settings.languages.messages.defaultSaved")); router.refresh(); }); } return (

{t("settings.languages.title")}

{t("settings.languages.description")}

{filters.map((item) => ( ))}
{filtered.length === 0 ? (
) : (
{t("settings.languages.columns.language")} {t("settings.languages.columns.status")} {t("settings.languages.columns.fallback")} {t("settings.languages.columns.completion")} {t("settings.languages.columns.usage")} {t("settings.languages.columns.actions")}
{filtered.map((language) => { const isDefault = language.code === defaultLocale; return (
{language.nativeName} {language.code} {language.builtIn && ( {t("settings.languages.badges.builtIn")} )} {isDefault && ( {t("settings.languages.badges.default")} )}

{language.name}

{t(`settings.languages.status.${language.status}`)}
{language.fallbackName ?? t("settings.languages.values.none")}
{language.completion}%
{t("settings.languages.values.usage", { count: language.usage })}
{language.status === "active" && !isDefault && ( )}
); })}
)} { if (!open) setPendingLocale(null); }} loading={pending} title={t("settings.languages.defaultDialog.title")} description={t("settings.languages.defaultDialog.description", { language: pendingLocale?.nativeName ?? "", })} cancelLabel={t("settings.languages.defaultDialog.cancel")} confirmLabel={t("settings.languages.defaultDialog.confirm")} onConfirm={confirmDefault} /> ); }