import { Badge, Box, Button, Code, Divider, Drawer, Group, Loader, Paper, ScrollArea, SimpleGrid, Stack, Table, Text, ThemeIcon, Title, Tooltip, } from '@mantine/core' import { useDisclosure } from '@mantine/hooks' import { useQuery } from '@tanstack/react-query' import { Link } from '@tanstack/react-router' import dayjs from 'dayjs' import { useState } from 'react' import { TbBug, TbExternalLink, TbHistory, TbMessageReport } from 'react-icons/tb' export interface ErrorDataTableProps { appId?: string } const STATUS_COLOR: Record = { OPEN: 'red', IN_PROGRESS: 'blue', ON_HOLD: 'orange', RESOLVED: 'teal', RELEASED: 'green', CLOSED: 'gray', } const STATUS_LABEL: Record = { OPEN: 'Open', ON_HOLD: 'On Hold', IN_PROGRESS: 'In Progress', RESOLVED: 'Resolved', RELEASED: 'Released', CLOSED: 'Closed', } export function ErrorDataTable({ appId }: ErrorDataTableProps) { const [opened, { open, close }] = useDisclosure(false) const [selectedError, setSelectedError] = useState(null) const [showStackTrace, setShowStackTrace] = useState(false) const { data: bugsData, isLoading } = useQuery({ queryKey: ['bugs', appId], queryFn: () => fetch(`/api/bugs?app=${appId || 'all'}&limit=10`).then((r) => r.json()), }) const bugs = bugsData?.data || [] const handleRowClick = (error: any) => { setSelectedError(error) setShowStackTrace(false) open() } return ( <> Latest Error Reports Most recent open bugs Error Description Reporter Version Reported Status {isLoading ? ( ) : bugs.length === 0 ? ( No error reports found. ) : bugs.map((error: any) => ( handleRowClick(error)} style={{ cursor: 'pointer' }} > {error.description} {error.user?.name || error.userId || 'System'} v{error.affectedVersion || 'N/A'} {dayjs(error.createdAt).format('D MMM YYYY, HH:mm')} {STATUS_LABEL[error.status?.toUpperCase()] ?? error.status} ))}
Error Detail } styles={{ header: { padding: '20px 24px', borderBottom: '1px solid var(--mantine-color-default-border)' }, }} > {selectedError && ( Description {selectedError.description} Status {STATUS_LABEL[selectedError.status?.toUpperCase()] ?? selectedError.status} Source {selectedError.source} App Version v{selectedError.affectedVersion || 'N/A'} Reported {dayjs(selectedError.createdAt).format('D MMM YYYY, HH:mm')} {selectedError.device && ( Device {selectedError.device} ยท {selectedError.os} )} {selectedError.feedBack && ( <> Developer Feedback {selectedError.feedBack} )} Stack Trace {showStackTrace && ( {selectedError.stackTrace || '(no stack trace)'} )} )} ) }