import { useState } from "react"; import { Trash2, ImageOff } from "lucide-react"; import { useHomeBanners, useHomeCategories, useHomeSellerTiles, useHomeBannerMutations, useHomeCategoryMutations, useHomeSellerTileMutations, type HomeBannerRow, type HomeCategoryRow, type HomeSellerTileRow, } from "~/requestHandler/use-admin-hooks"; import { AdminTable, AdminPagination, AdminPageTitle, StatusBadge, faNum, faDate, type Column, } from "~/components/admin/DataTable"; import { cn } from "~/lib/utils"; const PAGE_SIZE = 25; function Thumb({ url }: { url: string | null }) { if (!url) return (
); return ; } function Toggle({ on, onClick }: { on: boolean; onClick: () => void }) { return ( ); } function DeleteBtn({ onClick }: { onClick: () => void }) { return ( ); } export default function AdminHomepage() { const [tab, setTab] = useState<"banners" | "categories" | "tiles">("banners"); const TABS = [ { k: "banners", label: "بنرها" }, { k: "categories", label: "دسته‌ها" }, { k: "tiles", label: "فروشگاه‌ها" }, ] as const; return (
صفحه اصلی

مدیریت آیتم‌های موجود (فعال/غیرفعال، ترتیب، حذف). افزودن آیتم جدید از طریق آپلود تصویر انجام می‌شود.

{TABS.map((t) => ( ))}
{tab === "banners" && } {tab === "categories" && } {tab === "tiles" && }
); } function BannersTab() { const [page, setPage] = useState(1); const { data, isLoading } = useHomeBanners({ page, page_size: PAGE_SIZE }); const { update, remove } = useHomeBannerMutations(); const columns: Column[] = [ { header: "", render: (r) => }, { header: "بنر", render: (r) => (

{r.title || "—"}

{r.linkType}:{r.linkId}

), }, { header: "بازه", render: (r) => ( {faDate(r.startDate)} — {faDate(r.endDate)} ), }, { header: "نمایش", render: (r) => r.isVisible ? : , }, { header: "فعال", render: (r) => ( update.mutate({ id: r.id, data: { isActive: !r.isActive } })} /> ), }, { header: "", render: (r) => ( confirm("حذف این بنر؟") && remove.mutate(r.id)} /> ), }, ]; return (
String(r.id)} emptyText="بنری ثبت نشده است" />
); } function CategoriesTab() { const [page, setPage] = useState(1); const { data, isLoading } = useHomeCategories({ page, page_size: PAGE_SIZE }); const { update, remove } = useHomeCategoryMutations(); const columns: Column[] = [ { header: "", render: (r) => }, { header: "دسته", render: (r) => {r.categoryName || "—"} }, { header: "فعال", render: (r) => ( update.mutate({ id: r.id, data: { isActive: !r.isActive } })} /> ), }, { header: "", render: (r) => confirm("حذف این دسته از صفحه اصلی؟") && remove.mutate(r.id)} /> }, ]; return (
r.id} emptyText="دسته‌ای ثبت نشده است" />
); } function TilesTab() { const [page, setPage] = useState(1); const { data, isLoading } = useHomeSellerTiles({ page, page_size: PAGE_SIZE }); const { update, remove } = useHomeSellerTileMutations(); const columns: Column[] = [ { header: "", render: (r) => }, { header: "فروشگاه", render: (r) => {r.sellerName || "—"} }, { header: "ترتیب", render: (r) => ( { const v = Number(e.target.value); if (v !== r.order) update.mutate({ id: r.id, data: { order: v } }); }} className="w-16 rounded-lg border border-WHITE3 px-2 py-1 text-[13px] tabular-nums text-center" dir="ltr" /> ), }, { header: "فعال", render: (r) => ( update.mutate({ id: r.id, data: { isActive: !r.isActive } })} /> ), }, { header: "", render: (r) => confirm("حذف این کاشی فروشگاه؟") && remove.mutate(r.id)} /> }, ]; return (
r.id} emptyText="کاشی فروشگاهی ثبت نشده است" />
); }