Implementation
src/features/ticket/components/ticket-upsert-form.tsx
"use client";
import { useActionState } from "react";
import { FieldError } from "@/components/form/field-error";
import { Form } from "@/components/form/form";
import { SubmitButton } from "@/components/form/submit-button";
import { EMPTY_ACTION_STATE } from "@/components/form/utils/to-action-state";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import { Ticket } from "@/generated/prisma/client";
import { upsertTicket } from "../actions/upsert-ticket";
type TicketUpsertFormProps = {
ticket?: Ticket;
};
const TicketUpsertForm = ({ ticket }: TicketUpsertFormProps) => {
const [actionState, action] = useActionState(
upsertTicket.bind(null, ticket?.id),
// Use the empty state as initial before the form ever got submitted
EMPTY_ACTION_STATE,
);
return (
<Form action={action} actionState={actionState}>
<Label htmlFor="title">Title</Label>
<Input
id="title"
name="title"
type="text"
defaultValue={
(actionState.payload?.get("title") as string) ?? ticket?.title
}
/>
<FieldError actionState={actionState} name="title" />
<Label htmlFor="content">Content</Label>
<Textarea
id="content"
name="content"
defaultValue={
(actionState.payload?.get("content") as string) ?? ticket?.content
}
/>
<FieldError actionState={actionState} name="content" />
<SubmitButton label={ticket ? "Edit" : "Create"} />
</Form>
);
};
export { TicketUpsertForm };