import { useState, useEffect, useRef } from 'react';
import { TextArea as CosmosTextArea, FieldValueList, ParagraphDisplay, Text, EmailDisplay, PhoneDisplay, URLDisplay, withConfiguration } from '@pega/cosmos-react-core';
import type { PConnFieldProps } from './PConnProps';
import './create-nonce';
// includes in bundle
import { suggestionsHandler } from './suggestions-handler';
import handleEvent from "./event-utils";
import StyledPegaDxilMyParagraphWrapper from './styles';
// interface for props
interface PegaDxilMyParagraphProps extends PConnFieldProps {
// If any, enter additional props that only exist on TextInput here
displayAsStatus?: boolean;
isTableFormatter?: boolean;
hasSuggestions?: boolean;
variant?: any;
formatter: string;
}
// interface for StateProps object
interface StateProps {
value: string;
hasSuggestions: boolean;
}
export const formatExists = (formatterVal: string) => {
const formatterValues = [
"TextInput",
"WorkStatus",
"RichText",
"Email",
"Phone",
"URL",
"Operator"
];
let isformatter = false;
if (formatterValues.includes(formatterVal)) {
isformatter = true;
}
return isformatter;
};
export const textFormatter = (formatter: string, value: any) => {
let displayComponent:any = null;
switch(formatter){
case "TextInput" : {
displayComponent = value;
break;
}
case "Email" : {
displayComponent = ();
break;
}
case "Phone" : {
displayComponent = ();
break;
}
case "URL" : {
displayComponent = ();
break;
}
// no default
}
return displayComponent;
};
// Duplicated runtime code from Constellation Design System Component
// props passed in combination of props from property panel (config.json) and run time props from Constellation
// any default values in config.pros should be set in defaultProps at bottom of this file
function PegaDxilMyParagraph(props: PegaDxilMyParagraphProps) {
const {
getPConnect,
value,
hideLabel = false,
placeholder,
validatemessage,
label,
helperText,
testId,
fieldMetadata = {},
displayMode,
additionalProps = {},
variant = 'inline',
isTableFormatter = false,
hasSuggestions = false
} = props;
const { formatter } = props;
const pConn = getPConnect();
const actions = pConn.getActionsApi();
const stateProps = pConn.getStateProps() as StateProps;
const propName: string = stateProps.value;
const maxLength = fieldMetadata?.maxLength;
const hasValueChange = useRef(false);
// BUG-547602: Temporary type coercion for 8.5 until DXAPIs are enhanced to pass original pxViewMetadata JSON, respecting boolean primitives
let { readOnly = false, required = false, disabled = false } = props;
[readOnly, required, disabled] = [readOnly, required, disabled].map(
(prop) => prop === true || (typeof prop === 'string' && prop === 'true')
);
const [inputValue, setInputValue] = useState(value);
const [status, setStatus] = useState(hasSuggestions ? 'pending' : undefined);
useEffect(() => setInputValue(value), [value]);
useEffect(() => {
if (validatemessage !== '') {
setStatus('error');
}
if (hasSuggestions) {
setStatus('pending');
} else if (!hasSuggestions && status !== 'success') {
setStatus(validatemessage !== '' ? 'error' : undefined);
}
}, [validatemessage, hasSuggestions, status]);
if (displayMode === 'LABELS_LEFT' || displayMode === 'DISPLAY_ONLY') {
let displayComp = ;
if (isTableFormatter && formatExists(formatter) && formatter !== 'TextInput') {
displayComp = textFormatter(formatter, value);
}
return displayMode === 'DISPLAY_ONLY' ? (
{displayComp}
) : (
);
}
if (displayMode === 'STACKED_LARGE_VAL') {
const isValDefined = typeof value !== 'undefined' && value !== '';
const val = isValDefined ? (
{value}
) : (
''
);
return (
);
}
const onResolveSuggestionHandler = (accepted: boolean) => {
suggestionsHandler(accepted, pConn, setStatus);
};
return (
{
if (hasSuggestions) {
setStatus('');
}
setInputValue(event.target.value);
if (value !== event.target.value) {
// @ts-ignore
handleEvent(actions, 'change', propName, event.target.value);
hasValueChange.current = true;
}
}}
onBlur={(event: any) => {
if (!value || hasValueChange.current) {
// @ts-ignore
handleEvent(actions, 'blur', propName, event.target.value);
if (hasSuggestions) {
pConn.ignoreSuggestion('');
}
hasValueChange.current = false;
}
}}
onResolveSuggestion={onResolveSuggestionHandler}
/>
);
}
export default withConfiguration(PegaDxilMyParagraph);