websync / components /user /UserItem.tsx
Shivam
Initial commit: Web-SyncPlay moved into Streamer
d092f57
import { FC, useEffect, useRef, useState } from "react"
import { UserState } from "../../lib/types"
import { secondsToTime } from "../../lib/utils"
import IconPause from "../icon/IconPause"
import IconPlay from "../icon/IconPlay"
import classNames from "classnames"
import IconOwner from "../icon/IconOwner"
import InputText from "../input/InputText"
import Image from "next/image"
interface Props {
user: UserState
ownerId: string
socketId: string
updateName: (name: string) => void
}
const UserItem: FC<Props> = ({ user, ownerId, socketId, updateName }) => {
const [edit, setEdit] = useState(false)
const [name, _setName] = useState(user.name || "")
const nameRef = useRef(name)
const setName = (newName: string) => {
_setName(newName)
nameRef.current = newName
}
useEffect(() => {
setName(user.name || "")
}, [user.name])
return (
<div
className={classNames(
"rounded border-l-4",
"flex flex-row bg-dark-900 hover:bg-dark-800",
socketId == user.uid
? "border-primary-900 hover:border-primary-800"
: "border-dark-900 hover:border-dark-600"
)}
>
{ownerId == user.uid && (
<div
className={"absolute inline-flex -ml-4 -mt-4 p-2 cursor-help"}
data-tooltip-content={"Owner of the lobby"}
>
<IconOwner className={"text-primary-700"} sizeClassName={"w-5 h-5"} />
</div>
)}
<div className={"aspect-square shrink-0"}>
<Image
width={64}
height={64}
src={
"https://api.dicebear.com/7.x/pixel-art/png?seed=" + user.uid
}
alt={"Generated profile picture of " + user.name}
/>
</div>
<div
className={"p-2 pl-1 grow"}
onMouseEnter={() => {
if (user.uid === socketId) {
setEdit(true)
}
}}
onMouseLeave={() => {
if (user.uid === socketId) {
setEdit(false)
}
}}
>
{edit ? (
<InputText
className={"grow h-full"}
value={name}
onChange={updateName}
placeholder={"Change your name"}
/>
) : (
<>
<div className={"flex flex-row gap-1 truncate"}>{user.name}</div>
<div className={"flex flex-row gap-1 items-center"}>
{user.player.paused ? (
<IconPause sizeClassName={"w-3 h-3"} />
) : (
<IconPlay sizeClassName={"w-3 h-3"} />
)}
{secondsToTime(user.player.progress)}
</div>
</>
)}
</div>
</div>
)
}
export default UserItem