import React, { ReactElement, useEffect, useMemo, useState } from 'react'; //hooks import { useNavigate } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; import { AppDispatch, RootState } from '../../../redux/store'; //actions import { clearTemplateFields, searchAndAdvanceChange, selectPostCard, selectProduct, fetchProducts, } from '../../../redux/actions/templateActions'; import { CLEAR_TEMPLATE } from '../../../redux/actions/action-types'; import { clearQrFields } from '../../../redux/actions/customQRCodeActions'; //utils import { sortOrderForTemplatesV2 } from '../../../utils/constants'; import { removeItem } from '../../../utils/local-storage'; import { MESSAGES } from '../../../utils/message'; import { designTypes, envelopeTypes, selfMailerProduct } from '../../../utils/template-builder'; // UI Components import Typography from '../../GenericUIBlocks/Typography'; import Input from '../../GenericUIBlocks/Input'; import CircularProgress from '../../GenericUIBlocks/CircularProgress'; // images // @ts-ignore import Postcard from '../../../assets/images/products/postcard-new.tsx'; // @ts-ignore import ProfessionalLetter from '../../../assets/images/products/professional-new.tsx'; // @ts-ignore import PersonalLetter from '../../../assets/images/products/personal-new.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 RealPennedLetter from '../../../assets/images/products/real-new.tsx'; //@ts-ignore import SnapPackMailers from '../../../assets/images/templates/snap-pack.tsx'; // @ts-ignore import SelfMailer from '../../../assets/images/products/bi-new.svg'; // @ts-ignore import LeftArrow from '../../../assets/images/products/left-arrow.svg' // @ts-ignore import RightArrow from '../../../assets/images/products/right-arrow.svg' // @ts-ignore import One from '../../../assets/images/thumbnails/one.svg'; // styles import './styles.scss'; const textStyles = { fontSize: '20px', fontWeight: '600', color: '#000', marginBottom: '0', } const descriptionStyles = { fontSize: '16px', fontWeight: '400', color: '#00000099', marginBottom: '12px', } const buttonStyles = { width: '100%', maxWidth: '157px', height: '50px', borderRadius: '8px', fontSize: '16px', fontWeight: '600', } const progressStyles = { width: '20px', height: '20px', border: '2px solid var(--primary-color)', }; const Images: Record = { Postcards: , 'Professional Letters': , 'Personal Letters': , 'Real Penned Letter': , 'Tri-Fold Self-Mailers': , 'Bi-Fold Self-Mailers': , 'Snap Pack Mailers': , "Self Mailer": }; interface CreateTemplateV2Props { onReturnAndNavigate?: () => void; createTemplateRoute?: string | null; templateBuilderRoute?: string | null; restrictedProducts?: any; disallowedProducts?: string[] | null | undefined; currentTheme?: string | null | undefined; } const CreateTemplateV2: React.FC = ({ onReturnAndNavigate, createTemplateRoute, templateBuilderRoute, restrictedProducts, disallowedProducts, currentTheme }) => { const [activeProduct, setActiveProduct] = useState("13"); const [activeProductType, setActiveProductType] = useState("Postcards"); const [selectedSize, setSelectedSize] = useState('4x6'); const [selectedRPLType, setSelectedRPLType] = useState('16'); const [selectedDesign, setSelectedDesign] = useState(designTypes[0]) const [envelopeType, setEnvelopeType] = useState(envelopeTypes[0]); const [inputValue, setInputValue] = useState(''); const [showingFrontImage, setShowingFrontImage] = useState(true); const [isError, setIsError] = useState(false); const [isImageLoading, setIsImageLoading] = useState(true); const [imageToShow, setImageToShow] = useState(null); const dispatch: AppDispatch = useDispatch(); const navigate = useNavigate(); const title = useSelector((state: RootState) => state.templates.title) || ''; const product = useSelector( (state: RootState) => state.templates.product ) as Record; const allProducts = useSelector((state: RootState) => state.templates.products); const products = useMemo(() => { const exists = allProducts.some(p => p.id === "100"); return exists ? allProducts : [...allProducts.filter((prod) => prod.id !== '9' && prod.id !== '11'), selfMailerProduct]; }, [allProducts]); const productDetails = useSelector((state: RootState) => state.templates.productDetails); const templateType = useSelector( (state: RootState) => state.templates.templateType ); const restrictedSet = new Set( (restrictedProducts ?? []).map((id: any) => String(id)) ); const disallowedSet = new Set(disallowedProducts ?? []); const sortedProducts = products ?.sort((a, b) => { const indexA = sortOrderForTemplatesV2.indexOf(a.title === 'Self Mailer' ? a.title : a.productType); const indexB = sortOrderForTemplatesV2.indexOf(b.title === 'Self Mailer' ? b.title : 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 filteredDesignTypes = designTypes.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 handleProductChange = (prod: any) => { setActiveProduct(prod.id); setActiveProductType(prod.title === 'Self Mailer' ? 'Bi-Fold Self-Mailers' : prod.productType); setShowingFrontImage(true); setIsImageLoading(true); dispatch(selectProduct(prod)); prod.productType !== "Postcards" && setSelectedSize('4x6'); prod.productType !== "Professional Letters" && setEnvelopeType(envelopeTypes[0]); prod.productType !== "Real Penned Letter" && setSelectedRPLType('16'); prod.title !== "Self Mailer" && setSelectedDesign(designTypes[0]); } const handlePostCardSizeChange = (type: any, product: any) => { setSelectedSize(type.size); handleProductChange(product); dispatch( selectPostCard( { ...type, size: product.size, selectedSize: type.size, paper: product.paper, finish: product.finish }, 'Postcards' ) ) } const handleEnvelopeTypeChange = (envelope: any, product: any) => { setEnvelopeType(envelope); let selectedProduct = null; if (envelope?.label === 'Non-Windowed Envelope') { selectedProduct = sortedProducts.find((item) => item.windowed === false) } else if (envelope?.label === 'Windowed Envelope') { selectedProduct = sortedProducts.find((item) => item.windowed === true) } if (selectedProduct) { handleProductChange(selectedProduct); } } const handleRealPennedLetter = (type: any, product: any) => { setSelectedRPLType(type.id); handleProductChange(product); dispatch(selectPostCard({ ...product, id: type.id, size: product.size, selectedSize: type.size, label: type.label }, 'Real Penned Letter')); } const handleSliderArrowClick = (direction: string) => { if (direction === 'left') { setShowingFrontImage(true); } else { setShowingFrontImage(false); } setIsImageLoading(true); } const handleTemplateNameChange = (e: React.ChangeEvent) => { setInputValue(e.target.value); dispatch(searchAndAdvanceChange('title', e.target.value)); } const getCurrentProductDetails = (selectProduct: any) => { return productDetails?.find((detail: any) => detail.id === selectProduct.id) || null; }; useEffect(() => { dispatch(fetchProducts()); dispatch(clearTemplateFields()); dispatch(clearQrFields()); removeItem('formData'); dispatch({ type: CLEAR_TEMPLATE }); }, []); useEffect(() => { if(product && productDetails?.length === 0) setIsImageLoading(false); const currentProductDetail = getCurrentProductDetails(product); const currentImage = showingFrontImage ? currentProductDetail?.thumbnailFrontUrl : currentProductDetail?.thumbnailBackUrl; setImageToShow(currentImage); }, [product, productDetails, showingFrontImage]) useEffect(() => { if (sortedProducts?.length) { dispatch(selectProduct(sortedProducts[0])); } }, [products]); return (
Create a Template
Select a Product
{sortedProducts && sortedProducts ?.filter((prod) => { if (restrictedSet.has('2') || restrictedSet.has('4')) { return true; } else { return prod.windowed !== false; } }) .map((prod, index) => { const ImageOrComponent = Images[prod.productType]; return (
handleProductChange(prod)} > {typeof ImageOrComponent === 'string' ? ( Product ) : ( ImageOrComponent )} {prod.title === 'Self Mailer' ? prod.title : prod.productType}
); })}
{product && product?.productType === 'Postcards' && product?.size && (
Postcard Size
{product?.size .map((type: any, index: any) => { const size = type?.label?.split('x') || type?.size?.split('x'); return ( ) })}
)} {product && (product?.title === 'Self Mailer' || product?.productType === "Bi-Fold Self-Mailers" || product?.productType === "Tri-Fold Self-Mailers") && (
Design Format
{filteredDesignTypes.map((design: any, index: any) => { return ( ) })}
)} {product && product.productType === 'Professional Letters' && (
Envelope Type
{filteredEnvelopeTypes.map((envelope) => ( ))}
)} {product?.productType === 'Real Penned Letter' && (
Design Format
{product?.size ?.filter((type: any) => !restrictedSet.has(String(type.id))) .map((type: any) => ( ))}
)}
50 && isError ? MESSAGES.TEMPLATE.NAME_LESS_50 : '' } />
{isImageLoading && (
)} {!isImageLoading && !imageToShow ? ( {`Dummy setIsImageLoading(false)} onError={() => setIsImageLoading(false)} style={{ display: isImageLoading ? 'none' : 'block' }} /> ) : ( {`Product setIsImageLoading(false)} onError={() => setIsImageLoading(false)} style={{ display: isImageLoading ? 'none' : 'block' }} /> )} {(() => { const currentProductDetail = getCurrentProductDetails(product); if (!currentProductDetail || !currentProductDetail?.thumbnailBackUrl) { return null; } return ( <>
!showingFrontImage && handleSliderArrowClick('left')} > left
showingFrontImage && handleSliderArrowClick('right')} > right
); })()}
Size:{' '} {(() => { const size = product?.label?.split('x') || product?.selectedSize?.split('x'); return size?.length ? `${size[0] || ''}" x ${size[1] || ''}"` : product?.selectedSize; })() || product?.selectedSize || '-'} Paper: {product?.paper} {product?.finish && Finish: {product?.finish} } {product?.envelopeOptions && Envelope: {product?.envelopeOptions} }
) } export default CreateTemplateV2;