import React from 'react' import { Aperture, BarChart3, Calendar, Download, Image as ImageIcon, Info, Loader2, Mic, RefreshCw, Search, Users } from 'lucide-react' import { Avatar } from '../../components/Avatar' import type { ChatSession } from '../../types/models' import type { BatchVoiceTaskType } from '../../stores/batchTranscribeStore' export interface ChatHeaderProps { session: ChatSession isGroupChat: boolean standaloneSessionWindow: boolean showGroupMembersPanel: boolean showJumpPopover: boolean showInSessionSearch: boolean showDetailPanel: boolean shouldHideStandaloneDetailButton: boolean isPrivateSnsSupported: boolean isExportActionBusy: boolean isCurrentSessionExporting: boolean isPreparingExportDialog: boolean isBatchTranscribing: boolean runningBatchVoiceTaskType?: BatchVoiceTaskType isBatchDecrypting: boolean isRefreshingMessages: boolean isLoadingMessages: boolean currentSessionId?: string | null jumpCalendarWrapRef: React.RefObject onGroupAnalytics: () => void onToggleGroupMembersPanel: () => void onExportCurrentSession: () => void onOpenSnsTimeline: () => void onBatchTranscribe: () => void onBatchDecrypt: () => void onToggleJumpPopover: () => void onToggleInSessionSearch: () => void onRefreshMessages: () => void onToggleDetailPanel: () => void } function ChatHeader({ session, isGroupChat, standaloneSessionWindow, showGroupMembersPanel, showJumpPopover, showInSessionSearch, showDetailPanel, shouldHideStandaloneDetailButton, isPrivateSnsSupported, isExportActionBusy, isCurrentSessionExporting, isPreparingExportDialog, isBatchTranscribing, runningBatchVoiceTaskType, isBatchDecrypting, isRefreshingMessages, isLoadingMessages, currentSessionId, jumpCalendarWrapRef, onGroupAnalytics, onToggleGroupMembersPanel, onExportCurrentSession, onOpenSnsTimeline, onBatchTranscribe, onBatchDecrypt, onToggleJumpPopover, onToggleInSessionSearch, onRefreshMessages, onToggleDetailPanel }: ChatHeaderProps) { const sessionName = session.displayName || session.username const exportTitle = isCurrentSessionExporting ? '导出中' : isPreparingExportDialog ? '正在准备导出模块' : '导出当前会话' const batchVoiceTitle = isBatchTranscribing ? `${runningBatchVoiceTaskType === 'decrypt' ? '批量语音解密' : '批量转写'}中,可在导出页任务中心查看进度` : '批量语音处理' return (

{sessionName}

{isGroupChat &&
群聊
}
{!standaloneSessionWindow && isGroupChat && ( )} {isGroupChat && ( )} {!standaloneSessionWindow && ( )} {!standaloneSessionWindow && isPrivateSnsSupported && ( )} {!standaloneSessionWindow && ( )} {!standaloneSessionWindow && ( )}
{!shouldHideStandaloneDetailButton && ( )}
) } function areEqual(prev: ChatHeaderProps, next: ChatHeaderProps) { return ( prev.session.username === next.session.username && prev.session.displayName === next.session.displayName && prev.session.avatarUrl === next.session.avatarUrl && prev.isGroupChat === next.isGroupChat && prev.standaloneSessionWindow === next.standaloneSessionWindow && prev.showGroupMembersPanel === next.showGroupMembersPanel && prev.showJumpPopover === next.showJumpPopover && prev.showInSessionSearch === next.showInSessionSearch && prev.showDetailPanel === next.showDetailPanel && prev.shouldHideStandaloneDetailButton === next.shouldHideStandaloneDetailButton && prev.isPrivateSnsSupported === next.isPrivateSnsSupported && prev.isExportActionBusy === next.isExportActionBusy && prev.isCurrentSessionExporting === next.isCurrentSessionExporting && prev.isPreparingExportDialog === next.isPreparingExportDialog && prev.isBatchTranscribing === next.isBatchTranscribing && prev.runningBatchVoiceTaskType === next.runningBatchVoiceTaskType && prev.isBatchDecrypting === next.isBatchDecrypting && prev.isRefreshingMessages === next.isRefreshingMessages && prev.isLoadingMessages === next.isLoadingMessages && prev.currentSessionId === next.currentSessionId && prev.jumpCalendarWrapRef === next.jumpCalendarWrapRef && prev.onGroupAnalytics === next.onGroupAnalytics && prev.onToggleGroupMembersPanel === next.onToggleGroupMembersPanel && prev.onExportCurrentSession === next.onExportCurrentSession && prev.onOpenSnsTimeline === next.onOpenSnsTimeline && prev.onBatchTranscribe === next.onBatchTranscribe && prev.onBatchDecrypt === next.onBatchDecrypt && prev.onToggleJumpPopover === next.onToggleJumpPopover && prev.onToggleInSessionSearch === next.onToggleInSessionSearch && prev.onRefreshMessages === next.onRefreshMessages && prev.onToggleDetailPanel === next.onToggleDetailPanel ) } export default React.memo(ChatHeader, areEqual)