Files
AlgerMusicPlayer/src/renderer/store/index.ts
T

185 lines
5.3 KiB
TypeScript
Raw Normal View History

import { createStore } from 'vuex';
import { useMusicListHook } from '@/hooks/MusicListHook';
import homeRouter from '@/router/home';
2024-09-13 14:11:02 +08:00
import type { SongResult } from '@/type/music';
import { applyTheme, getCurrentTheme, ThemeType } from '@/utils/theme';
import { isElectron } from '@/utils';
2025-01-04 16:58:08 +08:00
import { likeSong, getLikedList } from '@/api/music';
// 默认设置
const defaultSettings = {
isProxy: false,
noAnimate: false,
animationSpeed: 1,
author: 'Alger',
authorUrl: 'https://github.com/algerkong'
};
function getLocalStorageItem<T>(key: string, defaultValue: T): T {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : defaultValue;
}
interface State {
menus: any[];
play: boolean;
isPlay: boolean;
2024-09-13 14:11:02 +08:00
playMusic: SongResult;
playMusicUrl: string;
user: any;
2024-09-13 14:11:02 +08:00
playList: SongResult[];
playListIndex: number;
setData: any;
2024-05-20 19:54:00 +08:00
lyric: any;
2024-05-23 17:12:35 +08:00
isMobile: boolean;
2024-09-12 17:28:51 +08:00
searchValue: string;
searchType: number;
2024-12-09 21:55:08 +08:00
favoriteList: number[];
playMode: number;
theme: ThemeType;
musicFull: boolean;
2025-01-04 16:13:37 +08:00
showUpdateModal: boolean;
}
const state: State = {
2021-09-29 15:26:13 +08:00
menus: homeRouter,
2021-07-21 22:30:55 +08:00
play: false,
2021-07-20 22:46:18 +08:00
isPlay: false,
2024-09-13 14:11:02 +08:00
playMusic: {} as SongResult,
playMusicUrl: '',
user: getLocalStorageItem('user', null),
playList: [],
playListIndex: 0,
setData: defaultSettings,
2024-05-20 19:54:00 +08:00
lyric: {},
2024-05-23 17:12:35 +08:00
isMobile: false,
2024-09-12 17:28:51 +08:00
searchValue: '',
searchType: 1,
favoriteList: getLocalStorageItem('favoriteList', []),
playMode: getLocalStorageItem('playMode', 0),
theme: getCurrentTheme(),
2025-01-04 16:13:37 +08:00
musicFull: false,
showUpdateModal: false
};
2023-12-28 10:45:11 +08:00
const { handlePlayMusic, nextPlay, prevPlay } = useMusicListHook();
const mutations = {
setMenus(state: State, menus: any[]) {
state.menus = menus;
2021-07-20 22:46:18 +08:00
},
2024-09-13 14:11:02 +08:00
async setPlay(state: State, playMusic: SongResult) {
await handlePlayMusic(state, playMusic);
2021-07-20 22:46:18 +08:00
},
setIsPlay(state: State, isPlay: boolean) {
state.isPlay = isPlay;
2021-07-20 22:46:18 +08:00
},
setPlayMusic(state: State, play: boolean) {
state.play = play;
2021-07-21 22:30:55 +08:00
},
setMusicFull(state: State, musicFull: boolean) {
state.musicFull = musicFull;
},
2024-09-13 14:11:02 +08:00
setPlayList(state: State, playList: SongResult[]) {
state.playListIndex = playList.findIndex((item) => item.id === state.playMusic.id);
state.playList = playList;
},
async nextPlay(state: State) {
await nextPlay(state);
},
async prevPlay(state: State) {
await prevPlay(state);
},
setSetData(state: State, setData: any) {
state.setData = setData;
if (isElectron) {
// (window as any).electron.ipcRenderer.setStoreValue(
// 'set',
// JSON.parse(JSON.stringify(setData))
// );
window.electron.ipcRenderer.send('set-store-value', 'set', JSON.parse(JSON.stringify(setData)));
} else {
localStorage.setItem('appSettings', JSON.stringify(setData));
}
},
2025-01-04 16:58:08 +08:00
async addToFavorite(state: State, songId: number) {
try {
2025-01-05 15:01:55 +08:00
state.user && localStorage.getItem('token') && await likeSong(songId, true);
2025-01-04 16:58:08 +08:00
if (!state.favoriteList.includes(songId)) {
state.favoriteList = [songId, ...state.favoriteList];
localStorage.setItem('favoriteList', JSON.stringify(state.favoriteList));
}
} catch (error) {
console.error('收藏歌曲失败:', error);
2024-12-09 21:55:08 +08:00
}
},
2025-01-04 16:58:08 +08:00
async removeFromFavorite(state: State, songId: number) {
try {
2025-01-05 15:01:55 +08:00
state.user && localStorage.getItem('token') && await likeSong(songId, false);
2025-01-04 16:58:08 +08:00
state.favoriteList = state.favoriteList.filter((id) => id !== songId);
localStorage.setItem('favoriteList', JSON.stringify(state.favoriteList));
} catch (error) {
console.error('取消收藏歌曲失败:', error);
}
2024-12-09 21:55:08 +08:00
},
togglePlayMode(state: State) {
state.playMode = (state.playMode + 1) % 3;
localStorage.setItem('playMode', JSON.stringify(state.playMode));
},
toggleTheme(state: State) {
state.theme = state.theme === 'dark' ? 'light' : 'dark';
applyTheme(state.theme);
2025-01-04 16:13:37 +08:00
},
SET_SHOW_UPDATE_MODAL(state, value) {
state.showUpdateModal = value
}
};
const actions = {
initializeSettings({ commit }: { commit: any }) {
if (isElectron) {
// const setData = (window as any).electron.ipcRenderer.getStoreValue('set');
const setData = window.electron.ipcRenderer.sendSync('get-store-value', 'set');
commit('setSetData', setData || defaultSettings);
} else {
const savedSettings = localStorage.getItem('appSettings');
if (savedSettings) {
commit('setSetData', {
...defaultSettings,
...JSON.parse(savedSettings)
});
} else {
commit('setSetData', defaultSettings);
}
}
2023-12-28 10:45:11 +08:00
},
initializeTheme({ state }: { state: State }) {
applyTheme(state.theme);
2025-01-04 16:58:08 +08:00
},
async initializeFavoriteList({ state }: { state: State }) {
try {
const res = await getLikedList();
if (res.data?.ids) {
state.favoriteList = res.data.ids.reverse();
localStorage.setItem('favoriteList', JSON.stringify(state.favoriteList));
}
} catch (error) {
console.error('获取收藏列表失败:', error);
// 如果获取失败,使用本地存储的数据
const localFavoriteList = localStorage.getItem('favoriteList');
if (localFavoriteList) {
state.favoriteList = JSON.parse(localFavoriteList);
}
}
}
};
const store = createStore({
state,
mutations,
actions
});
export default store;