2021-12-01 03:02:40 +01:00
|
|
|
<template>
|
2022-03-14 01:34:31 +01:00
|
|
|
<div class="page" :class="streamLibraryItem ? 'streaming' : ''">
|
2022-05-14 00:40:43 +02:00
|
|
|
<app-book-shelf-toolbar is-home page="search" :search-query="query" />
|
|
|
|
<app-book-shelf-categorized v-if="hasResults" ref="bookshelf" search :results="results" />
|
|
|
|
<div v-else class="w-full py-16">
|
2022-11-09 00:10:08 +01:00
|
|
|
<p class="text-xl text-center">{{ $getString('MessageNoSearchResultsFor', [query]) }}</p>
|
2021-12-01 03:02:40 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
export default {
|
|
|
|
async asyncData({ store, params, redirect, query, app }) {
|
2023-04-25 01:25:30 +02:00
|
|
|
const libraryId = params.library
|
|
|
|
const library = await store.dispatch('libraries/fetch', libraryId)
|
2021-12-02 02:07:03 +01:00
|
|
|
if (!library) {
|
|
|
|
return redirect('/oops?message=Library not found')
|
|
|
|
}
|
2024-07-21 13:00:55 +02:00
|
|
|
let results = await app.$axios.$get(`/api/libraries/${libraryId}/search?q=${encodeURIComponent(query.q)}`).catch((error) => {
|
2021-12-01 03:02:40 +01:00
|
|
|
console.error('Failed to search library', error)
|
|
|
|
return null
|
|
|
|
})
|
|
|
|
results = {
|
2023-04-25 01:25:30 +02:00
|
|
|
podcasts: results?.podcast || [],
|
|
|
|
books: results?.book || [],
|
|
|
|
authors: results?.authors || [],
|
|
|
|
series: results?.series || [],
|
|
|
|
tags: results?.tags || [],
|
|
|
|
narrators: results?.narrators || []
|
2021-12-01 03:02:40 +01:00
|
|
|
}
|
|
|
|
return {
|
2021-12-02 02:07:03 +01:00
|
|
|
libraryId,
|
2021-12-01 03:02:40 +01:00
|
|
|
results,
|
2023-04-25 01:25:30 +02:00
|
|
|
query: query.q
|
2021-12-01 03:02:40 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {}
|
|
|
|
},
|
2021-12-02 02:07:03 +01:00
|
|
|
watch: {
|
|
|
|
'$route.query'(newVal, oldVal) {
|
|
|
|
if (newVal && newVal.q && newVal.q !== this.query) {
|
|
|
|
this.query = newVal.q
|
|
|
|
this.search()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2021-12-01 03:02:40 +01:00
|
|
|
computed: {
|
2022-03-14 01:34:31 +01:00
|
|
|
streamLibraryItem() {
|
|
|
|
return this.$store.state.streamLibraryItem
|
2021-12-01 03:02:40 +01:00
|
|
|
},
|
|
|
|
hasResults() {
|
2022-04-12 23:54:52 +02:00
|
|
|
return Object.values(this.results).find((r) => !!r && r.length)
|
2021-12-01 03:02:40 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
2021-12-02 02:07:03 +01:00
|
|
|
async search() {
|
2024-07-21 13:00:55 +02:00
|
|
|
const results = await this.$axios.$get(`/api/libraries/${this.libraryId}/search?q=${encodeURIComponent(this.query)}`).catch((error) => {
|
2021-12-02 02:07:03 +01:00
|
|
|
console.error('Failed to search library', error)
|
|
|
|
return null
|
|
|
|
})
|
|
|
|
this.results = {
|
2023-04-25 01:25:30 +02:00
|
|
|
podcasts: results?.podcast || [],
|
|
|
|
books: results?.book || [],
|
|
|
|
authors: results?.authors || [],
|
|
|
|
series: results?.series || [],
|
|
|
|
tags: results?.tags || [],
|
|
|
|
narrators: results?.narrators || []
|
2021-12-02 02:07:03 +01:00
|
|
|
}
|
|
|
|
this.$nextTick(() => {
|
|
|
|
if (this.$refs.bookshelf) {
|
|
|
|
this.$refs.bookshelf.setShelvesFromSearch()
|
|
|
|
}
|
|
|
|
})
|
2021-12-01 03:02:40 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
mounted() {},
|
|
|
|
beforeDestroy() {}
|
|
|
|
}
|
|
|
|
</script>
|