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="کاشی فروشگاهی ثبت نشده است" />
);
}