From f9eaf888077c4d5bd044cbd9bfe392fe832dd525 Mon Sep 17 00:00:00 2001 From: bdim404 Date: Thu, 5 Feb 2026 23:30:07 +0800 Subject: [PATCH] refactor: Simplify AudioPlayer component by removing mobile detection logic and streamline download handling; enhance Home layout for better responsiveness --- .../src/components/AudioPlayer.tsx | 35 ++------ qwen3-tts-frontend/src/pages/Home.tsx | 80 +++++++++---------- 2 files changed, 45 insertions(+), 70 deletions(-) diff --git a/qwen3-tts-frontend/src/components/AudioPlayer.tsx b/qwen3-tts-frontend/src/components/AudioPlayer.tsx index 1356548..1dced73 100644 --- a/qwen3-tts-frontend/src/components/AudioPlayer.tsx +++ b/qwen3-tts-frontend/src/components/AudioPlayer.tsx @@ -12,35 +12,16 @@ interface AudioPlayerProps { jobId: number } -const isMobileDevice = () => { - return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) -} - const AudioPlayer = memo(({ audioUrl, jobId }: AudioPlayerProps) => { const { t } = useTranslation('common') const [blobUrl, setBlobUrl] = useState('') const [isLoading, setIsLoading] = useState(false) const [loadError, setLoadError] = useState(null) - const [useMobileMode, setUseMobileMode] = useState(false) const previousAudioUrlRef = useRef('') - useEffect(() => { - setUseMobileMode(isMobileDevice()) - }, []) - useEffect(() => { if (!audioUrl || audioUrl === previousAudioUrlRef.current) return - if (useMobileMode) { - const token = localStorage.getItem('token') - const separator = audioUrl.includes('?') ? '&' : '?' - const urlWithToken = token ? `${audioUrl}${separator}token=${token}` : audioUrl - setBlobUrl(urlWithToken) - previousAudioUrlRef.current = audioUrl - setIsLoading(false) - return - } - let active = true const prevBlobUrl = blobUrl @@ -76,7 +57,7 @@ const AudioPlayer = memo(({ audioUrl, jobId }: AudioPlayerProps) => { return () => { active = false } - }, [audioUrl, useMobileMode]) + }, [audioUrl, blobUrl, t]) useEffect(() => { return () => { @@ -85,15 +66,11 @@ const AudioPlayer = memo(({ audioUrl, jobId }: AudioPlayerProps) => { }, []) const handleDownload = useCallback(() => { - if (useMobileMode) { - window.open(blobUrl || audioUrl, '_blank') - } else { - const link = document.createElement('a') - link.href = blobUrl || audioUrl - link.download = `tts-${jobId}-${Date.now()}.wav` - link.click() - } - }, [blobUrl, audioUrl, jobId, useMobileMode]) + const link = document.createElement('a') + link.href = blobUrl || audioUrl + link.download = `tts-${jobId}-${Date.now()}.wav` + link.click() + }, [blobUrl, audioUrl, jobId]) if (isLoading) { return ( diff --git a/qwen3-tts-frontend/src/pages/Home.tsx b/qwen3-tts-frontend/src/pages/Home.tsx index 1f49c61..5819435 100644 --- a/qwen3-tts-frontend/src/pages/Home.tsx +++ b/qwen3-tts-frontend/src/pages/Home.tsx @@ -1,7 +1,7 @@ import { useState, useRef, lazy, Suspense, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { Navbar } from '@/components/Navbar' -import { Card, CardContent, CardHeader } from '@/components/ui/card' +import { Card, CardContent } from '@/components/ui/card' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { User, Palette, Copy } from 'lucide-react' import type { CustomVoiceFormHandle } from '@/components/tts/CustomVoiceForm' @@ -47,49 +47,47 @@ function Home() { onOpenChange={setSidebarOpen} /> -
- - - - - - - {t('customVoiceTab')} - - - - {t('voiceDesignTab')} - - - - {t('voiceCloneTab')} - - - - +
+
+ + + + + {t('customVoiceTab')} + + + + {t('voiceDesignTab')} + + + + {t('voiceCloneTab')} + + - - - - }> - - - + + + + }> + + + - - }> - - - + + }> + + + - - }> - - - - - - + + }> + + + + + + +