'use client'; import { useRef, useState } from 'react'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; import type { Recipient } from '@documenso/prisma/client'; import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; import { AvatarWithRecipient } from './avatar-with-recipient'; import { StackAvatar } from './stack-avatar'; import { StackAvatars } from './stack-avatars'; export type StackAvatarsWithTooltipProps = { recipients: Recipient[]; position?: 'top' | 'bottom'; children?: React.ReactNode; }; export const StackAvatarsWithTooltip = ({ recipients, position, children, }: StackAvatarsWithTooltipProps) => { const [open, setOpen] = useState(false); const isControlled = useRef(false); const isMouseOverTimeout = useRef(null); const waitingRecipients = recipients.filter( (recipient) => getRecipientType(recipient) === 'waiting', ); const openedRecipients = recipients.filter( (recipient) => getRecipientType(recipient) === 'opened', ); const completedRecipients = recipients.filter( (recipient) => getRecipientType(recipient) === 'completed', ); const uncompletedRecipients = recipients.filter( (recipient) => getRecipientType(recipient) === 'unsigned', ); const onMouseEnter = () => { if (isMouseOverTimeout.current) { clearTimeout(isMouseOverTimeout.current); } if (isControlled.current) { return; } isMouseOverTimeout.current = setTimeout(() => { setOpen((o) => (!o ? true : o)); }, 200); }; const onMouseLeave = () => { if (isMouseOverTimeout.current) { clearTimeout(isMouseOverTimeout.current); } if (isControlled.current) { return; } setTimeout(() => { setOpen((o) => (o ? false : o)); }, 200); }; const onOpenChange = (newOpen: boolean) => { isControlled.current = newOpen; setOpen(newOpen); }; return ( {children || } {completedRecipients.length > 0 && (

Completed

{completedRecipients.map((recipient: Recipient) => (

{recipient.email}

{RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName}

))}
)} {waitingRecipients.length > 0 && (

Waiting

{waitingRecipients.map((recipient: Recipient) => ( ))}
)} {openedRecipients.length > 0 && (

Opened

{openedRecipients.map((recipient: Recipient) => ( ))}
)} {uncompletedRecipients.length > 0 && (

Uncompleted

{uncompletedRecipients.map((recipient: Recipient) => ( ))}
)}
); };