Skip to content
Snippets Groups Projects
ShowEpisode.vue 2.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
      <router-view
        v-if="timeslot && note"
        :show="show"
        :timeslot="timeslot"
        :note="note"
        :playlist="playlist"
      />
    
      <FormGroup v-if="loadingErrorList.length > 0" :errors="loadingErrorList">
        <button type="button" class="btn btn-default tw-w-fit" @click="router.back()">
          <icon-system-uicons-arrow-left />
          {{ t('goBack') }}
        </button>
      </FormGroup>
    
    </template>
    
    <script setup lang="ts">
    
    import { ref, watchEffect } from 'vue'
    
    import { useRoute, useRouter } from 'vue-router'
    
    import { useErrorList, useObjectFromStore } from '@rokoli/bnb/drf'
    
    
    import { useI18n } from '@/i18n'
    
    import { useNoteStore, usePlaylistStore, useTimeSlotStore } from '@/stores'
    import { defineNavigationContext } from '@/stores/nav'
    import { newNote } from '@/stores/notes'
    
    import { Show } from '@/types'
    import { ensureError } from '@/util'
    
    import FormGroup from '@/components/generic/FormGroup.vue'
    
    
    const props = defineProps<{
      show: Show
    }>()
    
    const router = useRouter()
    const route = useRoute()
    
    const timeslotStore = useTimeSlotStore()
    const noteStore = useNoteStore()
    const playlistStore = usePlaylistStore()
    const { obj: timeslot } = useObjectFromStore(
      () => parseInt(route.params.episodeId as string),
      timeslotStore,
    )
    const { obj: note } = useObjectFromStore(() => timeslot.value?.noteId ?? null, noteStore)
    const { obj: playlist } = useObjectFromStore(
      () => timeslot.value?.playlistId ?? null,
      playlistStore,
    )
    
    const loadingError = ref<Error | undefined>()
    
    const loadingErrorList = useErrorList(loadingError)
    
    
    defineNavigationContext(() => ({ episode: timeslot }))
    
    // TODO: remove once steering auto-creates notes for timeslots
    watchEffect(async () => {
      const ts = timeslot.value
      if (ts && ts.noteId === null) {
        const note = newNote(ts.id, props.show)
        note.title = 'A title...'
        note.content = 'Some content...'
    
        try {
          const savedNote = await noteStore.create(note)
          await timeslotStore.partialUpdate(ts.id, { noteId: savedNote.id })
        } catch (e) {
          loadingError.value = ensureError(e)
        }
    
      }
    })
    
    watchEffect(() => {
      const showId = timeslot.value?.showId
      // if timeslot.showId doesn’t match the provided show.id,
      // the user might have switched shows with the show selector.
      if (showId && showId !== props.show.id) {
        void router.push({ name: 'show', params: { showId: props.show.id.toString() } })
      }
    })
    </script>