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