import JSXStyle from 'styled-jsx/style'; import { ItemProps } from '../Item'; import { ComponentItem as TComponentItem, getLayoutStyles } from '@cntrl-site/sdk'; import { FC, useState } from 'react'; import { useCntrlContext } from '../../../provider/useCntrlContext'; import { useComponentItem } from './useComponentItem'; import { useItemAngle } from '../useItemAngle'; import { useRegisterResize } from '../../../common/useRegisterResize'; import { getStyleFromItemStateAndParams } from '../../../utils/getStyleFromItemStateAndParams'; import { useLayoutContext } from '../../useLayoutContext'; import { useItemGeometry } from '../../../ItemGeometry/useItemGeometry'; import { LinkWrapper } from '../LinkWrapper'; export const ComponentItem: FC> = ({ item, sectionId, onResize, interactionCtrl }) => { const sdk = useCntrlContext(); const { layouts } = sdk; const itemAngle = useItemAngle(item, sectionId); const layout = useLayoutContext(); const fallbackLayout = layouts[0]?.id; const effectiveLayout = layout ?? fallbackLayout; const layoutValues: Record[] = [item.area, item.layoutParams]; const component = sdk.getComponent(item.commonParams.componentId); const [ref, setRef] = useState(null); const { opacity: itemOpacity, blur: itemBlur } = useComponentItem(item, sectionId); useRegisterResize(ref, onResize); useItemGeometry(item.id, ref); const stateParams = interactionCtrl?.getState(['opacity', 'angle', 'blur']); const angle = getStyleFromItemStateAndParams(stateParams?.styles?.angle, itemAngle); const opacity = getStyleFromItemStateAndParams(stateParams?.styles?.opacity, itemOpacity); const blur = getStyleFromItemStateAndParams(stateParams?.styles?.blur, itemBlur); const Element = component ? component.element : undefined; const layoutParameters = effectiveLayout ? item.layoutParams[effectiveLayout]?.parameters : undefined; const commonParameters = item.commonParams.parameters; const parameters = layoutParameters ? { ...layoutParameters, settings: { ...layoutParameters.settings, ...commonParameters?.settings } } : undefined; const hasLink = Boolean(item.link?.url); return ( <>
{parameters && Element && ( )}
{` .custom-component-${item.id} { width: 100%; height: 100%; pointer-events: ${hasLink ? 'none' : 'auto'}; } ${getLayoutStyles(layouts, layoutValues, ([area, layoutParams]) => { return (` .custom-component-${item.id} { transform: rotate(${area.angle}deg); opacity: ${layoutParams.opacity}; filter: blur(${layoutParams.blur}vw); ${layoutParams.blur !== 0 ? 'will-change: transform;' : ''} } `); })}`}
); };