From 45373f655f68fdd0b320cde175b6108454ad4731 Mon Sep 17 00:00:00 2001 From: Vijay A Date: Sat, 17 Jul 2021 20:32:22 +0530 Subject: Removed Franz paid plans features: - serviceLimit - planSelection - trialStatusBar and other Franz features that were for different tiers of subscription. --- src/components/TrialActivationInfoBar.js | 94 ------- src/components/auth/Pricing.js | 270 --------------------- src/components/layout/AppLayout.js | 10 - .../services/content/ServiceRestricted.js | 78 ------ src/components/services/content/Services.js | 5 +- .../settings/account/AccountDashboard.js | 147 ++--------- .../settings/navigation/SettingsNavigation.js | 16 +- .../settings/recipes/RecipesDashboard.js | 58 ++--- .../settings/services/EditServiceForm.js | 124 ++++------ .../settings/services/ServicesDashboard.js | 2 - .../settings/settings/EditSettingsForm.js | 29 +-- src/components/settings/team/TeamDashboard.js | 39 +-- src/components/subscription/SubscriptionForm.js | 78 ------ src/components/subscription/SubscriptionPopup.js | 84 ------- src/components/subscription/TrialForm.js | 115 --------- src/components/ui/ActivateTrialButton/index.js | 107 -------- src/components/ui/FeatureList.js | 81 ++----- src/components/ui/PremiumFeatureContainer/index.js | 101 -------- .../ui/PremiumFeatureContainer/styles.js | 34 --- src/components/ui/UpgradeButton/index.js | 83 ------- 20 files changed, 118 insertions(+), 1437 deletions(-) delete mode 100644 src/components/TrialActivationInfoBar.js delete mode 100644 src/components/auth/Pricing.js delete mode 100644 src/components/services/content/ServiceRestricted.js delete mode 100644 src/components/subscription/SubscriptionForm.js delete mode 100644 src/components/subscription/SubscriptionPopup.js delete mode 100644 src/components/subscription/TrialForm.js delete mode 100644 src/components/ui/ActivateTrialButton/index.js delete mode 100644 src/components/ui/PremiumFeatureContainer/index.js delete mode 100644 src/components/ui/PremiumFeatureContainer/styles.js delete mode 100644 src/components/ui/UpgradeButton/index.js (limited to 'src/components') diff --git a/src/components/TrialActivationInfoBar.js b/src/components/TrialActivationInfoBar.js deleted file mode 100644 index 77ab97565..000000000 --- a/src/components/TrialActivationInfoBar.js +++ /dev/null @@ -1,94 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { defineMessages, intlShape } from 'react-intl'; -import ms from 'ms'; -import injectSheet from 'react-jss'; -import classnames from 'classnames'; - -import InfoBar from './ui/InfoBar'; - -const messages = defineMessages({ - message: { - id: 'infobar.trialActivated', - defaultMessage: '!!!Your trial was successfully activated. Happy messaging!', - }, -}); - -const styles = { - notification: { - height: 'auto', - position: 'absolute', - top: -50, - transition: 'top 0.3s', - zIndex: 500, - width: 'calc(100% - 300px)', - }, - show: { - top: 0, - }, -}; - -@injectSheet(styles) -class TrialActivationInfoBar extends Component { - static propTypes = { - // eslint-disable-next-line - classes: PropTypes.object.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - state = { - showing: false, - removed: false, - } - - componentDidMount() { - setTimeout(() => { - this.setState({ - showing: true, - }); - }, 0); - - setTimeout(() => { - this.setState({ - showing: false, - }); - }, ms('6s')); - - setTimeout(() => { - this.setState({ - removed: true, - }); - }, ms('7s')); - } - - render() { - const { classes } = this.props; - const { showing, removed } = this.state; - const { intl } = this.context; - - if (removed) return null; - - return ( -
- - - {intl.formatMessage(messages.message)} - -
- ); - } -} - -export default TrialActivationInfoBar; diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js deleted file mode 100644 index 2fcabe54d..000000000 --- a/src/components/auth/Pricing.js +++ /dev/null @@ -1,270 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import injectSheet from 'react-jss'; -import { H2, Loader } from '@meetfranz/ui'; -import classnames from 'classnames'; - -import { Button } from '@meetfranz/forms'; -import { FeatureItem } from '../ui/FeatureItem'; -import { FeatureList } from '../ui/FeatureList'; - -const messages = defineMessages({ - headline: { - id: 'pricing.trial.headline.pro', - defaultMessage: '!!!Hi {name}, welcome to Franz', - }, - specialTreat: { - id: 'pricing.trial.intro.specialTreat', - defaultMessage: '!!!We have a special treat for you.', - }, - tryPro: { - id: 'pricing.trial.intro.tryPro', - defaultMessage: '!!!Enjoy the full Franz Professional experience completely free for 14 days.', - }, - happyMessaging: { - id: 'pricing.trial.intro.happyMessaging', - defaultMessage: '!!!Happy messaging,', - }, - noStringsAttachedHeadline: { - id: 'pricing.trial.terms.headline', - defaultMessage: '!!!No strings attached', - }, - noCreditCard: { - id: 'pricing.trial.terms.noCreditCard', - defaultMessage: '!!!No credit card required', - }, - automaticTrialEnd: { - id: 'pricing.trial.terms.automaticTrialEnd', - defaultMessage: '!!!Your free trial ends automatically after 14 days', - }, - trialWorth: { - id: 'pricing.trial.terms.trialWorth', - defaultMessage: '!!!Free trial (normally {currency}{price} per month)', - }, - activationError: { - id: 'pricing.trial.error', - defaultMessage: '!!!Sorry, we could not activate your trial!', - }, - ctaAccept: { - id: 'pricing.trial.cta.accept', - defaultMessage: '!!!Start my 14-day Franz Professional Trial ', - }, - ctaStart: { - id: 'pricing.trial.cta.start', - defaultMessage: '!!!Start using Franz', - }, - ctaSkip: { - id: 'pricing.trial.cta.skip', - defaultMessage: '!!!Continue to Ferdi', - }, - featuresHeadline: { - id: 'pricing.trial.features.headline', - defaultMessage: '!!!Franz Professional includes:', - }, -}); - -const styles = theme => ({ - root: { - width: '500px !important', - textAlign: 'center', - padding: 20, - zIndex: 100, - - '& h1': { - }, - }, - container: { - position: 'relative', - marginLeft: -150, - }, - welcomeOffer: { - textAlign: 'center', - fontWeight: 'bold', - marginBottom: '6 !important', - }, - keyTerms: { - textAlign: 'center', - }, - content: { - position: 'relative', - zIndex: 20, - }, - featureContainer: { - width: 300, - position: 'absolute', - left: 'calc(100% / 2 + 250px)', - marginTop: 20, - background: theme.signup.pricing.feature.background, - height: 'auto', - padding: 20, - borderTopRightRadius: theme.borderRadius, - borderBottomRightRadius: theme.borderRadius, - zIndex: 10, - }, - featureItem: { - borderBottom: [1, 'solid', theme.signup.pricing.feature.border], - }, - cta: { - marginTop: 40, - width: '100%', - }, - skipLink: { - textAlign: 'center', - marginTop: 10, - }, - error: { - margin: [20, 0, 0], - color: theme.styleTypes.danger.accent, - }, - priceContainer: { - display: 'flex', - justifyContent: 'space-evenly', - margin: [10, 0, 15], - }, - price: { - '& sup': { - verticalAlign: 14, - fontSize: 20, - }, - }, - figure: { - fontSize: 40, - }, - regularPrice: { - position: 'relative', - - '&:before': { - content: '" "', - position: 'absolute', - width: '130%', - height: 1, - top: 14, - left: -12, - borderBottom: [3, 'solid', 'red'], - transform: 'rotateZ(-20deg)', - }, - }, -}); - -export default @injectSheet(styles) @observer class Signup extends Component { - static propTypes = { - onSubmit: PropTypes.func.isRequired, - isLoadingRequiredData: PropTypes.bool.isRequired, - isActivatingTrial: PropTypes.bool.isRequired, - trialActivationError: PropTypes.bool.isRequired, - canSkipTrial: PropTypes.bool.isRequired, - classes: PropTypes.object.isRequired, - currency: PropTypes.string.isRequired, - price: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { - onSubmit, - isLoadingRequiredData, - isActivatingTrial, - trialActivationError, - canSkipTrial, - classes, - currency, - price, - name, - } = this.props; - const { intl } = this.context; - - const [intPart, fractionPart] = (price).toString().split('.'); - - return ( - <> -
-
- {isLoadingRequiredData ? : ( - - )} -

{intl.formatMessage(messages.headline, { name })}

-
-

- {intl.formatMessage(messages.specialTreat)} -
-

-

- {intl.formatMessage(messages.tryPro)} -
-

-

- {intl.formatMessage(messages.happyMessaging)} -

-

- Stefan Malzner -

-
-
-

- - {currency} - {intPart} - - {fractionPart} -

-

- - {currency} - 0 - - 00 -

-
-
-

- {intl.formatMessage(messages.noStringsAttachedHeadline)} -

-
    - - - -
-
- {trialActivationError && ( -

{intl.formatMessage(messages.activationError)}

- )} -
-
-

- {intl.formatMessage(messages.featuresHeadline)} -

- -
- - ); - } -} diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index a60270a6f..7e4d0e53e 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -19,10 +19,7 @@ import { isWindows } from '../../environment'; import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; import { workspaceStore } from '../../features/workspaces'; import AppUpdateInfoBar from '../AppUpdateInfoBar'; -import TrialActivationInfoBar from '../TrialActivationInfoBar'; import Todos from '../../features/todos/containers/TodosScreen'; -import PlanSelection from '../../features/planSelection/containers/PlanSelectionScreen'; -import TrialStatusBar from '../../features/trialStatusBar/containers/TrialStatusBarScreen'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -79,7 +76,6 @@ class AppLayout extends Component { areRequiredRequestsSuccessful: PropTypes.bool.isRequired, retryRequiredRequests: PropTypes.func.isRequired, areRequiredRequestsLoading: PropTypes.bool.isRequired, - hasActivatedTrial: PropTypes.bool.isRequired, }; state = { @@ -115,7 +111,6 @@ class AppLayout extends Component { areRequiredRequestsSuccessful, retryRequiredRequests, areRequiredRequestsLoading, - hasActivatedTrial, } = this.props; const { intl } = this.context; @@ -148,9 +143,6 @@ class AppLayout extends Component { /> ))} - {hasActivatedTrial && ( - - )} {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( {services} {children} - - ); diff --git a/src/components/services/content/ServiceRestricted.js b/src/components/services/content/ServiceRestricted.js deleted file mode 100644 index 4b8d926aa..000000000 --- a/src/components/services/content/ServiceRestricted.js +++ /dev/null @@ -1,78 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; - -import { serviceLimitStore } from '../../../features/serviceLimit'; -import Button from '../../ui/Button'; -import { RESTRICTION_TYPES } from '../../../models/Service'; - -const messages = defineMessages({ - headlineServiceLimit: { - id: 'service.restrictedHandler.serviceLimit.headline', - defaultMessage: '!!!You have reached your service limit.', - }, - textServiceLimit: { - id: 'service.restrictedHandler.serviceLimit.text', - defaultMessage: '!!!Please upgrade your account to use more than {count} services.', - }, - headlineCustomUrl: { - id: 'service.restrictedHandler.customUrl.headline', - defaultMessage: '!!!Franz Professional Plan required', - }, - textCustomUrl: { - id: 'service.restrictedHandler.customUrl.text', - defaultMessage: '!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.', - }, - action: { - id: 'service.restrictedHandler.action', - defaultMessage: '!!!Upgrade Account', - }, -}); - -export default @observer class ServiceRestricted extends Component { - static propTypes = { - name: PropTypes.string.isRequired, - upgrade: PropTypes.func.isRequired, - type: PropTypes.number.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - countdownInterval = null; - - countdownIntervalTimeout = 1000; - - render() { - const { - name, - upgrade, - type, - } = this.props; - const { intl } = this.context; - - return ( -
- {type === RESTRICTION_TYPES.SERVICE_LIMIT && ( - <> -

{intl.formatMessage(messages.headlineServiceLimit)}

-

{intl.formatMessage(messages.textServiceLimit, { count: serviceLimitStore.serviceLimit })}

- - )} - {type === RESTRICTION_TYPES.CUSTOM_URL && ( - <> -

{intl.formatMessage(messages.headlineCustomUrl)}

-

{intl.formatMessage(messages.textCustomUrl)}

- - )} -
- ); - } -} diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js index caa3cf9aa..6e46a60d2 100644 --- a/src/components/services/content/Services.js +++ b/src/components/services/content/Services.js @@ -54,7 +54,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services openSettings: PropTypes.func.isRequired, update: PropTypes.func.isRequired, userHasCompletedSignup: PropTypes.bool.isRequired, - hasActivatedTrial: PropTypes.bool.isRequired, classes: PropTypes.object.isRequired, actions: PropTypes.object.isRequired, isSpellcheckerEnabled: PropTypes.bool.isRequired, @@ -109,7 +108,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services openSettings, update, userHasCompletedSignup, - hasActivatedTrial, classes, isSpellcheckerEnabled, } = this.props; @@ -123,7 +121,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services return (
- {(userHasCompletedSignup || hasActivatedTrial) && ( + {userHasCompletedSignup && (
openSettings({ path: 'user' })} isSpellcheckerEnabled={isSpellcheckerEnabled} /> ))} diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 68d88e218..d3d75a979 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -3,14 +3,11 @@ import PropTypes from 'prop-types'; import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import ReactTooltip from 'react-tooltip'; -import { ProBadge, H1, H2 } from '@meetfranz/ui'; -import moment from 'moment'; +import { H1, H2 } from '@meetfranz/ui'; import Loader from '../../ui/Loader'; import Button from '../../ui/Button'; import Infobox from '../../ui/Infobox'; -import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen'; -import { i18nPlanName } from '../../../helpers/plan-helpers'; import { LOCAL_SERVER, LIVE_FRANZ_API } from '../../../config'; const messages = defineMessages({ @@ -30,18 +27,6 @@ const messages = defineMessages({ id: 'settings.account.manageSubscription.label', defaultMessage: '!!!Manage your subscription', }, - upgradeAccountToPro: { - id: 'settings.account.upgradeToPro.label', - defaultMessage: '!!!Upgrade to Franz Professional', - }, - accountTypeBasic: { - id: 'settings.account.accountType.basic', - defaultMessage: '!!!Basic Account', - }, - accountTypePremium: { - id: 'settings.account.accountType.premium', - defaultMessage: '!!!Premium Supporter Account', - }, accountEditButton: { id: 'settings.account.account.editButton', defaultMessage: '!!!Edit Account', @@ -76,23 +61,10 @@ const messages = defineMessages({ defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', }, - trial: { - id: 'settings.account.trial', - defaultMessage: '!!!Free Trial', - }, yourLicense: { id: 'settings.account.yourLicense', defaultMessage: '!!!Your Franz License:', }, - trialEndsIn: { - id: 'settings.account.trialEndsIn', - defaultMessage: '!!!Your free trial ends in {duration}.', - }, - trialUpdateBillingInformation: { - id: 'settings.account.trialUpdateBillingInfo', - defaultMessage: - '!!!Please update your billing info to continue using {license} after your trial period.', - }, accountUnavailable: { id: 'settings.account.accountUnavailable', defaultMessage: 'Account is unavailable', @@ -107,8 +79,6 @@ const messages = defineMessages({ class AccountDashboard extends Component { static propTypes = { user: MobxPropTypes.observableObject.isRequired, - isPremiumOverrideUser: PropTypes.bool.isRequired, - isProUser: PropTypes.bool.isRequired, isLoading: PropTypes.bool.isRequired, userInfoRequestFailed: PropTypes.bool.isRequired, retryUserInfoRequest: PropTypes.func.isRequired, @@ -116,10 +86,7 @@ class AccountDashboard extends Component { isLoadingDeleteAccount: PropTypes.bool.isRequired, isDeleteAccountSuccessful: PropTypes.bool.isRequired, openEditAccount: PropTypes.func.isRequired, - openBilling: PropTypes.func.isRequired, - upgradeToPro: PropTypes.func.isRequired, openInvoices: PropTypes.func.isRequired, - onCloseSubscriptionWindow: PropTypes.func.isRequired, server: PropTypes.string.isRequired, }; @@ -130,8 +97,6 @@ class AccountDashboard extends Component { render() { const { user, - isPremiumOverrideUser, - isProUser, isLoading, userInfoRequestFailed, retryUserInfoRequest, @@ -139,20 +104,11 @@ class AccountDashboard extends Component { isLoadingDeleteAccount, isDeleteAccountSuccessful, openEditAccount, - openBilling, - upgradeToPro, openInvoices, - onCloseSubscriptionWindow, server, } = this.props; const { intl } = this.context; - let planName = ''; - - if (user.team && user.team.plan) { - planName = i18nPlanName(user.team.plan, intl); - } - const isUsingWithoutAccount = server === LOCAL_SERVER; const isUsingFranzServer = server === LIVE_FRANZ_API; @@ -210,96 +166,38 @@ class AccountDashboard extends Component {

{`${user.firstname} ${user.lastname}`} - {user.isPremium && ( - <> - {' '} - - - )}

{user.organization && `${user.organization}, `} {user.email}

- {user.isPremium && ( -
-
- )} +
+
- {!user.isPremium && ( -
- {user.isPremium && user.isSubscriptionOwner && isUsingFranzServer && ( + {user.isSubscriptionOwner && isUsingFranzServer && (

{intl.formatMessage(messages.yourLicense)}

Franz - {' '} - {isPremiumOverrideUser ? 'Premium' : planName} - {user.team.isTrial && ( - <> - {' – '} - {intl.formatMessage(messages.trial)} - - )}

- {user.team.isTrial && ( - <> -
-

- {intl.formatMessage(messages.trialEndsIn, { - duration: moment - .duration( - moment().diff(user.team.trialEnd), - ) - .humanize(), - })} -

-

- {intl.formatMessage( - messages.trialUpdateBillingInformation, - { - license: planName, - }, - )} -

- - )} - {!isProUser && ( -
-
- )}
-
)} - {!user.isPremium && ( -
-
- -
-
- )} )} diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index cebab2f12..02cae6b69 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, intlShape } from 'react-intl'; import { inject, observer } from 'mobx-react'; -import { ProBadge } from '@meetfranz/ui'; import { RouterStore } from 'mobx-react-router'; import { LOCAL_SERVER, LIVE_FERDI_API, LIVE_FRANZ_API } from '../../../config'; @@ -11,7 +10,6 @@ import { workspaceStore } from '../../../features/workspaces'; import UIStore from '../../../stores/UIStore'; import SettingsStore from '../../../stores/SettingsStore'; import UserStore from '../../../stores/UserStore'; -import { serviceLimitStore } from '../../../features/serviceLimit'; const messages = defineMessages({ availableServices: { @@ -98,8 +96,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e render() { const { serviceCount, workspaceCount, stores } = this.props; - const { isDarkThemeActive } = stores.ui; - const { router, user } = stores; const { intl } = this.context; const isLoggedIn = Boolean(localStorage.getItem('authToken')); const isUsingWithoutAccount = stores.settings.app.server === LOCAL_SERVER; @@ -124,9 +120,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e {' '} {serviceCount} - {serviceLimitStore.serviceLimit !== 0 && ( - `/${serviceLimitStore.serviceLimit}` - )} {workspaceStore.isFeatureEnabled ? ( @@ -138,11 +131,7 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e > {intl.formatMessage(messages.yourWorkspaces)} {' '} - {workspaceStore.isPremiumUpgradeRequired ? ( - - ) : ( - {workspaceCount} - )} + {workspaceCount} ) : null} {!isUsingWithoutAccount && ( @@ -163,9 +152,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e disabled={!isLoggedIn} > {intl.formatMessage(messages.team)} - {!user.data.isPremium && ( - - )} )}

{intl.formatMessage(messages.headline)}

-
{serviceStatus.length > 0 && serviceStatus.includes('created') && ( @@ -223,9 +218,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com <>

{intl.formatMessage(messages.headlineCustomRecipes)} - {!isCommunityRecipesIncludedInCurrentPlan && ( - - )}

@@ -251,37 +243,33 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com

)} - 0) && !isCommunityRecipesIncludedInCurrentPlan} - > - {recipeFilter === 'dev' && communityRecipes.length > 0 && ( -

{intl.formatMessage(messages.headlineCommunityRecipes)}

- )} -
- {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && ( -
- - - + {recipeFilter === 'dev' && communityRecipes.length > 0 && ( +

{intl.formatMessage(messages.headlineCommunityRecipes)}

+ )} +
+ {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && ( +
+ + + -

{intl.formatMessage(messages.nothingFound)}

+

{intl.formatMessage(messages.nothingFound)}

- isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })} - /> -
- )} - {communityRecipes.map(recipe => ( isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })} + key={customWebsiteRecipe.id} + recipe={customWebsiteRecipe} + onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })} /> - ))} -
- +
+ )} + {communityRecipes.map(recipe => ( + isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })} + /> + ))} +
{recipeFilter === 'dev' && devRecipes.length > 0 && (

{intl.formatMessage(messages.headlineDevRecipes)}

diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js index 513c75eed..0f7c29de5 100644 --- a/src/components/settings/services/EditServiceForm.js +++ b/src/components/settings/services/EditServiceForm.js @@ -6,7 +6,6 @@ import { defineMessages, intlShape } from 'react-intl'; import normalizeUrl from 'normalize-url'; import Form from '../../../lib/Form'; -import User from '../../../models/User'; import Recipe from '../../../models/Recipe'; import Service from '../../../models/Service'; import Tabs, { TabItem } from '../../ui/Tabs'; @@ -17,9 +16,6 @@ import Button from '../../ui/Button'; import ImageUpload from '../../ui/ImageUpload'; import Select from '../../ui/Select'; -import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; -import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; -import { serviceLimitStore } from '../../../features/serviceLimit'; import { isMac } from '../../../environment'; import globalMessages from '../../../i18n/globalMessages'; @@ -80,14 +76,6 @@ const messages = defineMessages({ id: 'settings.service.form.customUrlValidationError', defaultMessage: '!!!Could not validate custom {name} server.', }, - customUrlPremiumInfo: { - id: 'settings.service.form.customUrlPremiumInfo', - defaultMessage: '!!!To add self hosted services, you need a Ferdi Premium Supporter Account.', - }, - customUrlUpgradeAccount: { - id: 'settings.service.form.customUrlUpgradeAccount', - defaultMessage: '!!!Upgrade your account', - }, indirectMessageInfo: { id: 'settings.service.form.indirectMessageInfo', defaultMessage: '!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...', @@ -149,7 +137,6 @@ export default @observer class EditServiceForm extends Component { return null; }, - user: PropTypes.instanceOf(User).isRequired, action: PropTypes.string.isRequired, form: PropTypes.instanceOf(Form).isRequired, onSubmit: PropTypes.func.isRequired, @@ -158,8 +145,6 @@ export default @observer class EditServiceForm extends Component { isSaving: PropTypes.bool.isRequired, isDeleting: PropTypes.bool.isRequired, isProxyFeatureEnabled: PropTypes.bool.isRequired, - isServiceProxyIncludedInCurrentPlan: PropTypes.bool.isRequired, - isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired, isHibernationFeatureActive: PropTypes.bool.isRequired, }; @@ -217,15 +202,12 @@ export default @observer class EditServiceForm extends Component { recipe, service, action, - user, form, isSaving, isDeleting, onDelete, openRecipeFile, isProxyFeatureEnabled, - isServiceProxyIncludedInCurrentPlan, - isSpellcheckerIncludedInCurrentPlan, isHibernationFeatureActive, } = this.props; const { intl } = this.context; @@ -285,7 +267,6 @@ export default @observer class EditServiceForm extends Component { )}
-
this.submit(e)} id="form">
@@ -311,24 +292,11 @@ export default @observer class EditServiceForm extends Component { )} {recipe.hasCustomUrl && ( - {user.isPremium || recipe.author.find(a => a.email === user.email) ? ( - <> - - {form.error === 'url-validation-error' && ( -

- {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })} -

- )} - - ) : ( -
-

{intl.formatMessage(messages.customUrlPremiumInfo)}

-

- - {intl.formatMessage(messages.customUrlUpgradeAccount)} - -

-
+ + {form.error === 'url-validation-error' && ( +

+ {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })} +

)}
)} @@ -403,56 +371,46 @@ export default @observer class EditServiceForm extends Component {
{!isMac && ( - -
- +
)} {isProxyFeatureEnabled && ( - -
-

- {intl.formatMessage(messages.headlineProxy)} - beta -

- - {form.$('proxy.isEnabled').value && ( - <> -
-
- - -
+
+

+ {intl.formatMessage(messages.headlineProxy)} + beta +

+ + {form.$('proxy.isEnabled').value && ( + <> +
+
+ +
-
-
- - -
+
+
+
+ +
-

- - {intl.formatMessage(messages.proxyRestartInfo)} -

-

- - {intl.formatMessage(messages.proxyInfo)} -

- - )} -
- +
+

+ + {intl.formatMessage(messages.proxyRestartInfo)} +

+

+ + {intl.formatMessage(messages.proxyInfo)} +

+ + )} +
)}
@@ -512,7 +470,7 @@ export default @observer class EditServiceForm extends Component { type="submit" label={intl.formatMessage(messages.saveService)} htmlForm="form" - disabled={action !== 'edit' && ((form.isPristine && requiresUserInput) || serviceLimitStore.userHasReachedServiceLimit)} + disabled={action !== 'edit' && (form.isPristine && requiresUserInput)} /> )}
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js index a0f05fd20..a05af5da0 100644 --- a/src/components/settings/services/ServicesDashboard.js +++ b/src/components/settings/services/ServicesDashboard.js @@ -10,7 +10,6 @@ import Loader from '../../ui/Loader'; import FAB from '../../ui/FAB'; import ServiceItem from './ServiceItem'; import Appear from '../../ui/effects/Appear'; -import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; const messages = defineMessages({ headline: { @@ -93,7 +92,6 @@ export default @observer class ServicesDashboard extends Component {

{intl.formatMessage(messages.headline)}

-
{(services.length !== 0 || searchNeedle) && !isLoading && ( - - <> - - {!isMac && form.$('enableSpellchecking').value && ( - + )} + {isMac && form.$('enableSpellchecking').value && ( +

{intl.formatMessage(messages.spellCheckerLanguageInfo)}

+ )} +

{intl.formatMessage(messages.contentHeadline)}

- {!isProUser && ( - {intl.formatMessage(globalMessages.proRequired)} - )}

{intl.formatMessage(messages.intro)}

{intl.formatMessage(messages.copy)}

- Franz for Teams + Ferdi for Teams
- {!isProUser ? ( - - ) : ( -
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js deleted file mode 100644 index ec486e5d0..000000000 --- a/src/components/subscription/SubscriptionForm.js +++ /dev/null @@ -1,78 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import injectSheet from 'react-jss'; - -import { H3, H2 } from '@meetfranz/ui'; - -import { Button } from '@meetfranz/forms'; -import { FeatureList } from '../ui/FeatureList'; - -const messages = defineMessages({ - submitButtonLabel: { - id: 'subscription.cta.choosePlan', - defaultMessage: '!!!Choose your plan', - }, - teaserHeadline: { - id: 'settings.account.headlineUpgradeAccount', - defaultMessage: '!!!Upgrade your account and get the full Franz experience', - }, - teaserText: { - id: 'subscription.teaser.intro', - defaultMessage: '!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!', - }, - includedFeatures: { - id: 'subscription.teaser.includedFeatures', - defaultMessage: '!!!Paid Franz Plans include:', - }, -}); - -const styles = () => ({ - activateTrialButton: { - margin: [40, 'auto', 50], - display: 'flex', - }, -}); - -export default @injectSheet(styles) @observer class SubscriptionForm extends Component { - static propTypes = { - selectPlan: PropTypes.func.isRequired, - isActivatingTrial: PropTypes.bool.isRequired, - classes: PropTypes.object.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { - isActivatingTrial, - selectPlan, - classes, - } = this.props; - const { intl } = this.context; - - return ( - <> -

{intl.formatMessage(messages.teaserHeadline)}

-

{intl.formatMessage(messages.teaserText)}

-
-
- ); - } -} diff --git a/src/components/subscription/TrialForm.js b/src/components/subscription/TrialForm.js deleted file mode 100644 index d61b779ed..000000000 --- a/src/components/subscription/TrialForm.js +++ /dev/null @@ -1,115 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import injectSheet from 'react-jss'; - -import { H3, H2 } from '@meetfranz/ui'; - -import { Button } from '@meetfranz/forms'; -import { FeatureList } from '../ui/FeatureList'; -import { FeatureItem } from '../ui/FeatureItem'; - -const messages = defineMessages({ - submitButtonLabel: { - id: 'subscription.cta.activateTrial', - defaultMessage: '!!!Yes, start the free Franz Professional trial', - }, - allOptionsButton: { - id: 'subscription.cta.allOptions', - defaultMessage: '!!!See all options', - }, - teaserHeadline: { - id: 'settings.account.headlineTrialUpgrade', - defaultMessage: '!!!Get the free 14 day Franz Professional Trial', - }, - includedFeatures: { - id: 'subscription.includedProFeatures', - defaultMessage: '!!!The Franz Professional Plan includes:', - }, - noStringsAttachedHeadline: { - id: 'pricing.trial.terms.headline', - defaultMessage: '!!!No strings attached', - }, - noCreditCard: { - id: 'pricing.trial.terms.noCreditCard', - defaultMessage: '!!!No credit card required', - }, - automaticTrialEnd: { - id: 'pricing.trial.terms.automaticTrialEnd', - defaultMessage: '!!!Your free trial ends automatically after 14 days', - }, -}); - -const styles = theme => ({ - activateTrialButton: { - margin: [40, 'auto', 10], - display: 'flex', - }, - allOptionsButton: { - margin: [0, 0, 40], - background: 'none', - border: 'none', - color: theme.colorText, - }, - keyTerms: { - marginTop: 20, - }, -}); - -export default @injectSheet(styles) @observer class TrialForm extends Component { - static propTypes = { - activateTrial: PropTypes.func.isRequired, - isActivatingTrial: PropTypes.bool.isRequired, - showAllOptions: PropTypes.func.isRequired, - classes: PropTypes.object.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { - isActivatingTrial, - activateTrial, - showAllOptions, - classes, - } = this.props; - const { intl } = this.context; - - return ( - <> -

{intl.formatMessage(messages.teaserHeadline)}

-

- {intl.formatMessage(messages.noStringsAttachedHeadline)} -

-
    - - -
- - -
-
- {children} -
-
- ) : children; - } -} - -PremiumFeatureContainer.wrappedComponent.propTypes = { - children: oneOrManyChildElements.isRequired, - stores: PropTypes.shape({ - user: PropTypes.instanceOf(UserStore).isRequired, - features: PropTypes.instanceOf(FeaturesStore).isRequired, - }).isRequired, - actions: PropTypes.shape({ - ui: PropTypes.instanceOf(UIStore).isRequired, - }).isRequired, -}; - -export default PremiumFeatureContainer; diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js deleted file mode 100644 index 41881e044..000000000 --- a/src/components/ui/PremiumFeatureContainer/styles.js +++ /dev/null @@ -1,34 +0,0 @@ -export default theme => ({ - container: { - background: theme.colorSubscriptionContainerBackground, - border: theme.colorSubscriptionContainerBorder, - margin: [0, 0, 20, -20], - padding: 20, - 'border-radius': theme.borderRadius, - pointerEvents: 'none', - height: 'auto', - }, - titleContainer: { - display: 'flex', - }, - title: { - 'font-weight': 'bold', - color: theme.colorSubscriptionContainerTitle, - }, - actionButton: { - background: theme.colorSubscriptionContainerActionButtonBackground, - color: theme.colorSubscriptionContainerActionButtonColor, - 'margin-left': 'auto', - 'border-radius': theme.borderRadiusSmall, - padding: [4, 8], - 'font-size': 12, - pointerEvents: 'initial', - }, - content: { - opacity: 0.5, - 'margin-top': 20, - '& > :last-child': { - 'margin-bottom': 0, - }, - }, -}); diff --git a/src/components/ui/UpgradeButton/index.js b/src/components/ui/UpgradeButton/index.js deleted file mode 100644 index eade46cfd..000000000 --- a/src/components/ui/UpgradeButton/index.js +++ /dev/null @@ -1,83 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { inject, observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; - -import { Button } from '@meetfranz/forms'; - -import UserStore from '../../../stores/UserStore'; -import ActivateTrialButton from '../ActivateTrialButton'; -import UIStore from '../../../stores/UIStore'; - -const messages = defineMessages({ - upgradeToPro: { - id: 'global.upgradeButton.upgradeToPro', - defaultMessage: '!!!Upgrade to Franz Professional', - }, -}); - -@inject('stores', 'actions') @observer -class UpgradeButton extends Component { - static propTypes = { - // eslint-disable-next-line - classes: PropTypes.object.isRequired, - className: PropTypes.string, - gaEventInfo: PropTypes.shape({ - category: PropTypes.string.isRequired, - event: PropTypes.string.isRequired, - label: PropTypes.string, - }), - requiresPro: PropTypes.bool, - }; - - static defaultProps = { - className: '', - gaEventInfo: null, - requiresPro: false, - } - - static contextTypes = { - intl: intlShape, - }; - - handleCTAClick() { - const { actions } = this.props; - - actions.ui.openSettings({ path: 'user' }); - } - - render() { - const { stores, requiresPro } = this.props; - const { intl } = this.context; - - const { isPremium, isPersonal } = stores.user; - - if (isPremium && isPersonal && requiresPro) { - return ( -