Newer
Older
<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 { t } = useI18n()
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>