"use client"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { authenticatedFetch, isAuthenticated, redirectToLogin } from "@/lib/auth-utils"; import { BACKEND_URL } from "@/lib/env-config"; interface SubscriptionRequestItem { id: string; user_id: string; user_email: string; plan_id: string; status: string; created_at: string; approved_at: string | null; approved_by: string | null; } export default function AdminSubscriptionRequestsPage() { const [requests, setRequests] = useState([]); const [loading, setLoading] = useState(true); const [actionInProgress, setActionInProgress] = useState(null); const [accessDenied, setAccessDenied] = useState(false); const fetchRequests = async () => { if (!isAuthenticated()) { redirectToLogin(); return; } try { const response = await authenticatedFetch( `${BACKEND_URL}/api/v1/admin/subscription-requests` ); if (response.status === 401) { redirectToLogin(); return; } if (response.status === 403) { setAccessDenied(true); return; } if (!response.ok) { toast.error("Failed to load subscription requests."); return; } const data: SubscriptionRequestItem[] = await response.json(); setRequests(data); } catch { toast.error("Failed to load subscription requests."); } finally { setLoading(false); } }; useEffect(() => { fetchRequests(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleAction = async (requestId: string, action: "approve" | "reject") => { setActionInProgress(requestId); try { const response = await authenticatedFetch( `${BACKEND_URL}/api/v1/admin/subscription-requests/${requestId}/${action}`, { method: "POST" } ); if (!response.ok) { const err = await response.json().catch(() => ({})); toast.error(err.detail ?? `Failed to ${action} request.`); return; } toast.success(`Request ${action}d successfully.`); setRequests((prev) => prev.filter((r) => r.id !== requestId)); } catch { toast.error(`Failed to ${action} request.`); } finally { setActionInProgress(null); } }; if (accessDenied) { return (

Access denied. Superuser privileges required.

); } if (loading) { return (

Loading…

); } return (

Subscription Requests

{requests.length === 0 ? (

No pending subscription requests.

) : (
{requests.map((req) => ( ))}
User Plan Requested At Actions
{req.user_email} {req.plan_id.replace(/_/g, " ")} {new Date(req.created_at).toLocaleString()}
)}
); }