import { InnerBlocks, useBlockProps, store as blockEditorStore, BlockControls } from "@wordpress/block-editor"; import { useEffect, useMemo, useState } from "@wordpress/element"; import { useSelect, select, dispatch } from "@wordpress/data"; import LayoutPreset from "./layoutPreset"; import { InspectorControl } from "../../components"; import { panelBodyRightIcon } from "../../icons/icons"; import Inspector from "./Inspector"; import { useDeviceType } from "../../controls/controls"; import dynamicCss from "./dynamicCss"; import { containerTemplatesConstant, layoutsColumnsWidth, shapeDividerIconConstant } from "./containerConstant"; import "./ContainerSelector.css"; import { compose } from "@wordpress/compose"; import addInitialAttr from "../shared/addInitialAttr"; import { ToolbarDropdownMenu } from "@wordpress/components"; import { AlignNoneIcon } from "./icons"; const ContainerEdit = ({ attributes, setAttributes, clientId, isSelected }) => { const [showPresetLayer, setShowPresetLayer] = useState(null); const page = "editor"; const { blockName, uniqueId, containerLayer, customCss, columns, containerFlexDirection, layout, htmlTag, containerTopDividerType, containerBottomDividerType, shapeDividerFlipTop, shapeDividerFlipBottom, advancedAdditionalID, advancedAdditionalClass, advanceWrapperLink, advanceWrapperLinkUrl, advanceWrapperLinkNewTab, containerFlexWrap, containerBGVideo, containerBG, columnsGap, columnsTablet, columnsMobile, align, containerWidth, } = attributes; const deviceType = useDeviceType(); const blockProps = useBlockProps({ className: `${uniqueId}-boxed`, }); const [template, setTemplate] = useState(""); const ContainerTag = htmlTag; const containerFlexDir = containerFlexDirection?.device?.[ deviceType ]; const numberOfColumns = columns; useEffect(() => { setAttributes({ blockClientId: clientId }); }, [clientId]); const { getBlock } = select("core/block-editor"); const { updateBlockAttributes } = dispatch("core/block-editor"); // For updating the template dynamically. const innerBlocks = useSelect((select) => select(blockEditorStore).getBlocks(clientId), [clientId, columns]); // const getGlobalBreakpoint = select("smartpost/global-settings").getCategory("breakpoint"); // useEffect( () => { // if (typeof getGlobalBreakpoint === "object") { // setAttributes({ globalBreakPointData: getGlobalBreakpoint }) // } // }, [ getGlobalBreakpoint ]) useEffect(() => { if (innerBlocks.length < 1 && !containerLayer) { setShowPresetLayer("show"); } else { setShowPresetLayer("hide"); } }, [columns, layout]); useEffect(() => { //reduceColWidth, const childBlocks = getBlock(clientId)?.innerBlocks; const responsiveColumns = { Desktop: columns, Tablet: columnsTablet, Mobile: columnsMobile, } const multiRowCols = ("container-column-multi-row-layout-one" !== layout ) ? 2 : 3; let reduceGap = 0; if([ "container-column-multi-row-layout-one", "container-column-multi-row-layout-two", "container-column-multi-row-layout-three", "container-column-multi-row-layout-four", "container-column-multi-row-layout-five"].includes(layout)) { reduceGap = childBlocks?.length > 1 ? (( columnsGap?.device?.[deviceType] || columnsGap?.device?.Desktop ) * (multiRowCols - 1) / multiRowCols ).toFixed(2) : 0; }else { reduceGap = childBlocks?.length > 1 ? (( (columnsGap?.device?.[deviceType] || columnsGap?.device?.Desktop ) * (((responsiveColumns[deviceType] || columns) - 1) / responsiveColumns[deviceType] || columns))).toFixed(2) : 0; } childBlocks?.forEach((child) => { const reduceColumnWidth = child?.attributes?.reduceColWidth || {}; updateBlockAttributes(child?.clientId, { reduceColWidth: { ...reduceColumnWidth, device: { ...reduceColumnWidth.device, [deviceType]: reduceGap, }, }, parentColumnGap: columnsGap, }); }); }, [columnsGap, columns, innerBlocks.length, columnsTablet, columnsMobile]); useEffect( () => { if ( !template && containerLayer ) { setTemplate( containerTemplatesConstant[ containerLayer ] ) } }, [ containerLayer ]); const customAppenderHandler = () => (
); const layoutClassName = ( numberOfColumns < 7 || numberOfColumns === "multi-row" ) ? layout : `${blockName}-column-${numberOfColumns}-layout`; const blockStyling = useMemo(() => dynamicCss(attributes, page, deviceType), [attributes, deviceType]); const multiRowLayout = { "container-column-multi-row-layout-one": 3, }; const gapMultiplier = !["multi-row", ""].includes( columns ) ? columns : multiRowLayout[layout] || 2; const columnsWidthStyle = layout ? { "--columnOne": layoutsColumnsWidth[layout][0] ? `${layoutsColumnsWidth[layout][0]}%` : "auto", "--columnTwo": layoutsColumnsWidth[layout][1] ? `${layoutsColumnsWidth[layout][1]}%` : "auto", "--columnThree": layoutsColumnsWidth[layout][2] ? `${layoutsColumnsWidth[layout][2]}%` : "auto", "--columnFour": layoutsColumnsWidth[layout][3] ? `${layoutsColumnsWidth[layout][3]}%` : "auto", "--columnFive": layoutsColumnsWidth[layout][4] ? `${layoutsColumnsWidth[layout][4]}%` : "auto", "--columnSix": layoutsColumnsWidth[layout][5] ? `${layoutsColumnsWidth[layout][5]}%` : "auto", "--gap": `${(columnsGap?.device?.[ deviceType ] || columnsGap?.device?.Desktop) * ( gapMultiplier - 1 )}px`, "--gapMultiplier": layout ? gapMultiplier : 0, } : {}; useEffect( () => { setAttributes({ containerColumnRoot: columnsWidthStyle, }) }, [layout, columnsGap]); const alignClasses = containerWidth === "boxed" ? `${align ? "align"+align : ""}` : "alignfull"; const activeAlignIcon = { none: , wide: "align-wide", full: "align-full-width", }; return ( <> {showPresetLayer && showPresetLayer === "show" && (
)} {showPresetLayer && showPresetLayer === "hide" && (
{/* Container Shape Divider Start */} {"none" !== containerTopDividerType && (
{shapeDividerIconConstant[containerTopDividerType]}
)} {"none" !== containerBottomDividerType && (
{shapeDividerIconConstant[containerBottomDividerType]}
)} {"video" === containerBG?.color?.style && (
{containerBGVideo && ( )}
)} {/* Container Shape Divider Ends */} {/*
*/} {containerWidth === "boxed" && ( setAttributes({ align: "none", containerWidth: "boxed" }), }, { title: "Wide", icon: "align-wide", onClick: () => setAttributes({ align: "wide", containerWidth: "boxed" }), }, // { // title: "Full", // icon: "align-full-width", // onClick: () => setAttributes({ align: "full", containerWidth: "full-width" }), // }, ] } /> )}
{/* { containerFlexWrap?.device?.[ deviceType ] !== "wrap" && ( )} */}
{advanceWrapperLink && ( {" "} )} {/*
*/}
)} ); }; export default compose(addInitialAttr)(ContainerEdit);