Skip to content
Snippets Groups Projects
nav.ts 1.82 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { defineStore } from 'pinia'
    import { Breadcrumb } from '@/components/nav/nav'
    
    import { computed, MaybeRefOrGetter, ref, toRef, watch } from 'vue'
    
    import { tryOnScopeDispose } from '@vueuse/core'
    
    import { useShowStore } from '@/stores/shows'
    import { RouteLocationNormalizedLoaded, useRoute } from 'vue-router'
    import { merge } from 'lodash'
    import { useId } from '@/util'
    
    
    export function useBreadcrumbs(breadcrumbs: MaybeRefOrGetter<Breadcrumb[]>) {
      const store = useNavStore()
      const unwatch = watch(
        toRef(breadcrumbs),
        (_breadcrumbs) => {
          store.breadcrumbs = _breadcrumbs
        },
        { immediate: true },
      )
      tryOnScopeDispose(() => {
        unwatch()
        store.breadcrumbs = []
      })
    }
    
    
    const definedNavigationContext = ref(new Map<string, Record<string, unknown>>())
    
    export function defineNavigationContext(context: MaybeRefOrGetter<Record<string, unknown>>) {
      const _context = toRef(context)
      const id = useId('nav-context-ref')
      const unwatch = watch(
        _context,
        (context) => {
          definedNavigationContext.value.set(id.value, context)
        },
        { immediate: true },
      )
      tryOnScopeDispose(() => {
        unwatch()
        definedNavigationContext.value.delete(id.value)
      })
    }
    
    export function useNavigationContext() {
      const store = useNavStore()
      return computed(() => store.navigationContext)
    }
    
    
    export const useNavStore = defineStore('nav', () => {
      const breadcrumbs = ref<Breadcrumb[]>([])
    
      const showStore = useShowStore()
      const route = useRoute()
      const navigationContext = computed<
        Record<string, unknown> & {
          route: RouteLocationNormalizedLoaded
        }
      >(() => {
        const mergedDefinedContext = merge({}, ...definedNavigationContext.value.values())
        return { route, show: showStore.selectedShow, ...mergedDefinedContext }
      })
    
    
        breadcrumbs,
        navigationContext,