"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { updateWaterIrrigator, resetWaterIrrigatorPin, deleteWaterUser } from "@/actions/water-log/admin"; import { AdminButton } from "./design-system"; type WaterUser = { id: string; name: string; role: "irrigator" | "water_admin"; active: boolean; language_preference: string; last_used_at: string | null; created_at: string; }; type Props = { waterUser: WaterUser; backHref?: string; }; export default function WaterUserEditForm({ waterUser, backHref = "/admin/water-log" }: Props) { const router = useRouter(); // Holds user edits only; missing keys fall back to the current prop so we // never copy the prop into useState. When the prop changes, the fallback // value tracks the new prop automatically. const [draft, setDraft] = useState<{ name?: string; role?: "irrigator" | "water_admin"; active?: boolean; lang?: string; }>({}); const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(false); const [resetting, setResetting] = useState(false); const [newPin, setNewPin] = useState(null); const [error, setError] = useState(null); const name = draft.name ?? waterUser.name; const role = draft.role ?? waterUser.role; const active = draft.active ?? waterUser.active; const lang = draft.lang ?? waterUser.language_preference; const setName = (v: string) => setDraft((d) => ({ ...d, name: v })); const setRole = (v: "irrigator" | "water_admin") => setDraft((d) => ({ ...d, role: v })); const setActive = (v: boolean) => setDraft((d) => ({ ...d, active: v })); const setLang = (v: string) => setDraft((d) => ({ ...d, lang: v })); async function handleSave(e: React.FormEvent) { e.preventDefault(); setSaving(true); setError(null); const result = await updateWaterIrrigator(waterUser.id, name.trim(), active, lang, role); if (result.success) { router.push(backHref); } else { setError(result.error ?? "Failed to save"); setSaving(false); } } async function handleResetPin() { setResetting(true); const result = await resetWaterIrrigatorPin(waterUser.id); if (result.success && result.pin) { setNewPin(result.pin); } else { setError(result.error ?? "Failed to reset PIN"); } setResetting(false); } async function handleDelete() { if (!window.confirm(`Delete user "${waterUser.name}"? Their log entries will be preserved.`)) return; setDeleting(true); const result = await deleteWaterUser(waterUser.id); if (result.success) { router.push(backHref); } else { setError(result.error ?? "Failed to delete"); setDeleting(false); } } return (
{error && (
{error}
)} {newPin && (

New PIN for {name}:

{newPin}

Write this down — it will not be shown again.

)}
setName(e.target.value)} className="w-full rounded-lg border border-[var(--admin-border)] px-3 py-2 text-sm outline-none focus:border-[var(--admin-accent)]" required />

{role === "water_admin" ? "Can manage headgates, users, and entries" : "Can only submit water log entries"}

Reset PIN
Delete User Save Changes
); }