Spaces:
Build error
Build error
'use client' | |
import { useState } from 'react' | |
import { t } from 'i18next' | |
import { useParams, usePathname } from 'next/navigation' | |
import s from './style.module.css' | |
import Tooltip from '@/app/components/base/tooltip' | |
import Loading from '@/app/components/base/loading' | |
import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager' | |
type AudioBtnProps = { | |
id?: string | |
voice?: string | |
value?: string | |
className?: string | |
isAudition?: boolean | |
noCache?: boolean | |
} | |
type AudioState = 'initial' | 'loading' | 'playing' | 'paused' | 'ended' | |
const AudioBtn = ({ | |
id, | |
voice, | |
value, | |
className, | |
isAudition, | |
}: AudioBtnProps) => { | |
const [audioState, setAudioState] = useState<AudioState>('initial') | |
const params = useParams() | |
const pathname = usePathname() | |
const audio_finished_call = (event: string): any => { | |
switch (event) { | |
case 'ended': | |
setAudioState('ended') | |
break | |
case 'paused': | |
setAudioState('ended') | |
break | |
case 'loaded': | |
setAudioState('loading') | |
break | |
case 'play': | |
setAudioState('playing') | |
break | |
case 'error': | |
setAudioState('ended') | |
break | |
} | |
} | |
let url = '' | |
let isPublic = false | |
if (params.token) { | |
url = '/text-to-audio' | |
isPublic = true | |
} | |
else if (params.appId) { | |
if (pathname.search('explore/installed') > -1) | |
url = `/installed-apps/${params.appId}/text-to-audio` | |
else | |
url = `/apps/${params.appId}/text-to-audio` | |
} | |
const handleToggle = async () => { | |
if (audioState === 'playing' || audioState === 'loading') { | |
setTimeout(() => setAudioState('paused'), 1) | |
AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio() | |
} | |
else { | |
setTimeout(() => setAudioState('loading'), 1) | |
AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).playAudio() | |
} | |
} | |
const tooltipContent = { | |
initial: t('appApi.play'), | |
ended: t('appApi.play'), | |
paused: t('appApi.pause'), | |
playing: t('appApi.playing'), | |
loading: t('appApi.loading'), | |
}[audioState] | |
return ( | |
<div className={`inline-flex items-center justify-center ${(audioState === 'loading' || audioState === 'playing') ? 'mr-1' : className}`}> | |
<Tooltip | |
popupContent={tooltipContent} | |
> | |
<button | |
disabled={audioState === 'loading'} | |
className={`box-border w-6 h-6 flex items-center justify-center cursor-pointer ${isAudition ? 'p-0.5' : 'p-0 rounded-md bg-white'}`} | |
onClick={handleToggle} | |
> | |
{audioState === 'loading' | |
? ( | |
<div className='w-full h-full rounded-md flex items-center justify-center'> | |
<Loading /> | |
</div> | |
) | |
: ( | |
<div className={`w-full h-full rounded-md flex items-center justify-center ${!isAudition ? 'hover:bg-gray-50' : 'hover:bg-gray-50'}`}> | |
<div className={`w-4 h-4 ${(audioState === 'playing') ? s.pauseIcon : s.playIcon}`}></div> | |
</div> | |
)} | |
</button> | |
</Tooltip> | |
</div> | |
) | |
} | |
export default AudioBtn | |