"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)}
/>
);
}