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) } }