"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { toast } from "sonner" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import axios from "axios" import YouTube from "react-youtube" const fetchReviewQueue = async () => { const response = await axios.get("/api/review-queue") return response.data } const updateReviewItem = async (id, status, metadata) => { const response = await axios.put(`/api/review-queue/${id}`, { status, metadata }) return response.data } export function ReviewQueue() { const [selectedItem, setSelectedItem] = useState(null) const queryClient = useQueryClient() const { data: queue, isLoading, error } = useQuery({ queryKey: ["reviewQueue"], queryFn: fetchReviewQueue, }) const mutation = useMutation({ mutationFn: updateReviewItem, onSuccess: () => { queryClient.invalidateQueries(["reviewQueue"]) toast.success("Item updated successfully") setSelectedItem(null) }, onError: (error) => { toast.error(`Error updating item: ${error.message}`) }, }) const handleApprove = (item) => { mutation.mutate({ id: item.id, status: "approved", metadata: item.metadata }) } const handleReject = (item) => { mutation.mutate({ id: item.id, status: "rejected", metadata: item.metadata }) } const handleEdit = (item) => { setSelectedItem(item) } const handleSaveEdit = () => { mutation.mutate({ id: selectedItem.id, status: "approved", metadata: selectedItem.metadata, }) } if (isLoading) return
Loading...
if (error) return Error{error.message} return (
Review Queue Manage content flagged for manual review Title Channel Status Actions {queue?.map((item) => ( {item.title} {item.channel} {item.status} handleApprove(item)}>Approve handleReject(item)}>Reject handleEdit(item)}>Edit Metadata ))}
{selectedItem && ( Edit Metadata Review and edit content details
{selectedItem.title}
{selectedItem.channel}
Transcript
{selectedItem.transcript}
Extracted Metadata
Series:
setSelectedItem({ ...selectedItem, metadata: { ...selectedItem.metadata, series: e.target.value } })} className="rounded-md border px-2 py-1 text-sm" />
Characters:
setSelectedItem({ ...selectedItem, metadata: { ...selectedItem.metadata, characters: e.target.value } })} className="rounded-md border px-2 py-1 text-sm" />
Themes:
setSelectedItem({ ...selectedItem, metadata: { ...selectedItem.metadata, themes: e.target.value } })} className="rounded-md border px-2 py-1 text-sm" />