"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { AdminDialog } from "@/components/ui/admin-dialog";
import { createAccount, updateAccount } from "./actions";
type ParentOption = { id: string; code: string; name: string; parentId: string | null };
type AccountRow = {
id: string;
code: string;
name: string;
description: string | null;
parentId: string | null;
isActive: boolean;
};
const INPUT = "w-full rounded-lg border border-neutral-300 px-3 py-2 text-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500/20";
function AccountFormFields({
account,
allAccounts,
}: {
account?: AccountRow;
allAccounts: ParentOption[];
}) {
// Only allow parent to be a top-level (parentId == null) or sub-category (parentId != null but has no grandparent)
// i.e. depth 0 or depth 1 nodes can be parents
const topLevel = allAccounts.filter((a) => a.parentId === null && (!account || a.id !== account.id));
const subLevel = allAccounts.filter((a) => a.parentId !== null && (!account || a.id !== account.id));
return (
);
}
export function AddAccountButton({ allAccounts }: { allAccounts: ParentOption[] }) {
const router = useRouter();
const [open, setOpen] = useState(false);
const [pending, setPending] = useState(false);
const [error, setError] = useState("");
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setPending(true);
setError("");
const result = await createAccount(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); }
else { setPending(false); setOpen(false); router.refresh(); }
}
return (
<>
setOpen(false)}>
>
);
}
export function EditAccountButton({
account,
allAccounts,
open: controlledOpen,
onOpenChange,
}: {
account: AccountRow;
allAccounts: ParentOption[];
open?: boolean;
onOpenChange?: (v: boolean) => void;
}) {
const router = useRouter();
const [internalOpen, setInternalOpen] = useState(false);
const [pending, setPending] = useState(false);
const [error, setError] = useState("");
const isControlled = controlledOpen !== undefined;
const open = isControlled ? controlledOpen : internalOpen;
const setOpen = isControlled ? (onOpenChange ?? (() => {})) : setInternalOpen;
async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
setPending(true);
setError("");
const fd = new FormData(e.currentTarget);
fd.set("id", account.id);
const result = await updateAccount(fd);
if ("error" in result) { setError(result.error); setPending(false); }
else { setPending(false); setOpen(false); router.refresh(); }
}
return (
<>
{!isControlled && (
)}
setOpen(false)}>
>
);
}