mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-07-09 21:44:41 +02:00
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.
200 lines
6.3 KiB
JavaScript
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)
|
|
}
|
|
}
|