'use client'; import { useCallback, useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { Rnd } from 'react-rnd'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { cn } from '../../lib/utils'; import { Card, CardContent } from '../card'; import { FRIENDLY_FIELD_TYPE } from './types'; import type { Prisma } from '.prisma/client'; export type FieldItemProps = { field: Prisma.FieldGetPayload; recipients: Prisma.RecipientGetPayload[]; }; export const SubjectFieldItem = ({ field, recipients }: FieldItemProps) => { const [coords, setCoords] = useState({ pageX: Number(field.positionX), pageY: Number(field.positionY), pageHeight: Number(field.height), pageWidth: Number(field.width), }); const signerEmail = recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? ''; const calculateCoords = useCallback(() => { const $page = document.querySelector( `${PDF_VIEWER_PAGE_SELECTOR}[data-page-number="${field.page}"]`, ); if (!$page) { return; } const { height, width } = $page.getBoundingClientRect(); const top = $page.getBoundingClientRect().top + window.scrollY; const left = $page.getBoundingClientRect().left + window.scrollX; const pageX = (Number(field.positionX) / 100) * width + left; const pageY = (Number(field.positionY) / 100) * height + top; const pageHeight = (Number(field.height) / 100) * height; const pageWidth = (Number(field.width) / 100) * width; setCoords({ pageX: pageX, pageY: pageY, pageHeight: pageHeight, pageWidth: pageWidth, }); }, [field.page, field.positionX, field.positionY, field.height, field.width]); useEffect(() => { calculateCoords(); }, [calculateCoords]); return createPortal( {FRIENDLY_FIELD_TYPE[field.type]}

{signerEmail}

, document.body, ); };