'use client' import { useState, useEffect, useCallback } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Badge } from '@/components/ui/badge' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { DollarSign, TrendingUp, Users, Settings, Search, Filter, CheckCircle, Clock, XCircle, Edit, Plus } from 'lucide-react' import { motion } from 'framer-motion' import { toast } from 'sonner' interface Commission { id: string amount: number level: number type: 'REFERRAL' | 'LEVEL' | 'BONUS' status: 'PENDING' | 'APPROVED' | 'PAID' | 'CANCELLED' createdAt: string user: { id: string name: string email: string } fromUser: { id: string name: string email: string } order?: { id: string total: number } } interface CommissionStats { totalCommissions: number pendingAmount: number approvedAmount: number paidAmount: number thisMonthCommissions: number averageCommission: number } interface CommissionSetting { id: string level: number percentage: number isActive: boolean } const statusConfig = { PENDING: { label: 'Pending', color: 'bg-yellow-100 text-yellow-800', icon: Clock }, APPROVED: { label: 'Approved', color: 'bg-blue-100 text-blue-800', icon: CheckCircle }, PAID: { label: 'Paid', color: 'bg-green-100 text-green-800', icon: CheckCircle }, CANCELLED: { label: 'Cancelled', color: 'bg-red-100 text-red-800', icon: XCircle } } export default function AdminCommissionsPage() { const [commissions, setCommissions] = useState([]) const [stats, setStats] = useState(null) const [settings, setSettings] = useState([]) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState({ status: 'all', type: 'all', level: 'all', search: '' }) const [settingsDialogOpen, setSettingsDialogOpen] = useState(false) const [editingSetting, setEditingSetting] = useState(null) const fetchData = useCallback(async () => { try { setLoading(true) const [commissionsRes, statsRes, settingsRes] = await Promise.all([ fetch('/api/admin/commissions'), fetch('/api/admin/commissions/stats'), fetch('/api/admin/commissions/settings') ]) // Check if responses are ok and contain valid JSON const commissionsData = commissionsRes.ok ? await commissionsRes.json() : { commissions: [] } const statsData = statsRes.ok ? await statsRes.json() : { totalCommissions: 0, pendingAmount: 0, approvedAmount: 0, paidAmount: 0, thisMonthCommissions: 0, averageCommission: 0 } const settingsData = settingsRes.ok ? await settingsRes.json() : { settings: [] } setCommissions(commissionsData.commissions || []) setStats(statsData) setSettings(settingsData.settings || []) } catch (error) { console.error('Error fetching commission data:', error) toast.error('Failed to load commission data') // Set fallback data setCommissions([]) setStats({ totalCommissions: 0, pendingAmount: 0, approvedAmount: 0, paidAmount: 0, thisMonthCommissions: 0, averageCommission: 0 }) setSettings([]) } finally { setLoading(false) } }, []) useEffect(() => { fetchData() }, [fetchData]) const handleStatusUpdate = async (commissionId: string, newStatus: string) => { try { const response = await fetch(`/api/admin/commissions/${commissionId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus }) }) if (!response.ok) throw new Error('Failed to update commission') toast.success('Commission status updated successfully') fetchData() } catch (error) { console.error('Error updating commission:', error) toast.error('Failed to update commission status') } } const handleSettingUpdate = async (setting: CommissionSetting) => { try { const response = await fetch(`/api/admin/commissions/settings/${setting.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ level: setting.level, percentage: setting.percentage, isActive: setting.isActive }) }) if (!response.ok) throw new Error('Failed to update setting') toast.success('Commission setting updated successfully') fetchData() setEditingSetting(null) setSettingsDialogOpen(false) } catch (error) { console.error('Error updating setting:', error) toast.error('Failed to update commission setting') } } const filteredCommissions = commissions.filter(commission => { const matchesStatus = filter.status === 'all' || commission.status === filter.status const matchesType = filter.type === 'all' || commission.type === filter.type const matchesLevel = filter.level === 'all' || commission.level.toString() === filter.level const matchesSearch = !filter.search || commission.user.name.toLowerCase().includes(filter.search.toLowerCase()) || commission.user.email.toLowerCase().includes(filter.search.toLowerCase()) || commission.fromUser.name.toLowerCase().includes(filter.search.toLowerCase()) return matchesStatus && matchesType && matchesLevel && matchesSearch }) if (loading) { return (
) } return (
{/* Header */}

Commission Management

Monitor and manage all commission transactions

Commission Settings
{settings.map((setting) => (

Level {setting.level}

{setting.percentage}% commission

{setting.isActive ? 'Active' : 'Inactive'}
))}
{/* Stats Cards */} {stats && (

Total Commissions

{stats.totalCommissions}

Pending Amount

₹{stats.pendingAmount.toFixed(0)}

Paid Amount

₹{stats.paidAmount.toFixed(0)}

Avg Commission

₹{stats.averageCommission.toFixed(0)}

)} {/* Main Commission Table */}
All Commissions
setFilter(prev => ({ ...prev, search: e.target.value }))} className="pl-10 w-64 bg-white shadow-sm" />
Recipient From User Amount Level Type Status Date Actions {filteredCommissions.map((commission, index) => (
{commission.user.name?.charAt(0) || 'U'}

{commission.user.name}

{commission.user.email}

{commission.fromUser.name}

{commission.fromUser.email}

₹{commission.amount.toFixed(2)} Level {commission.level} {commission.type} {statusConfig[commission.status].label}

{new Date(commission.createdAt).toLocaleDateString()}

{commission.status === 'PENDING' && ( <> )} {commission.status === 'APPROVED' && ( )}
))}
{filteredCommissions.length === 0 && (

No commissions found

Try adjusting your search or filter criteria

)}
{/* Edit Setting Dialog */} {editingSetting && ( setEditingSetting(null)}> Edit Commission Setting
setEditingSetting(prev => prev ? { ...prev, level: parseInt(e.target.value) } : null)} />
setEditingSetting(prev => prev ? { ...prev, percentage: parseFloat(e.target.value) } : null)} />
setEditingSetting(prev => prev ? { ...prev, isActive: e.target.checked } : null)} />
)}
) }