2021-08-23 18:31:04 -05:00
|
|
|
export const state = () => ({
|
|
|
|
user: null,
|
|
|
|
settings: {
|
2022-04-11 19:42:09 -05:00
|
|
|
orderBy: 'media.metadata.title',
|
2021-08-23 18:31:04 -05:00
|
|
|
orderDesc: false,
|
|
|
|
filterBy: 'all',
|
2021-08-26 09:47:51 -05:00
|
|
|
playbackRate: 1,
|
2022-01-24 18:03:54 -06:00
|
|
|
bookshelfCoverSize: 120,
|
2022-11-06 10:55:44 -06:00
|
|
|
collapseSeries: false,
|
2022-12-17 14:50:01 -06:00
|
|
|
collapseBookSeries: false,
|
2022-12-17 15:10:25 -06:00
|
|
|
useChapterTrack: false,
|
|
|
|
seriesSortBy: 'name',
|
|
|
|
seriesSortDesc: false,
|
|
|
|
seriesFilterBy: 'all'
|
2022-12-17 14:50:01 -06:00
|
|
|
}
|
2021-08-23 18:31:04 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
export const getters = {
|
2021-08-27 07:01:47 -05:00
|
|
|
getIsRoot: (state) => state.user && state.user.type === 'root',
|
2022-04-29 16:42:40 -05:00
|
|
|
getIsAdminOrUp: (state) => state.user && (state.user.type === 'admin' || state.user.type === 'root'),
|
2021-08-23 18:31:04 -05:00
|
|
|
getToken: (state) => {
|
2023-05-28 10:47:28 -05:00
|
|
|
return state.user?.token || null
|
2021-08-23 18:31:04 -05:00
|
|
|
},
|
2022-03-26 17:41:26 -05:00
|
|
|
getUserMediaProgress: (state) => (libraryItemId, episodeId = null) => {
|
2022-03-26 11:59:34 -05:00
|
|
|
if (!state.user.mediaProgress) return null
|
2022-03-26 17:41:26 -05:00
|
|
|
return state.user.mediaProgress.find(li => {
|
|
|
|
if (episodeId && li.episodeId !== episodeId) return false
|
2022-04-08 19:27:35 -05:00
|
|
|
return li.libraryItemId == libraryItemId
|
2022-03-26 17:41:26 -05:00
|
|
|
})
|
2021-08-23 18:31:04 -05:00
|
|
|
},
|
2022-03-17 20:28:04 -05:00
|
|
|
getUserBookmarksForItem: (state) => (libraryItemId) => {
|
|
|
|
if (!state.user.bookmarks) return []
|
|
|
|
return state.user.bookmarks.filter(bm => bm.libraryItemId === libraryItemId)
|
|
|
|
},
|
2021-08-23 18:31:04 -05:00
|
|
|
getUserSetting: (state) => (key) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return state.settings?.[key] || null
|
2021-08-23 18:31:04 -05:00
|
|
|
},
|
2021-09-06 17:42:15 -05:00
|
|
|
getUserCanUpdate: (state) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return !!state.user?.permissions?.update
|
2021-09-06 17:42:15 -05:00
|
|
|
},
|
|
|
|
getUserCanDelete: (state) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return !!state.user?.permissions?.delete
|
2021-09-06 17:42:15 -05:00
|
|
|
},
|
|
|
|
getUserCanDownload: (state) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return !!state.user?.permissions?.download
|
2021-09-18 12:45:34 -05:00
|
|
|
},
|
|
|
|
getUserCanUpload: (state) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return !!state.user?.permissions?.upload
|
2021-10-22 20:08:02 -05:00
|
|
|
},
|
|
|
|
getUserCanAccessAllLibraries: (state) => {
|
2023-06-11 13:22:58 -05:00
|
|
|
return !!state.user?.permissions?.accessAllLibraries
|
2021-10-22 20:08:02 -05:00
|
|
|
},
|
|
|
|
getLibrariesAccessible: (state, getters) => {
|
|
|
|
if (!state.user) return []
|
|
|
|
if (getters.getUserCanAccessAllLibraries) return []
|
|
|
|
return state.user.librariesAccessible || []
|
|
|
|
},
|
|
|
|
getCanAccessLibrary: (state, getters) => (libraryId) => {
|
|
|
|
if (!state.user) return false
|
|
|
|
if (getters.getUserCanAccessAllLibraries) return true
|
|
|
|
return getters.getLibrariesAccessible.includes(libraryId)
|
2022-11-15 17:20:57 -06:00
|
|
|
},
|
|
|
|
getIsSeriesRemovedFromContinueListening: (state) => (seriesId) => {
|
|
|
|
if (!state.user || !state.user.seriesHideFromContinueListening || !state.user.seriesHideFromContinueListening.length) return false
|
|
|
|
return state.user.seriesHideFromContinueListening.includes(seriesId)
|
2021-08-23 18:31:04 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const actions = {
|
2022-04-11 19:42:09 -05:00
|
|
|
// When changing libraries make sure sort and filter is still valid
|
|
|
|
checkUpdateLibrarySortFilter({ state, dispatch, commit }, mediaType) {
|
2022-12-17 14:50:01 -06:00
|
|
|
const settingsUpdate = {}
|
2022-04-11 19:42:09 -05:00
|
|
|
if (mediaType == 'podcast') {
|
|
|
|
if (state.settings.orderBy == 'media.metadata.authorName' || state.settings.orderBy == 'media.metadata.authorNameLF') {
|
|
|
|
settingsUpdate.orderBy = 'media.metadata.author'
|
|
|
|
}
|
2022-05-03 17:50:19 -05:00
|
|
|
if (state.settings.orderBy == 'media.duration') {
|
|
|
|
settingsUpdate.orderBy = 'media.numTracks'
|
|
|
|
}
|
2022-08-19 15:07:47 -05:00
|
|
|
if (state.settings.orderBy == 'media.metadata.publishedYear') {
|
|
|
|
settingsUpdate.orderBy = 'media.metadata.title'
|
|
|
|
}
|
2023-06-10 15:59:44 -05:00
|
|
|
const invalidFilters = ['series', 'authors', 'narrators', 'languages', 'progress', 'issues', 'ebooks', 'abridged']
|
2022-12-17 14:50:01 -06:00
|
|
|
const filterByFirstPart = (state.settings.filterBy || '').split('.').shift()
|
2022-04-11 19:42:09 -05:00
|
|
|
if (invalidFilters.includes(filterByFirstPart)) {
|
|
|
|
settingsUpdate.filterBy = 'all'
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (state.settings.orderBy == 'media.metadata.author') {
|
|
|
|
settingsUpdate.orderBy = 'media.metadata.authorName'
|
|
|
|
}
|
2022-05-03 17:50:19 -05:00
|
|
|
if (state.settings.orderBy == 'media.numTracks') {
|
|
|
|
settingsUpdate.orderBy = 'media.duration'
|
|
|
|
}
|
2022-04-11 19:42:09 -05:00
|
|
|
}
|
|
|
|
if (Object.keys(settingsUpdate).length) {
|
|
|
|
dispatch('updateUserSettings', settingsUpdate)
|
|
|
|
}
|
|
|
|
},
|
2022-12-17 14:50:01 -06:00
|
|
|
updateUserSettings({ state, commit }, payload) {
|
|
|
|
if (!payload) return false
|
|
|
|
|
|
|
|
let hasChanges = false
|
|
|
|
const existingSettings = { ...state.settings }
|
|
|
|
for (const key in existingSettings) {
|
|
|
|
if (payload[key] !== undefined && existingSettings[key] !== payload[key]) {
|
|
|
|
hasChanges = true
|
|
|
|
existingSettings[key] = payload[key]
|
|
|
|
}
|
2021-08-23 18:31:04 -05:00
|
|
|
}
|
2022-12-17 14:50:01 -06:00
|
|
|
if (hasChanges) {
|
|
|
|
commit('setSettings', existingSettings)
|
|
|
|
this.$eventBus.$emit('user-settings', state.settings)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
loadUserSettings({ state, commit }) {
|
|
|
|
// Load settings from local storage
|
|
|
|
try {
|
|
|
|
let userSettingsFromLocal = localStorage.getItem('userSettings')
|
|
|
|
if (userSettingsFromLocal) {
|
|
|
|
userSettingsFromLocal = JSON.parse(userSettingsFromLocal)
|
|
|
|
const userSettings = { ...state.settings }
|
|
|
|
for (const key in userSettings) {
|
|
|
|
if (userSettingsFromLocal[key] !== undefined) {
|
|
|
|
userSettings[key] = userSettingsFromLocal[key]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
commit('setSettings', userSettings)
|
|
|
|
this.$eventBus.$emit('user-settings', state.settings)
|
2021-08-23 18:31:04 -05:00
|
|
|
}
|
2022-12-17 14:50:01 -06:00
|
|
|
} catch (error) {
|
|
|
|
console.error('Failed to load userSettings from local storage', error)
|
|
|
|
}
|
2021-08-23 18:31:04 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const mutations = {
|
|
|
|
setUser(state, user) {
|
|
|
|
state.user = user
|
2021-08-23 19:37:40 -05:00
|
|
|
if (user) {
|
|
|
|
if (user.token) localStorage.setItem('token', user.token)
|
|
|
|
} else {
|
2021-08-23 18:31:04 -05:00
|
|
|
localStorage.removeItem('token')
|
|
|
|
}
|
|
|
|
},
|
2022-07-18 17:19:16 -05:00
|
|
|
setUserToken(state, token) {
|
|
|
|
state.user.token = token
|
|
|
|
localStorage.setItem('token', user.token)
|
|
|
|
},
|
2022-03-26 11:59:34 -05:00
|
|
|
updateMediaProgress(state, { id, data }) {
|
2021-10-24 15:53:51 -05:00
|
|
|
if (!state.user) return
|
2022-03-17 13:33:22 -05:00
|
|
|
if (!data) {
|
2022-03-26 11:59:34 -05:00
|
|
|
state.user.mediaProgress = state.user.mediaProgress.filter(lip => lip.id != id)
|
2022-03-17 13:33:22 -05:00
|
|
|
} else {
|
2022-03-26 11:59:34 -05:00
|
|
|
var indexOf = state.user.mediaProgress.findIndex(lip => lip.id == id)
|
2022-03-17 13:33:22 -05:00
|
|
|
if (indexOf >= 0) {
|
2022-03-26 11:59:34 -05:00
|
|
|
state.user.mediaProgress.splice(indexOf, 1, data)
|
2022-03-17 13:33:22 -05:00
|
|
|
} else {
|
2022-03-26 11:59:34 -05:00
|
|
|
state.user.mediaProgress.push(data)
|
2022-03-17 13:33:22 -05:00
|
|
|
}
|
2021-10-24 15:53:51 -05:00
|
|
|
}
|
|
|
|
},
|
2021-08-23 18:31:04 -05:00
|
|
|
setSettings(state, settings) {
|
|
|
|
if (!settings) return
|
2022-12-17 15:10:25 -06:00
|
|
|
localStorage.setItem('userSettings', JSON.stringify(settings))
|
2022-12-17 14:50:01 -06:00
|
|
|
state.settings = settings
|
2022-11-11 17:28:05 -06:00
|
|
|
}
|
2021-08-23 18:31:04 -05:00
|
|
|
}
|