diff --git a/web/_data/serverState.ts b/web/_data/serverState.ts index e2913d898..fab20351c 100644 --- a/web/_data/serverState.ts +++ b/web/_data/serverState.ts @@ -29,7 +29,8 @@ const randomGuid = `1111-1111-${makeid(4)}-123412341234`; // this guid is regist // EBLACKLISTED1 // EBLACKLISTED2 // ENOCONN -const state: ServerState = 'STARTER'; +const state: ServerState = 'UNLEASHED'; +let regDev = 0; let regTy = ''; switch (state) { // @ts-ignore @@ -39,20 +40,23 @@ switch (state) { // @ts-ignore case 'TRIAL': regTy = 'Trial'; - break; // @ts-ignore case 'BASIC': + regDev = 6; // @ts-ignore case 'PLUS': + regDev = 12; // @ts-ignore case 'PRO': // @ts-ignore case 'STARTER': + regDev = 4; // @ts-ignore case 'UNLEASHED': // @ts-ignore case 'LIFETIME': - regTy = state.charAt(0).toUpperCase() + state.substring(1).toLowerCase(); // title case + if (regDev === 0) regDev = 99999; + if (regTy === '') regTy = state.charAt(0).toUpperCase() + state.substring(1).toLowerCase(); // title case break; } @@ -69,8 +73,8 @@ export const serverState: Server = { // error: 'INVALID', valid: true, }, - connectPluginInstalled: 'dynamix.unraid.net.staging.plg', - // connectPluginInstalled: '', + // connectPluginInstalled: 'dynamix.unraid.net.staging.plg', + connectPluginInstalled: '', description: 'DevServer9000', deviceCount: 12, expireTime, @@ -90,8 +94,8 @@ export const serverState: Server = { regTm: uptime, regTo: 'Zack Spear', regTy, - // regUpdExpAt: oneHourFromNow, - regUpdExpAt: uptime, + // regExp: oneHourFromNow, + regExp: uptime, // "regGuid": "0781-5583-8355-81071A2B0211", site: 'http://localhost:4321', state, diff --git a/web/components/Registration.ce.vue b/web/components/Registration.ce.vue index b82504a68..d55b193b1 100644 --- a/web/components/Registration.ce.vue +++ b/web/components/Registration.ce.vue @@ -56,8 +56,8 @@ const { regTm, regTo, regTy, - regUpdExpAt, - regUpdExpired, + regExp, + regUpdatesExpired, state, stateData, stateDataError, @@ -106,11 +106,12 @@ const items = computed((): RegistrationItemProps[] => { label: t('Registered on'), text: dayjs(regTm.value).format('YYYY-MM-DD HH:mm'), }] : []), - ...(regUpdExpAt.value && (state.value === 'STARTER' || state.value === 'UNLEASHED') ? [{ - error: regUpdExpired.value, + ...(regExp.value && (state.value === 'STARTER' || state.value === 'UNLEASHED') ? [{ + error: regUpdatesExpired.value, label: t('OS Update Eligibility'), component: RegistrationUpgradeExpiration, componentProps: { t: t }, + componentOpacity: !regUpdatesExpired.value, }] : []), ...(state.value === 'EGUID' ? [{ diff --git a/web/components/Registration/UpgradeExpiration.vue b/web/components/Registration/UpgradeExpiration.vue index 45f2fa32b..a7cf923f7 100644 --- a/web/components/Registration/UpgradeExpiration.vue +++ b/web/components/Registration/UpgradeExpiration.vue @@ -13,27 +13,27 @@ const props = defineProps(); const { buildStringFromValues, dateDiff, formatDate } = useTimeHelper(props.t); const serverStore = useServerStore(); -const { regTy, regUpdExpAt, regUpdExpired, state } = storeToRefs(serverStore); +const { regTy, regExp, regUpdatesExpired, state } = storeToRefs(serverStore); const parsedTime = ref(''); -const formattedTime = computed(() => formatDate(regUpdExpAt.value)); +const formattedTime = computed(() => formatDate(regExp.value)); const output = computed(() => { - if (!regUpdExpAt.value) { + if (!regExp.value) { return undefined; } return { - title: regUpdExpired.value - ? props.t('Expired at {0}', [formattedTime.value]) - : props.t('Expires at {0}', [formattedTime.value]), - text: regUpdExpired.value - ? props.t('Expired {0}', [parsedTime.value]) - : props.t('Expires in {0}', [parsedTime.value]), + text: regUpdatesExpired.value + ? props.t('Ineligible since {0}', [formattedTime.value]) + : props.t('Valid until {0}', [formattedTime.value]), + title: regUpdatesExpired.value + ? props.t('Ineligible as of {0}', [parsedTime.value]) + : props.t('Valid for {0}', [parsedTime.value]), }; }); const runDiff = () => { - parsedTime.value = buildStringFromValues(dateDiff((regUpdExpAt.value).toString(), false)); + parsedTime.value = buildStringFromValues(dateDiff((regExp.value).toString(), false)); }; let interval: string | number | NodeJS.Timeout | undefined; @@ -51,10 +51,14 @@ onBeforeUnmount(() => { diff --git a/web/locales/en_US.json b/web/locales/en_US.json index 07bf19935..778433e3b 100644 --- a/web/locales/en_US.json +++ b/web/locales/en_US.json @@ -258,15 +258,22 @@ "License key actions": "License key actions", "License key type": "License key type", "OS Update Eligibility Expiration": "OS Update Eligibility Expiration", - "Expired at {0}": "Expired at {0}", - "Expires at {0}": "Expires at {0}", - "Expired {0}": "Expired {0}", - "Expires in {0}": "Expires in {0}", + "Ineligible since {0}": "Ineligible since {0}", + "Valid until {0}": "Valid until {0}", + "Ineligible as of {0}": "Ineligible as of {0}", + "Valid for {0}": "Valid for {0}", "Renew your license key now": "Renew your license key now", "Renew Key to Enable OS Updates": "Renew Key to Enable OS Updates", "Check Eligibility": "Check Eligibility", "Eligible": "Eligible", "Ineligible": "Ineligible", - "Flash GUID required": "Flash GUID required", - "Unraid {0}": "Unraid {0}" + "Flash GUID required to check replacement status": "Flash GUID required to check replacement status", + "Keyfile required to check replacement status": "Keyfile required to check replacement status", + "Unraid {0}": "Unraid {0}", + "OS Update Eligibility": "OS Update Eligibility", + "Key Replacement Eligibility": "Key Replacement Eligibility", + "Starter": "Starter", + "Unleashed": "Unleashed", + "Lifetime": "Lifetime", + "Renew your license key to continue receiving OS updates.": "Renew your license key to continue receiving OS updates." } diff --git a/web/store/server.ts b/web/store/server.ts index 15ce34884..22cf659b2 100644 --- a/web/store/server.ts +++ b/web/store/server.ts @@ -85,13 +85,14 @@ export const useServerStore = defineStore('server', () => { const name = ref(''); const osVersion = ref(''); const registered = ref(); + const regDev = ref(0); const regGen = ref(0); const regGuid = ref(''); const regTm = ref(0); const regTo = ref(''); const regTy = ref(''); - const regUpdExpAt = ref(0); - const regUpdExpired = computed(() => regUpdExpAt.value < Date.now()); // @todo temp solution until webgui provides + const regExp = ref(0); + const regUpdatesExpired = computed(() => regExp.value < Date.now()); // @todo temp solution until webgui provides const site = ref(''); const state = ref(); const theme = ref(); @@ -141,6 +142,7 @@ export const useServerStore = defineStore('server', () => { name: name.value, osVersion: osVersion.value, registered: registered.value, + regDev: regDev.value, regGen: regGen.value, regGuid: regGuid.value, site: site.value, @@ -375,9 +377,9 @@ export const useServerStore = defineStore('server', () => { case 'BASIC': case 'STARTER': return { - /** @todo for starter we need to have a renew key action */ actions: [ ...(!registered.value && connectPluginInstalled.value ? [signInAction.value] : []), + ...(state.value === 'STARTER' && regUpdatesExpired.value ? [renewAction.value] : []), ...([upgradeAction]), ...(registered.value && connectPluginInstalled.value ? [signOutAction.value] : []), ], @@ -408,9 +410,9 @@ export const useServerStore = defineStore('server', () => { case 'LIFETIME': case 'UNLEASHED': return { - /** @todo for unleashed we need to have a renew key action */ actions: [ ...(!registered.value && connectPluginInstalled.value ? [signInAction.value] : []), + ...(state.value === 'UNLEASHED' && regUpdatesExpired.value ? [renewAction.value] : []), ...(registered.value && connectPluginInstalled.value ? [signOutAction.value] : []), ], humanReadable: state.value === 'PRO' @@ -587,7 +589,8 @@ export const useServerStore = defineStore('server', () => { const trialExtensionEligible = computed(() => !regGen.value || regGen.value < 2); const tooManyDevices = computed((): Error | undefined => { - if (!config.value?.valid && config.value?.error === 'INVALID') { + if ((deviceCount.value !== 0 && regDev.value !== 0 && deviceCount.value > regDev.value) + || !config.value?.valid && config.value?.error === 'INVALID') { return { heading: 'Too Many Devices', level: 'error', @@ -734,7 +737,7 @@ export const useServerStore = defineStore('server', () => { if (typeof data?.regGen !== 'undefined') { regGen.value = data.regGen; } if (typeof data?.regGuid !== 'undefined') { regGuid.value = data.regGuid; } if (typeof data?.regTy !== 'undefined') { regTy.value = data.regTy; } - if (typeof data?.regUpdExpAt !== 'undefined') { regUpdExpAt.value = data.regUpdExpAt; } + if (typeof data?.regExp !== 'undefined') { regExp.value = data.regExp; } if (typeof data?.site !== 'undefined') { site.value = data.site; } if (typeof data?.state !== 'undefined') { state.value = data.state; } if (typeof data?.theme !== 'undefined') { theme.value = data.theme; } @@ -868,13 +871,14 @@ export const useServerStore = defineStore('server', () => { name, osVersion, registered, + regDev, regGen, regGuid, regTm, regTo, regTy, - regUpdExpAt, - regUpdExpired, + regExp, + regUpdatesExpired, site, state, theme, diff --git a/web/types/server.ts b/web/types/server.ts index 42d29fde3..23443fb8b 100644 --- a/web/types/server.ts +++ b/web/types/server.ts @@ -63,13 +63,14 @@ export interface Server { name?: string; osVersion?: string; registered?: boolean; + regDev?: number; regGen?: number; regGuid?: string; regTm?: number; regTo?: string; regTy?: string; - regUpdExpAt?: number; - regUpdExpired?: boolean; + regExp?: number; + regUpdatesExpired?: boolean; site?: string; state?: ServerState; theme?: Theme | undefined;