advplyr.audiobookshelf-app/store/index.js
ISO-B 358197db03 iOS devices have always networkConnected status true
Capacitor Network plugin only shows ios device connected if internet access is available. This fix allows iOS users to use local server without internet access. Socket is used to detect if connection to server is availabe.  networkConnected is only used for add server form and cellular permission check.

Cellular permissions for download and streaming wont work for iOS if device is connected to cellular, but without internet access to server that is used for connectivity check.
2024-11-03 21:45:05 +02:00

200 lines
6.3 KiB
JavaScript

import { Network } from '@capacitor/network'
import { AbsAudioPlayer } from '@/plugins/capacitor'
import { PlayMethod } from '@/plugins/constants'
export const state = () => ({
deviceData: null,
currentPlaybackSession: null,
playerIsPlaying: false,
playerIsFullscreen: false,
playerIsStartingPlayback: false, // When pressing play before native play response
playerStartingPlaybackMediaId: null,
isCasting: false,
isCastAvailable: false,
attemptingConnection: false,
socketConnected: false,
networkConnected: false,
networkConnectionType: null,
isNetworkUnmetered: true,
isFirstLoad: true,
isFirstAudioLoad: true,
hasStoragePermission: false,
selectedLibraryItem: null,
showReader: false,
ereaderKeepProgress: false,
ereaderFileId: null,
showSideDrawer: false,
isNetworkListenerInit: false,
serverSettings: null,
lastBookshelfScrollData: {},
lastItemScrollData: {}
})
export const getters = {
getCurrentPlaybackSessionId: (state) => {
return state.currentPlaybackSession?.id || null
},
getIsPlayerOpen: (state) => {
return !!state.currentPlaybackSession
},
getIsCurrentSessionLocal: (state) => {
return state.currentPlaybackSession?.playMethod == PlayMethod.LOCAL
},
getIsMediaStreaming: (state) => (libraryItemId, episodeId) => {
if (!state.currentPlaybackSession || !libraryItemId) return false
// Check using local library item id and local episode id
const isLocalLibraryItemId = libraryItemId.startsWith('local_')
if (isLocalLibraryItemId) {
if (state.currentPlaybackSession.localLibraryItem?.id !== libraryItemId) {
return false
}
if (!episodeId) return true
return state.currentPlaybackSession.localEpisodeId === episodeId
}
if (state.currentPlaybackSession.libraryItemId !== libraryItemId) {
return false
}
if (!episodeId) return true
return state.currentPlaybackSession.episodeId === episodeId
},
getServerSetting: (state) => (key) => {
if (!state.serverSettings) return null
return state.serverSettings[key]
},
getJumpForwardTime: (state) => {
if (!state.deviceData?.deviceSettings) return 10
return state.deviceData.deviceSettings.jumpForwardTime || 10
},
getJumpBackwardsTime: (state) => {
if (!state.deviceData?.deviceSettings) return 10
return state.deviceData.deviceSettings.jumpBackwardsTime || 10
},
getAltViewEnabled: (state) => {
if (!state.deviceData?.deviceSettings) return true
return state.deviceData.deviceSettings.enableAltView
},
getOrientationLockSetting: (state) => {
return state.deviceData?.deviceSettings?.lockOrientation
},
getCanDownloadUsingCellular: (state) => {
if (!state.deviceData?.deviceSettings?.downloadUsingCellular) return 'ALWAYS'
return state.deviceData.deviceSettings.downloadUsingCellular || 'ALWAYS'
},
getCanStreamingUsingCellular: (state) => {
if (!state.deviceData?.deviceSettings?.streamingUsingCellular) return 'ALWAYS'
return state.deviceData.deviceSettings.streamingUsingCellular || 'ALWAYS'
}
}
export const actions = {
// Listen for network connection
async setupNetworkListener({ state, commit }) {
if (state.isNetworkListenerInit) return
commit('setNetworkListenerInit', true)
const status = await Network.getStatus()
console.log('Network status', status)
commit('setNetworkStatus', status)
Network.addListener('networkStatusChange', (status) => {
console.log('Network status changed', status.connected, status.connectionType)
commit('setNetworkStatus', status)
})
AbsAudioPlayer.addListener('onNetworkMeteredChanged', (payload) => {
const isUnmetered = payload.value
console.log('On network metered changed', isUnmetered)
commit('setIsNetworkUnmetered', isUnmetered)
})
}
}
export const mutations = {
setDeviceData(state, deviceData) {
state.deviceData = deviceData
},
setLastBookshelfScrollData(state, { scrollTop, path, name }) {
state.lastBookshelfScrollData[name] = { scrollTop, path }
},
setLastItemScrollData(state, data) {
state.lastItemScrollData = data
},
setPlaybackSession(state, playbackSession) {
state.currentPlaybackSession = playbackSession
state.isCasting = playbackSession?.mediaPlayer === 'cast-player'
},
setMediaPlayer(state, mediaPlayer) {
state.isCasting = mediaPlayer === 'cast-player'
},
setCastAvailable(state, available) {
state.isCastAvailable = available
},
setAttemptingConnection(state, val) {
state.attemptingConnection = val
},
setPlayerPlaying(state, val) {
state.playerIsPlaying = val
},
setPlayerFullscreen(state, val) {
state.playerIsFullscreen = val
},
setPlayerIsStartingPlayback(state, mediaId) {
state.playerStartingPlaybackMediaId = mediaId
state.playerIsStartingPlayback = true
},
setPlayerDoneStartingPlayback(state) {
state.playerStartingPlaybackMediaId = null
state.playerIsStartingPlayback = false
},
setHasStoragePermission(state, val) {
state.hasStoragePermission = val
},
setIsFirstLoad(state, val) {
state.isFirstLoad = val
},
setIsFirstAudioLoad(state, val) {
state.isFirstAudioLoad = val
},
setSocketConnected(state, val) {
state.socketConnected = val
},
setNetworkListenerInit(state, val) {
state.isNetworkListenerInit = val
},
setNetworkStatus(state, val) {
if (val.connectionType !== 'none') {
state.networkConnected = true
} else {
state.networkConnected = false
}
if (this.$platform === 'ios') {
// Capacitor Network plugin only shows ios device connected if internet access is available.
// This fix allows iOS users to use local servers without internet access.
state.networkConnected = true
}
state.networkConnectionType = val.connectionType
},
setIsNetworkUnmetered(state, val) {
state.isNetworkUnmetered = val
},
showReader(state, { libraryItem, keepProgress, fileId }) {
state.selectedLibraryItem = libraryItem
state.ereaderKeepProgress = keepProgress
state.ereaderFileId = fileId
state.showReader = true
},
setShowReader(state, val) {
state.showReader = val
},
setShowSideDrawer(state, val) {
state.showSideDrawer = val
},
setServerSettings(state, val) {
state.serverSettings = val
this.$localStore.setServerSettings(state.serverSettings)
}
}