Merge pull request #3365 from h3poteto/iss-3301/global-header
refs #3301 Rewrite GlobalHeader with composition API
This commit is contained in:
commit
5fd66348a7
|
@ -2,7 +2,7 @@
|
|||
<div id="global_header">
|
||||
<el-menu
|
||||
v-if="!hide"
|
||||
:default-active="activeRoute()"
|
||||
:default-active="activeRoute"
|
||||
class="el-menu-vertical account-menu"
|
||||
:collapse="true"
|
||||
:router="true"
|
||||
|
@ -14,7 +14,7 @@
|
|||
<el-menu-item
|
||||
:index="`/${account._id}/`"
|
||||
:route="{ path: `/${account._id}/home` }"
|
||||
v-for="(account, index) in accounts"
|
||||
v-for="(account, _index) in accounts"
|
||||
v-bind:key="account._id"
|
||||
role="menuitem"
|
||||
>
|
||||
|
@ -34,56 +34,69 @@
|
|||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'vuex'
|
||||
import FailoverImg from '~/src/renderer/components/atoms/FailoverImg'
|
||||
<script lang="ts">
|
||||
import { defineComponent, computed, onMounted } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { useI18next } from 'vue3-i18next'
|
||||
import { useStore } from '@/store'
|
||||
import FailoverImg from '@/components/atoms/FailoverImg.vue'
|
||||
import { StreamingError } from '~/src/errors/streamingError'
|
||||
import { ACTION_TYPES } from '@/store/GlobalHeader'
|
||||
|
||||
export default {
|
||||
export default defineComponent({
|
||||
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
|
||||
setup() {
|
||||
const space = 'GlobalHeader'
|
||||
const store = useStore()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const i18n = useI18next()
|
||||
|
||||
const accounts = computed(() => store.state.GlobalHeader.accounts)
|
||||
const hide = computed(() => store.state.GlobalHeader.hide)
|
||||
const themeColor = computed(() => store.state.App.theme.global_header_color)
|
||||
const activeRoute = computed(() => `/${route.path.split('/')[1]}/`)
|
||||
|
||||
onMounted(() => {
|
||||
initialize()
|
||||
})
|
||||
},
|
||||
created() {
|
||||
this.initialize()
|
||||
},
|
||||
methods: {
|
||||
activeRoute() {
|
||||
return `/${this.$route.path.split('/')[1]}/`
|
||||
},
|
||||
async initialize() {
|
||||
await this.$store
|
||||
.dispatch('GlobalHeader/initLoad')
|
||||
|
||||
const initialize = async () => {
|
||||
await store
|
||||
.dispatch(`${space}/initLoad`)
|
||||
.then(accounts => {
|
||||
this.$store.dispatch('GlobalHeader/startStreamings').catch(err => {
|
||||
store.dispatch(`${space}/${ACTION_TYPES.START_STREAMINGS}`).catch(err => {
|
||||
if (err instanceof StreamingError) {
|
||||
this.$message({
|
||||
message: this.$t('message.start_all_streamings_error', {
|
||||
ElMessage({
|
||||
message: i18n.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` })
|
||||
if (route.params.id === undefined) {
|
||||
router.push({ path: `/${accounts[0]._id}/home` })
|
||||
}
|
||||
})
|
||||
.catch(_ => {
|
||||
return this.$router.push({ path: '/login' })
|
||||
return router.push({ path: '/login' })
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
accounts,
|
||||
hide,
|
||||
themeColor,
|
||||
activeRoute
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @param element a target dom element
|
||||
* @param point scroll target point of the element
|
||||
**/
|
||||
export default function scrollTop(element, point = 0) {
|
||||
export default function scrollTop(element: HTMLElement, point: number = 0) {
|
||||
const start = element.scrollTop
|
||||
const range = start - point
|
||||
// Progress of scroll: 0 ~ 100
|
||||
|
@ -32,26 +32,28 @@ export default function scrollTop(element, point = 0) {
|
|||
/**
|
||||
* easeOut
|
||||
**/
|
||||
const easeOut = function (p) {
|
||||
const easeOut = function (p: number) {
|
||||
return p * (2 - p)
|
||||
}
|
||||
|
||||
export class ScrollPosition {
|
||||
node = null
|
||||
previousScrollHeightMinusTop = 0
|
||||
private node: HTMLElement | null = null
|
||||
private previousScrollHeightMinusTop: number = 0
|
||||
|
||||
constructor(node) {
|
||||
constructor(node: HTMLElement) {
|
||||
this.node = node
|
||||
this.previousScrollHeightMinusTop = 0
|
||||
}
|
||||
|
||||
prepare() {
|
||||
this.previousScrollHeightMinusTop =
|
||||
this.node.scrollHeight - this.node.scrollTop
|
||||
if (this.node) {
|
||||
this.previousScrollHeightMinusTop = this.node.scrollHeight - this.node.scrollTop
|
||||
}
|
||||
}
|
||||
|
||||
restore() {
|
||||
this.node.scrollTop =
|
||||
this.node.scrollHeight - this.previousScrollHeightMinusTop
|
||||
if (this.node) {
|
||||
this.node.scrollTop = this.node.scrollHeight - this.previousScrollHeightMinusTop
|
||||
}
|
||||
}
|
||||
}
|
|
@ -37,6 +37,20 @@ const mutations: MutationTree<GlobalHeaderState> = {
|
|||
}
|
||||
}
|
||||
|
||||
export const ACTION_TYPES = {
|
||||
INIT_LOAD: 'initLoad',
|
||||
START_STREAMINGS: 'startStreamings',
|
||||
LIST_ACCOUNTS: 'listAccounts',
|
||||
REFRESH_ACCOUNTS: 'refreshAccounts',
|
||||
WATCH_SHORTCUT_EVENTS: 'watchShortcutEvents',
|
||||
REMOVE_SHORTCUT_EVENTS: 'removeShortcutEvents',
|
||||
LOAD_HIDE: 'loadHide',
|
||||
SWITCH_HIDE: 'switchHide',
|
||||
START_USER_STREAMINGS: 'startUserStreamings',
|
||||
STOP_USER_STREAMINGS: 'stopUserStreamings',
|
||||
BIND_NOTIFICATION: 'bindNotification'
|
||||
}
|
||||
|
||||
const actions: ActionTree<GlobalHeaderState, RootState> = {
|
||||
initLoad: async ({ dispatch }): Promise<Array<LocalAccount>> => {
|
||||
// Ignore error
|
||||
|
|
Loading…
Reference in New Issue