"use client"; import { Box, Flex, Heading, Text, SimpleGrid, Card, VStack, HStack, Badge, Spinner, Button, Separator, } from "@chakra-ui/react"; import { useTranslations } from "next-intl"; import { useColorModeValue } from "@/components/ui/color-mode"; import { SlideUp, StaggerContainer, StaggerItem, AnimatedCounter, } from "@/components/motion"; import { useAdminAnalytics, useAdminUsers } from "@/lib/api/admin/use-hooks"; import type { AdminUserDto, AnalyticsOverviewDto } from "@/lib/api/admin/types"; import { LuUsers, LuChartBar, LuActivity, LuShield } from "react-icons/lu"; import { useState } from "react"; type AdminTab = "overview" | "users"; // ======================== // Admin Stat Card // ======================== interface AdminStatProps { label: string; value: number; icon: React.ReactNode; colorPalette: string; } function AdminStat({ label, value, icon, colorPalette }: AdminStatProps) { const cardBg = useColorModeValue("white", "gray.800"); const borderColor = useColorModeValue("gray.100", "gray.700"); return ( {icon} {label} ); } // ======================== // Admin Content // ======================== export default function AdminContent() { const t = useTranslations("admin"); const tCommon = useTranslations("common"); const [activeTab, setActiveTab] = useState("overview"); const cardBg = useColorModeValue("white", "gray.800"); const borderColor = useColorModeValue("gray.100", "gray.700"); const { data: analyticsData, isLoading: analyticsLoading } = useAdminAnalytics(); const { data: usersData, isLoading: usersLoading } = useAdminUsers(); const analytics = analyticsData?.data as AnalyticsOverviewDto | undefined; const users = (usersData?.data as AdminUserDto[] | undefined) ?? []; const tabs: { key: AdminTab; label: string }[] = [ { key: "overview", label: t("overview") }, { key: "users", label: t("user-management") }, ]; const getUserDisplayName = (user: AdminUserDto) => { if (user.firstName && user.lastName) return `${user.firstName} ${user.lastName}`; if (user.firstName) return user.firstName; return user.email.split("@")[0]; }; return ( {t("title")} {t("subtitle")} {t("admin-badge")} {/* Tabs */} {tabs.map((tab) => ( ))} {/* Overview Tab */} {activeTab === "overview" && (analyticsLoading ? ( ) : ( } colorPalette="primary" /> } colorPalette="green" /> } colorPalette="orange" /> } colorPalette="purple" /> ))} {/* Users Tab */} {activeTab === "users" && (usersLoading ? ( ) : users.length > 0 ? ( {/* Table Header */} {t("user-name")} {t("user-email")} {t("user-role")} {t("user-status")} {/* User Rows */} {users.map((user: AdminUserDto, idx: number) => ( {idx > 0 && } {getUserDisplayName(user)} {user.email} {user.role || "User"} {user.isActive ? tCommon("active") : tCommon("inactive")} ))} ) : ( {t("no-users")} ))} ); }