From 41b8e1cce66880102b0cfbf42926bebb4bed8923 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Tue, 26 May 2026 20:42:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=9F=B3=E4=B9=90=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/music/MusicClient.tsx | 111 ++------------------------------ src/app/music/rankings/page.tsx | 33 ++++++---- src/app/music/search/page.tsx | 84 ++++++++++++++++++++++-- 3 files changed, 102 insertions(+), 126 deletions(-) diff --git a/src/app/music/MusicClient.tsx b/src/app/music/MusicClient.tsx index 00243b1..189a9b3 100644 --- a/src/app/music/MusicClient.tsx +++ b/src/app/music/MusicClient.tsx @@ -1884,20 +1884,14 @@ export default function MusicClient({ children: _children }: { children?: React. } if (pathname === '/music/search') { - const source = normalizeSource(searchParams.get('source') || currentSource); const keyword = searchParams.get('q') || ''; - setCurrentSource(source); setCurrentView('search'); setCurrentPlaylistTitle(keyword ? `搜索: ${keyword}` : '搜索'); setSearchKeyword(keyword); - if (keyword) { - void searchSongs(keyword, false); - } else { - setSongs([]); - setActiveSearchKeyword(''); - setSearchPage(1); - setSearchHasMore(false); - } + setSongs([]); + setActiveSearchKeyword(''); + setSearchPage(1); + setSearchHasMore(false); return; } @@ -2627,48 +2621,6 @@ export default function MusicClient({ children: _children }: { children?: React. 音乐 -
- -
-
- {musicSources.map((source) => ( - - ))} -
@@ -3530,61 +3482,6 @@ export default function MusicClient({ children: _children }: { children?: React. )} - {showSourceMenu && ( -
- - ); - })} -
- - - )} - {/* Add to Playlist Modal */} -
- {musicSources.map((source) => ( - - ))} -
-
-

排行榜

+
+

排行榜

+
+ {musicSources.map((source) => { + const active = currentSource === source.key; + return ( + + ); + })} +
{loading ? : playlists.length > 0 ? (
diff --git a/src/app/music/search/page.tsx b/src/app/music/search/page.tsx index f041d47..b47737f 100644 --- a/src/app/music/search/page.tsx +++ b/src/app/music/search/page.tsx @@ -5,7 +5,7 @@ import { useRouter, useSearchParams } from 'next/navigation'; import { playMusicList } from '@/lib/music/actions'; import { MusicLoadingIndicator, type Song } from '../MusicClient'; import SongList from '../SongList'; -import { mapSong, normalizeSource } from '@/lib/music/shared'; +import { mapSong, musicSources, normalizeSource } from '@/lib/music/shared'; export default function MusicSearchPage() { const router = useRouter(); @@ -13,21 +13,28 @@ export default function MusicSearchPage() { const source = normalizeSource(searchParams.get('source')); const q = searchParams.get('q') || ''; const [keyword, setKeyword] = useState(q); + const [selectedSource, setSelectedSource] = useState(source); const [songs, setSongs] = useState([]); const [loading, setLoading] = useState(false); + const [showSourceMenu, setShowSourceMenu] = useState(false); useEffect(() => { + setSelectedSource(source); setKeyword(q); if (!q) { setSongs([]); return; } + const controller = new AbortController(); setLoading(true); - fetch(`/api/music/v2/search?source=${source}&q=${encodeURIComponent(q)}&page=1&limit=20`) + fetch(`/api/music/v2/search?source=${source}&q=${encodeURIComponent(q)}&page=1&limit=20`, { signal: controller.signal }) .then((res) => res.json()) .then((data) => setSongs((data.data?.list || []).map(mapSong))) - .catch(() => setSongs([])) + .catch((error) => { + if (error?.name !== 'AbortError') setSongs([]); + }) .finally(() => setLoading(false)); + return () => controller.abort(); }, [source, q]); const submit = () => { @@ -35,16 +42,81 @@ export default function MusicSearchPage() { if (next) router.push(`/music/search?source=${source}&q=${encodeURIComponent(next)}`); }; + const changeSource = (nextSource: string) => { + const normalizedSource = normalizeSource(nextSource); + const next = keyword.trim() || q; + setSelectedSource(normalizedSource); + setShowSourceMenu(false); + router.push(`/music/search?source=${normalizedSource}${next ? `&q=${encodeURIComponent(next)}` : ''}`); + }; + + const currentSourceLabel = musicSources.find((item) => item.key === selectedSource)?.label || '音源'; + return (
-
+
- setKeyword(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && submit()} className="h-full w-full border-0 bg-transparent pl-10 pr-4 text-sm text-white outline-none placeholder:text-zinc-500" placeholder="搜索歌曲或艺术家..." /> + setKeyword(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && submit()} className="h-full w-full border-0 bg-transparent pl-10 pr-28 text-sm text-white outline-none placeholder:text-zinc-500" placeholder="搜索歌曲或艺术家..." /> +
+
+ + {showSourceMenu && ( + <> + + ); + })} +
+ + )} +
+
- +