diff --git a/store/server.ts b/store/server.ts index c57bac9aa..d0b09810b 100644 --- a/store/server.ts +++ b/store/server.ts @@ -20,6 +20,8 @@ import { useErrorsStore, type Error } from '~/store/errors'; import { usePurchaseStore } from '~/store/purchase'; import { useTrialStore } from '~/store/trial'; import { useThemeStore, type Theme } from '~/store/theme'; +import { useUnraidApiStore } from '~/store/unraidApi'; + import type { Server, ServerAccountCallbackSendPayload, @@ -44,6 +46,7 @@ export const useServerStore = defineStore('server', () => { const purchaseStore = usePurchaseStore(); const themeStore = useThemeStore(); const trialStore = useTrialStore(); + const unraidApiStore = useUnraidApiStore(); /** * State */ @@ -52,6 +55,7 @@ export const useServerStore = defineStore('server', () => { const avatar = ref(''); // @todo potentially move to a user store const config = ref(); const connectPluginInstalled = ref(''); + const connectPluginVersion = ref(''); const csrf = ref(''); // required to make requests to Unraid webgui const description = ref(''); const deviceCount = ref(0); @@ -70,13 +74,15 @@ export const useServerStore = defineStore('server', () => { const locale = ref(''); const name = ref(''); const osVersion = ref(''); - const pluginVersion = ref(''); const registered = ref(); const regGen = ref(0); const regGuid = ref(''); const site = ref(''); const state = ref(); const theme = ref(); + watch(theme, (newVal) => { + if (newVal) { themeStore.setTheme(newVal); } + }); const uptime = ref(0); const username = ref(''); // @todo potentially move to a user store const wanFQDN = ref(''); @@ -98,6 +104,7 @@ export const useServerStore = defineStore('server', () => { apiKey: apiKey.value, apiVersion: apiVersion.value, avatar: avatar.value, + connectPluginVersion: connectPluginVersion.value, connectPluginInstalled: connectPluginInstalled.value, description: description.value, deviceCount: deviceCount.value, @@ -113,7 +120,6 @@ export const useServerStore = defineStore('server', () => { locale: locale.value, name: name.value, osVersion: osVersion.value, - pluginVersion: pluginVersion.value, registered: registered.value, regGen: regGen.value, regGuid: regGuid.value, @@ -142,6 +148,7 @@ export const useServerStore = defineStore('server', () => { } const server = { apiVersion: apiVersion.value, + connectPluginVersion: connectPluginVersion.value, deviceCount: deviceCount.value, email: email.value, guid: guid.value, @@ -149,7 +156,6 @@ export const useServerStore = defineStore('server', () => { keyTypeForPurchase, locale: locale.value, osVersion: osVersion.value, - pluginVersion: pluginVersion.value, registered: registered.value ?? false, state: state.value, site: site.value, @@ -160,6 +166,7 @@ export const useServerStore = defineStore('server', () => { const serverAccountPayload = computed((): ServerAccountCallbackSendPayload => { return { apiVersion: apiVersion.value, + connectPluginVersion: connectPluginVersion.value, description: description.value, expireTime: expireTime.value, flashProduct: flashProduct.value, @@ -170,7 +177,6 @@ export const useServerStore = defineStore('server', () => { lanIp: lanIp.value, name: name.value, osVersion: osVersion.value, - pluginVersion: pluginVersion.value, registered: registered.value ?? false, regGuid: regGuid.value, site: site.value, @@ -185,6 +191,7 @@ export const useServerStore = defineStore('server', () => { apiVersion: apiVersion.value, avatar: avatar.value, connectPluginInstalled: connectPluginInstalled.value, + connectPluginVersion: connectPluginVersion.value, description: description.value, deviceCount: deviceCount.value, email: email.value, @@ -197,7 +204,6 @@ export const useServerStore = defineStore('server', () => { locale: locale.value, name: name.value, osVersion: osVersion.value, - pluginVersion: pluginVersion.value, registered: registered.value, regGen: regGen.value, regGuid: regGuid.value, @@ -500,6 +506,11 @@ export const useServerStore = defineStore('server', () => { type: 'serverState', }; }); + watch(stateDataError, (newVal, oldVal) => { + console.debug('[watch:stateDataError]', newVal, oldVal); + if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } + if (newVal) { errorsStore.setError(newVal); } + }); const authActionsNames = ['signIn', 'signOut']; // Extract sign in / out from actions so we can display seperately as needed @@ -543,6 +554,11 @@ export const useServerStore = defineStore('server', () => { } return undefined; }); + watch(invalidApiKey, (newVal, oldVal) => { + console.debug('[watch:invalidApiKey]', newVal, oldVal); + if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } + if (newVal) { errorsStore.setError(newVal); } + }); const tooManyDevices = computed((): Error | undefined => { if (!config.value?.valid && config.value?.error === 'INVALID') { @@ -556,6 +572,11 @@ export const useServerStore = defineStore('server', () => { } return undefined; }); + watch(tooManyDevices, (newVal, oldVal) => { + console.debug('[watch:tooManyDevices]', newVal, oldVal); + if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } + if (newVal) { errorsStore.setError(newVal); } + }); const pluginInstallFailed = computed((): Error | undefined => { if (connectPluginInstalled.value && connectPluginInstalled.value.includes('_installFailed')) { @@ -577,6 +598,11 @@ export const useServerStore = defineStore('server', () => { } return undefined; }); + watch(pluginInstallFailed, (newVal, oldVal) => { + console.debug('[watch:pluginInstallFailed]', newVal, oldVal); + if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } + if (newVal) { errorsStore.setError(newVal); } + }); /** * Deprecation warning for [hash].unraid.net SSL certs. Deprecation started 2023-01-01 @@ -605,6 +631,11 @@ export const useServerStore = defineStore('server', () => { type: 'server', } : undefined)); + watch(deprecatedUnraidSSL, (newVal, oldVal) => { + console.debug('[watch:deprecatedUnraidSSL]', newVal, oldVal); + if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } + if (newVal) { errorsStore.setError(newVal); } + }); const serverErrors = computed(() => { return [ @@ -615,6 +646,21 @@ export const useServerStore = defineStore('server', () => { deprecatedUnraidSSL.value, ].filter(Boolean); }); + /** + * Determines whether or not we start or stop the apollo client for unraid-api + */ + const registeredWithValidApiKey = computed(() => registered.value && !invalidApiKey.value); + watch(registeredWithValidApiKey, (newVal, oldVal) => { + console.debug('[watch:registeredWithValidApiKey]', newVal, oldVal); + if (oldVal) { + console.debug('[watch:registeredWithValidApiKey] no apiKey, stop unraid-api client'); + unraidApiStore.closeUnraidApiClient(); + } + if (newVal) { + console.debug('[watch:registeredWithValidApiKey] new apiKey, start unraid-api client'); + unraidApiStore.createApolloClient(); + } + }); /** * Actions */ @@ -625,6 +671,7 @@ export const useServerStore = defineStore('server', () => { if (typeof data?.avatar !== 'undefined') { avatar.value = data.avatar; } if (typeof data?.config !== 'undefined') { config.value = data.config; } if (typeof data?.connectPluginInstalled !== 'undefined') { connectPluginInstalled.value = data.connectPluginInstalled; } + if (typeof data?.connectPluginVersion !== 'undefined') { connectPluginVersion.value = data.connectPluginVersion; } if (typeof data?.csrf !== 'undefined') { csrf.value = data.csrf; } if (typeof data?.description !== 'undefined') { description.value = data.description; } if (typeof data?.deviceCount !== 'undefined') { deviceCount.value = data.deviceCount; } @@ -639,7 +686,6 @@ export const useServerStore = defineStore('server', () => { if (typeof data?.locale !== 'undefined') { locale.value = data.locale; } if (typeof data?.name !== 'undefined') { name.value = data.name; } if (typeof data?.osVersion !== 'undefined') { osVersion.value = data.osVersion; } - if (typeof data?.pluginVersion !== 'undefined') { pluginVersion.value = data.pluginVersion; } if (typeof data?.registered !== 'undefined') { registered.value = data.registered; } if (typeof data?.regGen !== 'undefined') { regGen.value = data.regGen; } if (typeof data?.regGuid !== 'undefined') { regGuid.value = data.regGuid; } @@ -747,41 +793,12 @@ export const useServerStore = defineStore('server', () => { }, 250); }; - watch(theme, (newVal) => { - if (newVal) { themeStore.setTheme(newVal); } - }); - - watch(stateDataError, (newVal, oldVal) => { - console.debug('[watch:stateDataError]', newVal, oldVal); - if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } - if (newVal) { errorsStore.setError(newVal); } - }); - watch(invalidApiKey, (newVal, oldVal) => { - console.debug('[watch:invalidApiKey]', newVal, oldVal); - if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } - if (newVal) { errorsStore.setError(newVal); } - }); - watch(tooManyDevices, (newVal, oldVal) => { - console.debug('[watch:tooManyDevices]', newVal, oldVal); - if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } - if (newVal) { errorsStore.setError(newVal); } - }); - watch(pluginInstallFailed, (newVal, oldVal) => { - console.debug('[watch:pluginInstallFailed]', newVal, oldVal); - if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } - if (newVal) { errorsStore.setError(newVal); } - }); - watch(deprecatedUnraidSSL, (newVal, oldVal) => { - console.debug('[watch:deprecatedUnraidSSL]', newVal, oldVal); - if (oldVal && oldVal.ref) { errorsStore.removeErrorByRef(oldVal.ref); } - if (newVal) { errorsStore.setError(newVal); } - }); - return { // state apiKey, avatar, config, + connectPluginInstalled, csrf, description, deviceCount, @@ -790,7 +807,6 @@ export const useServerStore = defineStore('server', () => { locale, lanIp, name, - connectPluginInstalled, registered, regGen, regGuid, @@ -808,6 +824,7 @@ export const useServerStore = defineStore('server', () => { keyActions, pluginInstallFailed, pluginOutdated, + registeredWithValidApiKey, server, serverAccountPayload, serverPurchasePayload, diff --git a/types/server.ts b/types/server.ts index 2c551559e..0af769d10 100644 --- a/types/server.ts +++ b/types/server.ts @@ -37,6 +37,7 @@ export interface Server { avatar?: string; config?: ServerStateConfigStatus | undefined; connectPluginInstalled?: ServerconnectPluginInstalled; + connectPluginVersion?: string; csrf?: string; description?: string; deviceCount?: number; @@ -52,7 +53,6 @@ export interface Server { locale?: string; name?: string; osVersion?: string; - pluginVersion?: string; registered?: boolean; regGen?: number; regGuid?: string; @@ -67,6 +67,7 @@ export interface Server { export interface ServerAccountCallbackSendPayload { apiVersion?: string; + connectPluginVersion?: string; description?: string; deviceCount?: number; expireTime?: number; @@ -79,7 +80,6 @@ export interface ServerAccountCallbackSendPayload { locale?: string; name?: string; osVersion?: string; - pluginVersion?: string; registered: boolean; regGen?: number; regGuid?: string; @@ -92,6 +92,7 @@ export type ServerKeyTypeForPurchase = 'Basic'|'Plus'|'Pro'|'Trial'; export interface ServerPurchaseCallbackSendPayload { apiVersion?: string; + connectPluginVersion?: string; deviceCount: number; email: string; guid: string; @@ -99,7 +100,6 @@ export interface ServerPurchaseCallbackSendPayload { keyTypeForPurchase: ServerKeyTypeForPurchase; locale: string; osVersion?: string; - pluginVersion?: string; registered: boolean; state: ServerState; site: string;