import { // eslint-disable-next-line @wordpress/no-unsafe-wp-apis __experimentalHStack as HStack, Modal, } from '@wordpress/components'; import { useCallback, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import useResponseNavigation from '../../hooks/use-response-navigation'; import ResponseActions from '../response-actions'; import ResponseNavigation from '../response-navigation'; import { ResponseViewBody } from './index'; /** * Single response component for dataviews. * It might return a modal when viewport is resized to mobile. * @param {object} props - The props object. * @param {FormResponse} props.sidePanelItem - The side panel item. * @param {Function} props.setSidePanelItem - The function to set the side panel item. * @param {boolean} props.isLoadingData - Whether the data is loading. * @param {boolean} props.isMobile - Whether the view is mobile. * @param {Function} props.onChangeSelection - The function to change the selection. * @param {string[]} props.selection - The selection. * @return {import('react').JSX.Element} The single response component. */ const SingleResponseView = ( { sidePanelItem, setSidePanelItem, isLoadingData, isMobile, onChangeSelection, selection, } ) => { const [ isChildModalOpen, setIsChildModalOpen ] = useState( false ); const [ isModalOpen, setIsModalOpen ] = useState( true ); const onRequestClose = useCallback( () => { if ( ! isChildModalOpen ) { onChangeSelection?.( [] ); } if ( isMobile ) { setIsModalOpen( false ); } }, [ onChangeSelection, isChildModalOpen, setIsModalOpen, isMobile ] ); const handleModalStateChange = useCallback( isOpen => { setIsChildModalOpen( isOpen ); }, [ setIsChildModalOpen ] ); const handleActionComplete = useCallback( actionedItem => { // if the action is on current response and hasn't changed status, // don't close the modal but update the side panel item if ( actionedItem?.id === sidePanelItem.id && actionedItem.status === sidePanelItem.status ) { setSidePanelItem( actionedItem ); } else if ( actionedItem?.id && selection ) { // Remove only the actioned item from selection, keep the rest const actionedItemId = String( actionedItem.id ); const newSelection = selection.filter( id => id !== actionedItemId ); onChangeSelection?.( newSelection ); } }, [ onChangeSelection, selection, sidePanelItem, setSidePanelItem ] ); // Use the navigation hook const navigation = useResponseNavigation( { onChangeSelection, record: sidePanelItem, setRecord: setSidePanelItem, } ); if ( ! sidePanelItem ) { return null; } // Navigation props to pass to InboxResponse and ResponseNavigation const navigationProps = { hasNext: navigation.hasNext, hasPrevious: navigation.hasPrevious, onNext: navigation.handleNext, onPrevious: navigation.handlePrevious, }; const contents = ( ); if ( ! isMobile ) { return (
{ contents }
); } if ( ! isModalOpen ) { return null; } return ( } > { contents } ); }; export default SingleResponseView;