import React, { useEffect, useState } from 'react'; import { type Field, FieldType } from '@prisma/client'; import { createPortal } from 'react-dom'; import { useFieldPageCoords } from '@documenso/lib/client-only/hooks/use-field-page-coords'; import { isFieldUnsignedAndRequired } from '@documenso/lib/utils/advanced-fields-helpers'; import type { RecipientColorStyles } from '../../lib/recipient-colors'; import { cn } from '../../lib/utils'; export type FieldContainerPortalProps = { field: Field; className?: string; children: React.ReactNode; }; export function FieldContainerPortal({ field, children, className = '', }: FieldContainerPortalProps) { const coords = useFieldPageCoords(field); const isCheckboxOrRadioField = field.type === 'CHECKBOX' || field.type === 'RADIO'; const style = { top: `${coords.y}px`, left: `${coords.x}px`, ...(!isCheckboxOrRadioField && { height: `${coords.height}px`, width: `${coords.width}px`, }), }; return createPortal(
{children}
, document.body, ); } export type FieldRootContainerProps = { field: Field; color?: RecipientColorStyles; children: React.ReactNode; className?: string; }; export function FieldRootContainer({ field, children, color, className }: FieldRootContainerProps) { const [isValidating, setIsValidating] = useState(false); const ref = React.useRef(null); useEffect(() => { if (!ref.current) { return; } const observer = new MutationObserver((_mutations) => { if (ref.current) { setIsValidating(ref.current.getAttribute('data-validate') === 'true'); } }); observer.observe(ref.current, { attributes: true, }); return () => { observer.disconnect(); }; }, []); return (
{children}
); }