import ContentCopyOutlined from "@mui/icons-material/ContentCopyOutlined"; import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined"; import PersonOutlineOutlined from "@mui/icons-material/PersonOutlineOutlined"; import { useEffect, useState } from "react"; import { SideDrawer } from "@/shared/ui/SideDrawer.jsx"; import { formatMillis } from "@/shared/utils/time.js"; import { roomStatusLabels } from "@/features/rooms/constants.js"; import styles from "@/features/rooms/rooms.module.css"; export function RoomDetailDrawer({ onClose, open, room }) { const owner = room?.owner || {}; const normalizedStatus = room?.status === "active" ? "active" : "closed"; const ownerDisplayId = ownerLongShortId(owner, room); return ( {room ? ( <>
{room.coverUrl ? : }

{room.title || "-"}

], ["房间状态", roomStatusLabels[normalizedStatus]], ["房间模式", room.mode], ["区域", room.regionName], ["创建时间", formatMillis(room.createdAtMs)], ["更新时间", formatMillis(room.updatedAtMs)] ]} title="基础信息" />

房主信息

{owner.avatar ? : }
{owner.username || "-"} {ownerDisplayId}
) : null}
); } function DetailSection({ items, title }) { return (

{title}

{items.map(([label, value]) => ( ))}
); } function DetailItem({ label, value }) { return (
{label}
{displayValue(value)}
); } function CopyableRoomId({ className = "", prefix = "", roomId }) { const [copied, setCopied] = useState(false); const value = displayValue(roomId); useEffect(() => { if (!copied) { return undefined; } const timer = window.setTimeout(() => setCopied(false), 1200); return () => window.clearTimeout(timer); }, [copied]); const copyRoomId = async () => { if (!roomId) { return; } await copyText(String(roomId)); setCopied(true); }; return ( ); } function StatusBadge({ status }) { const tone = status === "active" ? "running" : "stopped"; return ( {roomStatusLabels[status]} ); } function displayValue(value) { return value === 0 || value ? value : "-"; } function formatNumber(value) { return Number(value || 0).toLocaleString("zh-CN"); } function roomContributionValue(room) { return room?.roomContribution ?? room?.heat ?? 0; } async function copyText(value) { if (navigator.clipboard?.writeText) { try { await navigator.clipboard.writeText(value); return; } catch { // 本地开发和部分浏览器策略会拒绝 Clipboard API,退回同步复制路径。 } } const input = document.createElement("textarea"); input.value = value; input.setAttribute("readonly", ""); input.style.position = "fixed"; input.style.opacity = "0"; document.body.appendChild(input); input.select(); document.execCommand("copy"); input.remove(); } function ownerLongShortId(owner, room) { const longId = owner.userId || room?.ownerUserId || ""; const shortId = owner.displayUserId || ""; if (longId && shortId && longId !== shortId) { return `${longId}(${shortId})`; } return longId || shortId || "-"; }