import { useState } from 'react'; import { usePeriods, useClosePeriod, useMarkPeriodPaid } from '@/hooks/useCommissions'; import type { PeriodFilters, CommissionPeriod, PeriodStatus } from '@/services/commissions'; export default function PeriodsPage() { const [filters, setFilters] = useState({ page: 1, limit: 20 }); const [payModal, setPayModal] = useState<{ id: string; reference: string; notes: string } | null>(null); const { data, isLoading, error } = usePeriods(filters); const closePeriod = useClosePeriod(); const markPaid = useMarkPeriodPaid(); const handleClose = async (id: string) => { if (window.confirm('Are you sure you want to close this period? This action cannot be undone.')) { await closePeriod.mutateAsync(id); } }; const handleMarkPaid = async () => { if (!payModal) return; await markPaid.mutateAsync({ id: payModal.id, data: { payment_reference: payModal.reference || undefined, payment_notes: payModal.notes || undefined, } }); setPayModal(null); }; if (isLoading) { return (
); } if (error) { return (

Error loading periods

); } const getStatusColor = (status: PeriodStatus) => { const colors: Record = { open: 'bg-blue-100 text-blue-800', closed: 'bg-yellow-100 text-yellow-800', processing: 'bg-orange-100 text-orange-800', paid: 'bg-green-100 text-green-800', }; return colors[status] || 'bg-gray-100 text-gray-800'; }; return (

Commission Periods

+ New Period
{/* Filters */}
setFilters((prev) => ({ ...prev, date_from: e.target.value || undefined, page: 1 }))} className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" />
setFilters((prev) => ({ ...prev, date_to: e.target.value || undefined, page: 1 }))} className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" />
{/* Periods List */}
{data?.data?.map((period: CommissionPeriod) => ( ))}
Period Date Range Entries Total Amount Status Actions
{period.name}
{new Date(period.starts_at).toLocaleDateString()} - {new Date(period.ends_at).toLocaleDateString()}
{period.total_entries || 0} ${(period.total_amount || 0).toLocaleString()} {period.status} {period.status === 'open' && ( )} {period.status === 'closed' && ( )} {(period.status === 'paid' || period.status === 'processing') && ( View )}
{data?.data?.length === 0 && (

No periods found

Create your first period
)} {/* Pagination */} {data && data.totalPages > 1 && (

Showing page {filters.page || 1} of{' '} {data.totalPages} ({data.total} total)

)}
{/* Pay Modal */} {payModal && (

Mark Period as Paid

setPayModal({ ...payModal, reference: e.target.value })} placeholder="e.g., Wire transfer #12345" className="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm" />