import { Button, FormControl, FormLabel, Input, FormHelperText, HStack, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Spinner, Text, VStack, RadioGroup, Radio, } from "@chakra-ui/react"; import { useState, useEffect } from "react"; import { api } from "~/utils/api"; import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; import { maybeReportError } from "~/utils/errorHandling/maybeReportError"; import { type ProjectUserRole } from "@prisma/client"; export const InviteMemberModal = ({ isOpen, onClose, }: { isOpen: boolean; onClose: () => void; }) => { const selectedProject = useSelectedProject().data; const utils = api.useContext(); const [email, setEmail] = useState(""); const [role, setRole] = useState("MEMBER"); useEffect(() => { setEmail(""); setRole("MEMBER"); }, [isOpen]); const emailIsValid = !email || !email.match(/.+@.+\..+/); const inviteMemberMutation = api.users.inviteToProject.useMutation(); const [inviteMember, isInviting] = useHandledAsyncCallback(async () => { if (!selectedProject?.id || !role) return; const resp = await inviteMemberMutation.mutateAsync({ projectId: selectedProject.id, email, role, }); if (maybeReportError(resp)) return; await utils.projects.get.invalidate(); onClose(); }, [inviteMemberMutation, email, role, selectedProject?.id, onClose]); return ( Invite Member Invite a new member to {selectedProject?.name}. setRole(e as ProjectUserRole)} colorScheme="orange" > MEMBER ADMIN Email setEmail(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter" && (e.metaKey || e.ctrlKey || e.shiftKey)) { e.preventDefault(); e.currentTarget.blur(); inviteMember(); } }} /> Enter the email of the person you want to invite. ); };