import { RichText } from "@wordpress/block-editor";
import { memo, useMemo, useEffect } from "@wordpress/element";
import { usePanelBodyContext } from "../../context";
import useIconList from "../../components/iconLibrary/useIconList";
const Icon = memo(
({
iconEnable,
iconSource,
iconSourceCustom,
iconOverlayEnable,
iconHoverEffects,
currentIcon,
togglePanelBody,
}) => {
const iconClasses = useMemo(
() => `sp-smart-post-info-box-icon ${iconOverlayEnable ? "icon-img-overlay" : ""} ${iconHoverEffects}`,
[iconOverlayEnable, iconHoverEffects]
);
const imgClasses = useMemo(
() => `sp-smart-post-info-box-img ${iconOverlayEnable ? "icon-img-overlay" : ""} ${iconHoverEffects}`,
[iconOverlayEnable, iconHoverEffects]
);
if (
!iconEnable ||
(iconSource === "library" && !currentIcon) ||
(iconSource === "custom" && !iconSourceCustom)
) {
return null;
}
return (
{iconSource === "library" ? (
) : (
)}
);
}
);
const Title = memo(
({
titleTag,
titleText,
titleHoverEffects,
subTitleEnable,
subTitleTag,
subTitleText,
setAttributes,
togglePanelBody,
titleGlobalTypography,
subTitleGlobalTypography,
}) => {
const handleTitleChange = (newValue) => {
setAttributes({ titleText: newValue });
};
const handleSubTitleChange = (newValue) => {
setAttributes({ subTitleText: newValue });
};
const titleClasses = useMemo(
() =>
`sp-smart-post-info-box-title title-hover-${titleHoverEffects} ${titleGlobalTypography?.class ? titleGlobalTypography?.class : ""}`,
[titleHoverEffects, titleGlobalTypography?.class]
);
return (
{subTitleEnable && (
)}
);
}
);
const Description = memo(({ descText, dropCapsEnable, setAttributes, togglePanelBody, desGlobalTypography }) => {
const handleChange = (newValue) => {
setAttributes({ descText: newValue });
};
const descClasses = useMemo(
() =>
`sp-smart-post-info-box-desc sp-panel-data editor-selector-hover ${
dropCapsEnable ? "drop-caps" : ""
} ${desGlobalTypography?.class ? desGlobalTypography?.class : ""}`,
[dropCapsEnable, desGlobalTypography?.class]
);
return (
);
});
const Rating = memo(
({
iconsNum,
ratingIconSource,
ratingIconSourceLibrary,
ratingValueEnable,
scale,
togglePanelBody,
ratingGlobalTypography,
currentRatingIconSourceLibrary,
}) => {
const ratingIcons = useMemo(() => Array(iconsNum).fill(null), [iconsNum]);
const containerClasses = useMemo(
() => `sp-smart-post-info-box-rating-container ${ratingIconSource}`,
[ratingIconSource]
);
return (
{ratingIcons.map((_, index) => (
))}
{ratingIcons.map((_, index) => (
))}
{ratingValueEnable &&
{scale}/5}
);
}
);
const Separator = memo(({ separatorEnable, togglePanelBody }) => {
if (!separatorEnable) {
return null;
}
return (
);
});
const CallToActionIcon = memo(
({ buttonIconEnable, cAIconSource, cAIconSourceLibrary, cAIconSourceCustom, currentCAIcon }) => {
if (!buttonIconEnable) {
return null;
}
if (cAIconSource === "library" && cAIconSourceLibrary) {
return (
);
}
// Custom image icon rendering
if (cAIconSource === "custom" && cAIconSourceCustom?.url) {
return (
);
}
return null;
}
);
const CallToActionText = memo(({ caButtonText, setAttributes }) => {
const handleTextChange = (newValue) => {
setAttributes({ caButtonText: newValue });
};
const buttonTextWithDefault = useMemo(() => caButtonText?.trim() || "Learn More", [caButtonText]);
return (
);
});
const CallToActionButton = memo(
({
linkingType = "button",
caButtonText,
setAttributes,
togglePanelBody,
buttonIconEnable,
cAIconSource,
cAIconSourceLibrary,
cAIconSourceCustom,
callActionEnable,
callToActionGlobalTypography,
fullWidthButton = false,
currentCAIcon,
}) => {
const buttonClasses = useMemo(
() =>
`sp-smart-post-info-box-cta sp-panel-data linking-type-${linkingType} sp-smart-post-info-box-cta-link editor-selector-hover${linkingType === "button" && fullWidthButton ? " sp-btn-full-width" : ""} ${callToActionGlobalTypography?.class ? callToActionGlobalTypography?.class : ""}`,
[linkingType, callToActionGlobalTypography?.class, fullWidthButton]
);
if (!callActionEnable) {
return null;
}
if (linkingType === "fullBox") {
return null;
}
return (
{
event.preventDefault();
togglePanelBody();
}}
>
);
}
);
const Badge = memo(({ badgeEnable, badgeLabel, badgePosition, togglePanelBody, badgeGlobalTypography }) => {
const badgeClasses = useMemo(
() =>
`sp-smart-post-info-box-badge sp-panel-data editor-selector-hover ${badgePosition} ${badgeGlobalTypography?.class ? badgeGlobalTypography?.class : ""}`,
[badgePosition, badgeGlobalTypography?.class]
);
if (!badgeEnable || !badgeLabel) {
return null;
}
return (
{badgeLabel}
);
});
const Overlay = memo(({ infoBoxBg, imageOverlayEnable, imageOverlayHoverEnable }) => {
const shouldShowOverlay = useMemo(
() =>
(infoBoxBg.color.style === "image" || infoBoxBg.hover.style === "image") &&
(imageOverlayEnable || imageOverlayHoverEnable),
[infoBoxBg, imageOverlayEnable, imageOverlayHoverEnable]
);
if (!shouldShowOverlay) {
return null;
}
return ;
});
function EditHtml({ attributes, setAttributes }) {
const { togglePanelBody } = usePanelBodyContext();
const iconList = useIconList();
const {
uniqueId,
infoBoxLayout,
iconEnable,
iconSource,
iconHoverEffects,
iconSourceCustom,
iconOverlayEnable,
titleTag,
titleText,
subTitleTag,
subTitleText,
subTitleEnable,
separatorEnable,
titleHoverEffects,
caButtonText,
descText,
descriptionEnable,
dropCapsEnable,
badgeEnable,
badgeLabel,
badgePosition,
ratingEnable,
ratingIconSourceLibrary,
ratingIconSource,
cAIconSourceCustom,
scale,
linkingType,
titleEnable,
buttonIconEnable,
cAIconSource,
cAIconSourceLibrary,
overlayOnHover,
externalLinkIcon,
callActionEnable,
ratingValueEnable,
imageOverlayEnable,
imageOverlayHoverEnable,
iconName,
infoBoxBg,
advancedAdditionalClass,
titleGlobalTypography,
subTitleGlobalTypography,
desGlobalTypography,
callToActionGlobalTypography,
ratingGlobalTypography,
badgeGlobalTypography,
buttonLink,
currentIcon,
fullWidthButton,
currentCAIcon,
currentRatingIconSourceLibrary,
} = attributes;
useEffect(() => {
setAttributes({ currentIcon: iconList[iconName] });
}, [iconList, iconName]);
useEffect(() => {
setAttributes({ currentCAIcon: iconList[cAIconSourceLibrary] });
}, [iconList, cAIconSourceLibrary]);
useEffect(() => {
setAttributes({ currentRatingIconSourceLibrary: iconList[ratingIconSourceLibrary] });
}, [iconList, ratingIconSourceLibrary]);
useEffect(() => {
setAttributes({ currentIcon: iconList[iconName] });
}, [iconList, iconName]);
const iconsNum = 5;
const layoutOne = () => {
return (
<>
{titleEnable && (
)}
{descriptionEnable && (
)}
{ratingEnable && (
)}
>
);
};
const layoutTwo = () => {
return (
<>
{infoBoxLayout === "smart-info-box-layout-two" && titleEnable && (
)}
{infoBoxLayout === "smart-info-box-layout-four" && (
)}
{descriptionEnable && (
)}
{ratingEnable && (
)}
{infoBoxLayout === "smart-info-box-layout-two" && (
)}
{infoBoxLayout === "smart-info-box-layout-four" && titleEnable && (
)}
>
);
};
const layoutThree = () => {
return (
<>
{titleEnable && (
)}
{descriptionEnable && (
)}
{ratingEnable && (
)}
{callActionEnable && (
)}
>
);
};
return (
{callActionEnable && linkingType === "fullBox" ? (
{overlayOnHover && (
{externalLinkIcon && (
)}
)}
{(infoBoxLayout === "smart-info-box-layout-one" ||
infoBoxLayout === "smart-info-box-layout-five") &&
layoutOne()}
{(infoBoxLayout === "smart-info-box-layout-two" ||
infoBoxLayout === "smart-info-box-layout-four") &&
layoutTwo()}
{infoBoxLayout === "smart-info-box-layout-three" && layoutThree()}
) : (
{(infoBoxLayout === "smart-info-box-layout-one" ||
infoBoxLayout === "smart-info-box-layout-five") &&
layoutOne()}
{(infoBoxLayout === "smart-info-box-layout-two" ||
infoBoxLayout === "smart-info-box-layout-four") &&
layoutTwo()}
{infoBoxLayout === "smart-info-box-layout-three" && layoutThree()}
)}
);
}
export default EditHtml;