import type { TEditorRecipientsFormSchema } from '@documenso/lib/client-only/hooks/use-editor-recipients'; import type { RecipientStep } from '@documenso/lib/utils/recipient-groups'; import { cn } from '@documenso/ui/lib/utils'; import { Badge } from '@documenso/ui/primitives/badge'; import { Button } from '@documenso/ui/primitives/button'; import type { DraggableProvided, DraggableStateSnapshot } from '@hello-pangea/dnd'; import { Draggable, Droppable } from '@hello-pangea/dnd'; import { Trans } from '@lingui/react/macro'; import { GripVerticalIcon, Users2Icon } from 'lucide-react'; import { RecipientRow, type RecipientRowProps } from './recipient-row'; type TEditorSigner = TEditorRecipientsFormSchema['signers'][number]; export type DraggingType = 'STEP' | 'RECIPIENT' | null; export type RecipientStepCardSharedRowProps = Pick< RecipientRowProps, | 'stepCount' | 'showAdvancedSettings' | 'recipientSuggestions' | 'isLoadingSuggestions' | 'onSigningOrderChange' | 'onRoleChange' | 'onRemove' | 'onAutoCompleteSelect' | 'onSearchQueryChange' >; export type RecipientStepCardProps = { stepIndex: number; step: RecipientStep; draggableProvided: DraggableProvided; draggableSnapshot: DraggableStateSnapshot; draggingType: DraggingType; isStepLocked: boolean; isRemoveDisabled: boolean; flatIndexByFormId: Map; canSignerBeModified: (signer: TEditorSigner) => boolean; isSubmitting: boolean; onUngroup: (stepIndex: number) => void; rowProps: RecipientStepCardSharedRowProps; }; export const RecipientStepCard = ({ stepIndex, step, draggableProvided, draggableSnapshot, draggingType, isStepLocked, isRemoveDisabled, flatIndexByFormId, canSignerBeModified, isSubmitting, onUngroup, rowProps, }: RecipientStepCardProps) => { const isGroup = step.members.length > 1; const isCombineTarget = draggingType === 'STEP' && Boolean(draggableSnapshot.combineTargetFor); return (
{(droppableProvided, droppableSnapshot) => { const isJoinTarget = draggingType === 'RECIPIENT' && droppableSnapshot.isDraggingOver; const isHighlighted = isCombineTarget || isJoinTarget; return (
{isHighlighted && ( Release to sign together )}
Step {step.order} {isGroup && ( <> {step.members.length} signers ยท any order )}
{step.members.map((member, memberIndex) => { const signerIndex = flatIndexByFormId.get(member.formId) ?? -1; const canBeModified = canSignerBeModified(member); return ( {(memberProvided, memberSnapshot) => (
)}
); })} {droppableProvided.placeholder}
); }}
); };