Skip to content

Commit 6a7483a

Browse files
committed
Refactors license data handling into Pinia store
Moves license related logic and data into a dedicated Pinia store for better state management and component reusability. It also removes the computed properties from the vue component and places them in the store otherwise the computed props no longer work.
1 parent b21ee42 commit 6a7483a

File tree

3 files changed

+134
-126
lines changed

3 files changed

+134
-126
lines changed

src/components/configuration/PlatformLicense.vue

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<script setup lang="ts">
2-
import { computed } from "vue";
32
import ServiceControlAvailable from "../ServiceControlAvailable.vue";
43
import ExclamationMark from "./../../components/ExclamationMark.vue";
54
import convertToWarningLevel from "@/components/configuration/convertToWarningLevel";
@@ -14,25 +13,21 @@ import LoadingSpinner from "../LoadingSpinner.vue";
1413
const configurationStore = useConfigurationStore();
1514
const { configuration } = storeToRefs(configurationStore);
1615
const licenseStore = useLicenseStore();
16+
const { loading, licenseEdition, formattedExpirationDate, formattedUpgradeProtectionExpiration, formattedInstanceName } = storeToRefs(licenseStore);
1717
const { licenseStatus, license } = licenseStore;
18-
19-
const loading = computed(() => {
20-
return !license || license.status === "";
21-
});
2218
</script>
2319

2420
<template>
2521
<section name="license">
2622
<ServiceControlAvailable>
2723
<section>
2824
<LoadingSpinner v-if="loading" />
29-
30-
<template v-if="!loading">
25+
<template v-else>
3126
<div class="box">
3227
<div class="row">
3328
<div class="license-info">
3429
<div>
35-
<b>Platform license type:</b> <span role="note" aria-label="license-type">{{ typeText(license, configuration) }}{{ license.licenseEdition }}</span>
30+
<b>Platform license type:</b> <span role="note" aria-label="license-type">{{ typeText(license, configuration) }}{{ licenseEdition }}</span>
3631
</div>
3732

