mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
fix(web): post-review fixes for source tabs
- Reset per-platform fields on fetch failure (was leaving stale data for up to 5 minutes after the user logged out of NetEase). - Extract availableSources getter on the store; deduplicate the daily/ user availability computeds in Home.vue and Library.vue. - Add comment explaining why recommendAvailable always seeds netease. - Import Source type in SourceTabs.vue from the store instead of redeclaring locally, removing a future type-drift risk. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
ac55a346be
commit
ec02887d22
4 files changed
+27
-37
No files matched your search
@@ -14,7 +14,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
type Source = 'netease' | 'qq';
|
||||
import type { Source } from '../stores/player.js';
|
||||
|
||||
const LABELS: Record<Source, string> = {
|
||||
netease: '网易云',
|
||||
|
||||
+21
-18
@@ -94,6 +94,13 @@ export const usePlayerStore = defineStore('player', {
|
||||
if (this.isPaused) return Math.min(timing.serverElapsed, maxDuration);
|
||||
return Math.min(timing.serverElapsed + (Date.now() - timing.serverSyncTime) / 1000, maxDuration);
|
||||
},
|
||||
/** Sources that are currently logged in. Order: netease before qq. */
|
||||
availableSources(): Source[] {
|
||||
const s: Source[] = [];
|
||||
if (this.authStatus.netease) s.push('netease');
|
||||
if (this.authStatus.qq) s.push('qq');
|
||||
return s;
|
||||
},
|
||||
},
|
||||
|
||||
actions: {
|
||||
@@ -401,24 +408,20 @@ export const usePlayerStore = defineStore('player', {
|
||||
|
||||
const [neRecPL, neDaily, neUserPL, qqRecPL, qqDaily, qqUserPL, bili] = results;
|
||||
|
||||
if (neRecPL.status === 'fulfilled') {
|
||||
this.recommendPlaylists.netease = neRecPL.value.data.playlists ?? [];
|
||||
}
|
||||
if (neDaily.status === 'fulfilled') {
|
||||
this.dailySongs.netease = neDaily.value.data.songs ?? [];
|
||||
}
|
||||
if (neUserPL.status === 'fulfilled') {
|
||||
this.userPlaylists.netease = neUserPL.value.data.playlists ?? [];
|
||||
}
|
||||
if (qqRecPL.status === 'fulfilled') {
|
||||
this.recommendPlaylists.qq = qqRecPL.value.data.playlists ?? [];
|
||||
}
|
||||
if (qqDaily.status === 'fulfilled') {
|
||||
this.dailySongs.qq = qqDaily.value.data.songs ?? [];
|
||||
}
|
||||
if (qqUserPL.status === 'fulfilled') {
|
||||
this.userPlaylists.qq = qqUserPL.value.data.playlists ?? [];
|
||||
}
|
||||
this.recommendPlaylists.netease =
|
||||
neRecPL.status === 'fulfilled' ? (neRecPL.value.data.playlists ?? []) : [];
|
||||
this.dailySongs.netease =
|
||||
neDaily.status === 'fulfilled' ? (neDaily.value.data.songs ?? []) : [];
|
||||
this.userPlaylists.netease =
|
||||
neUserPL.status === 'fulfilled' ? (neUserPL.value.data.playlists ?? []) : [];
|
||||
this.recommendPlaylists.qq =
|
||||
qqRecPL.status === 'fulfilled' ? (qqRecPL.value.data.playlists ?? []) : [];
|
||||
this.dailySongs.qq =
|
||||
qqDaily.status === 'fulfilled' ? (qqDaily.value.data.songs ?? []) : [];
|
||||
this.userPlaylists.qq =
|
||||
qqUserPL.status === 'fulfilled' ? (qqUserPL.value.data.playlists ?? []) : [];
|
||||
// bilibili popular: keep previous value on failure (it's an anonymous endpoint
|
||||
// unrelated to user auth state, and stale popular results are harmless)
|
||||
if (bili.status === 'fulfilled') {
|
||||
this.bilibiliPopular = bili.value.data.songs ?? [];
|
||||
}
|
||||
|
||||
+4
-12
@@ -137,23 +137,15 @@ const USER_PLAYLIST_LIMIT = 20;
|
||||
const userPlaylistsExpanded = ref(false);
|
||||
|
||||
// Available sources per section.
|
||||
// Recommend playlists work anonymously on netease, so it's always available;
|
||||
// QQ requires login. This intentionally differs from dailyAvailable/userAvailable.
|
||||
const recommendAvailable = computed<Source[]>(() => {
|
||||
const s: Source[] = ['netease'];
|
||||
if (store.authStatus.qq) s.push('qq');
|
||||
return s;
|
||||
});
|
||||
const dailyAvailable = computed<Source[]>(() => {
|
||||
const s: Source[] = [];
|
||||
if (store.authStatus.netease) s.push('netease');
|
||||
if (store.authStatus.qq) s.push('qq');
|
||||
return s;
|
||||
});
|
||||
const userAvailable = computed<Source[]>(() => {
|
||||
const s: Source[] = [];
|
||||
if (store.authStatus.netease) s.push('netease');
|
||||
if (store.authStatus.qq) s.push('qq');
|
||||
return s;
|
||||
});
|
||||
const dailyAvailable = computed<Source[]>(() => store.availableSources);
|
||||
const userAvailable = computed<Source[]>(() => store.availableSources);
|
||||
|
||||
// Persisted active source per section.
|
||||
const recommendSource = ref<Source>(loadTabSource('home.recommend'));
|
||||
|
||||
@@ -63,12 +63,7 @@ const store = usePlayerStore();
|
||||
const history = ref<Song[]>([]);
|
||||
const historyLoading = ref(true);
|
||||
|
||||
const userAvailable = computed<Source[]>(() => {
|
||||
const s: Source[] = [];
|
||||
if (store.authStatus.netease) s.push('netease');
|
||||
if (store.authStatus.qq) s.push('qq');
|
||||
return s;
|
||||
});
|
||||
const userAvailable = computed<Source[]>(() => store.availableSources);
|
||||
|
||||
const userSource = ref<Source>(loadTabSource('library.user'));
|
||||
watch(userSource, (v) => saveTabSource('library.user', v));
|
||||
|
||||
Reference in new issue
Block a user