import React, { ReactElement, useEffect, useState } from 'react'; //hooks import { NavLink, useNavigate } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; import { AppDispatch, RootState } from '../../redux/store'; //actions import { clearTemplateFields, searchAndAdvanceChange, selectPostCard, selectProduct, } from '../../redux/actions/templateActions'; import { CLEAR_TEMPLATE } from '../../redux/actions/action-types'; import { clearQrFields } from '../../redux/actions/customQRCodeActions'; //utils import { PRODUCT_LEARN_URL, sortOrderForTemplates } from '../../utils/constants'; import { removeItem } from '../../utils/local-storage'; import { MESSAGES } from '../../utils/message'; import { envelopeTypes } from '../../utils/template-builder'; // UI Components import { GridContainer, GridItem } from '../GenericUIBlocks/Grid'; import Typography from '../GenericUIBlocks/Typography'; import Button from '../GenericUIBlocks/Button'; import GeneralSelect from '../GenericUIBlocks/GeneralSelect'; import GenericSnackbar from '../GenericUIBlocks/GenericSnackbar/Toast'; import GeneralTooltip from '../GenericUIBlocks/GeneralTooltip'; // Images //@ts-ignore import Postcard from '../../assets/images/templates/postcard.tsx'; //@ts-ignore import PersonalLetter from '../../assets/images/templates/personal-letter.tsx'; //@ts-ignore import ProfessionalLetter from '../../assets/images/templates/professional-letter.tsx'; //@ts-ignore import RealPennedLetter from '../../assets/images/templates/real-penned-letters.tsx'; //@ts-ignore import TriFoldSelfMailers from '../../assets/images/templates/tri-fold-self-mailers.tsx'; //@ts-ignore import BiFoldSelfMailers from '../../assets/images/templates/bi-fold-self-mailers.tsx'; //@ts-ignore import SnapPackMailers from '../../assets/images/templates/snap-pack.tsx'; //@ts-ignore import InfoIcon from '../../assets/images/templates/info-icon'; import SizeImage from '../../assets/images/templates/size-image'; import SizeImageMid from '../../assets/images/templates/size-image-mid'; import SizeImageLarge from '../../assets/images/templates/size-image-lg'; import SizeImageXLarge from '../../assets/images/templates/size-image-xl'; import Input from '../GenericUIBlocks/Input'; import Divider from '../GenericUIBlocks/Divider'; // styles import './styles.scss'; const templateHeadingStyles: React.CSSProperties = { color: `var(--primary-color)`, fontSize: `24px`, fontStyle: `normal`, fontWeight: `600`, lineHeight: `normal`, marginBottom: `20px`, }; const templateTextStyles: React.CSSProperties = { color: `var(--text-color)`, fontSize: `14px`, fontStyle: `normal`, fontWeight: `400`, lineHeight: `normal`, marginBottom: `16px`, }; const footerButtonStyles: React.CSSProperties = { width: '100%', maxWidth: '100px', height: '100%', minHeight: '40px', textTransform: 'capitalize', borderRadius: '3px', backgroundColor: 'transparent', color: `var(--text-color)`, fontSize: `14px`, fontWeight: `500`, }; const Images: Record = { Postcards: , 'Professional Letters': , 'Personal Letters': , 'Real Penned Letter': , 'Tri-Fold Self-Mailers': , 'Bi-Fold Self-Mailers': , 'Snap Pack Mailers': }; interface CreateTemplateProps { onReturnAndNavigate?: () => void; createTemplateRoute?: string | null; templateBuilderRoute?: string | null; restrictedProducts?: any; disallowedProducts?: string[] | null | undefined; currentTheme?: string | null | undefined; } const CreateTemplate: React.FC = ({ onReturnAndNavigate, createTemplateRoute, templateBuilderRoute, restrictedProducts, disallowedProducts, currentTheme }) => { const [isError, setIsError] = useState(false); const [envelopeType, setEnvelopeType] = useState<[]>([]); const [inputValue, setInputValue] = useState(''); const title = useSelector((state: RootState) => state.templates.title) || ''; const product = useSelector( (state: RootState) => state.templates.product ) as Record; const products = useSelector((state: RootState) => state.templates.products); const templateType = useSelector( (state: RootState) => state.templates.templateType ); const dispatch: AppDispatch = useDispatch(); const navigate = useNavigate(); const restrictedSet = new Set( (restrictedProducts ?? []).map((id: any) => String(id)) ); const disallowedSet = new Set(disallowedProducts ?? []); const sortedProducts = products ?.sort((a, b) => { const indexA = sortOrderForTemplates.indexOf(a.productType); const indexB = sortOrderForTemplates.indexOf(b.productType); return indexA - indexB; }) .filter((product) => { return ( !restrictedSet.has(String(product.id)) && !disallowedSet.has(product.productType.toLowerCase().replace(/\s+/g, '_')) ); }); const filteredEnvelopeTypes = envelopeTypes.filter((type) => { return !restrictedProducts?.includes(type.productId); }); const handleNext = () => { const trimedTitle = title.trim(); if ( !trimedTitle || trimedTitle?.length > 50 || !templateType || !product || (product && product.productType === 'Postcards' && !product?.selectedSize) || (product && product.productType === 'Professional Letters' && !Object.keys(envelopeType).length) ) { setIsError(true); } else { let envelope: string | string[] = ''; if (product.productType === 'Professional Letters') { //@ts-ignore envelope = envelopeTypes.find( //@ts-ignore (envelope) => envelope?.label === envelopeType.label )?.type; } dispatch(searchAndAdvanceChange('title', trimedTitle)); dispatch(searchAndAdvanceChange('envelopeType', envelope)); navigate( templateBuilderRoute ? templateBuilderRoute : '/template-builder' ); } }; const ProductTooltipContent = ({ product }: { product: any }) => (
{product?.productType}
{product?.size && product?.size.map((size: any, idx: any) => ( Size: {size.size} ))} {product?.paper && Paper: {product?.paper} } {+product?.id !== 2 && product?.envelope && Envelope: {product?.envelope} } {+product?.id === 2 && product?.envelope && Windowed Envelope: {product?.envelope} } {+product?.id === 2 && product?.nonEnvelope && Non-Windowed Envelope: {product?.nonEnvelope} } {/* {product?.ink && Ink: {product?.ink} } */}
); useEffect(() => { dispatch(clearTemplateFields()); dispatch(clearQrFields()); removeItem('formData'); dispatch({ type: CLEAR_TEMPLATE }); }, []); useEffect(() => { if (sortedProducts?.length) { dispatch(selectProduct(sortedProducts[0])); } }, [products]); useEffect(() => { if (product && product?.productType === 'Professional Letters') { if (Object.keys(envelopeType).length) { setIsError(false); } //@ts-ignore if (envelopeType?.label === 'Non-Windowed Envelope') { dispatch( selectProduct(sortedProducts.find((item) => item.windowed === false)) ); //@ts-ignore } else if (envelopeType?.label === 'Windowed Envelope') { dispatch( selectProduct(sortedProducts.find((item) => item.windowed === true)) ); } } }, [envelopeType]); return ( <> {MESSAGES.TEMPLATE_MESSAGE_ON_SMALL_SCREEN}
{MESSAGES.TEMPLATE.CREATE.TITLE}
{ setInputValue(e.target.value); dispatch(searchAndAdvanceChange('title', e.target.value)); }} placeholder="Template Name" inputIcon={false} error={ !title.trim() && isError ? MESSAGES.TEMPLATE.NAME_REQUIRED : title.length > 50 && isError ? MESSAGES.TEMPLATE.NAME_LESS_50 : '' } label={MESSAGES.TEMPLATE.CREATE.TEMPLATE_LABEL} />
{MESSAGES.TEMPLATE.CREATE.PRODUCT_LABEL} {' '} {MESSAGES.TEMPLATE.CREATE.LEARN_TEXT}
{sortedProducts && sortedProducts ?.filter((prod) => { if (restrictedSet.has('2') || restrictedSet.has('4')) { return true; } else { return prod.windowed !== false; } }) .map((prod, index) => { return (
dispatch(selectProduct(prod))} > {Images[prod.productType]} {prod.productType}
} />
); })}
{isError && !product && ( *{MESSAGES.TEMPLATE.PRODUCT_TYPE_REQUIRED} )}
{product?.productType?.includes('Postcards') || product?.productType?.includes('Professional Letters') || product?.productType?.includes('Real Penned Letter') ? ( ) : null} {product && product.productType === 'Professional Letters' && (
)} {product && (product?.productType === 'Postcards' || product?.productType === 'Real Penned Letter') && product?.size && (
{product?.productType === 'Real Penned Letter' ? 'Real Penned Letter Size*' : 'Postcard Size*'}
{product?.size .sort((a: any, b: any) => a.id.localeCompare(b.id)) .map((type: any, index: any) => { const size = type?.label?.split('x') || type?.size?.split('x'); return (
{ if (product?.productType === 'Real Penned Letter') { dispatch(selectPostCard({ ...product, id: type.id, size: product.size, selectedSize: type.size, }, 'Real Penned Letter')); } else { dispatch(selectPostCard({ ...type, size: product.size, selectedSize: type.size, }, 'Postcards' )); } }} className={ product?.productType === 'Real Penned Letter' ? `postCard ${product.selectedSize === type.size ? 'active' : '' }` : index === 0 ? `postCard postCard-small ${product.selectedSize === type.size ? 'active' : '' }` : index === 1 ? `postCard postCard-mid ${product.selectedSize === type.size ? 'active' : '' }` : index === 2 ? `postCard postCard-large ${product.selectedSize === type.size ? 'active' : '' }` : `postCard ${product.selectedSize === type.size ? 'active' : '' }` } key={index} > {product?.productType === 'Real Penned Letter' ? type?.title : `${size[0]}" x ${size[1]}"`} {product?.productType === 'Real Penned Letter' ? <> {index === 0 &&
} {index === 1 &&
} : index === 0 ? ( ) : index === 1 ? ( ) : index === 2 ? ( ) : }
); })}
{isError && product && product.productType === 'Postcards' && !product.selectedSize && ( *{MESSAGES.TEMPLATE.POSTCARD_SIZE_REQUIRED} )}
)}
); }; export default CreateTemplate;