150 lines
3.6 KiB
Vue
150 lines
3.6 KiB
Vue
<template>
|
|
<div id="global_header">
|
|
<el-menu
|
|
v-if="!hide"
|
|
:default-active="activeRoute()"
|
|
class="el-menu-vertical account-menu"
|
|
:collapse="true"
|
|
:router="true"
|
|
:background-color="themeColor"
|
|
text-color="#909399"
|
|
active-text-color="#ffffff"
|
|
role="menubar"
|
|
>
|
|
<el-menu-item
|
|
:index="`/${account._id}/`"
|
|
:route="{ path: `/${account._id}/home` }"
|
|
v-for="(account, index) in accounts"
|
|
v-bind:key="account._id"
|
|
role="menuitem"
|
|
>
|
|
<font-awesome-icon icon="circle-user" v-if="account.avatar === undefined || account.avatar === null || account.avatar === ''" />
|
|
<FailoverImg v-else :src="account.avatar" class="avatar" :title="account.username + '@' + account.domain" />
|
|
<FailoverImg :src="`${account.baseURL}/favicon.ico`" :failoverSrc="`${account.baseURL}/favicon.png`" class="instance-icon" />
|
|
<span slot="title">{{ account.domain }}</span>
|
|
</el-menu-item>
|
|
<el-menu-item index="/login" :title="$t('global_header.add_new_account')" role="menuitem" class="add-new-account">
|
|
<font-awesome-icon icon="plus" />
|
|
<span slot="new">New</span>
|
|
</el-menu-item>
|
|
</el-menu>
|
|
<div :class="hide ? 'space no-global-header' : 'space with-global-header'">
|
|
<router-view :key="$route.params.id"></router-view>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapState } from 'vuex'
|
|
import FailoverImg from '~/src/renderer/components/atoms/FailoverImg'
|
|
import { StreamingError } from '~/src/errors/streamingError'
|
|
|
|
export default {
|
|
components: {
|
|
FailoverImg
|
|
},
|
|
name: 'global-header',
|
|
computed: {
|
|
...mapState('GlobalHeader', {
|
|
accounts: state => state.accounts,
|
|
hide: state => state.hide
|
|
}),
|
|
...mapState({
|
|
themeColor: state => state.App.theme.global_header_color
|
|
})
|
|
},
|
|
created() {
|
|
this.initialize()
|
|
},
|
|
methods: {
|
|
activeRoute() {
|
|
return `/${this.$route.path.split('/')[1]}/`
|
|
},
|
|
async initialize() {
|
|
await this.$store
|
|
.dispatch('GlobalHeader/initLoad')
|
|
.then(accounts => {
|
|
this.$store.dispatch('GlobalHeader/startStreamings').catch(err => {
|
|
if (err instanceof StreamingError) {
|
|
this.$message({
|
|
message: this.$t('message.start_all_streamings_error', {
|
|
domain: err.domain
|
|
}),
|
|
type: 'error'
|
|
})
|
|
}
|
|
})
|
|
if (this.$route.params.id === undefined) {
|
|
this.$router.push({ path: `/${accounts[0]._id}/home` })
|
|
}
|
|
})
|
|
.catch(_ => {
|
|
return this.$router.push({ path: '/login' })
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.account-menu :deep(.el-menu-item) {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: flex-end;
|
|
padding: 0 !important;
|
|
}
|
|
|
|
#global_header {
|
|
.account-menu {
|
|
height: 100%;
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 65px;
|
|
padding-top: 24px;
|
|
border: 0;
|
|
|
|
.avatar {
|
|
width: 42px;
|
|
height: 42px;
|
|
border-radius: 50%;
|
|
mix-blend-mode: overlay;
|
|
}
|
|
|
|
.instance-icon {
|
|
width: 18px;
|
|
height: 18px;
|
|
mix-blend-mode: overlay;
|
|
vertical-align: bottom;
|
|
margin-left: -18px;
|
|
}
|
|
|
|
.is-active {
|
|
.avatar {
|
|
mix-blend-mode: normal;
|
|
}
|
|
|
|
.instance-icon {
|
|
mix-blend-mode: normal;
|
|
}
|
|
}
|
|
}
|
|
|
|
.space {
|
|
height: 100%;
|
|
}
|
|
|
|
.no-global-header {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.with-global-header {
|
|
margin-left: 65px;
|
|
}
|
|
|
|
.add-new-account {
|
|
align-items: center;
|
|
}
|
|
}
|
|
</style>
|