"use client" import { z } from "zod" import { useState } from "react" import { useMutation, useQuery } from "convex/react" // @ts-ignore import { api } from "@/convex/_generated/api" import { DEFAULT_TENANT_ID } from "@/lib/constants" import { useAuth } from "@/lib/auth-client" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { FieldSet, FieldGroup, Field, FieldLabel, FieldError } from "@/components/ui/field" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { toast } from "sonner" import { Spinner } from "@/components/ui/spinner" import { Dropzone } from "@/components/ui/dropzone" const schema = z.object({ subject: z.string().min(3, "Informe um assunto"), summary: z.string().optional(), priority: z.enum(["LOW", "MEDIUM", "HIGH", "URGENT"]).default("MEDIUM"), channel: z.enum(["EMAIL", "WHATSAPP", "CHAT", "PHONE", "API", "MANUAL"]).default("MANUAL"), queueName: z.string().nullable().optional(), }) export function NewTicketDialog() { const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const form = useForm>({ resolver: zodResolver(schema), defaultValues: { subject: "", summary: "", priority: "MEDIUM", channel: "MANUAL", queueName: null }, mode: "onTouched", }) const { userId } = useAuth() const queues = useQuery(api.queues.summary, { tenantId: DEFAULT_TENANT_ID }) ?? [] const create = useMutation(api.tickets.create) const addComment = useMutation(api.tickets.addComment) const [attachments, setAttachments] = useState>([]) async function submit(values: z.infer) { if (!userId) return setLoading(true) toast.loading("Criando ticket…", { id: "new-ticket" }) try { const sel = queues.find((q: any) => q.name === values.queueName) const id = await create({ tenantId: DEFAULT_TENANT_ID, subject: values.subject, summary: values.summary, priority: values.priority, channel: values.channel, queueId: sel?.id, requesterId: userId as any, }) if (attachments.length > 0 || (values.summary && values.summary.trim().length > 0)) { await addComment({ ticketId: id as any, authorId: userId as any, visibility: "PUBLIC", body: values.summary || "", attachments }) } toast.success("Ticket criado!", { id: "new-ticket" }) setOpen(false) form.reset() setAttachments([]) // Navegar para o ticket recém-criado window.location.href = `/tickets/${id}` } catch (err) { toast.error("Não foi possível criar o ticket.", { id: "new-ticket" }) } finally { setLoading(false) } } return ( Novo ticket Preencha as informações básicas para abrir um chamado.
Assunto Resumo