diff options
author | Stefan Malzner <stefan@adlk.io> | 2019-10-16 10:22:00 +0200 |
---|---|---|
committer | Stefan Malzner <stefan@adlk.io> | 2019-10-16 10:22:00 +0200 |
commit | ba578b8a6df8d31136fb170e78b70a71dad85e31 (patch) | |
tree | a8c980cc83e6014fd7befefd240b8364d40447d3 /src | |
parent | plan selection polishing (diff) | |
download | ferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.tar.gz ferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.tar.zst ferdium-app-ba578b8a6df8d31136fb170e78b70a71dad85e31.zip |
polishing
Diffstat (limited to 'src')
-rw-r--r-- | src/components/auth/Pricing.js | 15 | ||||
-rw-r--r-- | src/containers/auth/PricingScreen.js | 11 | ||||
-rw-r--r-- | src/features/planSelection/components/PlanItem.js | 50 | ||||
-rw-r--r-- | src/features/planSelection/components/PlanSelection.js | 27 | ||||
-rw-r--r-- | src/features/planSelection/containers/PlanSelectionScreen.js | 14 | ||||
-rw-r--r-- | src/features/planSelection/store.js | 3 | ||||
-rw-r--r-- | src/i18n/locales/defaultMessages.json | 102 | ||||
-rw-r--r-- | src/i18n/locales/en-US.json | 4 | ||||
-rw-r--r-- | src/i18n/messages/src/components/auth/Pricing.json | 29 | ||||
-rw-r--r-- | src/i18n/messages/src/features/planSelection/components/PlanItem.json | 19 |
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 | ||
11 | import { Button } from '@meetfranz/forms'; | 11 | import { Button } from '@meetfranz/forms'; |
12 | import { mdiArrowRight } from '@mdi/js'; | 12 | import { 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 | ||
18 | const messages = defineMessages({ | 14 | const 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 | ||
29 | const styles = theme => ({ | 29 | const 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 | } |