import type { UserRecord } from "@sprint/shared"; import { type FormEvent, useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Field } from "@/components/ui/field"; import { useAddOrganisationMember } from "@/lib/query/hooks"; import { parseError, user } from "@/lib/server"; export function AddMemberDialog({ organisationId, existingMembers, trigger, onSuccess, }: { organisationId: number; existingMembers: string[]; trigger?: React.ReactNode; onSuccess?: (user: UserRecord) => void | Promise; }) { const [open, setOpen] = useState(false); const [username, setUsername] = useState(""); const [submitAttempted, setSubmitAttempted] = useState(false); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const addMember = useAddOrganisationMember(); const reset = () => { setUsername(""); 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 (username.trim() === "") { return; } if (existingMembers.includes(username)) { setError("user is already a member of this organisation"); return; } setSubmitting(true); try { const userData: UserRecord = await user.byUsername(username); const userId = userData.id; await addMember.mutateAsync({ organisationId, userId, role: "member" }); setOpen(false); reset(); try { await onSuccess?.(userData); } catch (actionErr) { console.error(actionErr); } } catch (err) { const message = parseError(err as Error); console.error(err); setError(message || "failed to add member"); setSubmitting(false); toast.error(`Error adding member: ${message}`, { dismissible: false, }); } }; return ( {trigger || } Add Member
setUsername(e.target.value)} validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} submitAttempted={submitAttempted} placeholder="Enter username" error={error || undefined} />
); }