"use client"; import { cn } from "@/lib/utils"; import { EarSlash, GearSix, MicrophoneSlash } from "@phosphor-icons/react"; import { useQuery } from "convex/react"; import { useEffect, useRef, useState } from "react"; import { api } from "../../../../convex/_generated/api"; import { Avatar, AvatarFallback, AvatarImage } from "../avatar"; import { Button } from "../button"; import { HoverCard, HoverCardContent, HoverCardTrigger } from "../hover-card"; import { Tooltip, TooltipContent, TooltipTrigger } from "../tooltip"; type UserStatus = "online" | "busy" | "offline" | "away"; interface UserFloatingCardProps { user: any; // Too lazy to type the user type status?: UserStatus; activity?: string; } const statusColors: Record = { online: "bg-emerald-500", busy: "bg-red-500", away: "bg-yellow-500", offline: "bg-muted-foreground" }; export default function UserFloatingCard( { user }: UserFloatingCardProps ) { const [cardOpen, setCardOpen] = useState(false); const triggerRef = useRef(null); const contentRef = useRef(null); const status = useQuery(api.auth.getUserStatus) as { status: "online" | "busy" | "offline" | "away"; isUserSet: boolean; } | null; // Close when clicking outside the trigger/content useEffect(() => { if (!cardOpen) return; const handlePointerDown = (event: PointerEvent) => { const target = event.target as Node; if (triggerRef.current?.contains(target)) return; if (contentRef.current?.contains(target)) return; setCardOpen(false); }; document.addEventListener("pointerdown", handlePointerDown); return () => document.removeEventListener("pointerdown", handlePointerDown); }, [cardOpen]); const controls: { key: string; icon: React.ReactNode; label: string; tooltip: string; disabled?: boolean; onClick?: () => void; }[] = [ { key: "mute", icon: , label: "Mute (soon)", tooltip: "Soon", disabled: true, }, { key: "deafen", icon: , label: "Deafen (soon)", tooltip: "Soon", disabled: true, }, { key: "settings", icon: , label: "User Settings", tooltip: "Open settings", disabled: false, onClick: () => { // TODO: open user settings modal console.info("[UserFloatingCard] open settings modal (stub)"); } }, ]; return (
{/* Left: avatar + user info with hover card */} { }}>
{user.name?.charAt(0).toUpperCase()}
{user.name} {status?.status}
{/* Right: controls */}
{controls.map((control) => ( {control.tooltip} ))}
); }