"use client"; import { useState } from "react"; import { Tags } from "lucide-react"; import { useI18n } from "./I18nProvider"; import { api } from "@/lib/client-api"; import { prefixIcons, prefixUpdateSchema, type BadgeUser, type PrefixIcon, } from "@/shared/profile-appearance"; import { Username } from "./Username"; export function ModeratorPrefixes() { const { t } = useI18n(); const [search, setSearch] = useState(""), [users, setUsers] = useState([]), [selected, setSelected] = useState(null); const [prefix, setPrefix] = useState(""), [icon, setIcon] = useState("star"), [busy, setBusy] = useState(false), [error, setError] = useState(""), [saved, setSaved] = useState(false), [searched, setSearched] = useState(false); async function find(event: React.FormEvent) { event.preventDefault(); setBusy(true); setError(""); setSaved(false); setSelected(null); try { const result = await api<{ users: BadgeUser[] }>( "moderation/users?q=" + encodeURIComponent(search), ); setUsers(result.users); setSearched(true); } catch (failure) { setError((failure as Error).message); } finally { setBusy(false); } } async function save(remove = false) { if (!selected || busy) return; const body = prefixUpdateSchema.safeParse({ prefix: remove ? null : prefix, icon, }); if (!body.success) { setError( "Use a prefix of 1–24 characters without hidden controls or markup", ); return; } setBusy(true); setError(""); setSaved(false); try { const result = await api<{ user: BadgeUser }>( "moderation/users/" + selected.id, body.data, "PATCH", ); setSelected(result.user); setPrefix(result.user.custom_prefix ?? ""); setUsers((users) => users.map((user) => (user.id === result.user.id ? result.user : user)), ); setSaved(true); } catch (failure) { setError((failure as Error).message); } finally { setBusy(false); } } const iconLabels = { star: t("Star"), crown: t("Crown"), heart: t("Heart"), flame: t("Flame"), gem: t("Gem"), trophy: t("Trophy"), sparkles: t("Sparkles"), }; return (
{searched && users.length === 0 && (

{t("No players found.")}

)} {users.length > 0 && (
    {users.map((user) => (
  • ))}
)} {selected && (
{ event.preventDefault(); void save(); }} className="prefix-editor" >
)} {error && (

{t(error)}

)} {saved && (

{t("Player prefix saved.")}

)}
); }