From 4aa26488889aec3e152c2dbd73998d8b2336b41f Mon Sep 17 00:00:00 2001 From: Christopher Poile Date: Wed, 12 Apr 2023 15:15:24 -0400 Subject: [PATCH 1/2] Prepackage calls v0.15.1 (#22936) --- server/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/Makefile b/server/Makefile index 124b7460e5..3271d4d4b9 100644 --- a/server/Makefile +++ b/server/Makefile @@ -142,7 +142,7 @@ TEMPLATES_DIR=templates PLUGIN_PACKAGES ?= mattermost-plugin-antivirus-v0.1.2 PLUGIN_PACKAGES += mattermost-plugin-autolink-v1.2.2 PLUGIN_PACKAGES += mattermost-plugin-aws-SNS-v1.2.0 -PLUGIN_PACKAGES += mattermost-plugin-calls-v0.15.0 +PLUGIN_PACKAGES += mattermost-plugin-calls-v0.15.1 PLUGIN_PACKAGES += mattermost-plugin-channel-export-v1.0.0 PLUGIN_PACKAGES += mattermost-plugin-confluence-v1.3.0 PLUGIN_PACKAGES += mattermost-plugin-custom-attributes-v1.3.1 From 3089b8b06d2c4169b09aa08f83274b642e46a424 Mon Sep 17 00:00:00 2001 From: Nick Misasi Date: Wed, 12 Apr 2023 15:41:53 -0400 Subject: [PATCH 2/2] [MM-51479] Cloud Reverse Trial Banner Updates (#22852) * License public key to test env for mono-repo * Fix error modal showing on a successful trial request * Adjustments for new banners * stashing * Undo accidental merge * fixes * clean up dev stuff, fix style * Adjust padding on announcement bar button --------- Co-authored-by: Mattermost Build --- model/feature_flags.go | 3 + .../cloud_trial_announcement_bar.tsx | 77 ++++++++++++++----- .../cloud_trial_announcement_bar/index.ts | 3 + webapp/channels/src/i18n/en.json | 3 + .../sass/components/_announcement-bar.scss | 1 + webapp/channels/src/utils/constants.tsx | 2 +- 6 files changed, 69 insertions(+), 20 deletions(-) diff --git a/model/feature_flags.go b/model/feature_flags.go index f835aab621..07bfe6762a 100644 --- a/model/feature_flags.go +++ b/model/feature_flags.go @@ -78,6 +78,8 @@ type FeatureFlags struct { DeprecateCloudFree bool AppsSidebarCategory bool + + CloudReverseTrial bool } func (f *FeatureFlags) SetDefaults() { @@ -108,6 +110,7 @@ func (f *FeatureFlags) SetDefaults() { f.OnboardingAutoShowLinkedBoard = false f.OnboardingTourTips = true f.AppsSidebarCategory = false + f.CloudReverseTrial = false } func (f *FeatureFlags) Plugins() map[string]string { diff --git a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx index e9fcd6ba46..8224463d43 100644 --- a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx +++ b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx @@ -18,6 +18,8 @@ import PricingModal from 'components/pricing_modal'; import {ModalData} from 'types/actions'; +import {AlertCircleOutlineIcon, AlertOutlineIcon} from '@mattermost/compass-icons/components'; + import { Preferences, CloudBanners, @@ -38,6 +40,7 @@ type Props = { daysLeftOnTrial: number; isCloud: boolean; subscription?: Subscription; + reverseTrial: boolean; actions: { savePreferences: (userId: string, preferences: PreferenceType[]) => void; getCloudSubscription: () => void; @@ -132,7 +135,7 @@ class CloudTrialAnnouncementBar extends React.PureComponent { return null; } - const trialMoreThan3DaysMsg = ( + let trialMoreThan7DaysMsg = ( { /> ); - const trialLessThan3DaysMsg = ( + let modalButtonText = t('admin.billing.subscription.cloudTrial.subscribeButton'); + let modalButtonDefaultText = 'Upgrade Now'; + + if (this.props.reverseTrial) { + modalButtonText = t('admin.billing.subscription.cloudReverseTrial.subscribeButton'); + modalButtonDefaultText = 'Review your options'; + } + + if (this.props.reverseTrial) { + const trialEnd = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do'); + trialMoreThan7DaysMsg = ( + + ); + } + + let trialLessThan7DaysMsg = ( { /> ); - const userEndTrialDate = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do YYYY'); - const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm:ss', this.props.currentUser.timezone?.automaticTimezone as string); + if (this.props.reverseTrial) { + trialLessThan7DaysMsg = ( + + ); + } - const trialLastDaysMsg = ( + const userEndTrialDate = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'MMMM Do YYYY'); + const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm', this.props.currentUser.timezone?.automaticTimezone as string); + + let trialLastDaysMsg = ( { /> ); + if (this.props.reverseTrial) { + trialLastDaysMsg = ( + + ); + } + let bannerMessage; let icon; - switch (daysLeftOnTrial) { - case TrialPeriodDays.TRIAL_WARNING_THRESHOLD: - case TrialPeriodDays.TRIAL_2_DAYS: - bannerMessage = trialLessThan3DaysMsg; - break; - case TrialPeriodDays.TRIAL_1_DAY: - case TrialPeriodDays.TRIAL_0_DAYS: + + if (daysLeftOnTrial >= TrialPeriodDays.TRIAL_2_DAYS && daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD) { + bannerMessage = trialLessThan7DaysMsg; + icon = ; + } else if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_1_DAY && daysLeftOnTrial >= TrialPeriodDays.TRIAL_0_DAYS) { bannerMessage = trialLastDaysMsg; - break; - default: - bannerMessage = trialMoreThan3DaysMsg; - icon = ; - break; + icon = ; + } else { + bannerMessage = trialMoreThan7DaysMsg; + icon = ; } const dismissable = this.isDismissable(); @@ -184,8 +223,8 @@ class CloudTrialAnnouncementBar extends React.PureComponent { showCloseButton={dismissable} handleClose={this.handleClose} onButtonClick={this.showModal} - modalButtonText={t('admin.billing.subscription.cloudTrial.subscribeButton')} - modalButtonDefaultText={'Upgrade Now'} + modalButtonText={modalButtonText} + modalButtonDefaultText={modalButtonDefaultText} message={bannerMessage} showLinkAsButton={true} icon={icon} diff --git a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts index 9b6bbfc443..3d7e4fd871 100644 --- a/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts +++ b/webapp/channels/src/components/announcement_bar/cloud_trial_announcement_bar/index.ts @@ -21,6 +21,7 @@ import {Preferences, TrialPeriodDays} from 'utils/constants'; import {getRemainingDaysFromFutureTimestamp} from 'utils/utils'; import CloudTrialAnnouncementBar from './cloud_trial_announcement_bar'; +import {getConfig} from 'mattermost-redux/selectors/entities/admin'; function mapStateToProps(state: GlobalState) { const getCategory = makeGetCategory(); @@ -29,6 +30,7 @@ function mapStateToProps(state: GlobalState) { const isCloud = getLicense(state).Cloud === 'true'; let isFreeTrial = false; let daysLeftOnTrial = 0; + const config = getConfig(state); if (isCloud && subscription?.is_free_trial === 'true') { isFreeTrial = true; @@ -46,6 +48,7 @@ function mapStateToProps(state: GlobalState) { isCloud, subscription, preferences: getCategory(state, Preferences.CLOUD_TRIAL_BANNER), + reverseTrial: Boolean(config.FeatureFlags?.CloudReverseTrial), }; } diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 607a41dfb8..8d285dd78e 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -304,6 +304,9 @@ "admin.billing.subscription.cancelSubscriptionSection.description": "At this time, deleting a workspace can only be done with the help of a customer support representative.", "admin.billing.subscription.cancelSubscriptionSection.title": "Cancel your subscription", "admin.billing.subscription.cloudMonthlyBadge": "Monthly", + "admin.billing.subscription.cloudReverseTrial.daysLeftOnTrial": "{daysLeftOnTrial} days left on your trial. Purchase a plan or contact sales to keep your workspace.", + "admin.billing.subscription.cloudReverseTrial.lastDay": "This is the last day of your trial. Purchase a plan before {userEndTrialHour} or contact sales", + "admin.billing.subscription.cloudReverseTrial.subscribeButton": "Review your options", "admin.billing.subscription.cloudTrial.daysLeftOnTrial": "There are {daysLeftOnTrial} days left on your free trial", "admin.billing.subscription.cloudTrial.lastDay": "This is the last day of your free trial. Your access will expire on {userEndTrialDate} at {userEndTrialHour}.", "admin.billing.subscription.cloudTrial.moreThan3Days": "Your trial has started! There are {daysLeftOnTrial} days left", diff --git a/webapp/channels/src/sass/components/_announcement-bar.scss b/webapp/channels/src/sass/components/_announcement-bar.scss index d06163241f..3869282ffb 100644 --- a/webapp/channels/src/sass/components/_announcement-bar.scss +++ b/webapp/channels/src/sass/components/_announcement-bar.scss @@ -104,6 +104,7 @@ height: 24px; box-sizing: border-box; padding: 4px 8px; + padding-top: 2px; border: 1px solid #fff; margin-left: 8px; background-color: inherit !important; diff --git a/webapp/channels/src/utils/constants.tsx b/webapp/channels/src/utils/constants.tsx index 58627a21ae..4bb243003c 100644 --- a/webapp/channels/src/utils/constants.tsx +++ b/webapp/channels/src/utils/constants.tsx @@ -177,7 +177,7 @@ export const Unique = { export const TrialPeriodDays = { TRIAL_30_DAYS: 30, TRIAL_14_DAYS: 14, - TRIAL_WARNING_THRESHOLD: 3, + TRIAL_WARNING_THRESHOLD: 7, TRIAL_2_DAYS: 2, TRIAL_1_DAY: 1, TRIAL_0_DAYS: 0,