aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2019-10-16 10:22:00 +0200
committerLibravatar Stefan Malzner <stefan@adlk.io>2019-10-16 10:22:00 +0200
commitba578b8a6df8d31136fb170e78b70a71dad85e31 (patch)
treea8c980cc83e6014fd7befefd240b8364d40447d3
parentplan selection polishing (diff)
downloadferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.tar.gz
ferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.tar.zst
ferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.zip
polishing
-rw-r--r--src/components/auth/Pricing.js15
-rw-r--r--src/containers/auth/PricingScreen.js11
-rw-r--r--src/features/planSelection/components/PlanItem.js50
-rw-r--r--src/features/planSelection/components/PlanSelection.js27
-rw-r--r--src/features/planSelection/containers/PlanSelectionScreen.js14
-rw-r--r--src/features/planSelection/store.js3
-rw-r--r--src/i18n/locales/defaultMessages.json102
-rw-r--r--src/i18n/locales/en-US.json4
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json29
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanItem.json19
10 files changed, 184 insertions, 90 deletions
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
index 40ce49814..67af04470 100644
--- a/src/components/auth/Pricing.js
+++ b/src/components/auth/Pricing.js
@@ -32,6 +32,10 @@ const messages = defineMessages({
32 id: 'pricing.trial.terms.automaticTrialEnd', 32 id: 'pricing.trial.terms.automaticTrialEnd',
33 defaultMessage: '!!!Your free trial ends automatically after 14 days', 33 defaultMessage: '!!!Your free trial ends automatically after 14 days',
34 }, 34 },
35 trialWorth: {
36 id: 'pricing.trial.terms.trialWorth',
37 defaultMessage: '!!!Free trial (normally {currency}{price} per month)',
38 },
35 activationError: { 39 activationError: {
36 id: 'pricing.trial.error', 40 id: 'pricing.trial.error',
37 defaultMessage: '!!!Sorry, we could not activate your trial!', 41 defaultMessage: '!!!Sorry, we could not activate your trial!',
@@ -104,6 +108,8 @@ export default @observer @injectSheet(styles) class Signup extends Component {
104 trialActivationError: PropTypes.bool.isRequired, 108 trialActivationError: PropTypes.bool.isRequired,
105 canSkipTrial: PropTypes.bool.isRequired, 109 canSkipTrial: PropTypes.bool.isRequired,
106 classes: PropTypes.object.isRequired, 110 classes: PropTypes.object.isRequired,
111 currency: PropTypes.string.isRequired,
112 price: PropTypes.number.isRequired,
107 }; 113 };
108 114
109 static contextTypes = { 115 static contextTypes = {
@@ -118,6 +124,8 @@ export default @observer @injectSheet(styles) class Signup extends Component {
118 trialActivationError, 124 trialActivationError,
119 canSkipTrial, 125 canSkipTrial,
120 classes, 126 classes,
127 currency,
128 price,
121 } = this.props; 129 } = this.props;
122 const { intl } = this.context; 130 const { intl } = this.context;
123 131
@@ -156,6 +164,13 @@ export default @observer @injectSheet(styles) class Signup extends Component {
156 {intl.formatMessage(messages.noStringsAttachedHeadline)} 164 {intl.formatMessage(messages.noStringsAttachedHeadline)}
157 </H2> 165 </H2>
158 <ul className={classes.keyTermsList}> 166 <ul className={classes.keyTermsList}>
167 <FeatureItem
168 icon="πŸ‘‰"
169 name={intl.formatMessage(messages.trialWorth, {
170 currency,
171 price,
172 })}
173 />
159 <FeatureItem icon="πŸ‘‰" name={intl.formatMessage(messages.noCreditCard)} /> 174 <FeatureItem icon="πŸ‘‰" name={intl.formatMessage(messages.noCreditCard)} />
160 <FeatureItem icon="πŸ‘‰" name={intl.formatMessage(messages.automaticTrialEnd)} /> 175 <FeatureItem icon="πŸ‘‰" name={intl.formatMessage(messages.automaticTrialEnd)} />
161 </ul> 176 </ul>
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
index 8e0ded16a..ff378bd8b 100644
--- a/src/containers/auth/PricingScreen.js
+++ b/src/containers/auth/PricingScreen.js
@@ -40,6 +40,15 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend
40 const { getUserInfoRequest, activateTrialRequest } = stores.user; 40 const { getUserInfoRequest, activateTrialRequest } = stores.user;
41 const { featuresRequest, features } = stores.features; 41 const { featuresRequest, features } = stores.features;
42 42
43 const { pricingConfig } = features;
44
45 let currency = '$';
46 let price = '5.99';
47 if (pricingConfig) {
48 ({ currency } = pricingConfig);
49 ({ price } = pricingConfig.plans.pro.yearly);
50 }
51
43 return ( 52 return (
44 <Pricing 53 <Pricing
45 onSubmit={this.submit.bind(this)} 54 onSubmit={this.submit.bind(this)}
@@ -48,6 +57,8 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend
48 trialActivationError={activateTrialRequest.isError} 57 trialActivationError={activateTrialRequest.isError}
49 canSkipTrial={features.canSkipTrial} 58 canSkipTrial={features.canSkipTrial}
50 error={error} 59 error={error}
60 currency={currency}
61 price={price}
51 /> 62 />
52 ); 63 );
53 } 64 }
diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js
index a49cd40d3..ea04c8448 100644
--- a/src/features/planSelection/components/PlanItem.js
+++ b/src/features/planSelection/components/PlanItem.js
@@ -10,10 +10,6 @@ import { H2 } from '@meetfranz/ui';
10 10
11import { Button } from '@meetfranz/forms'; 11import { Button } from '@meetfranz/forms';
12import { mdiArrowRight } from '@mdi/js'; 12import { mdiArrowRight } from '@mdi/js';
13// import { FeatureList } from '../ui/FeatureList';
14// import { PLANS, PAYMENT_INTERVAL } from '../../config';
15// import { i18nPlanName, i18nIntervalName } from '../../helpers/plan-helpers';
16// import { PLAN_INTERVAL_CONFIG_TYPE } from './types';
17 13
18const messages = defineMessages({ 14const messages = defineMessages({
19 perMonth: { 15 perMonth: {
@@ -24,6 +20,10 @@ const messages = defineMessages({
24 id: 'subscription.interval.perMonthPerUser', 20 id: 'subscription.interval.perMonthPerUser',
25 defaultMessage: '!!!per month & user', 21 defaultMessage: '!!!per month & user',
26 }, 22 },
23 bestValue: {
24 id: 'subscription.bestValue',
25 defaultMessage: '!!!Best value',
26 },
27}); 27});
28 28
29const styles = theme => ({ 29const styles = theme => ({
@@ -41,7 +41,6 @@ const styles = theme => ({
41 marginBottom: 20, 41 marginBottom: 20,
42 fontSize: 30, 42 fontSize: 30,
43 color: theme.styleTypes.primary.contrast, 43 color: theme.styleTypes.primary.contrast,
44 // fontWeight: 'bold',
45 }, 44 },
46 }, 45 },
47 currency: { 46 currency: {
@@ -58,9 +57,6 @@ const styles = theme => ({
58 verticalAlign: 20, 57 verticalAlign: 20,
59 }, 58 },
60 }, 59 },
61 interval: {
62 // paddingBottom: 40,
63 },
64 text: { 60 text: {
65 marginBottom: 'auto', 61 marginBottom: 'auto',
66 }, 62 },
@@ -68,10 +64,6 @@ const styles = theme => ({
68 background: theme.styleTypes.primary.accent, 64 background: theme.styleTypes.primary.accent,
69 color: theme.styleTypes.primary.contrast, 65 color: theme.styleTypes.primary.contrast,
70 margin: [40, 'auto', 0, 'auto'], 66 margin: [40, 'auto', 0, 'auto'],
71
72 // '&:active': {
73 // opacity: 0.7,
74 // },
75 }, 67 },
76 divider: { 68 divider: {
77 width: 40, 69 width: 40,
@@ -83,10 +75,10 @@ const styles = theme => ({
83 padding: 20, 75 padding: 20,
84 background: color(theme.styleTypes.primary.accent).darken(0.25).hex(), 76 background: color(theme.styleTypes.primary.accent).darken(0.25).hex(),
85 color: theme.styleTypes.primary.contrast, 77 color: theme.styleTypes.primary.contrast,
78 position: 'relative',
86 }, 79 },
87 content: { 80 content: {
88 padding: 20, 81 padding: 20,
89 // border: [1, 'solid', 'red'],
90 background: '#EFEFEF', 82 background: '#EFEFEF',
91 }, 83 },
92 simpleCTA: { 84 simpleCTA: {
@@ -97,6 +89,20 @@ const styles = theme => ({
97 fill: theme.styleTypes.primary.accent, 89 fill: theme.styleTypes.primary.accent,
98 }, 90 },
99 }, 91 },
92 bestValue: {
93 background: theme.styleTypes.success.accent,
94 color: theme.styleTypes.success.contrast,
95 right: -66,
96 top: -40,
97 height: 'auto',
98 position: 'absolute',
99 transform: 'rotateZ(45deg)',
100 textAlign: 'center',
101 padding: [5, 50],
102 transformOrigin: 'left bottom',
103 fontSize: 12,
104 boxShadow: '0 2px 6px rgba(0,0,0,0.15)',
105 },
100}); 106});
101 107
102 108
@@ -111,6 +117,8 @@ export default @observer @injectSheet(styles) class PlanItem extends Component {
111 simpleCTA: PropTypes.bool, 117 simpleCTA: PropTypes.bool,
112 perUser: PropTypes.bool, 118 perUser: PropTypes.bool,
113 classes: PropTypes.object.isRequired, 119 classes: PropTypes.object.isRequired,
120 bestValue: PropTypes.bool,
121 className: PropTypes.string,
114 children: PropTypes.element, 122 children: PropTypes.element,
115 }; 123 };
116 124
@@ -118,6 +126,8 @@ export default @observer @injectSheet(styles) class PlanItem extends Component {
118 simpleCTA: false, 126 simpleCTA: false,
119 perUser: false, 127 perUser: false,
120 children: null, 128 children: null,
129 bestValue: false,
130 className: '',
121 } 131 }
122 132
123 static contextTypes = { 133 static contextTypes = {
@@ -135,16 +145,26 @@ export default @observer @injectSheet(styles) class PlanItem extends Component {
135 ctaLabel, 145 ctaLabel,
136 simpleCTA, 146 simpleCTA,
137 perUser, 147 perUser,
148 bestValue,
149 className,
138 children, 150 children,
139 } = this.props; 151 } = this.props;
140 const { intl } = this.context; 152 const { intl } = this.context;
141 153
142 const priceParts = `${price}`.split('.'); 154 const priceParts = `${price}`.split('.');
143 // const intervalName = i18nIntervalName(PAYMENT_INTERVAL.MONTHLY, intl);
144 155
145 return ( 156 return (
146 <div className={classes.root}> 157 <div className={classnames({
158 [classes.root]: true,
159 [className]: className,
160 })}
161 >
147 <div className={classes.header}> 162 <div className={classes.header}>
163 {bestValue && (
164 <div className={classes.bestValue}>
165 {intl.formatMessage(messages.bestValue)}
166 </div>
167 )}
148 <H2 className={classes.planName}>{name}</H2> 168 <H2 className={classes.planName}>{name}</H2>
149 <p className={classes.text}> 169 <p className={classes.text}>
150 {text} 170 {text}
diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js
index 9cd592083..1a45cf035 100644
--- a/src/features/planSelection/components/PlanSelection.js
+++ b/src/features/planSelection/components/PlanSelection.js
@@ -137,6 +137,9 @@ const styles = theme => ({
137 border: '1px solid red', 137 border: '1px solid red',
138 overflow: 'scroll-x', 138 overflow: 'scroll-x',
139 }, 139 },
140 featuredPlan: {
141 transform: 'scale(1.05)',
142 },
140}); 143});
141 144
142@injectSheet(styles) @observer 145@injectSheet(styles) @observer
@@ -197,29 +200,31 @@ class PlanSelection extends Component {
197 /> 200 />
198 </PlanItem> 201 </PlanItem>
199 <PlanItem 202 <PlanItem
200 name={i18nPlanName(plans.personal.yearly.id, intl)} 203 name={i18nPlanName(plans.pro.yearly.id, intl)}
201 text={intl.formatMessage(messages.textPersonal)} 204 text={intl.formatMessage(messages.textProfessional)}
202 price={plans.personal.yearly.price} 205 price={plans.pro.yearly.price}
203 currency={currency} 206 currency={currency}
204 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPersonal : messages.actionTrial)} 207 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPro : messages.actionTrial)}
205 upgrade={() => upgradeAccount(plans.personal.yearly.id)} 208 upgrade={() => upgradeAccount(plans.personal.yearly.id)}
209 className={classes.featuredPlan}
210 perUser
211 bestValue
206 > 212 >
207 <FeatureList 213 <FeatureList
208 plan={PLANS.PERSONAL} 214 plan={PLANS.PRO}
209 className={classes.featureList} 215 className={classes.featureList}
210 /> 216 />
211 </PlanItem> 217 </PlanItem>
212 <PlanItem 218 <PlanItem
213 name={i18nPlanName(plans.pro.yearly.id, intl)} 219 name={i18nPlanName(plans.personal.yearly.id, intl)}
214 text={intl.formatMessage(messages.textProfessional)} 220 text={intl.formatMessage(messages.textPersonal)}
215 price={plans.pro.yearly.price} 221 price={plans.personal.yearly.price}
216 currency={currency} 222 currency={currency}
217 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPro : messages.actionTrial)} 223 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPersonal : messages.actionTrial)}
218 upgrade={() => upgradeAccount(plans.personal.yearly.id)} 224 upgrade={() => upgradeAccount(plans.personal.yearly.id)}
219 perUser
220 > 225 >
221 <FeatureList 226 <FeatureList
222 plan={PLANS.PRO} 227 plan={PLANS.PERSONAL}
223 className={classes.featureList} 228 className={classes.featureList}
224 /> 229 />
225 </PlanItem> 230 </PlanItem>
diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js
index 01b357861..dff9051d8 100644
--- a/src/features/planSelection/containers/PlanSelectionScreen.js
+++ b/src/features/planSelection/containers/PlanSelectionScreen.js
@@ -43,15 +43,12 @@ class PlanSelectionScreen extends Component {
43 } 43 }
44 44
45 upgradeAccount(planId) { 45 upgradeAccount(planId) {
46 const { user, features } = this.props.stores;
47 const { upgradeAccount, hideOverlay } = this.props.actions.planSelection; 46 const { upgradeAccount, hideOverlay } = this.props.actions.planSelection;
48 47
49 upgradeAccount({ 48 upgradeAccount({
50 planId, 49 planId,
51 onCloseWindow: () => { 50 onCloseWindow: () => {
52 hideOverlay(); 51 hideOverlay();
53 user.getUserInfoRequest.invalidate({ immediately: true });
54 features.featuresRequest.invalidate({ immediately: true });
55 }, 52 },
56 }); 53 });
57 } 54 }
@@ -68,17 +65,6 @@ class PlanSelectionScreen extends Component {
68 const { activateTrial } = this.props.actions.user; 65 const { activateTrial } = this.props.actions.user;
69 const { upgradeAccount, downgradeAccount, hideOverlay } = this.props.actions.planSelection; 66 const { upgradeAccount, downgradeAccount, hideOverlay } = this.props.actions.planSelection;
70 67
71 // const planConfig = [{
72 // id: 'free',
73 // price: 0,
74 // }, {
75 // id: plans.personal.yearly.id,
76 // price: plans.personal.yearly.price,
77 // }, {
78 // id: plans.pro.yearly.id,
79 // price: plans.pro.yearly.price,
80 // }];
81
82 return ( 68 return (
83 <ErrorBoundary> 69 <ErrorBoundary>
84 <PlanSelection 70 <PlanSelection
diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js
index 57d71011b..e229c37e5 100644
--- a/src/features/planSelection/store.js
+++ b/src/features/planSelection/store.js
@@ -98,6 +98,9 @@ export default class PlanSelectionStore extends FeatureStore {
98 win.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`); 98 win.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`);
99 99
100 win.on('closed', () => { 100 win.on('closed', () => {
101 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
102 this.stores.features.featuresRequest.invalidate({ immediately: true });
103
101 onCloseWindow(); 104 onCloseWindow();
102 }); 105 });
103 }; 106 };
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 210ea001a..eafac1f87 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -482,55 +482,68 @@
482 } 482 }
483 }, 483 },
484 { 484 {
485 "defaultMessage": "!!!Sorry, we could not activate your trial!", 485 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
486 "end": { 486 "end": {
487 "column": 3, 487 "column": 3,
488 "line": 38 488 "line": 38
489 }, 489 },
490 "file": "src/components/auth/Pricing.js", 490 "file": "src/components/auth/Pricing.js",
491 "id": "pricing.trial.terms.trialWorth",
492 "start": {
493 "column": 14,
494 "line": 35
495 }
496 },
497 {
498 "defaultMessage": "!!!Sorry, we could not activate your trial!",
499 "end": {
500 "column": 3,
501 "line": 42
502 },
503 "file": "src/components/auth/Pricing.js",
491 "id": "pricing.trial.error", 504 "id": "pricing.trial.error",
492 "start": { 505 "start": {
493 "column": 19, 506 "column": 19,
494 "line": 35 507 "line": 39
495 } 508 }
496 }, 509 },
497 { 510 {
498 "defaultMessage": "!!!Start my 14-day Franz Professional Trial", 511 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
499 "end": { 512 "end": {
500 "column": 3, 513 "column": 3,
501 "line": 42 514 "line": 46
502 }, 515 },
503 "file": "src/components/auth/Pricing.js", 516 "file": "src/components/auth/Pricing.js",
504 "id": "pricing.trial.cta.accept", 517 "id": "pricing.trial.cta.accept",
505 "start": { 518 "start": {
506 "column": 13, 519 "column": 13,
507 "line": 39 520 "line": 43
508 } 521 }
509 }, 522 },
510 { 523 {
511 "defaultMessage": "!!!Continue to Franz", 524 "defaultMessage": "!!!Continue to Franz",
512 "end": { 525 "end": {
513 "column": 3, 526 "column": 3,
514 "line": 46 527 "line": 50
515 }, 528 },
516 "file": "src/components/auth/Pricing.js", 529 "file": "src/components/auth/Pricing.js",
517 "id": "pricing.trial.cta.skip", 530 "id": "pricing.trial.cta.skip",
518 "start": { 531 "start": {
519 "column": 11, 532 "column": 11,
520 "line": 43 533 "line": 47
521 } 534 }
522 }, 535 },
523 { 536 {
524 "defaultMessage": "!!!Franz Professional includes:", 537 "defaultMessage": "!!!Franz Professional includes:",
525 "end": { 538 "end": {
526 "column": 3, 539 "column": 3,
527 "line": 50 540 "line": 54
528 }, 541 },
529 "file": "src/components/auth/Pricing.js", 542 "file": "src/components/auth/Pricing.js",
530 "id": "pricing.trial.features.headline", 543 "id": "pricing.trial.features.headline",
531 "start": { 544 "start": {
532 "column": 20, 545 "column": 20,
533 "line": 47 546 "line": 51
534 } 547 }
535 } 548 }
536 ], 549 ],
@@ -3923,6 +3936,19 @@
3923 "column": 19, 3936 "column": 19,
3924 "line": 23 3937 "line": 23
3925 } 3938 }
3939 },
3940 {
3941 "defaultMessage": "!!!Best value",
3942 "end": {
3943 "column": 3,
3944 "line": 30
3945 },
3946 "file": "src/features/planSelection/components/PlanItem.js",
3947 "id": "subscription.bestValue",
3948 "start": {
3949 "column": 13,
3950 "line": 27
3951 }
3926 } 3952 }
3927 ], 3953 ],
3928 "path": "src/features/planSelection/components/PlanItem.json" 3954 "path": "src/features/planSelection/components/PlanItem.json"
@@ -3933,143 +3959,143 @@
3933 "defaultMessage": "!!!Welcome back, {name}", 3959 "defaultMessage": "!!!Welcome back, {name}",
3934 "end": { 3960 "end": {
3935 "column": 3, 3961 "column": 3,
3936 "line": 19 3962 "line": 20
3937 }, 3963 },
3938 "file": "src/features/planSelection/components/PlanSelection.js", 3964 "file": "src/features/planSelection/components/PlanSelection.js",
3939 "id": "feature.planSelection.fullscreen.welcome", 3965 "id": "feature.planSelection.fullscreen.welcome",
3940 "start": { 3966 "start": {
3941 "column": 11, 3967 "column": 11,
3942 "line": 16 3968 "line": 17
3943 } 3969 }
3944 }, 3970 },
3945 { 3971 {
3946 "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", 3972 "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
3947 "end": { 3973 "end": {
3948 "column": 3, 3974 "column": 3,
3949 "line": 23 3975 "line": 24
3950 }, 3976 },
3951 "file": "src/features/planSelection/components/PlanSelection.js", 3977 "file": "src/features/planSelection/components/PlanSelection.js",
3952 "id": "feature.planSelection.fullscreen.subheadline", 3978 "id": "feature.planSelection.fullscreen.subheadline",
3953 "start": { 3979 "start": {
3954 "column": 15, 3980 "column": 15,
3955 "line": 20 3981 "line": 21
3956 } 3982 }
3957 }, 3983 },
3958 { 3984 {
3959 "defaultMessage": "!!!Basic functionality", 3985 "defaultMessage": "!!!Basic functionality",
3960 "end": { 3986 "end": {
3961 "column": 3, 3987 "column": 3,
3962 "line": 27 3988 "line": 28
3963 }, 3989 },
3964 "file": "src/features/planSelection/components/PlanSelection.js", 3990 "file": "src/features/planSelection/components/PlanSelection.js",
3965 "id": "feature.planSelection.free.text", 3991 "id": "feature.planSelection.free.text",
3966 "start": { 3992 "start": {
3967 "column": 12, 3993 "column": 12,
3968 "line": 24 3994 "line": 25
3969 } 3995 }
3970 }, 3996 },
3971 { 3997 {
3972 "defaultMessage": "!!!More services, no waiting - ideal for personal use.", 3998 "defaultMessage": "!!!More services, no waiting - ideal for personal use.",
3973 "end": { 3999 "end": {
3974 "column": 3, 4000 "column": 3,
3975 "line": 31 4001 "line": 32
3976 }, 4002 },
3977 "file": "src/features/planSelection/components/PlanSelection.js", 4003 "file": "src/features/planSelection/components/PlanSelection.js",
3978 "id": "feature.planSelection.personal.text", 4004 "id": "feature.planSelection.personal.text",
3979 "start": { 4005 "start": {
3980 "column": 16, 4006 "column": 16,
3981 "line": 28 4007 "line": 29
3982 } 4008 }
3983 }, 4009 },
3984 { 4010 {
3985 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", 4011 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.",
3986 "end": { 4012 "end": {
3987 "column": 3, 4013 "column": 3,
3988 "line": 35 4014 "line": 36
3989 }, 4015 },
3990 "file": "src/features/planSelection/components/PlanSelection.js", 4016 "file": "src/features/planSelection/components/PlanSelection.js",
3991 "id": "feature.planSelection.pro.text", 4017 "id": "feature.planSelection.pro.text",
3992 "start": { 4018 "start": {
3993 "column": 20, 4019 "column": 20,
3994 "line": 32 4020 "line": 33
3995 } 4021 }
3996 }, 4022 },
3997 { 4023 {
3998 "defaultMessage": "!!!Stay on Free", 4024 "defaultMessage": "!!!Stay on Free",
3999 "end": { 4025 "end": {
4000 "column": 3, 4026 "column": 3,
4001 "line": 39 4027 "line": 40
4002 }, 4028 },
4003 "file": "src/features/planSelection/components/PlanSelection.js", 4029 "file": "src/features/planSelection/components/PlanSelection.js",
4004 "id": "feature.planSelection.cta.stayOnFree", 4030 "id": "feature.planSelection.cta.stayOnFree",
4005 "start": { 4031 "start": {
4006 "column": 17, 4032 "column": 17,
4007 "line": 36 4033 "line": 37
4008 } 4034 }
4009 }, 4035 },
4010 { 4036 {
4011 "defaultMessage": "!!!Downgrade to Free", 4037 "defaultMessage": "!!!Downgrade to Free",
4012 "end": { 4038 "end": {
4013 "column": 3, 4039 "column": 3,
4014 "line": 43 4040 "line": 44
4015 }, 4041 },
4016 "file": "src/features/planSelection/components/PlanSelection.js", 4042 "file": "src/features/planSelection/components/PlanSelection.js",
4017 "id": "feature.planSelection.cta.ctaDowngradeFree", 4043 "id": "feature.planSelection.cta.ctaDowngradeFree",
4018 "start": { 4044 "start": {
4019 "column": 20, 4045 "column": 20,
4020 "line": 40 4046 "line": 41
4021 } 4047 }
4022 }, 4048 },
4023 { 4049 {
4024 "defaultMessage": "!!!Start my free 14-days Trial", 4050 "defaultMessage": "!!!Start my free 14-days Trial",
4025 "end": { 4051 "end": {
4026 "column": 3, 4052 "column": 3,
4027 "line": 47 4053 "line": 48
4028 }, 4054 },
4029 "file": "src/features/planSelection/components/PlanSelection.js", 4055 "file": "src/features/planSelection/components/PlanSelection.js",
4030 "id": "feature.planSelection.cta.trial", 4056 "id": "feature.planSelection.cta.trial",
4031 "start": { 4057 "start": {
4032 "column": 15, 4058 "column": 15,
4033 "line": 44 4059 "line": 45
4034 } 4060 }
4035 }, 4061 },
4036 { 4062 {
4037 "defaultMessage": "!!!Choose Personal", 4063 "defaultMessage": "!!!Choose Personal",
4038 "end": { 4064 "end": {
4039 "column": 3, 4065 "column": 3,
4040 "line": 51 4066 "line": 52
4041 }, 4067 },
4042 "file": "src/features/planSelection/components/PlanSelection.js", 4068 "file": "src/features/planSelection/components/PlanSelection.js",
4043 "id": "feature.planSelection.cta.upgradePersonal", 4069 "id": "feature.planSelection.cta.upgradePersonal",
4044 "start": { 4070 "start": {
4045 "column": 23, 4071 "column": 23,
4046 "line": 48 4072 "line": 49
4047 } 4073 }
4048 }, 4074 },
4049 { 4075 {
4050 "defaultMessage": "!!!Choose Professional", 4076 "defaultMessage": "!!!Choose Professional",
4051 "end": { 4077 "end": {
4052 "column": 3, 4078 "column": 3,
4053 "line": 55 4079 "line": 56
4054 }, 4080 },
4055 "file": "src/features/planSelection/components/PlanSelection.js", 4081 "file": "src/features/planSelection/components/PlanSelection.js",
4056 "id": "feature.planSelection.cta.upgradePro", 4082 "id": "feature.planSelection.cta.upgradePro",
4057 "start": { 4083 "start": {
4058 "column": 18, 4084 "column": 18,
4059 "line": 52 4085 "line": 53
4060 } 4086 }
4061 }, 4087 },
4062 { 4088 {
4063 "defaultMessage": "!!!Complete comparison of all plans", 4089 "defaultMessage": "!!!Complete comparison of all plans",
4064 "end": { 4090 "end": {
4065 "column": 3, 4091 "column": 3,
4066 "line": 59 4092 "line": 60
4067 }, 4093 },
4068 "file": "src/features/planSelection/components/PlanSelection.js", 4094 "file": "src/features/planSelection/components/PlanSelection.js",
4069 "id": "feature.planSelection.fullFeatureList", 4095 "id": "feature.planSelection.fullFeatureList",
4070 "start": { 4096 "start": {
4071 "column": 19, 4097 "column": 19,
4072 "line": 56 4098 "line": 57
4073 } 4099 }
4074 } 4100 }
4075 ], 4101 ],
@@ -4112,52 +4138,52 @@
4112 "defaultMessage": "!!!Downgrade your Franz Plan", 4138 "defaultMessage": "!!!Downgrade your Franz Plan",
4113 "end": { 4139 "end": {
4114 "column": 3, 4140 "column": 3,
4115 "line": 19 4141 "line": 20
4116 }, 4142 },
4117 "file": "src/features/planSelection/containers/PlanSelectionScreen.js", 4143 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
4118 "id": "feature.planSelection.fullscreen.dialog.title", 4144 "id": "feature.planSelection.fullscreen.dialog.title",
4119 "start": { 4145 "start": {
4120 "column": 15, 4146 "column": 15,
4121 "line": 16 4147 "line": 17
4122 } 4148 }
4123 }, 4149 },
4124 { 4150 {
4125 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", 4151 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
4126 "end": { 4152 "end": {
4127 "column": 3, 4153 "column": 3,
4128 "line": 23 4154 "line": 24
4129 }, 4155 },
4130 "file": "src/features/planSelection/containers/PlanSelectionScreen.js", 4156 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
4131 "id": "feature.planSelection.fullscreen.dialog.message", 4157 "id": "feature.planSelection.fullscreen.dialog.message",
4132 "start": { 4158 "start": {
4133 "column": 17, 4159 "column": 17,
4134 "line": 20 4160 "line": 21
4135 } 4161 }
4136 }, 4162 },
4137 { 4163 {
4138 "defaultMessage": "!!!Downgrade to Free", 4164 "defaultMessage": "!!!Downgrade to Free",
4139 "end": { 4165 "end": {
4140 "column": 3, 4166 "column": 3,
4141 "line": 27 4167 "line": 28
4142 }, 4168 },
4143 "file": "src/features/planSelection/containers/PlanSelectionScreen.js", 4169 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
4144 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade", 4170 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade",
4145 "start": { 4171 "start": {
4146 "column": 22, 4172 "column": 22,
4147 "line": 24 4173 "line": 25
4148 } 4174 }
4149 }, 4175 },
4150 { 4176 {
4151 "defaultMessage": "!!!Choose Personal", 4177 "defaultMessage": "!!!Choose Personal",
4152 "end": { 4178 "end": {
4153 "column": 3, 4179 "column": 3,
4154 "line": 31 4180 "line": 32
4155 }, 4181 },
4156 "file": "src/features/planSelection/containers/PlanSelectionScreen.js", 4182 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
4157 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade", 4183 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade",
4158 "start": { 4184 "start": {
4159 "column": 20, 4185 "column": 20,
4160 "line": 28 4186 "line": 29
4161 } 4187 }
4162 } 4188 }
4163 ], 4189 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index f2fd7a52a..6977ec096 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -170,6 +170,7 @@
170 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", 170 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
171 "pricing.trial.terms.headline": "No strings attached", 171 "pricing.trial.terms.headline": "No strings attached",
172 "pricing.trial.terms.noCreditCard": "No credit card required", 172 "pricing.trial.terms.noCreditCard": "No credit card required",
173 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
173 "service.crashHandler.action": "Reload {name}", 174 "service.crashHandler.action": "Reload {name}",
174 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 175 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
175 "service.crashHandler.headline": "Oh no!", 176 "service.crashHandler.headline": "Oh no!",
@@ -369,6 +370,7 @@
369 "signup.link.login": "Already have an account, sign in?", 370 "signup.link.login": "Already have an account, sign in?",
370 "signup.password.label": "Password", 371 "signup.password.label": "Password",
371 "signup.submit.label": "Create account", 372 "signup.submit.label": "Create account",
373 "subscription.bestValue": "Best value",
372 "subscription.cta.activateTrial": "Yes, start the free Franz Professional trial", 374 "subscription.cta.activateTrial": "Yes, start the free Franz Professional trial",
373 "subscription.cta.allOptions": "See all options", 375 "subscription.cta.allOptions": "See all options",
374 "subscription.cta.choosePlan": "Choose your plan", 376 "subscription.cta.choosePlan": "Choose your plan",
@@ -413,4 +415,4 @@
413 "workspaceDrawer.workspaceFeatureInfo": "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 415 "workspaceDrawer.workspaceFeatureInfo": "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>",
414 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 416 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
415 "workspaces.switchingIndicator.switchingTo": "Switching to" 417 "workspaces.switchingIndicator.switchingTo": "Switching to"
416} \ No newline at end of file 418}
diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json
index 2d09c9ebb..3f0cf4e86 100644
--- a/src/i18n/messages/src/components/auth/Pricing.json
+++ b/src/i18n/messages/src/components/auth/Pricing.json
@@ -65,15 +65,28 @@
65 } 65 }
66 }, 66 },
67 { 67 {
68 "id": "pricing.trial.terms.trialWorth",
69 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
70 "file": "src/components/auth/Pricing.js",
71 "start": {
72 "line": 35,
73 "column": 14
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
68 "id": "pricing.trial.error", 81 "id": "pricing.trial.error",
69 "defaultMessage": "!!!Sorry, we could not activate your trial!", 82 "defaultMessage": "!!!Sorry, we could not activate your trial!",
70 "file": "src/components/auth/Pricing.js", 83 "file": "src/components/auth/Pricing.js",
71 "start": { 84 "start": {
72 "line": 35, 85 "line": 39,
73 "column": 19 86 "column": 19
74 }, 87 },
75 "end": { 88 "end": {
76 "line": 38, 89 "line": 42,
77 "column": 3 90 "column": 3
78 } 91 }
79 }, 92 },
@@ -82,11 +95,11 @@
82 "defaultMessage": "!!!Start my 14-day Franz Professional Trial", 95 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
83 "file": "src/components/auth/Pricing.js", 96 "file": "src/components/auth/Pricing.js",
84 "start": { 97 "start": {
85 "line": 39, 98 "line": 43,
86 "column": 13 99 "column": 13
87 }, 100 },
88 "end": { 101 "end": {
89 "line": 42, 102 "line": 46,
90 "column": 3 103 "column": 3
91 } 104 }
92 }, 105 },
@@ -95,11 +108,11 @@
95 "defaultMessage": "!!!Continue to Franz", 108 "defaultMessage": "!!!Continue to Franz",
96 "file": "src/components/auth/Pricing.js", 109 "file": "src/components/auth/Pricing.js",
97 "start": { 110 "start": {
98 "line": 43, 111 "line": 47,
99 "column": 11 112 "column": 11
100 }, 113 },
101 "end": { 114 "end": {
102 "line": 46, 115 "line": 50,
103 "column": 3 116 "column": 3
104 } 117 }
105 }, 118 },
@@ -108,11 +121,11 @@
108 "defaultMessage": "!!!Franz Professional includes:", 121 "defaultMessage": "!!!Franz Professional includes:",
109 "file": "src/components/auth/Pricing.js", 122 "file": "src/components/auth/Pricing.js",
110 "start": { 123 "start": {
111 "line": 47, 124 "line": 51,
112 "column": 20 125 "column": 20
113 }, 126 },
114 "end": { 127 "end": {
115 "line": 50, 128 "line": 54,
116 "column": 3 129 "column": 3
117 } 130 }
118 } 131 }
diff --git a/src/i18n/messages/src/features/planSelection/components/PlanItem.json b/src/i18n/messages/src/features/planSelection/components/PlanItem.json
index 839686390..5a94f32ee 100644
--- a/src/i18n/messages/src/features/planSelection/components/PlanItem.json
+++ b/src/i18n/messages/src/features/planSelection/components/PlanItem.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!per month", 4 "defaultMessage": "!!!per month",
5 "file": "src/features/planSelection/components/PlanItem.js", 5 "file": "src/features/planSelection/components/PlanItem.js",
6 "start": { 6 "start": {
7 "line": 19, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 22, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,10 +17,23 @@
17 "defaultMessage": "!!!per month & user", 17 "defaultMessage": "!!!per month & user",
18 "file": "src/features/planSelection/components/PlanItem.js", 18 "file": "src/features/planSelection/components/PlanItem.js",
19 "start": { 19 "start": {
20 "line": 23, 20 "line": 19,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.bestValue",
30 "defaultMessage": "!!!Best value",
31 "file": "src/features/planSelection/components/PlanItem.js",
32 "start": {
33 "line": 23,
34 "column": 13
35 },
36 "end": {
24 "line": 26, 37 "line": 26,
25 "column": 3 38 "column": 3
26 } 39 }