import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { RealtimeRefresh } from "@/components/realtime-refresh"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { db } from "@/db"; import { videoUploads } from "@/db/schema"; import { desc } from "drizzle-orm"; import { retryVideoJob } from "../actions"; export const dynamic = "force-dynamic"; function statusVariant(status: string) { return status === "completed" ? "default" : status === "failed" ? "destructive" : "secondary"; } export default async function AdminUploadHistoryPage() { const uploads = await db.query.videoUploads.findMany({ orderBy: [desc(videoUploads.createdAt)], limit: 20, }); const allJobs = uploads.length ? await db.query.videoUploadJobs.findMany({ where: (table, { inArray }) => inArray( table.uploadId, uploads.map((upload) => upload.id), ), }) : []; const jobsByUpload = new Map(); for (const job of allJobs) jobsByUpload.set(job.uploadId, [ ...(jobsByUpload.get(job.uploadId) ?? []), job, ]); return ( <> Upload history Scheduled and recent publishing jobs. {uploads.length === 0 ? (

No uploads yet.

) : ( uploads.map((upload) => (

{upload.title}

{upload.scheduledAt ? `Scheduled ${upload.scheduledAt.toLocaleString("en-GB", { timeZone: "Asia/Bangkok" })}` : upload.createdAt.toLocaleString("en-GB", { timeZone: "Asia/Bangkok", })}

{upload.status} {(jobsByUpload.get(upload.id) ?? []).map((job) => ( {job.platform}: {job.status} {job.status === "failed" && (
)}
))}
)) )}
); }