'use client'; import { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { OrderStatsCards } from '@/components/admin/OrderStatsCards'; import { OrdersTable } from '@/components/admin/OrdersTable'; import { OrderFilters } from '@/components/admin/OrderFilters'; import { OrderDetailsModal } from '@/components/admin/OrderDetailsModal'; import { ExportButton } from '@/components/admin/ExportButton'; import { OrderRecord } from '@/src/types'; interface OrderStats { totalOrders: number; totalRevenue: number; totalCO2Offset: number; fulfillmentRate: number; } export default function AdminOrders() { const [orders, setOrders] = useState([]); const [stats, setStats] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(25); const [totalCount, setTotalCount] = useState(0); const [sortKey, setSortKey] = useState('CreatedAt'); const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc'); const [selectedOrder, setSelectedOrder] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [dateFrom, setDateFrom] = useState(''); const [dateTo, setDateTo] = useState(''); const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false); // Fetch orders and stats useEffect(() => { fetchData(); }, [currentPage, pageSize, sortKey, sortOrder, searchTerm, statusFilter, dateFrom, dateTo]); const fetchData = async () => { setIsLoading(true); setError(null); try { // Build query params for orders const params = new URLSearchParams(); params.append('limit', pageSize.toString()); params.append('offset', ((currentPage - 1) * pageSize).toString()); if (sortKey) { params.append('sortBy', sortKey); params.append('sortOrder', sortOrder); } // Add filters if (searchTerm) { params.append('search', searchTerm); } if (statusFilter) { params.append('status', statusFilter); } if (dateFrom) { params.append('dateFrom', dateFrom); } if (dateTo) { params.append('dateTo', dateTo); } // Fetch orders const ordersResponse = await fetch(`/api/admin/orders?${params}`); const ordersData = await ordersResponse.json(); if (!ordersResponse.ok) { throw new Error(ordersData.error || 'Failed to fetch orders'); } setOrders(ordersData.data || []); setTotalCount(ordersData.pagination?.totalRows || 0); // Fetch stats (for current month) const statsResponse = await fetch('/api/admin/stats'); const statsData = await statsResponse.json(); if (statsResponse.ok) { setStats(statsData.data.stats); } } catch (err) { console.error('Error fetching data:', err); setError(err instanceof Error ? err.message : 'Failed to load orders'); } finally { setIsLoading(false); } }; const handleSort = (key: keyof OrderRecord) => { if (sortKey === key) { // Toggle sort order if same column setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc'); } else { // New column, default to ascending setSortKey(key); setSortOrder('asc'); } }; const handlePageChange = (newPage: number) => { setCurrentPage(newPage); }; const handlePageSizeChange = (newSize: number) => { setPageSize(newSize); setCurrentPage(1); // Reset to first page when changing page size }; const handleViewDetails = (order: OrderRecord) => { setSelectedOrder(order); setIsDetailsModalOpen(true); }; const handleCloseDetailsModal = () => { setIsDetailsModalOpen(false); // Optional: clear selected order after animation completes setTimeout(() => setSelectedOrder(null), 300); }; const handleSearchChange = (search: string) => { setSearchTerm(search); setCurrentPage(1); // Reset to first page on filter change }; const handleStatusChange = (status: string) => { setStatusFilter(status); setCurrentPage(1); }; const handleDateRangeChange = (from: string, to: string) => { setDateFrom(from); setDateTo(to); setCurrentPage(1); }; const handleResetFilters = () => { setSearchTerm(''); setStatusFilter(''); setDateFrom(''); setDateTo(''); setCurrentPage(1); }; if (error) { return (

Orders

{error}

); } return ( {/* Header */}

Orders

View and manage all carbon offset orders

{/* Stats Cards */} {/* Filters */} {/* Orders Table */} {/* Order Details Modal */}
); }