From 380542d12845d41f7d8ff32643b7f7056675ebe7 Mon Sep 17 00:00:00 2001 From: Rory Powell Date: Tue, 20 Sep 2022 10:15:28 +0100 Subject: [PATCH] Wrap licensing banners and modals in feature flag, disable logo --- .../portal/licensing/LicensingOverlays.svelte | 8 +- .../builder/src/stores/portal/licensing.js | 138 +++++++++--------- packages/client/src/licensing/constants.js | 1 + packages/client/src/licensing/features.js | 5 +- 4 files changed, 82 insertions(+), 70 deletions(-) diff --git a/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte b/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte index 8431b860e8..736aac862f 100644 --- a/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte +++ b/packages/builder/src/components/portal/licensing/LicensingOverlays.svelte @@ -8,6 +8,7 @@ import { ExpiringKeys } from "./constants" import { getBanners } from "./licensingBanners" import { banner } from "@budibase/bbui" + import { FEATURE_FLAGS, isEnabled } from "../../../helpers/featureFlags" const oneDayInSeconds = 86400 @@ -81,7 +82,12 @@ } } - $: if (userLoaded && licensingLoaded && loaded) { + $: if ( + userLoaded && + licensingLoaded && + loaded && + isEnabled(FEATURE_FLAGS.LICENSING) + ) { queuedModals = processModals() queuedBanners = getBanners() showNextModal() diff --git a/packages/builder/src/stores/portal/licensing.js b/packages/builder/src/stores/portal/licensing.js index 9d63a9edb5..e2b4570302 100644 --- a/packages/builder/src/stores/portal/licensing.js +++ b/packages/builder/src/stores/portal/licensing.js @@ -3,10 +3,12 @@ import { API } from "api" import { auth } from "stores/portal" import { Constants } from "@budibase/frontend-core" import { StripeStatus } from "components/portal/licensing/constants" +import { FEATURE_FLAGS, isEnabled } from "../../helpers/featureFlags" export const createLicensingStore = () => { const DEFAULT = { plans: {}, + usageMetrics: {}, } const oneDayInMilliseconds = 86400000 @@ -27,78 +29,80 @@ export const createLicensingStore = () => { }) }, getUsageMetrics: async () => { - const quota = get(store).quotaUsage - const license = get(auth).user.license - const now = new Date() + if (isEnabled(FEATURE_FLAGS.LICENSING)) { + const quota = get(store).quotaUsage + const license = get(auth).user.license + const now = new Date() - const getMetrics = (keys, license, quota) => { - if (!license || !quota || !keys) { - return {} + const getMetrics = (keys, license, quota) => { + if (!license || !quota || !keys) { + return {} + } + return keys.reduce((acc, key) => { + const quotaLimit = license[key].value + const quotaUsed = (quota[key] / quotaLimit) * 100 + acc[key] = quotaLimit > -1 ? Math.round(quotaUsed) : -1 + return acc + }, {}) } - return keys.reduce((acc, key) => { - const quotaLimit = license[key].value - const quotaUsed = (quota[key] / quotaLimit) * 100 - acc[key] = quotaLimit > -1 ? Math.round(quotaUsed) : -1 - return acc - }, {}) - } - const monthlyMetrics = getMetrics( - ["dayPasses", "queries", "automations"], - license.quotas.usage.monthly, - quota.monthly.current - ) - const staticMetrics = getMetrics( - ["apps", "rows"], - license.quotas.usage.static, - quota.usageQuota - ) - - const getDaysBetween = (dateStart, dateEnd) => { - return dateEnd > dateStart - ? Math.round( - (dateEnd.getTime() - dateStart.getTime()) / oneDayInMilliseconds - ) - : 0 - } - - const quotaResetDate = new Date(quota.quotaReset) - const quotaResetDaysRemaining = getDaysBetween(now, quotaResetDate) - - const accountDowngraded = - license?.billing?.subscription?.downgradeAt && - license?.billing?.subscription?.downgradeAt <= now.getTime() && - license?.billing?.subscription?.status === StripeStatus.PAST_DUE && - license?.plan.type === Constants.PlanType.FREE - - const pastDueAtMilliseconds = license?.billing?.subscription?.pastDueAt - const downgradeAtMilliseconds = - license?.billing?.subscription?.downgradeAt - let pastDueDaysRemaining - let pastDueEndDate - - if (pastDueAtMilliseconds && downgradeAtMilliseconds) { - pastDueEndDate = new Date(downgradeAtMilliseconds) - pastDueDaysRemaining = getDaysBetween( - new Date(pastDueAtMilliseconds), - pastDueEndDate + const monthlyMetrics = getMetrics( + ["dayPasses", "queries", "automations"], + license.quotas.usage.monthly, + quota.monthly.current + ) + const staticMetrics = getMetrics( + ["apps", "rows"], + license.quotas.usage.static, + quota.usageQuota ) - } - store.update(state => { - return { - ...state, - usageMetrics: { ...monthlyMetrics, ...staticMetrics }, - quotaResetDaysRemaining, - quotaResetDate, - accountDowngraded, - accountPastDue: pastDueAtMilliseconds != null, - pastDueEndDate, - pastDueDaysRemaining, - isFreePlan: () => { - return license?.plan.type === Constants.PlanType.FREE - }, + const getDaysBetween = (dateStart, dateEnd) => { + return dateEnd > dateStart + ? Math.round( + (dateEnd.getTime() - dateStart.getTime()) / oneDayInMilliseconds + ) + : 0 } - }) + + const quotaResetDate = new Date(quota.quotaReset) + const quotaResetDaysRemaining = getDaysBetween(now, quotaResetDate) + + const accountDowngraded = + license?.billing?.subscription?.downgradeAt && + license?.billing?.subscription?.downgradeAt <= now.getTime() && + license?.billing?.subscription?.status === StripeStatus.PAST_DUE && + license?.plan.type === Constants.PlanType.FREE + + const pastDueAtMilliseconds = license?.billing?.subscription?.pastDueAt + const downgradeAtMilliseconds = + license?.billing?.subscription?.downgradeAt + let pastDueDaysRemaining + let pastDueEndDate + + if (pastDueAtMilliseconds && downgradeAtMilliseconds) { + pastDueEndDate = new Date(downgradeAtMilliseconds) + pastDueDaysRemaining = getDaysBetween( + new Date(pastDueAtMilliseconds), + pastDueEndDate + ) + } + + store.update(state => { + return { + ...state, + usageMetrics: { ...monthlyMetrics, ...staticMetrics }, + quotaResetDaysRemaining, + quotaResetDate, + accountDowngraded, + accountPastDue: pastDueAtMilliseconds != null, + pastDueEndDate, + pastDueDaysRemaining, + isFreePlan: () => { + return license?.plan.type === Constants.PlanType.FREE + }, + } + }) + } }, } diff --git a/packages/client/src/licensing/constants.js b/packages/client/src/licensing/constants.js index dd6e8eb405..57454bc37a 100644 --- a/packages/client/src/licensing/constants.js +++ b/packages/client/src/licensing/constants.js @@ -1,5 +1,6 @@ export const PlanType = { FREE: "free", + PRO: "pro", TEAM: "team", BUSINESS: "business", ENTERPRISE: "enterprise", diff --git a/packages/client/src/licensing/features.js b/packages/client/src/licensing/features.js index 1f0d4a4870..98e03b77d2 100644 --- a/packages/client/src/licensing/features.js +++ b/packages/client/src/licensing/features.js @@ -1,5 +1,6 @@ -import { isFreePlan } from "./utils.js" +// import { isFreePlan } from "./utils.js" export const logoEnabled = () => { - return isFreePlan() + return false + // return isFreePlan() }