import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Plus, Search, Loader2 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { ticketsService } from "@/services/tickets.service"; import type { Ticket } from "@/types"; export default function TicketsPage() { const [search, setSearch] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [typeFilter, setTypeFilter] = useState("all"); const [createOpen, setCreateOpen] = useState(false); const [form, setForm] = useState({ subject: "", type: "bug", description: "" }); const { toast } = useToast(); const qc = useQueryClient(); const { data, isLoading } = useQuery({ queryKey: ["tickets", statusFilter, typeFilter, search], queryFn: () => ticketsService.list({ ...(statusFilter !== "all" ? { status: statusFilter } : {}), ...(typeFilter !== "all" ? { type: typeFilter } : {}), ...(search ? { search } : {}), }), }); const tickets: Ticket[] = data?.items ?? data?.data ?? []; const createMut = useMutation({ mutationFn: ticketsService.create, onSuccess: () => { qc.invalidateQueries({ queryKey: ["tickets"] }); setCreateOpen(false); setForm({ subject: "", type: "bug", description: "" }); toast({ title: "Ticket created successfully" }); }, onError: () => { toast({ title: "Failed to create ticket", variant: "destructive" }); }, }); function handleCreate() { if (!form.subject.trim()) return; createMut.mutate({ subject: form.subject.trim(), type: form.type as Ticket["type"], description: form.description.trim(), }); } const statusVariant = (s: string) => s === "open" ? "default" : s === "in_progress" ? "secondary" : "outline"; const typeVariant = (t: string) => t === "bug" ? "destructive" : t === "feature" ? "secondary" : "outline"; return (
Manage support tickets and feature requests.