"use client"; import { useOptimistic, useTransition, useRef, useState } from "react"; export function UsernameEdit({ userId, currentUsername, action, }: { userId: string; currentUsername: string; action: (formData: FormData) => Promise; }) { const [optimisticUsername, setOptimisticUsername] = useOptimistic(currentUsername); const [editing, setEditing] = useState(false); const [, startTransition] = useTransition(); const inputRef = useRef(null); function startEdit() { setEditing(true); setTimeout(() => inputRef.current?.select(), 0); } function submit(value: string) { const trimmed = value.trim(); if (!trimmed || trimmed === currentUsername) { setEditing(false); return; } setEditing(false); startTransition(async () => { setOptimisticUsername(trimmed); const fd = new FormData(); fd.append("id", userId); fd.append("username", trimmed); await action(fd); }); } if (editing) { return ( submit(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") submit((e.target as HTMLInputElement).value); if (e.key === "Escape") setEditing(false); }} /> ); } return ( ); }