import React, { RefObject, useCallback, useEffect, useMemo, useRef } from 'react'; import { SilkeSchemaFields } from '../silke-schema-fields'; import { SilkeTextField } from '../../silke-text-field'; import { SilkePopover } from '../../silke-popover'; import { FieldRegisterModel, FormObjectProvider } from '../../silke-form/form-context'; import { SilkeText } from '../../silke-text'; import { SilkeBox } from '../../silke-box'; import { SilkeButton } from '../../silke-button'; import { generateTitle } from './utils'; import { VevProps } from '@vev/utils'; import { getSchemaDefaultValue } from '../schema-utils'; import { SilkeSchemaContext, useSchemaContext } from '../silke-schema-context'; import styles from './styles.scss'; type Props = { anchor: RefObject; selected: number; value: any[]; disabled?: boolean; schema: VevProps | VevProps[] | string; onChange: (value: any[]) => void; onDelete: () => void; onClose: () => void; }; export function ArrayFieldModal({ anchor, value, selected, schema, disabled, onChange, onDelete, onClose, }: Props) { const schemaContext = useSchemaContext(); const valueRef = useRef(value); const fieldRefs = useRef({}); const registerField = useCallback((name: any, v: FieldRegisterModel) => { fieldRefs.current[name] = v; }, []); const defaultItemValue = useMemo( () => getSchemaDefaultValue(schema as VevProps | VevProps[]), [schema], ); const contentRef = useRef(null); useEffect(() => { // Focus the first input-like element when the popover opens const timer = setTimeout(() => { const el = contentRef.current?.querySelector( 'input, textarea, [contenteditable="true"], [role="textbox"]', ); el?.focus(); }, 50); return () => clearTimeout(timer); }, [selected]); const anchorRect = anchor.current.getBoundingClientRect(); const anchorPos: [number, number] = [anchorRect.left - 16, anchorRect.top]; return ( {generateTitle(value[selected], schema) || 'Untitled'} {typeof schema === 'string' ? ( { const update = [...(value || [])]; update[selected] = val; onChange(update); }} /> ) : ( {}} onChange={(name, update) => { const newValue = [...(value || [])]; newValue[selected] = { ...defaultItemValue, ...value[selected], [name]: update, }; onChange(newValue); }} register={registerField} > )} ); }