import { Response } from '@/lib/api/response'; import { IncompleteFile } from '@/lib/db/models/incompleteFile'; import { fetchApi } from '@/lib/fetchApi'; import { ActionIcon, Badge, Button, Card, Group, Modal, Stack, Text, Title, Tooltip } from '@mantine/core'; import { showNotification } from '@mantine/notifications'; import { IncompleteFileStatus } from '@prisma/client'; import { IconFileDots, IconTrashFilled } from '@tabler/icons-react'; import { useRouter } from 'next/router'; import { ReactNode, useEffect, useState } from 'react'; import useSWR from 'swr'; const badgeMap: Record = { PENDING: ( Pending ), PROCESSING: ( Processing ), COMPLETE: ( Complete ), FAILED: ( Failed ), }; export default function PendingFilesButton() { const router = useRouter(); const [open, setOpen] = useState(router.query.pending !== undefined); const { data: incompleteFiles, mutate } = useSWR< Extract >('/api/user/files/incomplete'); const handleDelete = async (incompleteFile: IncompleteFile) => { const { error } = await fetchApi( '/api/user/files/incomplete', 'DELETE', { id: [incompleteFile.id], }, ); if (error) { showNotification({ title: 'Error', message: `Failed to delete pending file: ${error.message}`, color: 'red', icon: , }); } else { showNotification({ message: 'Cleared Pending File!', color: 'green', icon: , }); } mutate(); }; useEffect(() => { if (open) { router.push({ query: { ...router.query, pending: 'true' } }, undefined, { shallow: true }); } else { delete router.query.pending; router.push({ query: router.query }, undefined, { shallow: true }); } }, [open]); return ( <> setOpen(false)} title={Pending Files}> {incompleteFiles?.map((incompleteFile) => ( {incompleteFile.metadata.file.filename} {badgeMap[incompleteFile.status]} {incompleteFile.metadata.file.type} {incompleteFile.chunksComplete} / {incompleteFile.chunksTotal} processed {incompleteFile.id} ))} {incompleteFiles?.length === 0 && Nothing here!} setOpen(true)}> ); }