import React, { useCallback, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { IReduxState } from '../../../app/types'; import { clearSelectedMeeting, fetchMeetings, setActiveTab, toggleMeetingIntelligence } from '../../actions'; import { getMeetingIntelligenceState } from '../../functions'; import RecordingsList from './RecordingsList'; import SearchPanel from './SearchPanel'; import SummaryPanel from './SummaryPanel'; import TranscriptViewer from './TranscriptViewer'; /** * Meeting Intelligence Dashboard side panel. * * @returns {React.ReactElement|null} The dashboard or null if closed. */ const MeetingIntelligenceDashboard: React.FC = () => { const dispatch = useDispatch(); const { isOpen, activeTab, selectedMeeting } = useSelector((state: IReduxState) => getMeetingIntelligenceState(state)); // Fetch meetings on open useEffect(() => { if (isOpen) { dispatch(fetchMeetings() as any); } }, [ dispatch, isOpen ]); const handleClose = useCallback(() => { dispatch(toggleMeetingIntelligence()); }, [ dispatch ]); const handleBack = useCallback(() => { dispatch(clearSelectedMeeting()); }, [ dispatch ]); const handleTranscriptTab = useCallback(() => { dispatch(setActiveTab('transcript')); }, [ dispatch ]); const handleSummaryTab = useCallback(() => { dispatch(setActiveTab('summary')); }, [ dispatch ]); const handleRecordingsTab = useCallback(() => { dispatch(setActiveTab('recordings')); }, [ dispatch ]); const handleSearchTab = useCallback(() => { dispatch(setActiveTab('search')); }, [ dispatch ]); if (!isOpen) { return null; } return (