"use client" import { Nav } from "@/components/core/nav"; import Altcha from "@/components/core/altcha"; import { authClient } from "@/util/auth-client"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { TbSend, TbClock, TbCheck, TbX, TbEye, TbNotes, TbInfoCircle, } from "react-icons/tb"; import Link from "next/link"; interface ServiceRequest { id: string; reason: string; status: 'pending' | 'approved' | 'denied'; adminNotes?: string; reviewedAt?: string; createdAt: string; serviceName: string; serviceDescription: string; } interface Service { id: string; name: string; description: string; priceStatus: string; joinLink?: string; enabled: boolean; } export default function ServiceRequests() { const router = useRouter(); const { data: session, isPending } = authClient.useSession(); const [mounted, setMounted] = useState(false); const [requests, setRequests] = useState([]); const [services, setServices] = useState([]); const [userServices, setUserServices] = useState([]); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [selectedService, setSelectedService] = useState(""); const [reason, setReason] = useState(""); const [captchaToken, setCaptchaToken] = useState(""); const [message, setMessage] = useState(""); useEffect(() => { setMounted(true); }, []); useEffect(() => { if (mounted && !isPending && !session) { router.push("/login?message=Please sign in to access service requests"); } }, [session, isPending, mounted, router]); useEffect(() => { if (session) { fetchRequests(); fetchUserServices(); fetchServices(); } }, [session]); const fetchRequests = async () => { try { const response = await fetch("/api/service-requests"); if (response.ok) { const data = await response.json(); setRequests(data.requests); } } catch (error) { console.error("Error fetching requests:", error); } finally { setLoading(false); } }; const fetchUserServices = async () => { try { const response = await fetch("/api/user-services"); if (response.ok) { const data = await response.json(); setUserServices(data.services.map((s: { serviceName: string }) => s.serviceName)); } } catch (error) { console.error("Error fetching user services:", error); } }; const fetchServices = async () => { try { const response = await fetch("/api/services"); if (response.ok) { const data = await response.json(); setServices(data.services); } } catch (error) { console.error("Error fetching services:", error); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedService || !reason || !captchaToken) { setMessage("Please fill in all fields and complete the captcha"); return; } setSubmitting(true); setMessage(""); try { const response = await fetch("/api/service-requests", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ serviceId: selectedService, reason, captchaToken }), }); const data = await response.json(); if (response.ok) { setMessage("Request submitted successfully!"); setSelectedService(""); setReason(""); setCaptchaToken(""); fetchRequests(); } else { setMessage(data.error || "Failed to submit request"); } } catch (error) { console.error("Error submitting request:", error); setMessage("An error occurred while submitting the request"); } finally { setSubmitting(false); } }; const getStatusIcon = (status: string) => { switch (status) { case 'pending': return ; case 'approved': return ; case 'denied': return ; default: return ; } }; const getStatusColor = (status: string) => { switch (status) { case 'pending': return 'text-yellow-600 bg-yellow-50 border-yellow-200'; case 'approved': return 'text-green-600 bg-green-50 border-green-200'; case 'denied': return 'text-red-600 bg-red-50 border-red-200'; default: return 'text-gray-600 bg-gray-50 border-gray-200'; } }; if (!mounted || isPending) { return (
); } if (!session) { return (
); } return (