import { forwardRef, useMemo } from 'react'; import PropTypes from 'prop-types'; import { clsm } from '../../../../utils'; import { dashboard as $dashboardContent } from '../../../../content'; import { NoData, SyncError } from '../../../../assets/icons'; import { useStreams } from '../../../../contexts/Streams'; import Spinner from '../../../../components/Spinner'; const $content = $dashboardContent.stream_session_page; const errorContainerClasses = clsm([ 'dark:fill-darkMode-gray', 'dark:text-darkMode-gray', 'fill-lightMode-gray-medium', 'flex-col', 'flex', 'h-full', 'items-center', 'justify-center', 'relative', 'space-y-1', 'text-lightMode-gray-medium', 'w-full' ]); const MetricPanel = forwardRef( ( { children, className, footer, hasData, header, headerClassName, isLoading, title, wrapper }, wrapperRef ) => { const { fetchActiveStreamSessionError } = useStreams(); const Wrapper = useMemo(() => wrapper.tag || 'div', [wrapper.tag]); const renderBody = () => { if (isLoading) return (
); if (fetchActiveStreamSessionError) return (

{$content.failed_to_load}

); if (!hasData) return (

{$content.no_data_available}

); return children; }; return (
{(title || header) && (
{title && (

{title}

)} {header}
)} {renderBody()} {footer && (
{footer}
)}
); } ); MetricPanel.defaultProps = { children: null, className: '', footer: null, hasData: false, header: null, headerClassName: '', isLoading: false, title: '', wrapper: { tag: 'div', className: '' } }; MetricPanel.propTypes = { children: PropTypes.node, className: PropTypes.string, footer: PropTypes.node, hasData: PropTypes.bool, header: PropTypes.node, headerClassName: PropTypes.string, isLoading: PropTypes.bool, title: PropTypes.string, wrapper: PropTypes.shape({ tag: PropTypes.string, className: PropTypes.string }) }; export default MetricPanel;