import { forwardRef, useCallback, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import { Close } from '../../../../../../assets/icons'; import { clsm, noop } from '../../../../../../utils'; import { dashboard as $dashboardContent } from '../../../../../../content'; import { useResponsiveDevice } from '../../../../../../contexts/ResponsiveDevice'; import { useStreams } from '../../../../../../contexts/Streams'; import Button from '../../../../../../components/Button'; import MetricPanel from '../../MetricPanel'; import StreamEventItem from './StreamEventItem'; const $content = $dashboardContent.stream_session_page.stream_events; const StreamEventsList = forwardRef( ( { isHidden, isLearnMoreVisible, isPreview, selectedEventId, setIsStreamEventsListVisible, setSelectedEventId, streamEvents, toggleLearnMore }, wrapperRef ) => { const { isDefaultResponsiveView } = useResponsiveDevice(); const { activeStreamSession = {}, isLoadingStreamData, fetchActiveStreamSessionError } = useStreams(); const selectedEventRef = useRef(); const setSelectedEventRef = useCallback( (eventEl) => { const eventId = eventEl?.attributes['data-id'].value; if (eventId === selectedEventId) selectedEventRef.current = eventEl; }, [selectedEventId] ); const handleEventClick = (id) => { setSelectedEventId((prevId) => { if (prevId === id) { selectedEventRef.current = null; return null; } return id; }); }; const handleCloseEventsList = () => { setIsStreamEventsListVisible(false); setSelectedEventId(null); }; useEffect(() => { setTimeout( () => selectedEventRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 300 ); }, [selectedEventId]); useEffect(() => { const removeSpacebarScroll = (e) => { if (e.key === ' ') e.preventDefault(); }; const wrapper = wrapperRef.current; wrapper?.addEventListener('keypress', removeSpacebarScroll); return () => wrapper?.removeEventListener('keypress', removeSpacebarScroll); }, [wrapperRef]); const hasEvents = !!streamEvents.length; return ( ) } headerClassName={clsm(['pl-4', 'pt-8'])} isLoading={isLoadingStreamData} ref={wrapperRef} title={$content.stream_events} wrapper={{ className: clsm([ 'dark:scrollbar-color-darkMode-gray', 'h-full', 'md:p-0', 'md:pb-0', 'overflow-x-hidden', 'overflow-y-auto', 'pr-4', 'scrollbar-color-lightMode-gray', 'scrollbar-mb-4', 'scrollbar-mt-[-4px]', 'space-y-4', 'supports-overlay:overflow-y-overlay', (!hasEvents || isLoadingStreamData || fetchActiveStreamSessionError) && 'pb-20', !hasEvents && ['md:mt-11', 'md:mr-0', 'md:mb-8'] ]) }} > {hasEvents ? ( streamEvents.map((streamEvent) => ( )) ) : (

{$content.no_stream_events}

{$content.no_stream_events_message}

)}
); } ); StreamEventsList.defaultProps = { isHidden: false, isLearnMoreVisible: false, isPreview: false, selectedEventId: null, setIsStreamEventsListVisible: noop, streamEvents: [] }; StreamEventsList.propTypes = { isHidden: PropTypes.bool, isLearnMoreVisible: PropTypes.bool, isPreview: PropTypes.bool, selectedEventId: PropTypes.string, setIsStreamEventsListVisible: PropTypes.func, setSelectedEventId: PropTypes.func.isRequired, streamEvents: PropTypes.array, toggleLearnMore: PropTypes.func.isRequired }; export default StreamEventsList;