mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-06-20 20:05:44 +02:00
158 lines
No EOL
4.7 KiB
Vue
158 lines
No EOL
4.7 KiB
Vue
<template>
|
|
<div class="w-full h-full">
|
|
<template v-for="(shelf, index) in shelves">
|
|
<bookshelf-shelf :key="shelf.id" :label="shelf.label" :entities="shelf.entities" :type="shelf.type" :style="{ zIndex: shelves.length - index }" />
|
|
</template>
|
|
|
|
<div v-if="!shelves.length" class="absolute top-0 left-0 w-full h-full flex items-center justify-center">
|
|
<div>
|
|
<p class="mb-4 text-center text-xl">
|
|
Bookshelf empty<span v-show="isSocketConnected">
|
|
for library <strong>{{ currentLibraryName }}</strong></span
|
|
>
|
|
</p>
|
|
<div class="w-full" v-if="!isSocketConnected">
|
|
<div class="flex justify-center items-center mb-3">
|
|
<span class="material-icons text-error text-lg">cloud_off</span>
|
|
<p class="pl-2 text-error text-sm">Audiobookshelf server not connected.</p>
|
|
</div>
|
|
<p class="px-4 text-center text-error absolute bottom-12 left-0 right-0 mx-auto"><strong>Important!</strong> This app requires that you are running <u>your own server</u> and does not provide any content.</p>
|
|
</div>
|
|
<div class="flex justify-center">
|
|
<ui-btn v-if="!isSocketConnected" small @click="$router.push('/connect')" class="w-32"> Connect </ui-btn>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
shelves: [],
|
|
loading: true
|
|
}
|
|
},
|
|
computed: {
|
|
books() {
|
|
return this.$store.getters['downloads/getAudiobooks']
|
|
},
|
|
isSocketConnected() {
|
|
return this.$store.state.socketConnected
|
|
},
|
|
currentLibraryName() {
|
|
return this.$store.getters['libraries/getCurrentLibraryName']
|
|
},
|
|
booksWithUserAbData() {
|
|
var books = this.books.map((b) => {
|
|
var userAbData = this.$store.getters['user/getUserAudiobookData'](b.id)
|
|
return { ...b, userAbData }
|
|
})
|
|
return books
|
|
},
|
|
booksCurrentlyReading() {
|
|
var books = this.booksWithUserAbData
|
|
.map((b) => ({ ...b }))
|
|
.filter((b) => b.userAbData && !b.userAbData.isRead && b.userAbData.progress > 0)
|
|
.sort((a, b) => {
|
|
return b.userAbData.lastUpdate - a.userAbData.lastUpdate
|
|
})
|
|
return books
|
|
},
|
|
booksRecentlyAdded() {
|
|
var books = this.books
|
|
.map((b) => {
|
|
return { ...b }
|
|
})
|
|
.sort((a, b) => b.addedAt - a.addedAt)
|
|
return books.slice(0, 10)
|
|
},
|
|
booksRead() {
|
|
var books = this.booksWithUserAbData
|
|
.filter((b) => b.userAbData && b.userAbData.isRead)
|
|
.sort((a, b) => {
|
|
return b.userAbData.lastUpdate - a.userAbData.lastUpdate
|
|
})
|
|
return books.slice(0, 10)
|
|
},
|
|
downloadOnlyShelves() {
|
|
var shelves = []
|
|
|
|
if (this.booksCurrentlyReading.length) {
|
|
shelves.push({
|
|
id: 'recent',
|
|
label: 'Continue Reading',
|
|
type: 'books',
|
|
entities: this.booksCurrentlyReading
|
|
})
|
|
}
|
|
|
|
if (this.booksRecentlyAdded.length) {
|
|
shelves.push({
|
|
id: 'added',
|
|
label: 'Recently Added',
|
|
type: 'books',
|
|
entities: this.booksRecentlyAdded
|
|
})
|
|
}
|
|
|
|
if (this.booksRead.length) {
|
|
shelves.push({
|
|
id: 'read',
|
|
label: 'Read Again',
|
|
type: 'books',
|
|
entities: this.booksRead
|
|
})
|
|
}
|
|
return shelves
|
|
},
|
|
currentLibraryId() {
|
|
return this.$store.state.libraries.currentLibraryId
|
|
}
|
|
},
|
|
methods: {
|
|
async fetchCategories() {
|
|
var categories = await this.$axios
|
|
.$get(`/api/libraries/${this.currentLibraryId}/categories`)
|
|
.then((data) => {
|
|
return data
|
|
})
|
|
.catch((error) => {
|
|
console.error('Failed to fetch categories', error)
|
|
return []
|
|
})
|
|
this.shelves = categories
|
|
},
|
|
async socketInit(isConnected) {
|
|
if (isConnected) {
|
|
console.log('Connected - Load from server')
|
|
await this.fetchCategories()
|
|
} else {
|
|
console.log('Disconnected - Reset to local storage')
|
|
this.shelves = this.downloadOnlyShelves
|
|
}
|
|
this.loading = false
|
|
},
|
|
async libraryChanged(libid) {
|
|
console.log('Library changed', libid)
|
|
if (this.isSocketConnected) {
|
|
await this.fetchCategories()
|
|
} else {
|
|
this.shelves = this.downloadOnlyShelves
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$server.on('initialized', this.socketInit)
|
|
this.$eventBus.$on('library-changed', this.libraryChanged)
|
|
if (this.$server.initialized) {
|
|
this.fetchCategories()
|
|
}
|
|
},
|
|
beforeDestroy() {
|
|
this.$server.off('initialized', this.socketInit)
|
|
this.$eventBus.$off('library-changed', this.libraryChanged)
|
|
}
|
|
}
|
|
</script> |