You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.2 KiB
TypeScript

import { $userInfo, $userStatus } from "@/store/player"
import { useStore } from '@nanostores/react'
import { useEffect, useMemo, useState } from "react"
import {
Table,
TableBody,
TableCell,
TableFooter,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table"
import { socket } from "./socket"
import { ClientMessage } from "@/lib/types/message"
import { getUserPlayTime } from "@/lib/utils"
export const UserList = ({ roomName, serverTimeAdjust }: { roomName: string, serverTimeAdjust: number }) => {
const userStatus = useStore($userStatus)
const [_, setTick] = useState(0)
useEffect(() => {
const interval = setInterval(() => {
setTick(t => t + 1)
}, 500)
return () => clearInterval(interval)
}, [])
const sortedUserStatus = useMemo(() => {
return [...userStatus].sort((a, b) => {
// 按照username排序
return (a.username || '').localeCompare(b.username || '')
})
}, [userStatus])
return (
<Table key={userStatus.length}>
<TableHeader>
<TableRow>
<TableHead className="w-[72px]"></TableHead>
<TableHead className="text-center"></TableHead>
<TableHead className="text-center"></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{sortedUserStatus.map((user) => (
<TableRow key={user.userID}>
<TableCell className="font-medium">{user.username}</TableCell>
<TableCell className="text-center">{getUserPlayTime(user, serverTimeAdjust)}</TableCell>
<TableCell className="text-center">{user.playing == true ? '播放中' : '暂停中'}</TableCell>
</TableRow>
))}
{userStatus.length == 0 && <><TableRow>
<TableCell className="text-center h-full align-middle" colSpan={3}></TableCell>
</TableRow></>}
</TableBody>
<TableFooter>
</TableFooter>
</Table>
)
}