'use client' import { useEffect, useState } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { DollarSign, Clock, CheckCircle, XCircle, Eye, Search, Filter } from 'lucide-react' import { motion } from 'framer-motion' import { toast } from 'sonner' interface Payout { id: string amount: number status: 'PENDING' | 'APPROVED' | 'REJECTED' | 'PAID' bankDetails: string adminNotes?: string createdAt: string updatedAt: string user: { id: string name: string email: string } } interface PayoutStats { totalRequests: number pendingAmount: number approvedAmount: number paidAmount: number } export default function AdminPayoutsPage() { const [payouts, setPayouts] = useState([]) const [stats, setStats] = useState(null) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState({ status: 'all', search: '' }) const [selectedPayout, setSelectedPayout] = useState(null) const [reviewDialogOpen, setReviewDialogOpen] = useState(false) const [reviewStatus, setReviewStatus] = useState<'APPROVED' | 'REJECTED'>('APPROVED') const [adminNotes, setAdminNotes] = useState('') const [processing, setProcessing] = useState(false) useEffect(() => { fetchPayouts() fetchStats() }, []) const fetchPayouts = async () => { try { const response = await fetch('/api/admin/payouts') if (!response.ok) throw new Error('Failed to fetch payouts') const data = await response.json() setPayouts(data.payouts || []) } catch (error) { console.error('Error fetching payouts:', error) toast.error('Failed to load payouts') } finally { setLoading(false) } } const fetchStats = async () => { try { const response = await fetch('/api/admin/payouts/stats') if (!response.ok) throw new Error('Failed to fetch stats') const data = await response.json() setStats(data) } catch (error) { console.error('Error fetching stats:', error) } } const handleReviewPayout = async () => { if (!selectedPayout) return setProcessing(true) try { const response = await fetch(`/api/admin/payouts/${selectedPayout.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: reviewStatus, adminNotes }) }) if (!response.ok) throw new Error('Failed to update payout') toast.success(`Payout ${reviewStatus.toLowerCase()} successfully`) setReviewDialogOpen(false) setSelectedPayout(null) setAdminNotes('') fetchPayouts() fetchStats() } catch (error) { console.error('Error updating payout:', error) toast.error('Failed to update payout') } finally { setProcessing(false) } } const openReviewDialog = (payout: Payout) => { setSelectedPayout(payout) setAdminNotes(payout.adminNotes || '') setReviewDialogOpen(true) } const getStatusColor = (status: string) => { switch (status) { case 'PENDING': return 'bg-yellow-100 text-yellow-800' case 'APPROVED': return 'bg-blue-100 text-blue-800' case 'REJECTED': return 'bg-red-100 text-red-800' case 'PAID': return 'bg-green-100 text-green-800' default: return 'bg-gray-100 text-gray-800' } } const getStatusIcon = (status: string) => { switch (status) { case 'PENDING': return case 'APPROVED': return case 'REJECTED': return case 'PAID': return default: return } } const filteredPayouts = payouts.filter(payout => { const matchesStatus = filter.status === 'all' || payout.status === filter.status const matchesSearch = !filter.search || payout.user.name.toLowerCase().includes(filter.search.toLowerCase()) || payout.user.email.toLowerCase().includes(filter.search.toLowerCase()) return matchesStatus && matchesSearch }) if (loading) { return (
) } return (
{/* Header */}

Payout Management

Review and manage user payout requests

{/* Stats Cards */} {stats && (

Total Requests

{stats.totalRequests}

Pending Amount

₹{stats.pendingAmount.toFixed(0)}

Approved Amount

₹{stats.approvedAmount.toFixed(0)}

Paid Amount

₹{stats.paidAmount.toFixed(0)}

)} {/* Filters */}
Payout Requests
setFilter(prev => ({ ...prev, search: e.target.value }))} className="pl-10 w-64" />
{filteredPayouts.length === 0 ? (

No payout requests found

Payout requests will appear here when users submit them

) : (
{filteredPayouts.map((payout, index) => (
{getStatusIcon(payout.status)}
{payout.user.name} {payout.status}

{payout.user.email}

Requested {new Date(payout.createdAt).toLocaleDateString()}

₹{payout.amount.toFixed(2)}

Updated {new Date(payout.updatedAt).toLocaleDateString()}

))}
)}
{/* Review Dialog */} Review Payout Request Review and take action on this payout request {selectedPayout && (
{/* User Info */}

User Information

Name:

{selectedPayout.user.name}

Email:

{selectedPayout.user.email}

Amount:

₹{selectedPayout.amount.toFixed(2)}

Status: {selectedPayout.status}
{/* Bank Details */}
{selectedPayout.bankDetails}
{/* Action Section */} {selectedPayout.status === 'PENDING' && (