3833
<template v-if="licenseStatus.isSubscriptionLicense">
@@ -45,7 +40,7 @@ const loading = computed(() => {
4540
'license-expired': licenseStatus.isPlatformExpired,
4641
}"
4742
>
48-
{{ license.formattedExpirationDate }}
43+
{{ formattedExpirationDate }}
4944
<span role="note" aria-label="license-days-left">{{ licenseStatus.subscriptionDaysLeft }}</span>
5045
<exclamation-mark :type="convertToWarningLevel(licenseStatus.warningLevel)" />
5146
</span>
@@ -62,7 +57,7 @@ const loading = computed(() => {
6257
'license-expired': licenseStatus.isPlatformTrialExpired,
6358
}"
6459
>
65-
{{ license.formattedExpirationDate }}
60+
{{ formattedExpirationDate }}
6661
<span role="note" aria-label="license-days-left"> {{ licenseStatus.trialDaysLeft }}</span>
6762
<exclamation-mark :type="convertToWarningLevel(licenseStatus.warningLevel)" />
6863
</span>
@@ -85,7 +80,7 @@ const loading = computed(() => {
8580
'license-expired': licenseStatus.isInvalidDueToUpgradeProtectionExpired,
8681
}"
8782
>
88-
{{ license.formattedUpgradeProtectionExpiration }}
83+
{{ formattedUpgradeProtectionExpiration }}
8984
<span role="note" aria-label="license-days-left">{{ licenseStatus.upgradeDaysLeft }}</span>
9085
<exclamation-mark :type="convertToWarningLevel(licenseStatus.warningLevel)" />
9186
</span>
@@ -98,7 +93,7 @@ const loading = computed(() => {
9893
</template>
9994
<div>
10095
<b>ServiceControl instance:</b>
101-
{{ license.formattedInstanceName }}
96+
{{ formattedInstanceName }}
10297
</div>
10398
<ul class="license-install-info">
10499
<li>

src/stores/LicenseStore.ts

Lines changed: 126 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,26 @@
11
import { acceptHMRUpdate, defineStore } from "pinia";
2-
import { computed, ComputedRef, reactive, UnwrapNestedRefs } from "vue";
2+
import { computed, reactive, ref } from "vue";
33
import { useServiceControlStore } from "./ServiceControlStore";
44
import LicenseInfo, { LicenseStatus } from "@/resources/LicenseInfo";
55
import { LicenseWarningLevel } from "@/composables/LicenseStatus";
66
import { useGetDayDiffFromToday } from "@/composables/formatter";
77

8-
interface License extends LicenseInfo {
9-
licenseEdition: ComputedRef<string>;
10-
formattedExpirationDate: ComputedRef<string>;
11-
formattedUpgradeProtectionExpiration: ComputedRef<string>;
12-
formattedInstanceName: ComputedRef<string>;
13-
}
14-
15-
class emptyLicense implements License {
16-
edition = "";
17-
expiration_date = "";
18-
upgrade_protection_expiration = "";
19-
license_type = "";
20-
instance_name = "";
21-
trial_license = true;
22-
registered_to = "";
23-
status = "";
24-
license_status = LicenseStatus.Unavailable;
25-
license_extension_url = "";
26-
licenseEdition = computed(() => {
27-
return `${this.license_type}${this.edition ? `, ${this.edition}` : ""}`;
28-
});
29-
formattedInstanceName = computed(() => {
30-
return this.instance_name || "Upgrade ServiceControl to v3.4.0+ to see more information about this license";
31-
});
32-
formattedExpirationDate = computed(() => {
33-
return this.expiration_date ? new Date(this.expiration_date.replace("Z", "")).toLocaleDateString() : "";
34-
});
35-
formattedUpgradeProtectionExpiration = computed(() => {
36-
return this.upgrade_protection_expiration ? new Date(this.upgrade_protection_expiration.replace("Z", "")).toLocaleDateString() : "";
37-
});
38-
}
39-
408
export const useLicenseStore = defineStore("LicenseStore", () => {
419
const serviceControlStore = useServiceControlStore();
4210

43-
const license = reactive<License>(new emptyLicense());
11+
const license = reactive<LicenseInfo>({
12+
edition: "",
13+
expiration_date: "",
14+
upgrade_protection_expiration: "",
15+
license_type: "",
16+
instance_name: "",
17+
trial_license: true,
18+
registered_to: "",
19+
status: "",
20+
license_status: LicenseStatus.Unavailable,
21+
license_extension_url: "",
22+
});
23+
4424
const licenseStatus = reactive({
4525
isSubscriptionLicense: false,
4626
isUpgradeProtectionLicense: false,
@@ -59,37 +39,61 @@ export const useLicenseStore = defineStore("LicenseStore", () => {
5939
licenseExtensionUrl: "",
6040
});
6141

42+
const loading = ref(false);
43+
44+
// Computed properties for license formatting
45+
const licenseEdition = computed(() => {
46+
return `${license.license_type}${license.edition ? `, ${license.edition}` : ""}`;
47+
});
48+
49+
const formattedInstanceName = computed(() => {
50+
return license.instance_name || "Upgrade ServiceControl to v3.4.0+ to see more information about this license";
51+
});
52+
53+
const formattedExpirationDate = computed(() => {
54+
return license.expiration_date ? new Date(license.expiration_date.replace("Z", "")).toLocaleDateString() : "";
55+
});
56+
57+
const formattedUpgradeProtectionExpiration = computed(() => {
58+
return license.upgrade_protection_expiration ? new Date(license.upgrade_protection_expiration.replace("Z", "")).toLocaleDateString() : "";
59+
});
60+
6261
async function refresh() {
63-
const lic = await getLicense();
64-
if (lic === null) {
65-
return;
62+
loading.value = true;
63+
try {
64+
const lic = await getLicense();
65+
if (lic === null) {
66+
return;
67+
}
68+
license.license_type = lic.license_type;
69+
license.expiration_date = lic.expiration_date;
70+
license.trial_license = lic.trial_license;
71+
license.edition = lic.edition;
72+
license.license_status = lic.license_status;
73+
license.instance_name = lic.instance_name;
74+
license.registered_to = lic.registered_to;
75+
license.status = lic.status;
76+
license.license_extension_url = lic.license_extension_url ?? "https://particular.net/extend-your-trial?p=servicepulse";
77+
license.upgrade_protection_expiration = lic.upgrade_protection_expiration;
78+
79+
licenseStatus.isSubscriptionLicense = isSubscriptionLicense();
80+
licenseStatus.isUpgradeProtectionLicense = isUpgradeProtectionLicense();
81+
licenseStatus.isTrialLicense = license.trial_license;
82+
licenseStatus.isPlatformExpired = license.license_status === LicenseStatus.InvalidDueToExpiredSubscription;
83+
licenseStatus.isPlatformTrialExpiring = license.license_status === LicenseStatus.ValidWithExpiringTrial;
84+
licenseStatus.isPlatformTrialExpired = license.license_status === LicenseStatus.InvalidDueToExpiredTrial;
85+
licenseStatus.isInvalidDueToUpgradeProtectionExpired = license.license_status === LicenseStatus.InvalidDueToExpiredUpgradeProtection;
86+
licenseStatus.isValidWithExpiredUpgradeProtection = license.license_status === LicenseStatus.ValidWithExpiredUpgradeProtection;
87+
licenseStatus.isValidWithExpiringUpgradeProtection = license.license_status === LicenseStatus.ValidWithExpiringUpgradeProtection;
88+
licenseStatus.upgradeDaysLeft = getUpgradeDaysLeft();
89+
licenseStatus.subscriptionDaysLeft = getSubscriptionDaysLeft();
90+
licenseStatus.trialDaysLeft = getTrialDaysLeft();
91+
licenseStatus.warningLevel = getLicenseWarningLevel();
92+
licenseStatus.isExpired = licenseStatus.isPlatformExpired || licenseStatus.isPlatformTrialExpired || licenseStatus.isInvalidDueToUpgradeProtectionExpired;
93+
licenseStatus.licenseExtensionUrl = license.license_extension_url;
94+
} finally {
95+
loading.value = false;
6696
}
67-
license.license_type = lic.license_type;
68-
license.expiration_date = lic.expiration_date;
69-
license.trial_license = lic.trial_license;
70-
license.edition = lic.edition;
71-
license.license_status = lic.license_status;
72-
license.instance_name = lic.instance_name;
73-
license.registered_to = lic.registered_to;
74-
license.status = lic.status;
75-
license.license_extension_url = lic.license_extension_url ?? "https://particular.net/extend-your-trial?p=servicepulse";
76-
license.upgrade_protection_expiration = lic.upgrade_protection_expiration;
77-
78-
licenseStatus.isSubscriptionLicense = isSubscriptionLicense(license);
79-
licenseStatus.isUpgradeProtectionLicense = isUpgradeProtectionLicense(license);
80-
licenseStatus.isTrialLicense = license.trial_license;
81-
licenseStatus.isPlatformExpired = license.license_status === LicenseStatus.InvalidDueToExpiredSubscription;
82-
licenseStatus.isPlatformTrialExpiring = license.license_status === LicenseStatus.ValidWithExpiringTrial;
83-
licenseStatus.isPlatformTrialExpired = license.license_status === LicenseStatus.InvalidDueToExpiredTrial;
84-
licenseStatus.isInvalidDueToUpgradeProtectionExpired = license.license_status === LicenseStatus.InvalidDueToExpiredUpgradeProtection;
85-
licenseStatus.isValidWithExpiredUpgradeProtection = license.license_status === LicenseStatus.ValidWithExpiredUpgradeProtection;
86-
licenseStatus.isValidWithExpiringUpgradeProtection = license.license_status === LicenseStatus.ValidWithExpiringUpgradeProtection;
87-
licenseStatus.upgradeDaysLeft = getUpgradeDaysLeft(license);
88-
licenseStatus.subscriptionDaysLeft = getSubscriptionDaysLeft(license);
89-
licenseStatus.trialDaysLeft = getTrialDaysLeft(license);
90-
licenseStatus.warningLevel = getLicenseWarningLevel(license.license_status);
91-
licenseStatus.isExpired = licenseStatus.isPlatformExpired || licenseStatus.isPlatformTrialExpired || licenseStatus.isInvalidDueToUpgradeProtectionExpired;
92-
licenseStatus.licenseExtensionUrl = license.license_extension_url;
9397
}
9498

9599
async function getLicense() {
@@ -102,67 +106,76 @@ export const useLicenseStore = defineStore("LicenseStore", () => {
102106
}
103107
}
104108

105-
return { refresh, license, licenseStatus };
106-
});
109+
function getLicenseWarningLevel() {
110+
switch (license.license_status) {
111+
case LicenseStatus.InvalidDueToExpiredTrial:
112+
case LicenseStatus.InvalidDueToExpiredSubscription:
113+
case LicenseStatus.InvalidDueToExpiredUpgradeProtection:
114+
return LicenseWarningLevel.Danger;
115+
case LicenseStatus.ValidWithExpiringUpgradeProtection:
116+
case LicenseStatus.ValidWithExpiringTrial:
117+
case LicenseStatus.ValidWithExpiredUpgradeProtection:
118+
case LicenseStatus.ValidWithExpiringSubscription:
119+
return LicenseWarningLevel.Warning;
120+
default:
121+
return LicenseWarningLevel.None;
122+
}
123+
}
107124

108-
function getLicenseWarningLevel(licenseStatus: LicenseStatus) {
109-
switch (licenseStatus) {
110-
case LicenseStatus.InvalidDueToExpiredTrial:
111-
case LicenseStatus.InvalidDueToExpiredSubscription:
112-
case LicenseStatus.InvalidDueToExpiredUpgradeProtection:
113-
return LicenseWarningLevel.Danger;
114-
case LicenseStatus.ValidWithExpiringUpgradeProtection:
115-
case LicenseStatus.ValidWithExpiringTrial:
116-
case LicenseStatus.ValidWithExpiredUpgradeProtection:
117-
case LicenseStatus.ValidWithExpiringSubscription:
118-
return LicenseWarningLevel.Warning;
119-
default:
120-
return LicenseWarningLevel.None;
125+
function isUpgradeProtectionLicense() {
126+
return license.upgrade_protection_expiration !== undefined && license.upgrade_protection_expiration !== "";
121127
}
122-
}
123128

124-
function isUpgradeProtectionLicense(license: UnwrapNestedRefs<License>) {
125-
return license.upgrade_protection_expiration !== undefined && license.upgrade_protection_expiration !== "";
126-
}
129+
function isSubscriptionLicense() {
130+
return license.expiration_date !== undefined && license.expiration_date !== "" && !license.trial_license;
131+
}
127132

128-
function isSubscriptionLicense(license: UnwrapNestedRefs<License>) {
129-
return license.expiration_date !== undefined && license.expiration_date !== "" && !license.trial_license;
130-
}
133+
function getSubscriptionDaysLeft() {
134+
if (license.license_status === LicenseStatus.InvalidDueToExpiredSubscription) return " - expired";
131135

132-
function getSubscriptionDaysLeft(license: UnwrapNestedRefs<License>) {
133-
if (license.license_status === LicenseStatus.InvalidDueToExpiredSubscription) return " - expired";
136+
const isExpiring = license.license_status === LicenseStatus.ValidWithExpiringSubscription;
137+
return getExpiringText(isExpiring, license.expiration_date);
138+
}
134139

135-
const isExpiring = license.license_status === LicenseStatus.ValidWithExpiringSubscription;
136-
return getExpiringText(isExpiring, license.expiration_date);
137-
}
140+
function getTrialDaysLeft() {
141+
if (license.license_status === LicenseStatus.InvalidDueToExpiredTrial) return " - expired";
138142

139-
function getTrialDaysLeft(license: UnwrapNestedRefs<License>) {
140-
if (license.license_status === LicenseStatus.InvalidDueToExpiredTrial) return " - expired";
143+
const isExpiring = license.license_status === LicenseStatus.ValidWithExpiringTrial;
144+
return getExpiringText(isExpiring, license.expiration_date);
145+
}
141146

142-
const isExpiring = license.license_status === LicenseStatus.ValidWithExpiringTrial;
143-
return getExpiringText(isExpiring, license.expiration_date);
144-
}
147+
function getExpiringText(isExpiring: boolean, expirationDate: string) {
148+
const expiringIn = useGetDayDiffFromToday(expirationDate);
149+
if (isNaN(expiringIn)) return "";
150+
if (!isExpiring) return ` - ${expiringIn} days left`;
151+
if (expiringIn === 0) return " - expiring today";
152+
if (expiringIn === 1) return " - expiring tomorrow";
153+
return ` - expiring in ${expiringIn} days`;
154+
}
145155

146-
function getExpiringText(isExpiring: boolean, expirationDate: string) {
147-
const expiringIn = useGetDayDiffFromToday(expirationDate);
148-
if (isNaN(expiringIn)) return "";
149-
if (!isExpiring) return ` - ${expiringIn} days left`;
150-
if (expiringIn === 0) return " - expiring today";
151-
if (expiringIn === 1) return " - expiring tomorrow";
152-
return ` - expiring in ${expiringIn} days`;
153-
}
156+
function getUpgradeDaysLeft() {
157+
if (license.license_status === LicenseStatus.InvalidDueToExpiredUpgradeProtection) return " - expired";
154158

155-
function getUpgradeDaysLeft(license: UnwrapNestedRefs<License>) {
156-
if (license.license_status === LicenseStatus.InvalidDueToExpiredUpgradeProtection) return " - expired";
159+
const expiringIn = useGetDayDiffFromToday(license.upgrade_protection_expiration);
160+
//TODO: can this be unified with the function above? Text is currently similar but not identical.
161+
if (isNaN(expiringIn)) return "";
162+
if (expiringIn <= 0) return " - expired";
163+
if (expiringIn === 0) return " - expiring today";
164+
if (expiringIn === 1) return " - 1 day left";
165+
return " - " + expiringIn + " days left";
166+
}
157167

158-
const expiringIn = useGetDayDiffFromToday(license.upgrade_protection_expiration);
159-
//TODO: can this be unified with the function above? Text is currently similar but not identical.
160-
if (isNaN(expiringIn)) return "";
161-
if (expiringIn <= 0) return " - expired";
162-
if (expiringIn === 0) return " - expiring today";
163-
if (expiringIn === 1) return " - 1 day left";
164-
return " - " + expiringIn + " days left";
165-
}
168+
return {
169+
refresh,
170+
license,
171+
licenseStatus,
172+
loading,
173+
licenseEdition,
174+
formattedInstanceName,
175+
formattedExpirationDate,
176+
formattedUpgradeProtectionExpiration,
177+
};
178+
});
166179

167180
if (import.meta.hot) {
168181
import.meta.hot.accept(acceptHMRUpdate(useLicenseStore, import.meta.hot));

test/specs/configuration/questions/licenseExpiryDaysLeft.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import { screen } from "@testing-library/vue";
22

33
export async function licenseExpiryDaysLeft() {
44
//TODO: determine why timeout had to be increased
5-
const licenseExpiryDaysLeftElement = await screen.findByRole("note", { name: "license-days-left" }, { timeout: 5000 });
5+
const licenseExpiryDaysLeftElement = await screen.findByRole("note", { name: "license-days-left" });
66
return licenseExpiryDaysLeftElement;
77
}

0 commit comments

Comments
 (0)