From f0b3338f08b1c8225a4346b1709a2355f420fadb Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Wed, 22 Apr 2026 13:53:37 -0400 Subject: [PATCH] fix: live update request status --- backend/src/routes/overseer.ts | 17 ++++++++++++----- .../app/dashboard/components/RequestHistory.tsx | 10 ++++++++++ frontend/src/app/dashboard/page.tsx | 2 ++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/backend/src/routes/overseer.ts b/backend/src/routes/overseer.ts index 5526d3f..ec290e5 100644 --- a/backend/src/routes/overseer.ts +++ b/backend/src/routes/overseer.ts @@ -79,11 +79,13 @@ router.post( cost += (seasons.length - 1) * (settings?.tvPerSeasonCost || 250); const dbBalance = user.totalEarned - user.totalSpent; if (dbBalance < cost) - return res.status(400).json({ - error: "Insufficient balance", - required: cost, - current: dbBalance, - }); + return res + .status(400) + .json({ + error: "Insufficient balance", + required: cost, + current: dbBalance, + }); const overseerRequest = await overseerClient.post("/request", { mediaType, mediaId, @@ -162,6 +164,11 @@ router.post( reason: `Refunded: ${request.title}`, }); } + io.to(`user:${request.userId}`).emit("request_updated", { + id: request.id, + status: updatedRequest.status, + title: request.title, + }); res.json({ success: true, request: updatedRequest }); }), ); diff --git a/frontend/src/app/dashboard/components/RequestHistory.tsx b/frontend/src/app/dashboard/components/RequestHistory.tsx index 979e5fe..6c751d5 100644 --- a/frontend/src/app/dashboard/components/RequestHistory.tsx +++ b/frontend/src/app/dashboard/components/RequestHistory.tsx @@ -6,11 +6,13 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { userApi } from "@/lib/api"; +import { useSocket } from "@/lib/socket"; export function RequestHistory() { const [requests, setRequests] = useState([]); const [status, setStatus] = useState(""); const [query, setQuery] = useState(""); + const socket = useSocket(); const load = async () => { const res = await userApi.getRequests(1, 50, status || undefined); @@ -20,6 +22,14 @@ export function RequestHistory() { useEffect(() => { load(); }, [status]); + useEffect(() => { + if (!socket) return; + const refresh = () => load(); + socket.on("request_updated", refresh); + return () => { + socket.off("request_updated", refresh); + }; + }, [socket, status]); const filtered = requests.filter( (r) => diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx index 5de0eb5..eecf39c 100644 --- a/frontend/src/app/dashboard/page.tsx +++ b/frontend/src/app/dashboard/page.tsx @@ -51,10 +51,12 @@ export default function DashboardPage() { socket.on("credits_earned", refresh); socket.on("bonus_received", refresh); socket.on("credits_spent", refresh); + socket.on("request_updated", refresh); return () => { socket.off("credits_earned", refresh); socket.off("bonus_received", refresh); socket.off("credits_spent", refresh); + socket.off("request_updated", refresh); }; }, [socket]);