'use client'; import { useEffect, useLayoutEffect, useState } from 'react'; import PickConstituenta from '@/components/select/PickConstituenta'; import SelectMultiGrammeme from '@/components/select/SelectMultiGrammeme'; import Label from '@/components/ui/Label'; import TextInput from '@/components/ui/TextInput'; import AnimateFade from '@/components/wrap/AnimateFade'; import { ReferenceType } from '@/models/language'; import { parseEntityReference, parseGrammemes } from '@/models/languageAPI'; import { CstMatchMode } from '@/models/miscellaneous'; import { IConstituenta, IRSForm } from '@/models/rsform'; import { matchConstituenta } from '@/models/rsformAPI'; import { prefixes } from '@/utils/constants'; import { IGrammemeOption, SelectorGrammemes } from '@/utils/selectors'; import SelectWordForm from '../../components/select/SelectWordForm'; import { IReferenceInputState } from './DlgEditReference'; interface TabEntityReferenceProps { initial: IReferenceInputState; schema: IRSForm; setIsValid: React.Dispatch>; setReference: React.Dispatch>; } function TabEntityReference({ initial, schema, setIsValid, setReference }: TabEntityReferenceProps) { const [selectedCst, setSelectedCst] = useState(undefined); const [alias, setAlias] = useState(''); const [term, setTerm] = useState(''); const [selectedGrams, setSelectedGrams] = useState([]); // Initialization useLayoutEffect(() => { if (!!initial.refRaw && initial.type === ReferenceType.ENTITY) { const ref = parseEntityReference(initial.refRaw); setAlias(ref.entity); const grams = parseGrammemes(ref.form); setSelectedGrams(SelectorGrammemes.filter(data => grams.includes(data.value))); } }, [initial, schema.items]); // Produce result useEffect(() => { setIsValid(alias !== '' && selectedGrams.length > 0); setReference(`@{${alias}|${selectedGrams.map(gram => gram.value).join(',')}}`); }, [alias, selectedGrams, setIsValid, setReference]); // Update term when alias changes useEffect(() => { const cst = schema.cstByAlias.get(alias); setTerm(cst?.term_resolved ?? ''); }, [alias, term, schema]); function handleSelectConstituenta(cst: IConstituenta) { setAlias(cst.alias); setSelectedCst(cst); } return ( cst.term_resolved} matchFunc={(cst, filter) => matchConstituenta(cst, filter, CstMatchMode.TERM)} onBeginFilter={cst => cst.term_resolved !== ''} rows={7} />
setAlias(event.target.value)} />
); } export default TabEntityReference;