| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | 'use client'import { useRef, 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 { randomString } from '@/utils'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 selector = useRef(`play-tooltip-${randomString(4)}`)  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') {      setAudioState('paused')      AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio()    }    else {      setAudioState('loading')      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={`${(audioState === 'loading' || audioState === 'playing') ? 'mr-1' : className}`}>      <Tooltip        selector={selector.current}        content={tooltipContent}        className='z-10'      >        <button          disabled={audioState === 'loading'}          className={`box-border p-0.5 flex items-center justify-center cursor-pointer ${isAudition || '!p-0 rounded-md bg-white'}`}          onClick={handleToggle}        >          {audioState === 'loading'            ? (              <div className='w-6 h-6 rounded-md flex items-center justify-center p-2'>                <Loading />              </div>            )            : (              <div className={`w-6 h-6 rounded-md ${!isAudition ? 'w-4 h-4 hover:bg-gray-50' : 'hover:bg-gray-50'} ${(audioState === 'playing') ? s.pauseIcon : s.playIcon}`}></div>            )}        </button>      </Tooltip>    </div>  )}export default AudioBtn
 |