import React, { FC, useCallback } from '../../lib/teact/teact'; import { withGlobal } from '../../lib/teact/teactn'; import { GlobalActions } from '../../global/types'; import { ApiAudio, ApiChat, ApiMessage, ApiUser, } from '../../api/types'; import { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment'; import * as mediaLoader from '../../util/mediaLoader'; import { getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle, } from '../../modules/helpers'; import { selectSender } from '../../modules/selectors'; import { pick } from '../../util/iteratees'; import renderText from '../common/helpers/renderText'; import useAudioPlayer from '../../hooks/useAudioPlayer'; import buildClassName from '../../util/buildClassName'; import useLang from '../../hooks/useLang'; import RippleEffect from '../ui/RippleEffect'; import Button from '../ui/Button'; import './AudioPlayer.scss'; type OwnProps = { message: ApiMessage; className?: string; noUi?: boolean; }; type StateProps = { sender?: ApiChat | ApiUser; }; type DispatchProps = Pick; const AudioPlayer: FC = ({ message, className, noUi, sender, focusMessage, closeAudioPlayer, }) => { const lang = useLang(); const senderName = sender ? getSenderTitle(lang, sender) : undefined; const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined); const { playPause, isPlaying } = useAudioPlayer( getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true, ); const handleClick = useCallback(() => { focusMessage({ chatId: message.chatId, messageId: message.id }); }, [focusMessage, message.chatId, message.id]); const handleClose = useCallback(() => { if (isPlaying) { playPause(); } closeAudioPlayer(); }, [closeAudioPlayer, isPlaying, playPause]); if (noUi) { return undefined; } const audio = getMessageAudio(message); return (
{audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}
); }; function renderAudio(audio: ApiAudio) { const { title, performer, fileName } = audio; return ( <>
{renderText(title || fileName)}
{performer && (
{renderText(performer)}
)} ); } function renderVoice(subtitle: string, senderName?: string) { return ( <>
{senderName && renderText(senderName)}
{subtitle}
); } export default withGlobal( (global, { message }): StateProps => { const sender = selectSender(global, message); return { sender }; }, (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']), )(AudioPlayer);