/** * NewTicketPage.tsx * * Formulário para abertura de um novo chamado de TI. * Visão do Solicitante — Fase 4, Passo 2. */ import { useState, type FormEvent } from 'react'; import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { api, type TicketPriority } from '@/lib/api'; import { useAuth } from '@/context/AuthContext'; import { useToast } from '@/context/ToastContext'; import styles from './NewTicketPage.module.css'; // ─── Dados estáticos dos selects ────────────────────────────────────────────── const PRIORITIES: { value: TicketPriority; label: string; description: string }[] = [ { value: 'low', label: '🟢 Baixa', description: 'Sem impacto imediato' }, { value: 'medium', label: '🔵 Média', description: 'Impacto moderado' }, { value: 'high', label: '🟡 Alta', description: 'Impacto significativo' }, { value: 'critical', label: '🔴 Crítica', description: 'Sistema/serviço fora do ar' }, ]; // ─── Componente ─────────────────────────────────────────────────────────────── export default function NewTicketPage() { const navigate = useNavigate(); const queryClient = useQueryClient(); const { user } = useAuth(); const { addToast } = useToast(); // Estado do formulário const [title, setTitle] = useState(''); const [description, setDesc] = useState(''); const [priority, setPriority] = useState('medium'); const [categoryId, setCategoryId] = useState(undefined); // Query: categorias const { data: categories = [], isLoading: isLoadingCategories } = useQuery({ queryKey: ['categories'], queryFn: () => api.categories.list(), }); // Mutation: criação do ticket via API const { mutate: createTicket, isPending } = useMutation({ mutationFn: () => api.tickets.create({ title: title.trim(), description: description.trim(), priority, categoryId, creatorId: user!.id, }), onSuccess: (data) => { void queryClient.invalidateQueries({ queryKey: ['tickets'] }); addToast('Chamado criado com sucesso!', 'success'); navigate(`/tickets/${data.id}`); }, onError: (err: any) => { addToast(`Erro ao criar chamado: ${err.message}`, 'error'); }, }); function handleSubmit(e: FormEvent) { e.preventDefault(); createTicket(); } return (
{/* Cabeçalho da página */}

Novo Chamado

Descreva o problema com o máximo de detalhes possível para agilizar o atendimento.

{/* Formulário */}
{/* Título */}
setTitle(e.target.value)} required minLength={5} maxLength={150} disabled={isPending} aria-describedby="title-hint" />

Seja objetivo — este é o resumo que aparece na fila dos agentes.

{/* Descrição */}