import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import { faPaperPlane } from "@fortawesome/pro-regular-svg-icons" import { useForm } from "react-hook-form" import { useMutation, useQuery, useRouter } from "blitz" import sendMessage from "../mutations/send-message" import { Direction, Message, MessageStatus } from "../../../db" import getConversationsQuery from "../queries/get-conversations" import useCurrentCustomer from "../../core/hooks/use-current-customer" import useCustomerPhoneNumber from "../../core/hooks/use-customer-phone-number" type Form = { content: string } export default function NewMessageArea() { const router = useRouter() const recipient = router.params.recipient const { customer } = useCurrentCustomer() const phoneNumber = useCustomerPhoneNumber() const sendMessageMutation = useMutation(sendMessage)[0] const { setQueryData: setConversationsQueryData, refetch: refetchConversations } = useQuery( getConversationsQuery, {} )[1] const { register, handleSubmit, setValue, formState: { isSubmitting }, } = useForm
() const onSubmit = handleSubmit(async ({ content }) => { if (isSubmitting) { return } const id = uuidv4() const message: Message = { id, customerId: customer!.id, twilioSid: id, from: phoneNumber!.phoneNumber, to: recipient, content: content, direction: Direction.Outbound, status: MessageStatus.Queued, sentAt: new Date(), } await setConversationsQueryData( (conversations) => { const nextConversations = { ...conversations } if (!nextConversations[recipient]) { nextConversations[recipient] = [] } nextConversations[recipient] = [...nextConversations[recipient]!, message] return nextConversations }, { refetch: false } ) setValue("content", "") await sendMessageMutation({ to: recipient, content }) await refetchConversations({ cancelRefetch: true }) }) return (