import type { UserRecord } from "@issue/shared"; import { type FormEvent, useState } from "react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Field } from "@/components/ui/field"; import { Label } from "@/components/ui/label"; import { UserSelect } from "@/components/user-select"; import { issue } from "@/lib/server"; import { cn } from "@/lib/utils"; export function CreateIssue({ projectId, members, trigger, completeAction, }: { projectId?: number; members?: UserRecord[]; trigger?: React.ReactNode; completeAction?: (issueId: number) => void | Promise; }) { const userId = JSON.parse(localStorage.getItem("user") || "{}").id as number | undefined; const [open, setOpen] = useState(false); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [assigneeId, setAssigneeId] = useState("unassigned"); const [submitAttempted, setSubmitAttempted] = useState(false); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const reset = () => { setTitle(""); setDescription(""); setAssigneeId("unassigned"); setSubmitAttempted(false); setSubmitting(false); setError(null); }; const onOpenChange = (nextOpen: boolean) => { setOpen(nextOpen); if (!nextOpen) { reset(); } }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setError(null); setSubmitAttempted(true); if (title.trim() === "" || description.trim().length > 2048) { return; } if (!userId) { setError("you must be logged in to create an issue"); return; } if (!projectId) { setError("select a project first"); return; } setSubmitting(true); try { await issue.create({ projectId, title, description, assigneeId: assigneeId === "unassigned" ? null : Number(assigneeId), onSuccess: async (data) => { setOpen(false); reset(); try { await completeAction?.(data.id); } catch (actionErr) { console.error(actionErr); } }, onError: (message) => { setError(message); setSubmitting(false); }, }); } catch (err) { console.error(err); setError("failed to create issue"); setSubmitting(false); } }; return ( {trigger || ( )} Create Issue
setTitle(e.target.value)} validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} submitAttempted={submitAttempted} placeholder="Demo Issue" /> setDescription(e.target.value)} validate={(v) => v.trim().length > 2048 ? "Too long (2048 character limit)" : undefined } submitAttempted={submitAttempted} placeholder="Optional details" /> {members && members.length > 0 && (
)}
{error ? ( ) : ( )}
); }