import { forwardRef, useRef, useState } from 'react'; import { getFormHeaderClasses, getModalContainerClasses, getModalFormClasses, MODAL_CLOSE_BUTTON_CLASSES, MODAL_OVERFLOW_DIVIDER_CLASSES } from '../StreamManagerModalTheme'; import { BREAKPOINTS, STREAM_ACTION_NAME } from '../../../../constants'; import { Close } from '../../../../assets/icons'; import { clsm } from '../../../../utils'; import { MODAL_TYPE, useModal } from '../../../../contexts/Modal'; import { streamManager as $streamManagerContent } from '../../../../content'; import { useResponsiveDevice } from '../../../../contexts/ResponsiveDevice'; import { useStreamManagerActions } from '../../../../contexts/StreamManagerActions'; import Button from '../../../../components/Button'; import Modal from '../../../../components/Modal'; import ResponsivePanel from '../../../../components/ResponsivePanel'; import Spinner from '../../../../components/Spinner'; import useMediaQuery from '../../../../hooks/useMediaQuery'; import useResizeObserver from '../../../../hooks/useResizeObserver'; import useScrollListener from '../../../../../src/pages/StreamManager/streamManagerCards/StreamManagerActions/StreamManagerActionForms/AmazonProduct/useScrollListener'; const $content = $streamManagerContent; const StreamManagerActionModal = forwardRef((_, ref) => { const { closeModal, content, handleConfirm, handleSave, isModalOpen, type } = useModal(); const { actionName, title, confirmText, streamManagerActionContent } = content || {}; const { getStreamManagerActionData, isSendingStreamAction, handleResetAmazonProductData } = useStreamManagerActions(); const { isMobileView, isLandscape } = useResponsiveDevice(); const [isContentOverflowing, setIsContentOverflowing] = useState(false); const streamManagerActionData = getStreamManagerActionData(); const mainContentRef = useRef(); const prefersDarkColorScheme = useMediaQuery('(prefers-color-scheme: dark)'); const buttonClasses = clsm(['relative', 'w-auto', 'md:w-full']); const isAmazonProductStreamAction = actionName === STREAM_ACTION_NAME.AMAZON_PRODUCT; // list of stream actions that should only submit when submit button is clicked const shouldSubmitOnButtonClick = [ STREAM_ACTION_NAME.AMAZON_PRODUCT ].includes(actionName); useScrollListener(actionName, mainContentRef, setIsContentOverflowing); useResizeObserver( mainContentRef, (entry) => { if (entry) { const { scrollHeight, clientHeight } = entry.target; setIsContentOverflowing(scrollHeight > clientHeight); } }, isModalOpen ); const save = () => handleSave(streamManagerActionData); const send = (e) => { e.preventDefault(); if (!shouldSubmitOnButtonClick) handleConfirm(streamManagerActionData); }; const submitOnButtonClick = () => { if (shouldSubmitOnButtonClick) handleConfirm(streamManagerActionData); }; const onClose = () => { actionName === STREAM_ACTION_NAME.AMAZON_PRODUCT && handleResetAmazonProductData(); closeModal(); }; const renderStreamManagerAction = (children) => ( <> { /** * We mount/unmount the responsive panel to skip the enter and exit * animations when switching between desktop and mobile views */ isMobileView && ( {children} ) } {children} ); return ( type === MODAL_TYPE.STREAM_MANAGER_ACTION && !!content && renderStreamManagerAction(

{title}

{streamManagerActionContent}
) ); }); export default StreamManagerActionModal;