lx-music-desktop/src/renderer/views/Leaderboard/index.vue
2023-08-27 15:09:07 +08:00

190 lines
3.9 KiB
Vue

<template>
<div :class="$style.leaderboard">
<div :class="$style.lists">
<div :class="$style.listsSelect">
<base-selection :model-value="source" :class="$style.select" :list="sourceList" item-key="id" item-name="name" @update:model-value="handleToggleSource" />
</div>
<BoardList ref="boardListRef" :board-id="boardId" :source="source" @show-menu="$refs.musicListRef?.hideMenu()" />
</div>
<div :class="$style.list">
<MusicList ref="musicListRef" :source="source" :board-id="boardId" @show-menu="$refs.boardListRef?.hideMenu()" />
</div>
</div>
</template>
<script>
import { computed, ref } from '@common/utils/vueTools'
import { getLeaderboardSetting, setLeaderboardSetting } from '@renderer/utils/data'
import BoardList from './BoardList/index.vue'
import MusicList from './MusicList/index.vue'
import { sources } from '@renderer/store/leaderboard/state'
import { sourceNames } from '@renderer/store'
import { useRoute, useRouter } from '@common/utils/vueRouter'
const source = ref('')
const boardId = ref(null)
const verifyQueryParams = async function(to, from, next) {
let _source = to.query.source
let _boardId = to.query.boardId
if (_source == null) {
const setting = await getLeaderboardSetting()
if (_source == null) {
_source = setting.source
_boardId = setting.boardId
}
next({
path: to.path,
query: { ...to.query, source: _source, boardId: _boardId },
})
return
}
next()
source.value = _source
boardId.value = _boardId
void setLeaderboardSetting({ source: _source, boardId: _boardId })
}
export default {
components: {
BoardList,
MusicList,
},
beforeRouteEnter: verifyQueryParams,
beforeRouteUpdate: verifyQueryParams,
setup() {
const musicListRef = ref(null)
const boardListRef = ref(null)
const sourceList = computed(() => {
return sources.map(s => ({ id: s, name: sourceNames.value[s] }))
})
const router = useRouter()
const route = useRoute()
const handleToggleSource = (id) => {
void router.replace({
path: route.path,
query: {
source: id,
},
})
}
return {
source,
boardId,
sourceList,
handleToggleSource,
musicListRef,
boardListRef,
}
},
}
</script>
<style lang="less" module>
@import '@renderer/assets/styles/layout.less';
.leaderboard {
height: 100%;
display: flex;
position: relative;
}
.header {
flex: none;
width: 100%;
display: flex;
flex-flow: row nowrap;
}
.tab {
flex: auto;
}
.select {
flex: none;
width: 80px;
}
.content {
flex: auto;
display: flex;
overflow: hidden;
flex-flow: column nowrap;
}
.lists {
flex: none;
width: 14.8%;
display: flex;
flex-flow: column nowrap;
}
.listsHeader {
position: relative;
}
.listsSelect {
font-size: 12px;
&:hover {
:global(.icon) {
opacity: 1;
}
}
>:global(.content) {
display: block;
width: 100%;
}
:global(.label-content) {
background-color: transparent !important;
line-height: 38px;
height: 38px;
border-radius: 0;
&:hover {
background: none !important;
}
}
:global(.label) {
color: var(--color-font) !important;
}
:global(.icon) {
opacity: .6;
transition: opacity .3s ease;
}
:global(.selection-list) {
max-height: 500px;
box-shadow: 0 1px 8px 0 rgba(0,0,0,.2);
li {
// background-color: var(--color-main-background);
line-height: 38px;
font-size: 13px;
&:hover {
background-color: var(--color-button-background-hover);
}
&:active {
background-color: var(--color-button-background-active);
}
}
}
// line-height: 38px;
// padding: 0 10px;
border-bottom: var(--color-list-header-border-bottom);
flex: none;
}
.list {
position: relative;
overflow: hidden;
height: 100%;
flex: auto;
display: flex;
flex-flow: column nowrap;
// .noItem {
// }
}
</style>