import React, { useEffect, useState } from 'react'; // Polotno and thrid party libraries import { observer } from 'mobx-react-lite'; import { SectionTab, } from 'polotno/side-panel'; import type { StoreType } from 'polotno/model/store'; import type { TemplatesSection } from 'polotno/side-panel'; // Hooks import { useDispatch, useSelector } from 'react-redux'; import { AppDispatch, RootState } from '../../../redux/store'; // Actions import { failure, success } from '../../../redux/actions/snackbarActions'; import { SET_CUSTOM_FIELDS, SET_CUSTOM_FIELDS_V2, SET_PLATFORM_FIELDS } from '../../../redux/actions/action-types'; // Components import Button from '../../GenericUIBlocks/Button'; import GeneralTootip from '../../GenericUIBlocks/GeneralTooltip'; // Utils import { copyToClipboard } from '../../../utils/helper'; // Icons import InfoIcon from '../../../assets/images/templates/info-icon'; import ContentCopyIcon from '../../..//assets/images/templates/content-copy-icon'; import Field from '../../../assets/images/templates/field'; // Styles import './styles.scss' type SideSection = typeof TemplatesSection; const iconButtonStyles = { backgroundColor: 'transparent', } type CustomFieldsSectionProps = { store: StoreType; active: boolean; allowSenderFields?: boolean; allowPropertyFields?: boolean; excludedFields?: string[] | null; platformName?: string, onClick: () => void; onGetCustomFields?: () => Promise; }; const CustomFieldSection: SideSection = { name: 'Fields', Tab: observer( (props: { store: StoreType; active: boolean; onClick: () => void }) => ( ) ) as SideSection['Tab'], Panel: observer(({ store, onGetCustomFields, allowSenderFields, excludedFields, allowPropertyFields, platformName }: CustomFieldsSectionProps) => { const [isShowDialog, setIsShowDialog] = useState(false); const [search, setSearch] = useState(''); const [filteredDynamicFields, setFilteredDynamicFields] = useState([]); const [filteredCustomFields, setFilteredCustomFields] = useState([]); const [filteredMiscFields, setFilteredMiscFields] = useState([]); const [filteredPropertyFields, setFilteredPropertyFields] = useState([]); const [filteredCustomFieldsV2, setFilteredCustomFieldsV2] = useState([]); const [filteredSenderFields, setFilteredSenderFields] = useState([]); const [filteredPlatformFields, setFilteredPlatformFields] = useState([]); const dispatch = useDispatch(); const customFields = useSelector( (state: RootState) => state.customFields.customFields ) as Record; const customFieldsV2 = useSelector( (state: RootState) => state.customFields.customFieldsV2 ) as Record; const platformFields = useSelector( (state: RootState) => state.customFields.platformFields ) as Record; const defaultDynamicFields = useSelector( (state: RootState) => state.customFields.defaultDynamicFields ) as Record; const defaultSenderFields = useSelector( (state: RootState) => state.templates.defaultSenderFields ) as Record; const defaultPropertyFields = useSelector( (state: RootState) => state.templates.defaultPropertyFields ) as Record; const defaultMiscFields = useSelector( (state: RootState) => state.templates.defaultMiscFields ) as Record; const product = useSelector((state: RootState) => state.templates.product); const currentTemplateType = product?.productType; const currentProductId = product?.id || ''; const handleShowDialog = () => { setIsShowDialog((prev) => !prev); }; const fetchCustomFields = async () => { if (onGetCustomFields) { const allCustomFields: any = await onGetCustomFields(); const platformFields: any = []; const customFields: any = []; if (allCustomFields?.version === 'v2') { const flattenedFields = allCustomFields.customFields.flatMap((section: { fields: any; }) => section.fields); for (const field of flattenedFields) { (field.isPlatformField ? platformFields : customFields).push(field); } const filteredCustomFields = allCustomFields?.customFields .map((customField: any) => ({ ...customField, fields: customField.fields.filter((field: any) => customFields.includes(field)) })) .filter((section: { fields: any[] }) => section.fields.length > 0); if (allCustomFields?.customFields?.length) { dispatch({ type: SET_CUSTOM_FIELDS, payload: [] }); dispatch({ type: SET_CUSTOM_FIELDS_V2, payload: filteredCustomFields }); } else { dispatch({ type: SET_CUSTOM_FIELDS, payload: [] }); dispatch({ type: SET_CUSTOM_FIELDS_V2, payload: [] }); } if (platformFields.length) { dispatch({ type: SET_PLATFORM_FIELDS, payload: platformFields }); } else { dispatch({ type: SET_PLATFORM_FIELDS, payload: [] }); } } else { for (const field of allCustomFields) { (field.isPlatformField ? platformFields : customFields).push(field); } if (customFields.length) { dispatch({ type: SET_CUSTOM_FIELDS, payload: customFields }); } else { dispatch({ type: SET_CUSTOM_FIELDS, payload: [] }); } if (platformFields.length) { dispatch({ type: SET_PLATFORM_FIELDS, payload: platformFields }); } else { dispatch({ type: SET_PLATFORM_FIELDS, payload: [] }); } } } }; const copyCustomFieldText = (key: string, value: string = '') => { if (currentTemplateType === 'Real Penned Letter' && +currentProductId === 16) { let modifiedString = key.replace(/{{/g, '((').replace(/}}/g, '))'); copyToClipboard(modifiedString); dispatch(success(`${value} Copied`)); } else { copyToClipboard(key); dispatch(success(`${value} Copied`)); } }; useEffect(() => { fetchCustomFields(); }, []); useEffect(() => { setFilteredDynamicFields( defaultDynamicFields ?.filter(({ key }: any) => !excludedFields?.includes(key)) .filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) ) ); setFilteredMiscFields(defaultMiscFields.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) )) setFilteredPropertyFields( allowPropertyFields ? defaultPropertyFields ?.filter(({ key }: any) => !excludedFields?.includes(key)) ?.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) ) : [] ); setFilteredSenderFields( allowSenderFields ? defaultSenderFields?.filter(({ key }: any) => !excludedFields?.includes(key))?.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) ) : [] ); setFilteredPlatformFields(platformFields ?.filter(({ key }: any) => !excludedFields?.includes(key)) ?.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) )); setFilteredCustomFields(customFields ?.filter(({ key }: any) => !excludedFields?.includes(key)) ?.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) )); if (customFieldsV2.length) { const newFilteredData = customFieldsV2 .map((section: { fields: any[]; }) => ({ ...section, fields: section.fields.filter((field: { value: string; }) => field.value?.toLowerCase().includes(search?.toLowerCase()) ) })).filter((section: any) => section?.fields?.length > 0); setFilteredCustomFieldsV2(newFilteredData); } else { setFilteredDynamicFields( defaultDynamicFields ?.filter(({ key }: any) => !excludedFields?.includes(key)) ?.filter(({ value }: any) => value?.toLowerCase().includes(search?.toLowerCase()) ) ); } }, [search, defaultSenderFields, platformFields, customFields, defaultDynamicFields, customFieldsV2]); return (
setSearch(e.target.value)} value={search} />
{filteredDynamicFields.length > 0 && <>
Contact Fields
{filteredDynamicFields ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} } {allowPropertyFields && filteredPropertyFields.length > 0 && <>
Property Address
{filteredPropertyFields ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} } {allowSenderFields && filteredSenderFields.length > 0 && <>
Sender Fields
{filteredSenderFields ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} } {onGetCustomFields && platformFields?.length > 0 && ( <>
{platformName ? `${platformName} Fields` : 'OLC Fields'}
{filteredPlatformFields ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} ) } {onGetCustomFields && filteredCustomFieldsV2.length > 0 ? filteredCustomFieldsV2.map((section: any, index: number): any => (

{section?.section}
{section.fields.map(({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
))}
)) : onGetCustomFields && customFields?.length > 0 && filteredCustomFields.length > 0 && ( <>
Custom Fields
{filteredCustomFields ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} ) } {defaultMiscFields && filteredMiscFields.length > 0 && <>
Miscellaneous Fields
{filteredMiscFields ?.filter(({ key }) => !excludedFields?.includes(key)) ?.map( ({ key, value }: { key: string; value: string }, i: number) => (
copyCustomFieldText(key, value) } > {value}
) )} } {filteredDynamicFields.length <= 0 && filteredCustomFieldsV2.length <= 0 && filteredPropertyFields.length <= 0 && filteredSenderFields.length <= 0 && filteredPlatformFields.length <= 0 && filteredCustomFields.length <= 0 && filteredMiscFields.length <= 0 &&
No results
}
); }) as unknown as SideSection['Panel'], }; export default CustomFieldSection;