import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined"; import PersonOutlineOutlined from "@mui/icons-material/PersonOutlineOutlined"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import Tooltip from "@mui/material/Tooltip"; import { AdminFormDialog } from "@/shared/ui/AdminFormDialog.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { IconButton } from "@/shared/ui/IconButton.jsx"; import { PaginationBar } from "@/shared/ui/PaginationBar.jsx"; import { AdminFilterResetButton } from "@/shared/ui/AdminListLayout.jsx"; import { RegionSelect } from "@/shared/ui/RegionSelect.jsx"; import { createRegionColumnFilter } from "@/shared/ui/RegionFilterControl.jsx"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; import { UploadField } from "@/shared/ui/UploadField.jsx"; import { formatMillis } from "@/shared/utils/time.js"; import { RoomDetailDrawer } from "@/features/rooms/components/RoomDetailDrawer.jsx"; import { roomStatusFilters, roomStatusLabels } from "@/features/rooms/constants.js"; import { useRoomsPage } from "@/features/rooms/hooks/useRoomsPage.js"; import styles from "@/features/rooms/rooms.module.css"; const columns = [ { key: "identity", label: "房间", width: "minmax(240px, 1.5fr)", render: (room) => , }, { key: "owner", label: "房主", width: "minmax(210px, 1.2fr)", render: (room) => , }, { key: "region", label: "区域", width: "minmax(140px, 0.8fr)", render: (room) => room.regionName || (room.visibleRegionId ? `区域 ${room.visibleRegionId}` : "-"), }, { key: "onlineCount", label: "房间人数", width: "minmax(110px, 0.7fr)", render: (room) => `${formatNumber(room.onlineCount)} 人`, }, { key: "status", label: "状态", width: "minmax(100px, 0.7fr)", render: (room) => , }, { key: "time", label: "创建时间", width: "minmax(170px, 1fr)", render: (room) => formatMillis(room.createdAtMs), }, ]; export function RoomListPage() { const page = useRoomsPage(); const items = page.data.items || []; const total = page.data.total || 0; const tableColumns = [ ...columns.map((column) => column.key === "region" ? { ...column, filter: createRegionColumnFilter({ loading: page.loadingRegions, options: page.regionOptions, value: page.regionId, onChange: page.changeRegionId, }), } : column.key === "identity" ? { ...column, filter: createTextColumnFilter({ placeholder: "搜索房间、房主", value: page.query, onChange: page.changeQuery, }), render: (room) => page.openDetail(room)} />, } : column.key === "status" ? { ...column, filter: createOptionsColumnFilter({ options: roomStatusFilters, placeholder: "搜索状态", value: page.status, onChange: page.changeStatus, }), render: (room) => ( page.openStatus(room)} /> ), } : column, ), { key: "actions", label: "操作", width: "minmax(104px, 0.6fr)", render: (room) => , }, ]; return (
room.roomId} /> {total > 0 ? ( ) : null}
page.setForm({ ...page.form, title: event.target.value })} /> page.setForm({ ...page.form, coverUrl })} /> page.setForm({ ...page.form, visibleRegionId })} /> page.setForm({ ...page.form, description: event.target.value })} /> page.setStatusForm({ status: event.target.value })} > 正常 关闭
); } function RoomIdentity({ onClick, room }) { const content = (
{room.coverUrl ? : }
{room.title || "-"}
{room.roomId}
); if (!onClick) { return content; } return ( ); } function OwnerIdentity({ room }) { const owner = room.owner || {}; const ownerName = owner.username || "-"; const ownerDisplayId = owner.displayUserId || room.ownerUserId || "-"; return (
{owner.avatar ? : }
{ownerName}
{ownerDisplayId}
); } function RoomActions({ page, room }) { return (
{page.abilities.canUpdate ? ( page.openEdit(room)}> ) : null} {page.abilities.canDelete ? ( page.removeRoom(room)} > ) : null}
); } function RoomStatus({ disabled, onClick, status }) { const normalizedStatus = status === "active" ? "active" : "closed"; const tone = normalizedStatus === "active" ? "running" : "stopped"; const badge = ( {roomStatusLabels[normalizedStatus]} ); if (disabled) { return badge; } return ( ); } function ActionModal({ children, disabled, loading, onClose, onSubmit, open, title }) { return ( {children} ); } function formatNumber(value) { return Number(value || 0).toLocaleString("zh-CN"); }