"use client"; import { Box, Flex, Heading, Text, SimpleGrid, Card, VStack, HStack, Badge, Spinner, Button, Separator, Input, } from "@chakra-ui/react"; import { NativeSelectRoot, NativeSelectField, } from "@/components/ui/forms/native-select"; import { useTranslations, useFormatter } 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 { formatRoleLabel, isAdminRole } from "@/lib/auth/roles"; import { LuUsers, LuChartBar, LuActivity, LuShield, LuPencil, } from "react-icons/lu"; import { useState, useEffect } from "react"; import { useSession } from "next-auth/react"; import { EditUserModal } from "./edit-user-modal"; import LeagueTiersContent from "./league-tiers-content"; import ModelPerformanceContent from "./model-performance-content"; type AdminTab = "overview" | "users" | "league-tiers" | "model-performance"; // ======================== // 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 format = useFormatter(); const [activeTab, setActiveTab] = useState("overview"); const [editingUser, setEditingUser] = useState(null); const [searchParams, setSearchParams] = useState({ search: "", role: "", subscriptionStatus: "", page: 1, limit: 10, }); const [debouncedSearch, setDebouncedSearch] = useState(""); useEffect(() => { const handler = setTimeout(() => { setDebouncedSearch(searchParams.search); setSearchParams((prev) => ({ ...prev, page: 1 })); }, 500); return () => clearTimeout(handler); }, [searchParams.search]); const { data: session, status } = useSession(); const cardBg = useColorModeValue("white", "gray.800"); const borderColor = useColorModeValue("gray.100", "gray.700"); const canAccessAdmin = isAdminRole(session?.user?.roles); const { data: analyticsData, isLoading: analyticsLoading } = useAdminAnalytics(canAccessAdmin); const { data: usersData, isLoading: usersLoading } = useAdminUsers( { search: debouncedSearch, role: searchParams.role, subscriptionStatus: searchParams.subscriptionStatus, page: searchParams.page, limit: searchParams.limit, }, canAccessAdmin, ); const analytics = analyticsData?.data as AnalyticsOverviewDto | undefined; const users = usersData?.data?.items ?? []; const meta = usersData?.data?.meta; const tabs: { key: AdminTab; label: string }[] = [ { key: "overview", label: t("overview") }, { key: "users", label: t("user-management") }, { key: "league-tiers", label: "Lig Tier" }, { key: "model-performance", label: "Model Performansı" }, ]; 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]; }; if (status === "loading") { return ( ); } if (!canAccessAdmin) { return ( {t("restricted")} {t("admin-access-required")} {t("admin-access-description")} ); } return ( {t("title")} {t("subtitle")} {t("admin-badge")} {/* Tabs */} {tabs.map((tab) => ( ))} {/* Overview Tab */} {activeTab === "overview" && (analyticsLoading ? ( ) : ( } colorPalette="primary" /> } colorPalette="green" /> } colorPalette="purple" /> } colorPalette="orange" /> } colorPalette="purple" /> ))} {/* Users Tab */} {activeTab === "users" && ( {/* Filters */} setSearchParams({ ...searchParams, search: e.target.value, }) } /> setSearchParams({ ...searchParams, role: e.target.value, page: 1, }) } items={[ { label: t("standard-user"), value: "user" }, { label: t("superadmin"), value: "superadmin" }, ]} /> setSearchParams({ ...searchParams, subscriptionStatus: e.target.value, page: 1, }) } items={[ { label: t("plan-free"), value: "free" }, { label: "Plus", value: "plus" }, { label: "Premium", value: "premium" }, { label: t("plan-past-due"), value: "past_due" }, { label: t("plan-cancelled"), value: "cancelled" }, ]} /> {usersLoading ? ( ) : users.length > 0 ? ( {/* Table Header */} {t("user-name")} {t("user-email")} {t("user-role")} {t("subscription")} {t("user-status")} {/* User Rows */} {users.map((user: AdminUserDto, idx: number) => ( {idx > 0 && } {getUserDisplayName(user)} {user.email} {formatRoleLabel(user.role)} {user.subscriptionStatus || "free"} {user.subscriptionExpiresAt ? ( {format.dateTime( new Date(user.subscriptionExpiresAt), { year: "numeric", month: "2-digit", day: "2-digit", }, )} ) : ( - )} {user.subscriptionStatus || "free"} {user.isActive ? tCommon("active") : tCommon("inactive")} ))} {/* Pagination */} {meta && meta.totalPages > 1 && ( {tCommon("page")} {meta.page} / {meta.totalPages} )} ) : ( {t("no-users")} )} )} {/* League Tiers Tab */} {activeTab === "league-tiers" && } {/* Model Performance Tab */} {activeTab === "model-performance" && } setEditingUser(null)} /> ); }