index.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. 'use client'
  2. import { useState } from 'react'
  3. import { useParams, usePathname } from 'next/navigation'
  4. import {
  5. RiVolumeUpLine,
  6. } from '@remixicon/react'
  7. import { t } from 'i18next'
  8. import Tooltip from '@/app/components/base/tooltip'
  9. import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
  10. import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
  11. type AudioBtnProps = {
  12. id?: string
  13. voice?: string
  14. value?: string
  15. }
  16. type AudioState = 'initial' | 'loading' | 'playing' | 'paused' | 'ended'
  17. const AudioBtn = ({
  18. id,
  19. voice,
  20. value,
  21. }: AudioBtnProps) => {
  22. const [audioState, setAudioState] = useState<AudioState>('initial')
  23. const params = useParams()
  24. const pathname = usePathname()
  25. const audio_finished_call = (event: string): any => {
  26. switch (event) {
  27. case 'ended':
  28. setAudioState('ended')
  29. break
  30. case 'paused':
  31. setAudioState('ended')
  32. break
  33. case 'loaded':
  34. setAudioState('loading')
  35. break
  36. case 'play':
  37. setAudioState('playing')
  38. break
  39. case 'error':
  40. setAudioState('ended')
  41. break
  42. }
  43. }
  44. let url = ''
  45. let isPublic = false
  46. if (params.token) {
  47. url = '/text-to-audio'
  48. isPublic = true
  49. }
  50. else if (params.appId) {
  51. if (pathname.search('explore/installed') > -1)
  52. url = `/installed-apps/${params.appId}/text-to-audio`
  53. else
  54. url = `/apps/${params.appId}/text-to-audio`
  55. }
  56. const handleToggle = async () => {
  57. if (audioState === 'playing' || audioState === 'loading') {
  58. setTimeout(() => setAudioState('paused'), 1)
  59. AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio()
  60. }
  61. else {
  62. setTimeout(() => setAudioState('loading'), 1)
  63. AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).playAudio()
  64. }
  65. }
  66. const tooltipContent = {
  67. initial: t('appApi.play'),
  68. ended: t('appApi.play'),
  69. paused: t('appApi.pause'),
  70. playing: t('appApi.playing'),
  71. loading: t('appApi.loading'),
  72. }[audioState]
  73. return (
  74. <Tooltip
  75. popupContent={tooltipContent}
  76. >
  77. <ActionButton
  78. state={
  79. audioState === 'loading' || audioState === 'playing'
  80. ? ActionButtonState.Active
  81. : ActionButtonState.Default
  82. }
  83. onClick={handleToggle}
  84. disabled={audioState === 'loading'}
  85. >
  86. <RiVolumeUpLine className='w-4 h-4' />
  87. </ActionButton>
  88. </Tooltip>
  89. )
  90. }
  91. export default AudioBtn