"use client"; import { useEffect, useState } from "react"; import dayjs from "@calcom/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { Badge } from "@coss/ui/components/badge"; import { Button } from "@calcom/ui/components/button"; import { PanelCard } from "@calcom/ui/components/card"; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetPanel, SheetTitle, SheetClose, } from "@coss/ui/components/sheet"; import { Skeleton } from "@coss/ui/components/skeleton"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@coss/ui/components/table"; import { ActiveUserBreakdownSkeleton } from "./ActiveUserBreakdownSkeleton"; const PAGE_SIZE = 10; export function ActiveUserBreakdown({ teamId }: { teamId: number }) { const { data, isLoading } = trpc.viewer.teams.getActiveUserBreakdown.useQuery( { teamId }, { enabled: !!teamId } ); if (isLoading) return ; if (!data) return null; return ; } type BreakdownData = { activeUsers: Array<{ id: number; email: string; name: string | null; activeAs: "host" | "attendee" }>; totalMembers: number; activeHosts: number; activeAttendees: number; periodStart: string; periodEnd: string; pricePerSeat: number | null; }; type SelectedUser = { id: number; email: string; name: string | null; activeAs: "host" | "attendee"; }; function ActiveUserBreakdownContent({ data, teamId }: { data: BreakdownData; teamId: number }) { const { t } = useLocale(); const [currentPage, setCurrentPage] = useState(0); const [selectedUser, setSelectedUser] = useState(null); const { activeUsers, totalMembers, activeHosts, activeAttendees, periodStart, periodEnd } = data; useEffect(() => { setCurrentPage(0); }, [activeUsers]); const totalPages = Math.ceil(activeUsers.length / PAGE_SIZE); const paginatedUsers = activeUsers.slice(currentPage * PAGE_SIZE, (currentPage + 1) * PAGE_SIZE); const formattedStart = dayjs.utc(periodStart).format("MMM D, YYYY"); const formattedEnd = dayjs.utc(periodEnd).format("MMM D, YYYY"); return ( <>

{t("active_users_summary", { hosts: activeHosts, attendees: activeAttendees, active: activeHosts + activeAttendees, total: totalMembers, })}

{activeUsers.length === 0 ? (
{t("no_active_users")}
) : ( <>
{t("name")} {t("email")} {t("status")} {paginatedUsers.map((user) => ( setSelectedUser(user)}> {user.name || "-"} {user.email} {user.activeAs === "host" ? ( {t("active_as_host")} ) : ( {t("active_as_attendee")} )} ))}
{totalPages > 1 && (
)} )}
!open && setSelectedUser(null)}> {selectedUser?.name || selectedUser?.email} {selectedUser?.email} {selectedUser?.activeAs === "host" ? ( {t("active_as_host")} ) : ( {t("active_as_attendee")} )} {selectedUser && ( )} {t("close")}} /> ); } function UserBookingsSheet({ teamId, userId, activeAs, }: { teamId: number; userId: number; activeAs: "host" | "attendee"; }) { const { t } = useLocale(); const { data, isLoading } = trpc.viewer.teams.getActiveUserBookings.useQuery( { teamId, userId, activeAs }, { enabled: true } ); if (isLoading) { return (
); } const bookings = data?.bookings ?? []; return (
{bookings.length} {bookings.length === 1 ? t("booking") : t("bookings")}
{bookings.length === 0 ? (

{t("no_bookings")}

) : ( {t("booking")} {t("date")} {activeAs === "host" ? t("attendees") : t("host")} {bookings.map((booking) => ( {booking.title} {dayjs.utc(booking.startTime).format("MMM D, YYYY h:mm A")} {booking.otherParty || "-"} ))}
)}
); }