import { memo, useContext, useEffect, useState } from 'react'; import { IconButton, InputAdornment, TextField, Tooltip } from '@mui/material'; import { DataContext } from '../context/Context'; import ComponentWrapper from '../common/ComponentWrapper'; import { getFieldName } from '../permissions/getFieldName'; import { inputProps } from '../interface/inputfieldProps'; import { useDebouncedChange } from '@jsonforms/material-renderers'; import { Close } from '@mui/icons-material'; import { getComponentProps } from '../common/getComponentProps'; import _ from 'lodash'; import { formatAndMaskingProvider, prepareMaskingAndFormating, } from '../common/formattingAndMasking'; import { ButtonIcon } from '../common/ButtonIcon'; import { useJsonForms } from '@jsonforms/react'; import React from 'react'; const Input = memo(function (props: inputProps) { const { data, required, errors, enabled, uischema, path, handleChange, schema, rootSchema, } = props; const uischemaData = uischema?.config?.main; const [showAdornment, setShowAdornment] = useState(false); const [actualValue, setActualValue] = useState(''); const [count, setCount] = useState(0); const [maskedValue, setMaskedValue] = useState(''); const { pageName, permissions, theme, serviceProvider } = useContext(DataContext); const fieldName = getFieldName(path); const eventToValue = (ev: any) => ev.target.value === '' ? undefined : ev.target.value; const [inputText, onChange, onClear] = useDebouncedChange( handleChange, '', data, path, eventToValue, ); const computedProps = getComponentProps( `${pageName}:${fieldName}`, permissions, schema, rootSchema, ); const onPointerEnter = () => { if (!computedProps.disabled) { setShowAdornment(true); } }; const onPointerLeave = () => setShowAdornment(false); const ctx = useJsonForms(); const dynamicStyle = React.useMemo(() => { return serviceProvider( ctx, { onClick: uischema.config?.main?.styleFunction || 'getStyle', }, { event: { _reactName: 'onClick' }, path, }, ); }, [data, path]); const componentStyle = { ...uischema.config?.style, ...dynamicStyle }; useEffect(() => { if (data && uischemaData.formatStrArray && count === 0) { const { updatedMaskedValue, isValidInput } = prepareMaskingAndFormating( data.split(''), uischemaData.formatStrArray, ); if (isValidInput) { setCount(1); setMaskedValue(updatedMaskedValue); setActualValue(data); } } }, [data]); const handleKeyDown = (event: React.KeyboardEvent) => { if (uischemaData.formatStrArray) { const { key, target } = event; const { isValidInput, updatedMaskedValue, updatedActualStr } = formatAndMaskingProvider( key, target, uischemaData.formatStrArray, actualValue, ); if (isValidInput) { setActualValue(updatedActualStr); handleChange(path, updatedActualStr); setMaskedValue(updatedMaskedValue); } } }; const handleInputChange = ( e: React.ChangeEvent, ) => { if (!uischemaData.formatStrArray) { onChange(e); } }; return ( handleKeyDown(e)} onChange={(e) => { handleInputChange(e); }} multiline={uischemaData?.multiline || false} placeholder={uischemaData?.placeholder} onPointerEnter={(event) => onPointerEnter()} onPointerLeave={(event) => onPointerLeave()} label={uischemaData?.label} size={uischemaData?.size || 'medium'} type={uischemaData?.type} variant={uischemaData?.variant} helperText={ errors !== '' && errors.includes('pattern') ? uischemaData?.errorMessage : errors || '\u00A0' } error={errors !== '' ? true : false} slotProps={{ inputLabel: { sx: { ...componentStyle.inputLabelStyle, }, }, input: { startAdornment: uischemaData?.startIcon ? ( {ButtonIcon(uischemaData?.startIcon, uischemaData)} ) : null, endAdornment: ( { onClear(); setMaskedValue(''); setActualValue(''); }} size='large' > ), }, htmlInput: { ...uischemaData?.inputProps, style: { fontSize: theme.myTheme.typography.fontSize }, }, }} /> ); }); export default Input;