zaphyra's git: domsonic

subsonic web-client

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
import { computed } from 'vue'
import { useRoute, type RouteLocationNormalizedLoaded } from 'vue-router'

import { useMainStore } from '../store/main'

import { SearchInput } from '../components/SearchInput.vine'
import { NavSidebar, NavBar } from '../components/Navbars.vine'
import { Player } from '../components/Player.vine'

export const RootView = () => {
  const 
    mainStore = useMainStore(),
    route = useRoute(),

    isAuthenticated = computed(() => !!mainStore.serverInfo),

    routeOnAttributes = (r: RouteLocationNormalizedLoaded) => (
      (['album', 'genre', 'artist', ' search', 'queue'].includes(r.name as string))
      ? { key: JSON.stringify(r.params) }
      : {}
    )

  return vine`
    <router-view v-slot="{ Component, route: viewRoute }">
      <NavSidebar v-if="isAuthenticated" />
      <main>
        <SearchInput v-if="isAuthenticated" />
        <component
          :is="Component"
          v-if="!viewRoute.meta.keepAlive"
          v-bind="routeOnAttributes(viewRoute)"
        />
        <keep-alive v-else max="5">
          <component
            :is="Component"
            v-bind="routeOnAttributes(viewRoute)"
          />
        </keep-alive>
      </main>
      <Player v-if="isAuthenticated" />
      <NavBar v-if="isAuthenticated" />
    </router-view>

    <transition name="fade">
      <div v-if="mainStore.loaderVisible" class="loader-overlay">
        <img src="" alt="Loading...">
      </div>
    </transition>
  `
}