import { useState } from "react";
import { Eye, EyeOff, Trash2 } from "lucide-react";
import {
useAdminComments,
useAdminChatMessages,
useAdminCommentModerate,
useAdminCommentDelete,
type AdminCommentRow,
type AdminChatMessageRow,
} from "~/requestHandler/use-admin-hooks";
import {
AdminTable,
AdminPagination,
AdminToolbar,
AdminSearch,
AdminSelect,
AdminPageTitle,
StatusBadge,
faDate,
useDebouncedValue,
type Column,
} from "~/components/admin/DataTable";
import { cn } from "~/lib/utils";
const PAGE_SIZE = 25;
export default function AdminModeration() {
const [tab, setTab] = useState<"comments" | "chat">("comments");
return (
مدیریت محتوا
{(["comments", "chat"] as const).map((t) => (
))}
{tab === "comments" ?
:
}
);
}
function CommentsTab() {
const [page, setPage] = useState(1);
const [search, setSearch] = useState("");
const [hidden, setHidden] = useState("");
const [kind, setKind] = useState("");
const debouncedSearch = useDebouncedValue(search);
const { data, isLoading } = useAdminComments({
page,
page_size: PAGE_SIZE,
search: debouncedSearch,
is_hidden: hidden,
kind,
});
const moderate = useAdminCommentModerate();
const del = useAdminCommentDelete();
const reset = (fn: () => void) => {
fn();
setPage(1);
};
const onDelete = (r: AdminCommentRow) => {
if (confirm("حذف این نظر؟ این عمل بازگشتپذیر نیست.")) del.mutate(r.id);
};
const columns: Column[] = [
{
header: "نظر",
render: (r) => (
{r.comment}
{r.productTitle || "—"}
{r.isReply && · پاسخ}
{!r.isReply && r.repliesCount > 0 && · {r.repliesCount} پاسخ}
),
},
{
header: "کاربر",
render: (r) => (
{r.userPhone || "—"}
),
},
{
header: "وضعیت",
render: (r) =>
r.isHidden ? (
) : (
),
},
{ header: "تاریخ", render: (r) => {faDate(r.createdAt)} },
{
header: "",
render: (r) => (
),
},
];
return (
reset(() => setSearch(v))} placeholder="جستجوی متن نظر / کاربر…" />
reset(() => setHidden(v))}
options={[
{ value: "", label: "همه" },
{ value: "false", label: "نمایشدادهشده" },
{ value: "true", label: "پنهانشده" },
]}
/>
reset(() => setKind(v))}
options={[
{ value: "", label: "همه" },
{ value: "top", label: "نظر اصلی" },
{ value: "reply", label: "پاسخ" },
]}
/>
r.id} emptyText="نظری ثبت نشده است" />
);
}
function ChatTab() {
const [page, setPage] = useState(1);
const [search, setSearch] = useState("");
const [deleted, setDeleted] = useState("");
const debouncedSearch = useDebouncedValue(search);
const { data, isLoading } = useAdminChatMessages({
page,
page_size: PAGE_SIZE,
search: debouncedSearch,
is_deleted: deleted,
});
const reset = (fn: () => void) => {
fn();
setPage(1);
};
const columns: Column[] = [
{
header: "پیام",
render: (r) => (
{r.content || (r.imageUrl ? "🖼 تصویر" : "—")}
),
},
{
header: "فرستنده",
render: (r) => (
{r.senderPhone || "—"}
),
},
{
header: "وضعیت",
render: (r) =>
r.isDeleted ? : ,
},
{ header: "تاریخ", render: (r) => {faDate(r.createdAt)} },
];
return (
reset(() => setSearch(v))} placeholder="جستجوی متن پیام / فرستنده…" />
reset(() => setDeleted(v))}
options={[
{ value: "", label: "همه" },
{ value: "false", label: "فعال" },
{ value: "true", label: "حذفشده" },
]}
/>
مشاهدهی فقطخواندنی گفتگوها.
r.id} emptyText="پیامی یافت نشد" />
);
}