@@ -130,10 +133,17 @@ export const DevtronLicenseCard = ({
appTheme,
handleCopySuccess,
licenseStatusError,
+ isSaasInstance,
}: DevtronLicenseCardProps) => {
- const { bgColor, textColor } = getLicenseColorsAccordingToStatus({ isFreemium, licenseStatus, licenseStatusError })
- const remainingTime = getTTLInHumanReadableFormat(ttl)
- const remainingTimeString = ttl < 0 ? `Expired ${remainingTime} ago` : `${remainingTime} remaining`
+ const isFreeForever = isFreemium && !isSaasInstance
+
+ const { bgColor, textColor } = getLicenseColorsAccordingToStatus({
+ isFreemium,
+ licenseStatus,
+ licenseStatusError,
+ isSaasInstance,
+ })
+
const isThemeDark = appTheme === AppThemeType.dark
const cardRef = useRef
(null)
@@ -178,6 +188,15 @@ export const DevtronLicenseCard = ({
? useMotionTemplate`linear-gradient(55deg, transparent, rgba(122, 127, 131, ${sheenOpacity}) ${sheenPosition}%, transparent)`
: useMotionTemplate`linear-gradient(55deg, transparent, rgba(255, 255, 255, ${sheenOpacity}) ${sheenPosition}%, transparent)`
+ const getRemainingTimeString = () => {
+ if (isFreeForever) {
+ return null
+ }
+
+ const remainingTime = getTTLInHumanReadableFormat(ttl)
+ return ttl < 0 ? `Expired ${remainingTime} ago` : `${remainingTime} remaining`
+ }
+
return (
@@ -217,12 +236,12 @@ export const DevtronLicenseCard = ({
- {isFreemium ? 'VALID FOREVER' : expiryDate}
+ {isFreeForever ? 'VALID FOREVER' : expiryDate}
- {!isFreemium && (
+ {!isFreeForever && (
<>
ยท
- {remainingTimeString}
+ {getRemainingTimeString()}
>
)}
@@ -239,6 +258,7 @@ export const DevtronLicenseCard = ({
isFreemium={isFreemium}
licenseStatusError={licenseStatusError}
licenseStatus={licenseStatus}
+ isFreeForever={isFreeForever}
/>
)
diff --git a/src/Shared/Components/License/index.tsx b/src/Shared/Components/License/index.tsx
index 75fa48db5..52c765f60 100644
--- a/src/Shared/Components/License/index.tsx
+++ b/src/Shared/Components/License/index.tsx
@@ -17,5 +17,6 @@
export { default as ActivateLicenseDialog } from './ActivateLicenseDialog'
export { default as DevtronLicenseCard } from './DevtronLicenseCard'
export { ICDevtronWithBorder, default as InstallationFingerprintInfo } from './License.components'
+export { activateLicense } from './services'
export * from './types'
export { parseDevtronLicenseData, parseDevtronLicenseDTOIntoLicenseCardData } from './utils'
diff --git a/src/Shared/Components/License/types.ts b/src/Shared/Components/License/types.ts
index 38b2be000..4c2d639ae 100644
--- a/src/Shared/Components/License/types.ts
+++ b/src/Shared/Components/License/types.ts
@@ -32,6 +32,7 @@ export type DevtronLicenseCardProps = {
isFreemium: boolean
appTheme: AppThemeType
licenseStatusError: LicenseErrorStruct
+ isSaasInstance: boolean
} & (
| {
licenseKey: string
@@ -45,6 +46,11 @@ export type DevtronLicenseCardProps = {
}
)
+export interface LicenseCardSubTextProps
+ extends Pick {
+ isFreeForever: boolean
+}
+
export type DevtronLicenseInfo = Omit &
Pick
diff --git a/src/Shared/Components/License/utils.tsx b/src/Shared/Components/License/utils.tsx
index 540d14613..423eb9648 100644
--- a/src/Shared/Components/License/utils.tsx
+++ b/src/Shared/Components/License/utils.tsx
@@ -27,16 +27,22 @@ export const getLicenseColorsAccordingToStatus = ({
isFreemium,
licenseStatus,
licenseStatusError,
-}: Pick): {
+ isSaasInstance,
+}: Pick): {
bgColor: string
textColor: string
} => {
if (isFreemium) {
const freemiumLimitReached = licenseStatusError?.code === LicensingErrorCodes.ClusterLimitExceeded
- return freemiumLimitReached
- ? { bgColor: 'var(--R100)', textColor: 'var(--R500)' }
- : { bgColor: 'var(--G100)', textColor: 'var(--G500)' }
+ if (freemiumLimitReached) {
+ return { bgColor: 'var(--R100)', textColor: 'var(--R500)' }
+ }
+
+ if (!isSaasInstance) {
+ return { bgColor: 'var(--G100)', textColor: 'var(--G500)' }
+ }
}
+
switch (licenseStatus) {
case LicenseStatus.ACTIVE:
return { bgColor: 'var(--G100)', textColor: 'var(--G500)' }
@@ -68,16 +74,24 @@ export const parseDevtronLicenseDTOIntoLicenseCardData = => {
const {
isTrial,
- expiry,
- ttl,
+ expiry: onPremExpiry,
+ ttl: onPremTTL,
reminderThreshold,
organisationMetadata,
license,
claimedByUserDetails,
isFreemium,
licenseStatusError,
+ isSaasInstance,
+ timeElapsedSinceCreation,
+ creationTime,
} = licenseDTO || {}
+ // In case of Saas expiry date is 30 days from creation time
+ const expiry = isSaasInstance && creationTime ? moment(creationTime).add(30, 'days').toISOString() : onPremExpiry
+ // For TTL will use timeElapsedSinceCreation to calculate remaining time for Saas license with 30 days validity, since browser time may differ from server time
+ const ttl = isSaasInstance && timeElapsedSinceCreation ? 30 * 24 * 60 * 60 - timeElapsedSinceCreation : onPremTTL
+
return {
enterpriseName: organisationMetadata?.name || 'Devtron Enterprise',
expiryDate: expiry ? moment(expiry).format(DATE_TIME_FORMATS['DD/MM/YYYY']) : '',
@@ -86,6 +100,7 @@ export const parseDevtronLicenseDTOIntoLicenseCardData = = {
[RemoteConnectionType.Direct]: 'Direct Connection',
diff --git a/src/Shared/types.ts b/src/Shared/types.ts
index 76a6859f3..dec0e3820 100644
--- a/src/Shared/types.ts
+++ b/src/Shared/types.ts
@@ -1106,18 +1106,10 @@ export interface LicenseErrorStruct {
userMessage: string
}
-export interface DevtronLicenseBaseDTO {
+export type DevtronLicenseBaseDTO = {
fingerprint: string | null
isTrial: boolean | null
isFreemium: boolean | null
- /**
- * In timestamp format
- */
- expiry: string | null
- /**
- * Can be negative, depicts time left in seconds for license to expire
- */
- ttl: number | null
/**
* Show a reminder after these many DAYS left for license to expire, i.e,
* Show if `ttl` is less than `reminderThreshold` [converted to seconds]
@@ -1128,7 +1120,31 @@ export interface DevtronLicenseBaseDTO {
domain: string | null
} | null
license: string | null
-}
+} & (
+ | {
+ isSaasInstance: true
+ /**
+ * In seconds
+ */
+ timeElapsedSinceCreation: number
+ creationTime: string
+ ttl?: never
+ expiry?: never
+ }
+ | {
+ isSaasInstance?: false
+ timeElapsedSinceCreation?: never
+ creationTime?: never
+ /**
+ * Can be negative, depicts time left in seconds for license to expire
+ */
+ ttl: number | null
+ /**
+ * In timestamp format
+ */
+ expiry: string | null
+ }
+)
export type DevtronLicenseDTO = DevtronLicenseBaseDTO &
(isCentralDashboard extends true
@@ -1141,9 +1157,14 @@ export type DevtronLicenseDTO = Devt
showLicenseData?: never
licenseStatusError?: never
moduleLimits?: never
+ instanceData: {
+ devtronUrl: string
+ devtronPassword: string
+ } | null
}
: {
claimedByUserDetails?: never
+ instanceData?: never
showLicenseData: boolean
licenseStatusError?: LicenseErrorStruct
moduleLimits: {