diff --git a/src/App.vue b/src/App.vue index e0c4ba6..0a3b1ef 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,130 +1,9 @@ - - diff --git a/src/components/CloseModal.vue b/src/components/CloseModal.vue new file mode 100644 index 0000000..6c4defe --- /dev/null +++ b/src/components/CloseModal.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components/CommentSection.vue b/src/components/CommentSection.vue index f477046..c32394d 100644 --- a/src/components/CommentSection.vue +++ b/src/components/CommentSection.vue @@ -1,32 +1,34 @@ @@ -47,6 +49,7 @@ import IconHeart from '~icons/lucide/heart' const props = defineProps<{ type: number id: number + darkMode?: boolean }>() const comments = ref([]) @@ -104,22 +107,29 @@ function loadMore() { fetchComments() } +const likingSet = ref(new Set()) + async function likeComment(cid: number) { + if (likingSet.value.has(cid)) return + const target = comments.value.find(c => c.commentId === cid) + if (!target) return + const liked = !!target.liked + likingSet.value.add(cid) try { await invoke('comment_like', { query: { - t: 1, + t: liked ? 0 : 1, type: props.type, id: props.id, cid } }) - const target = comments.value.find(c => c.commentId === cid) - if (target) { - target.likedCount++ - } + target.liked = !liked + target.likedCount += liked ? -1 : 1 } catch (e) { console.error(e) + } finally { + likingSet.value.delete(cid) } } diff --git a/src/components/RoamDrawer.vue b/src/components/RoamDrawer.vue new file mode 100644 index 0000000..08920e2 --- /dev/null +++ b/src/components/RoamDrawer.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue new file mode 100644 index 0000000..233dfb1 --- /dev/null +++ b/src/components/Sidebar.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/components/TitleBar.vue b/src/components/TitleBar.vue new file mode 100644 index 0000000..bf25087 --- /dev/null +++ b/src/components/TitleBar.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/stores/player.ts b/src/stores/player.ts index bfc20be..6b57363 100644 --- a/src/stores/player.ts +++ b/src/stores/player.ts @@ -20,14 +20,6 @@ function loadRecentLocal(): Song[] { return []; } -function loadLikedIdsFromStorage(): Set { - try { - const raw = localStorage.getItem('liked_ids'); - if (raw) return new Set(JSON.parse(raw)); - } catch { /* 忽略 */ } - return new Set(); -} - export const usePlayerStore = defineStore('player', () => { const currentSong = ref(null); const playing = ref(false); @@ -53,7 +45,7 @@ export const usePlayerStore = defineStore('player', () => { const recentLocal = ref(loadRecentLocal()); const MAX_RECENT = 200; - const likedIds = ref>(loadLikedIdsFromStorage()); + const likedIds = ref>(new Set()); function emitPlaybackState() { const song = currentSong.value; @@ -82,7 +74,9 @@ export const usePlayerStore = defineStore('player', () => { const data = JSON.parse(json); const ids: number[] = data.ids || data.data?.ids || []; likedIds.value = new Set(ids); - } catch { /* 忽略 */ } + } catch (e) { + console.error('加载喜欢列表失败', e); + } } async function toggleLike(songId: number) { @@ -111,10 +105,6 @@ export const usePlayerStore = defineStore('player', () => { localStorage.setItem('recent_local', JSON.stringify(val)); }, { deep: true }); - watch(likedIds, (val) => { - localStorage.setItem('liked_ids', JSON.stringify([...val])); - }, { deep: true }); - const isFmMode = ref(false); const fmQueue: Song[] = []; let fmNextCallback: (() => void) | null = null; @@ -171,6 +161,7 @@ export const usePlayerStore = defineStore('player', () => { await invoke('fm_trash', { query: { id: songId, time: 25 } }); } catch (e) { console.error('fm_trash 失败', e); + showToast('减少推荐失败', 'error'); } await nextFm(); } @@ -254,6 +245,7 @@ export const usePlayerStore = defineStore('player', () => { } catch (e) { console.error('FM播放失败', e); playing.value = false; + showToast('FM 播放失败', 'error'); if (fmNextCallback) { fmNextCallback(); } else { @@ -373,6 +365,7 @@ export const usePlayerStore = defineStore('player', () => { } catch (e) { console.error('播放失败', e); playing.value = false; + showToast('播放失败,请稍后重试', 'error'); } } @@ -576,6 +569,7 @@ export const usePlayerStore = defineStore('player', () => { } } catch (e) { console.error(e); + showToast('FM 加载失败', 'error'); } return false; } @@ -600,6 +594,7 @@ async function loadFm() { } } catch (e) { console.error('FM加载失败', e); + showToast('FM 加载失败', 'error'); } }