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 ?
: }
],
["房间状态", 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 || "-";
}