Files
AlgerMusicPlayer/src/renderer/App.vue

144 lines
3.6 KiB
Vue

<template>
<div class="app-container" :class="{ mobile: isMobile, noElectron: !isElectron }">
<n-config-provider :theme="theme === 'dark' ? darkTheme : lightTheme">
<n-dialog-provider>
<n-message-provider>
<router-view></router-view>
</n-message-provider>
</n-dialog-provider>
</n-config-provider>
</div>
</template>
<script setup lang="ts">
import { cloneDeep } from 'lodash';
import { darkTheme, lightTheme } from 'naive-ui';
import { computed, nextTick, onMounted, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import homeRouter from '@/router/home';
import { useMenuStore } from '@/store/modules/menu';
import { usePlayerStore } from '@/store/modules/player';
import { useSettingsStore } from '@/store/modules/settings';
import { isElectron, isLyricWindow } from '@/utils';
import { initAudioListeners } from './hooks/MusicHook';
import { isMobile } from './utils';
import { useAppShortcuts } from './utils/appShortcuts';
import { audioService } from './services/audioService';
const { locale } = useI18n();
const settingsStore = useSettingsStore();
const menuStore = useMenuStore();
const playerStore = usePlayerStore();
const router = useRouter();
// 监听语言变化
watch(
() => settingsStore.setData.language,
(newLanguage) => {
if (newLanguage && newLanguage !== locale.value) {
locale.value = newLanguage;
}
},
{ immediate: true }
);
const theme = computed(() => {
return settingsStore.theme;
});
// 监听字体变化并应用
watch(
() => [settingsStore.setData.fontFamily, settingsStore.setData.fontScope],
([newFont, fontScope]) => {
const appElement = document.body;
if (newFont && fontScope === 'global') {
appElement.style.fontFamily = newFont;
} else {
appElement.style.fontFamily = '';
}
}
);
const handleSetLanguage = (value: string) => {
console.log('应用语言变更:', value);
if (value) {
locale.value = value;
}
};
if (!isLyricWindow.value) {
settingsStore.initializeSettings();
settingsStore.initializeTheme();
settingsStore.initializeSystemFonts();
if (isMobile.value) {
menuStore.setMenus(homeRouter.filter((item) => item.meta.isMobile));
}
}
handleSetLanguage(settingsStore.setData.language);
// 监听迷你模式状态
if (isElectron) {
window.api.onLanguageChanged(handleSetLanguage);
window.electron.ipcRenderer.on('mini-mode', (_, value) => {
settingsStore.setMiniMode(value);
if (value) {
// 存储当前路由
localStorage.setItem('currentRoute', router.currentRoute.value.path);
router.push('/mini');
} else {
// 恢复当前路由
const currentRoute = localStorage.getItem('currentRoute');
if (currentRoute) {
router.push(currentRoute);
localStorage.removeItem('currentRoute');
} else {
router.push('/');
}
}
});
}
// 使用应用内快捷键
useAppShortcuts();
onMounted(async () => {
if (isLyricWindow.value) {
return;
}
// 先初始化播放状态
await playerStore.initializePlayState();
// 如果有正在播放的音乐,则初始化音频监听器
if (playerStore.playMusic && playerStore.playMusic.id) {
// 使用 nextTick 确保 DOM 更新后再初始化
await nextTick();
initAudioListeners();
if (isElectron) {
window.api.sendSong(cloneDeep(playerStore.playMusic));
}
}
audioService.releaseOperationLock();
});
</script>
<style lang="scss" scoped>
.app-container {
@apply h-full w-full;
user-select: none;
}
.mobile {
.text-base {
font-size: 14px !important;
}
}
.html:has(.mobile) {
font-size: 14px;
}
</style>