"use client" /** * Known Issues Page - Public bugs/feature requests */ import { useEffect, useState } from "react" import { Card, CardContent } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { getApiUrl } from "@/lib/api-config" import Link from "next/link" import { ArrowLeft, ThumbsUp, Bug, Lightbulb, Loader2 } from "lucide-react" interface Ticket { id: number ticket_number: string type: string status: string priority: string title: string description: string upvotes: number created_at: string } const TYPE_ICONS: Record = { bug: Bug, feature: Lightbulb, } export default function KnownIssuesPage() { const [tickets, setTickets] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { fetchKnownIssues() }, []) const fetchKnownIssues = async () => { try { const res = await fetch(`${getApiUrl()}/tickets/known-issues`) if (res.ok) { setTickets(await res.json()) } } catch (e) { console.error("Failed to fetch known issues", e) } finally { setLoading(false) } } const handleUpvote = async (ticketNumber: string, e: React.MouseEvent) => { e.preventDefault() e.stopPropagation() try { await fetch(`${getApiUrl()}/tickets/${ticketNumber}/upvote`, { method: "POST", }) // Optimistic update setTickets(tickets.map(t => t.ticket_number === ticketNumber ? { ...t, upvotes: t.upvotes + 1 } : t )) } catch (e) { console.error("Failed to upvote", e) } } return (

Known Issues

Active bugs and feature requests

{loading ? (
) : tickets.length === 0 ? (

No known issues at this time.

) : (
{tickets.map((ticket) => { const Icon = TYPE_ICONS[ticket.type] || Bug return (
{ticket.ticket_number} {ticket.status === "in_progress" ? "In Progress" : "Open"}

{ticket.title}

{ticket.description && (

{ticket.description}

)}
) })}
)}
) }