import { AudioPlayerControls, Box, IconButton } from '@rocket.chat/fuselage'; import { UserAvatar } from '@rocket.chat/ui-avatar'; import { useUserDisplayName } from '@rocket.chat/ui-client'; import { useTranslation } from 'react-i18next'; import SidebarCard from './SidebarCard'; import { useFormatMemorySize } from '../../hooks/useFormatMemorySize'; import { setMessageJumpQueryStringParameter } from '../../lib/utils/setMessageJumpQueryStringParameter'; import { useMediaPlayer } from '../../providers/MediaPlayerProvider'; import { useGoToRoom } from '../../views/room/hooks/useGoToRoom'; /** * Persistent audio card pinned to the bottom of the sidebar (design 1c). * It drives the shared audio element, so it stays available while a track is * loaded — including after switching or closing the room, or closing the thread * the audio was played from. */ const NowPlayingSection = () => { const { t } = useTranslation(); const { track, playing, currentTime, duration, playbackRate, toggle, seek, cyclePlaybackRate, close } = useMediaPlayer(); const goToRoom = useGoToRoom(); const formatMemorySize = useFormatMemorySize(); const displayName = useUserDisplayName({ name: track?.name, username: track?.username }); if (!track) { return null; } const openConversation = async () => { if (!track.rid) { return; } await goToRoom(track.rid); if (track.mid) { void setMessageJumpQueryStringParameter(track.mid); } }; return ( void openConversation()} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); void openConversation(); } }} title={t('Jump_to_message')} style={{ gap: 8, cursor: track.rid ? 'pointer' : 'default' }} > {track.username && } {displayName || t('Audio')} {track.size ? `${track.title} (${formatMemorySize(track.size)})` : track.title} ); }; export default NowPlayingSection;