diff options
author | 2019-10-17 14:12:36 +0200 | |
---|---|---|
committer | 2019-10-17 14:12:36 +0200 | |
commit | b6276bd0cb88ce681bc35a6fc7b1ae0cf6ac56ea (patch) | |
tree | 7070d5c2fd4a3d98d63d0c85171d85dba77102c5 /src | |
parent | polishing (diff) | |
download | ferdium-app-b6276bd0cb88ce681bc35a6fc7b1ae0cf6ac56ea.tar.gz ferdium-app-b6276bd0cb88ce681bc35a6fc7b1ae0cf6ac56ea.tar.zst ferdium-app-b6276bd0cb88ce681bc35a6fc7b1ae0cf6ac56ea.zip |
optimize trial signup flow
Diffstat (limited to 'src')
-rw-r--r-- | src/actions/user.js | 4 | ||||
-rw-r--r-- | src/api/server/ServerApi.js | 2 | ||||
-rw-r--r-- | src/components/auth/Pricing.js | 92 | ||||
-rw-r--r-- | src/containers/auth/PricingScreen.js | 17 | ||||
-rw-r--r-- | src/containers/auth/SignupScreen.js | 22 | ||||
-rw-r--r-- | src/i18n/locales/defaultMessages.json | 94 | ||||
-rw-r--r-- | src/i18n/locales/en-US.json | 6 | ||||
-rw-r--r-- | src/i18n/messages/src/components/auth/Pricing.json | 81 | ||||
-rw-r--r-- | src/stores/FeaturesStore.js | 1 | ||||
-rw-r--r-- | src/stores/UserStore.js | 4 |
10 files changed, 245 insertions, 78 deletions
diff --git a/src/actions/user.js b/src/actions/user.js index 5d7d9a899..7061a367a 100644 --- a/src/actions/user.js +++ b/src/actions/user.js | |||
@@ -11,8 +11,10 @@ export default { | |||
11 | lastname: PropTypes.string.isRequired, | 11 | lastname: PropTypes.string.isRequired, |
12 | email: PropTypes.string.isRequired, | 12 | email: PropTypes.string.isRequired, |
13 | password: PropTypes.string.isRequired, | 13 | password: PropTypes.string.isRequired, |
14 | accountType: PropTypes.string.isRequired, | 14 | accountType: PropTypes.string, |
15 | company: PropTypes.string, | 15 | company: PropTypes.string, |
16 | plan: PropTypes.string, | ||
17 | currency: PropTypes.string, | ||
16 | }, | 18 | }, |
17 | retrievePassword: { | 19 | retrievePassword: { |
18 | email: PropTypes.string.isRequired, | 20 | email: PropTypes.string.isRequired, |
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js index f56c7b6e4..1f538368d 100644 --- a/src/api/server/ServerApi.js +++ b/src/api/server/ServerApi.js | |||
@@ -87,7 +87,7 @@ export default class ServerApi { | |||
87 | } | 87 | } |
88 | const trial = await request.json(); | 88 | const trial = await request.json(); |
89 | 89 | ||
90 | debug('ServerApi::signup resolves', trial); | 90 | debug('ServerApi::activateTrial resolves', trial); |
91 | return true; | 91 | return true; |
92 | } | 92 | } |
93 | 93 | ||
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js index 67af04470..86b6a4263 100644 --- a/src/components/auth/Pricing.js +++ b/src/components/auth/Pricing.js | |||
@@ -13,12 +13,20 @@ import { FeatureList } from '../ui/FeatureList'; | |||
13 | 13 | ||
14 | const messages = defineMessages({ | 14 | const messages = defineMessages({ |
15 | headline: { | 15 | headline: { |
16 | id: 'pricing.trial.headline', | 16 | id: 'pricing.trial.headline.pro', |
17 | defaultMessage: '!!!Franz Professional', | 17 | defaultMessage: '!!!Hi {name}, welcome to Franz', |
18 | }, | 18 | }, |
19 | personalOffer: { | 19 | specialTreat: { |
20 | id: 'pricing.trial.subheadline', | 20 | id: 'pricing.trial.intro.specialTreat', |
21 | defaultMessage: '!!!Here\'s a special welcome for you:', | 21 | defaultMessage: '!!!We have a special treat for you.', |
22 | }, | ||
23 | tryPro: { | ||
24 | id: 'pricing.trial.intro.tryPro', | ||
25 | defaultMessage: '!!!Enjoy the full Franz Professional experience completely free for 14 days.', | ||
26 | }, | ||
27 | happyMessaging: { | ||
28 | id: 'pricing.trial.intro.happyMessaging', | ||
29 | defaultMessage: '!!!Happy messaging,', | ||
22 | }, | 30 | }, |
23 | noStringsAttachedHeadline: { | 31 | noStringsAttachedHeadline: { |
24 | id: 'pricing.trial.terms.headline', | 32 | id: 'pricing.trial.terms.headline', |
@@ -44,6 +52,10 @@ const messages = defineMessages({ | |||
44 | id: 'pricing.trial.cta.accept', | 52 | id: 'pricing.trial.cta.accept', |
45 | defaultMessage: '!!!Start my 14-day Franz Professional Trial ', | 53 | defaultMessage: '!!!Start my 14-day Franz Professional Trial ', |
46 | }, | 54 | }, |
55 | ctaStart: { | ||
56 | id: 'pricing.trial.cta.start', | ||
57 | defaultMessage: '!!!Start using Franz', | ||
58 | }, | ||
47 | ctaSkip: { | 59 | ctaSkip: { |
48 | id: 'pricing.trial.cta.skip', | 60 | id: 'pricing.trial.cta.skip', |
49 | defaultMessage: '!!!Continue to Franz', | 61 | defaultMessage: '!!!Continue to Franz', |
@@ -98,6 +110,34 @@ const styles = theme => ({ | |||
98 | margin: [20, 0, 0], | 110 | margin: [20, 0, 0], |
99 | color: theme.styleTypes.danger.accent, | 111 | color: theme.styleTypes.danger.accent, |
100 | }, | 112 | }, |
113 | priceContainer: { | ||
114 | display: 'flex', | ||
115 | justifyContent: 'space-evenly', | ||
116 | margin: [10, 0, 15], | ||
117 | }, | ||
118 | price: { | ||
119 | '& sup': { | ||
120 | verticalAlign: 14, | ||
121 | fontSize: 20, | ||
122 | }, | ||
123 | }, | ||
124 | figure: { | ||
125 | fontSize: 40, | ||
126 | }, | ||
127 | regularPrice: { | ||
128 | position: 'relative', | ||
129 | |||
130 | '&:before': { | ||
131 | content: '" "', | ||
132 | position: 'absolute', | ||
133 | width: '130%', | ||
134 | height: 1, | ||
135 | top: 14, | ||
136 | left: -12, | ||
137 | borderBottom: [3, 'solid', 'red'], | ||
138 | transform: 'rotateZ(-20deg)', | ||
139 | }, | ||
140 | }, | ||
101 | }); | 141 | }); |
102 | 142 | ||
103 | export default @observer @injectSheet(styles) class Signup extends Component { | 143 | export default @observer @injectSheet(styles) class Signup extends Component { |
@@ -129,6 +169,8 @@ export default @observer @injectSheet(styles) class Signup extends Component { | |||
129 | } = this.props; | 169 | } = this.props; |
130 | const { intl } = this.context; | 170 | const { intl } = this.context; |
131 | 171 | ||
172 | const [intPart, fractionPart] = (price).toString().split('.'); | ||
173 | |||
132 | return ( | 174 | return ( |
133 | <div className={classnames('auth__scroll-container', classes.container)}> | 175 | <div className={classnames('auth__scroll-container', classes.container)}> |
134 | <div className={classnames('auth__container', 'auth__container--signup', classes.content)}> | 176 | <div className={classnames('auth__container', 'auth__container--signup', classes.content)}> |
@@ -140,25 +182,39 @@ export default @observer @injectSheet(styles) class Signup extends Component { | |||
140 | alt="" | 182 | alt="" |
141 | /> | 183 | /> |
142 | )} | 184 | )} |
143 | <p className={classes.welcomeOffer}>{intl.formatMessage(messages.personalOffer)}</p> | 185 | <h1>{intl.formatMessage(messages.headline, { name: 'Stefan' })}</h1> |
144 | <h1>{intl.formatMessage(messages.headline)}</h1> | ||
145 | <div className="auth__letter"> | 186 | <div className="auth__letter"> |
146 | <p> | 187 | <p> |
147 | We built Franz with a lot of effort, manpower and love, | 188 | {intl.formatMessage(messages.specialTreat)} |
148 | to boost up your messaging experience. | ||
149 | <br /> | 189 | <br /> |
150 | </p> | 190 | </p> |
151 | <p> | 191 | <p> |
152 | For the next 14 days, we are going to give you the full Franz Professional experience so you can watch your communication evolve! | 192 | {intl.formatMessage(messages.tryPro)} |
153 | <br /> | 193 | <br /> |
154 | </p> | 194 | </p> |
155 | <p> | 195 | <p> |
156 | Thanks for being a hero. | 196 | {intl.formatMessage(messages.happyMessaging)} |
157 | </p> | 197 | </p> |
158 | <p> | 198 | <p> |
159 | <strong>Stefan Malzner</strong> | 199 | <strong>Stefan Malzner</strong> |
160 | </p> | 200 | </p> |
161 | </div> | 201 | </div> |
202 | <div className={classes.priceContainer}> | ||
203 | <p className={classnames(classes.price, classes.regularPrice)}> | ||
204 | <span className={classes.figure}> | ||
205 | {currency} | ||
206 | {intPart} | ||
207 | </span> | ||
208 | <sup>{fractionPart}</sup> | ||
209 | </p> | ||
210 | <p className={classnames(classes.price, classes.trialPrice)}> | ||
211 | <span className={classes.figure}> | ||
212 | {currency} | ||
213 | 0 | ||
214 | </span> | ||
215 | <sup>00</sup> | ||
216 | </p> | ||
217 | </div> | ||
162 | <div className={classes.keyTerms}> | 218 | <div className={classes.keyTerms}> |
163 | <H2> | 219 | <H2> |
164 | {intl.formatMessage(messages.noStringsAttachedHeadline)} | 220 | {intl.formatMessage(messages.noStringsAttachedHeadline)} |
@@ -179,7 +235,7 @@ export default @observer @injectSheet(styles) class Signup extends Component { | |||
179 | <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p> | 235 | <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p> |
180 | )} | 236 | )} |
181 | <Button | 237 | <Button |
182 | label={intl.formatMessage(messages.ctaAccept)} | 238 | label={intl.formatMessage(!canSkipTrial ? messages.ctaStart : messages.ctaAccept)} |
183 | className={classes.cta} | 239 | className={classes.cta} |
184 | onClick={onSubmit} | 240 | onClick={onSubmit} |
185 | busy={isActivatingTrial} | 241 | busy={isActivatingTrial} |
@@ -196,18 +252,6 @@ export default @observer @injectSheet(styles) class Signup extends Component { | |||
196 | <H2> | 252 | <H2> |
197 | {intl.formatMessage(messages.featuresHeadline)} | 253 | {intl.formatMessage(messages.featuresHeadline)} |
198 | </H2> | 254 | </H2> |
199 | {/* <ul className={classes.features}> | ||
200 | <FeatureItem name="Add unlimited services" className={classes.featureItem} /> | ||
201 | <FeatureItem name="Spellchecker support" className={classes.featureItem} /> | ||
202 | <FeatureItem name="Workspaces" className={classes.featureItem} /> | ||
203 | <FeatureItem name="Add Custom Websites" className={classes.featureItem} /> | ||
204 | <FeatureItem name="On-premise & other Hosted Services" className={classes.featureItem} /> | ||
205 | <FeatureItem name="Install 3rd party services" className={classes.featureItem} /> | ||
206 | <FeatureItem name="Service Proxies" className={classes.featureItem} /> | ||
207 | <FeatureItem name="Team Management" className={classes.featureItem} /> | ||
208 | <FeatureItem name="No Waiting Screens" className={classes.featureItem} /> | ||
209 | <FeatureItem name="Forever ad-free" className={classes.featureItem} /> | ||
210 | </ul> */} | ||
211 | <FeatureList /> | 255 | <FeatureList /> |
212 | </div> | 256 | </div> |
213 | </div> | 257 | </div> |
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js index ff378bd8b..55811ed23 100644 --- a/src/containers/auth/PricingScreen.js +++ b/src/containers/auth/PricingScreen.js | |||
@@ -20,14 +20,19 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend | |||
20 | } = this.props; | 20 | } = this.props; |
21 | 21 | ||
22 | const { activateTrialRequest } = stores.user; | 22 | const { activateTrialRequest } = stores.user; |
23 | const { defaultTrialPlan } = stores.features.features; | 23 | const { defaultTrialPlan, canSkipTrial } = stores.features.anonymousFeatures; |
24 | 24 | ||
25 | actions.user.activateTrial({ planId: defaultTrialPlan }); | 25 | if (!canSkipTrial) { |
26 | await activateTrialRequest._promise; | ||
27 | |||
28 | if (!activateTrialRequest.isError) { | ||
29 | stores.router.push('/'); | 26 | stores.router.push('/'); |
30 | stores.user.hasCompletedSignup = true; | 27 | stores.user.hasCompletedSignup = true; |
28 | } else { | ||
29 | actions.user.activateTrial({ planId: defaultTrialPlan }); | ||
30 | await activateTrialRequest._promise; | ||
31 | |||
32 | if (!activateTrialRequest.isError) { | ||
33 | stores.router.push('/'); | ||
34 | stores.user.hasCompletedSignup = true; | ||
35 | } | ||
31 | } | 36 | } |
32 | } | 37 | } |
33 | 38 | ||
@@ -43,7 +48,7 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend | |||
43 | const { pricingConfig } = features; | 48 | const { pricingConfig } = features; |
44 | 49 | ||
45 | let currency = '$'; | 50 | let currency = '$'; |
46 | let price = '5.99'; | 51 | let price = 5.99; |
47 | if (pricingConfig) { | 52 | if (pricingConfig) { |
48 | ({ currency } = pricingConfig); | 53 | ({ currency } = pricingConfig); |
49 | ({ price } = pricingConfig.plans.pro.yearly); | 54 | ({ price } = pricingConfig.plans.pro.yearly); |
diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js index efc7ea4c1..f93498be2 100644 --- a/src/containers/auth/SignupScreen.js +++ b/src/containers/auth/SignupScreen.js | |||
@@ -4,6 +4,7 @@ import { inject, observer } from 'mobx-react'; | |||
4 | 4 | ||
5 | import Signup from '../../components/auth/Signup'; | 5 | import Signup from '../../components/auth/Signup'; |
6 | import UserStore from '../../stores/UserStore'; | 6 | import UserStore from '../../stores/UserStore'; |
7 | import FeaturesStore from '../../stores/FeaturesStore'; | ||
7 | 8 | ||
8 | import { globalError as globalErrorPropType } from '../../prop-types'; | 9 | import { globalError as globalErrorPropType } from '../../prop-types'; |
9 | 10 | ||
@@ -12,11 +13,27 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends | |||
12 | error: globalErrorPropType.isRequired, | 13 | error: globalErrorPropType.isRequired, |
13 | }; | 14 | }; |
14 | 15 | ||
16 | onSignup(values) { | ||
17 | const { actions, stores } = this.props; | ||
18 | |||
19 | const { canSkipTrial, defaultTrialPlan, pricingConfig } = stores.features.anonymousFeatures; | ||
20 | |||
21 | if (!canSkipTrial) { | ||
22 | Object.assign(values, { | ||
23 | plan: defaultTrialPlan, | ||
24 | currency: pricingConfig.currencyID, | ||
25 | }); | ||
26 | } | ||
27 | |||
28 | actions.user.signup(values); | ||
29 | } | ||
30 | |||
15 | render() { | 31 | render() { |
16 | const { actions, stores, error } = this.props; | 32 | const { stores, error } = this.props; |
33 | |||
17 | return ( | 34 | return ( |
18 | <Signup | 35 | <Signup |
19 | onSubmit={actions.user.signup} | 36 | onSubmit={values => this.onSignup(values)} |
20 | isSubmitting={stores.user.signupRequest.isExecuting} | 37 | isSubmitting={stores.user.signupRequest.isExecuting} |
21 | loginRoute={stores.user.loginRoute} | 38 | loginRoute={stores.user.loginRoute} |
22 | error={error} | 39 | error={error} |
@@ -33,5 +50,6 @@ SignupScreen.wrappedComponent.propTypes = { | |||
33 | }).isRequired, | 50 | }).isRequired, |
34 | stores: PropTypes.shape({ | 51 | stores: PropTypes.shape({ |
35 | user: PropTypes.instanceOf(UserStore).isRequired, | 52 | user: PropTypes.instanceOf(UserStore).isRequired, |
53 | features: PropTypes.instanceOf(FeaturesStore).isRequired, | ||
36 | }).isRequired, | 54 | }).isRequired, |
37 | }; | 55 | }; |
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index cd876c0ea..e46c69d67 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json | |||
@@ -417,133 +417,185 @@ | |||
417 | { | 417 | { |
418 | "descriptors": [ | 418 | "descriptors": [ |
419 | { | 419 | { |
420 | "defaultMessage": "!!!Franz Professional", | 420 | "defaultMessage": "!!!Hi {name}, welcome to Franz", |
421 | "end": { | 421 | "end": { |
422 | "column": 3, | 422 | "column": 3, |
423 | "line": 18 | 423 | "line": 18 |
424 | }, | 424 | }, |
425 | "file": "src/components/auth/Pricing.js", | 425 | "file": "src/components/auth/Pricing.js", |
426 | "id": "pricing.trial.headline", | 426 | "id": "pricing.trial.headline.pro", |
427 | "start": { | 427 | "start": { |
428 | "column": 12, | 428 | "column": 12, |
429 | "line": 15 | 429 | "line": 15 |
430 | } | 430 | } |
431 | }, | 431 | }, |
432 | { | 432 | { |
433 | "defaultMessage": "!!!Here's a special welcome for you:", | 433 | "defaultMessage": "!!!We have a special treat for you.", |
434 | "end": { | 434 | "end": { |
435 | "column": 3, | 435 | "column": 3, |
436 | "line": 22 | 436 | "line": 22 |
437 | }, | 437 | }, |
438 | "file": "src/components/auth/Pricing.js", | 438 | "file": "src/components/auth/Pricing.js", |
439 | "id": "pricing.trial.intro.specialTreat", | ||
440 | "start": { | ||
441 | "column": 16, | ||
442 | "line": 19 | ||
443 | } | ||
444 | }, | ||
445 | { | ||
446 | "defaultMessage": "!!!Try out the full Franz Professional experience completely free for 14 days.", | ||
447 | "end": { | ||
448 | "column": 3, | ||
449 | "line": 26 | ||
450 | }, | ||
451 | "file": "src/components/auth/Pricing.js", | ||
452 | "id": "pricing.trial.intro.tryPro", | ||
453 | "start": { | ||
454 | "column": 10, | ||
455 | "line": 23 | ||
456 | } | ||
457 | }, | ||
458 | { | ||
459 | "defaultMessage": "!!!Happy messaging,", | ||
460 | "end": { | ||
461 | "column": 3, | ||
462 | "line": 30 | ||
463 | }, | ||
464 | "file": "src/components/auth/Pricing.js", | ||
465 | "id": "pricing.trial.intro.happyMessaging", | ||
466 | "start": { | ||
467 | "column": 18, | ||
468 | "line": 27 | ||
469 | } | ||
470 | }, | ||
471 | { | ||
472 | "defaultMessage": "!!!Here's a special welcome for you:", | ||
473 | "end": { | ||
474 | "column": 3, | ||
475 | "line": 34 | ||
476 | }, | ||
477 | "file": "src/components/auth/Pricing.js", | ||
439 | "id": "pricing.trial.subheadline", | 478 | "id": "pricing.trial.subheadline", |
440 | "start": { | 479 | "start": { |
441 | "column": 17, | 480 | "column": 17, |
442 | "line": 19 | 481 | "line": 31 |
443 | } | 482 | } |
444 | }, | 483 | }, |
445 | { | 484 | { |
446 | "defaultMessage": "!!!No strings attached", | 485 | "defaultMessage": "!!!No strings attached", |
447 | "end": { | 486 | "end": { |
448 | "column": 3, | 487 | "column": 3, |
449 | "line": 26 | 488 | "line": 38 |
450 | }, | 489 | }, |
451 | "file": "src/components/auth/Pricing.js", | 490 | "file": "src/components/auth/Pricing.js", |
452 | "id": "pricing.trial.terms.headline", | 491 | "id": "pricing.trial.terms.headline", |
453 | "start": { | 492 | "start": { |
454 | "column": 29, | 493 | "column": 29, |
455 | "line": 23 | 494 | "line": 35 |
456 | } | 495 | } |
457 | }, | 496 | }, |
458 | { | 497 | { |
459 | "defaultMessage": "!!!No credit card required", | 498 | "defaultMessage": "!!!No credit card required", |
460 | "end": { | 499 | "end": { |
461 | "column": 3, | 500 | "column": 3, |
462 | "line": 30 | 501 | "line": 42 |
463 | }, | 502 | }, |
464 | "file": "src/components/auth/Pricing.js", | 503 | "file": "src/components/auth/Pricing.js", |
465 | "id": "pricing.trial.terms.noCreditCard", | 504 | "id": "pricing.trial.terms.noCreditCard", |
466 | "start": { | 505 | "start": { |
467 | "column": 16, | 506 | "column": 16, |
468 | "line": 27 | 507 | "line": 39 |
469 | } | 508 | } |
470 | }, | 509 | }, |
471 | { | 510 | { |
472 | "defaultMessage": "!!!Your free trial ends automatically after 14 days", | 511 | "defaultMessage": "!!!Your free trial ends automatically after 14 days", |
473 | "end": { | 512 | "end": { |
474 | "column": 3, | 513 | "column": 3, |
475 | "line": 34 | 514 | "line": 46 |
476 | }, | 515 | }, |
477 | "file": "src/components/auth/Pricing.js", | 516 | "file": "src/components/auth/Pricing.js", |
478 | "id": "pricing.trial.terms.automaticTrialEnd", | 517 | "id": "pricing.trial.terms.automaticTrialEnd", |
479 | "start": { | 518 | "start": { |
480 | "column": 21, | 519 | "column": 21, |
481 | "line": 31 | 520 | "line": 43 |
482 | } | 521 | } |
483 | }, | 522 | }, |
484 | { | 523 | { |
485 | "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", | 524 | "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", |
486 | "end": { | 525 | "end": { |
487 | "column": 3, | 526 | "column": 3, |
488 | "line": 38 | 527 | "line": 50 |
489 | }, | 528 | }, |
490 | "file": "src/components/auth/Pricing.js", | 529 | "file": "src/components/auth/Pricing.js", |
491 | "id": "pricing.trial.terms.trialWorth", | 530 | "id": "pricing.trial.terms.trialWorth", |
492 | "start": { | 531 | "start": { |
493 | "column": 14, | 532 | "column": 14, |
494 | "line": 35 | 533 | "line": 47 |
495 | } | 534 | } |
496 | }, | 535 | }, |
497 | { | 536 | { |
498 | "defaultMessage": "!!!Sorry, we could not activate your trial!", | 537 | "defaultMessage": "!!!Sorry, we could not activate your trial!", |
499 | "end": { | 538 | "end": { |
500 | "column": 3, | 539 | "column": 3, |
501 | "line": 42 | 540 | "line": 54 |
502 | }, | 541 | }, |
503 | "file": "src/components/auth/Pricing.js", | 542 | "file": "src/components/auth/Pricing.js", |
504 | "id": "pricing.trial.error", | 543 | "id": "pricing.trial.error", |
505 | "start": { | 544 | "start": { |
506 | "column": 19, | 545 | "column": 19, |
507 | "line": 39 | 546 | "line": 51 |
508 | } | 547 | } |
509 | }, | 548 | }, |
510 | { | 549 | { |
511 | "defaultMessage": "!!!Start my 14-day Franz Professional Trial", | 550 | "defaultMessage": "!!!Start my 14-day Franz Professional Trial", |
512 | "end": { | 551 | "end": { |
513 | "column": 3, | 552 | "column": 3, |
514 | "line": 46 | 553 | "line": 58 |
515 | }, | 554 | }, |
516 | "file": "src/components/auth/Pricing.js", | 555 | "file": "src/components/auth/Pricing.js", |
517 | "id": "pricing.trial.cta.accept", | 556 | "id": "pricing.trial.cta.accept", |
518 | "start": { | 557 | "start": { |
519 | "column": 13, | 558 | "column": 13, |
520 | "line": 43 | 559 | "line": 55 |
560 | } | ||
561 | }, | ||
562 | { | ||
563 | "defaultMessage": "!!!Start using Franz", | ||
564 | "end": { | ||
565 | "column": 3, | ||
566 | "line": 62 | ||
567 | }, | ||
568 | "file": "src/components/auth/Pricing.js", | ||
569 | "id": "pricing.trial.cta.start", | ||
570 | "start": { | ||
571 | "column": 12, | ||
572 | "line": 59 | ||
521 | } | 573 | } |
522 | }, | 574 | }, |
523 | { | 575 | { |
524 | "defaultMessage": "!!!Continue to Franz", | 576 | "defaultMessage": "!!!Continue to Franz", |
525 | "end": { | 577 | "end": { |
526 | "column": 3, | 578 | "column": 3, |
527 | "line": 50 | 579 | "line": 66 |
528 | }, | 580 | }, |
529 | "file": "src/components/auth/Pricing.js", | 581 | "file": "src/components/auth/Pricing.js", |
530 | "id": "pricing.trial.cta.skip", | 582 | "id": "pricing.trial.cta.skip", |
531 | "start": { | 583 | "start": { |
532 | "column": 11, | 584 | "column": 11, |
533 | "line": 47 | 585 | "line": 63 |
534 | } | 586 | } |
535 | }, | 587 | }, |
536 | { | 588 | { |
537 | "defaultMessage": "!!!Franz Professional includes:", | 589 | "defaultMessage": "!!!Franz Professional includes:", |
538 | "end": { | 590 | "end": { |
539 | "column": 3, | 591 | "column": 3, |
540 | "line": 54 | 592 | "line": 70 |
541 | }, | 593 | }, |
542 | "file": "src/components/auth/Pricing.js", | 594 | "file": "src/components/auth/Pricing.js", |
543 | "id": "pricing.trial.features.headline", | 595 | "id": "pricing.trial.features.headline", |
544 | "start": { | 596 | "start": { |
545 | "column": 20, | 597 | "column": 20, |
546 | "line": 51 | 598 | "line": 67 |
547 | } | 599 | } |
548 | } | 600 | } |
549 | ], | 601 | ], |
@@ -3956,7 +4008,7 @@ | |||
3956 | { | 4008 | { |
3957 | "descriptors": [ | 4009 | "descriptors": [ |
3958 | { | 4010 | { |
3959 | "defaultMessage": "!!!Welcome back, {name}", | 4011 | "defaultMessage": "!!!Are you ready to choose, {name}", |
3960 | "end": { | 4012 | "end": { |
3961 | "column": 3, | 4013 | "column": 3, |
3962 | "line": 20 | 4014 | "line": 20 |
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 8af42554b..6b0aebb13 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json | |||
@@ -170,9 +170,13 @@ | |||
170 | "pricing.plan.pro-yearly": "Professional Yearly", | 170 | "pricing.plan.pro-yearly": "Professional Yearly", |
171 | "pricing.trial.cta.accept": "Start my 14-day Franz Professional Trial ", | 171 | "pricing.trial.cta.accept": "Start my 14-day Franz Professional Trial ", |
172 | "pricing.trial.cta.skip": "Continue to Franz", | 172 | "pricing.trial.cta.skip": "Continue to Franz", |
173 | "pricing.trial.cta.start": "Start using Franz", | ||
173 | "pricing.trial.error": "Sorry, we could not activate your trial!", | 174 | "pricing.trial.error": "Sorry, we could not activate your trial!", |
174 | "pricing.trial.features.headline": "Franz Professional includes:", | 175 | "pricing.trial.features.headline": "Franz Professional includes:", |
175 | "pricing.trial.headline": "Franz Professional", | 176 | "pricing.trial.headline.pro": "Hi {name}, welcome to Franz", |
177 | "pricing.trial.intro.happyMessaging": "Happy messaging,", | ||
178 | "pricing.trial.intro.specialTreat": "We have a special treat for you.", | ||
179 | "pricing.trial.intro.tryPro": "Enjoy the full Franz Professional experience completely free for 14 days.", | ||
176 | "pricing.trial.subheadline": "Here's a special welcome for you:", | 180 | "pricing.trial.subheadline": "Here's a special welcome for you:", |
177 | "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", | 181 | "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", |
178 | "pricing.trial.terms.headline": "No strings attached", | 182 | "pricing.trial.terms.headline": "No strings attached", |
diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json index 3f0cf4e86..6db39148c 100644 --- a/src/i18n/messages/src/components/auth/Pricing.json +++ b/src/i18n/messages/src/components/auth/Pricing.json | |||
@@ -1,7 +1,7 @@ | |||
1 | [ | 1 | [ |
2 | { | 2 | { |
3 | "id": "pricing.trial.headline", | 3 | "id": "pricing.trial.headline.pro", |
4 | "defaultMessage": "!!!Franz Professional", | 4 | "defaultMessage": "!!!Hi {name}, welcome to Franz", |
5 | "file": "src/components/auth/Pricing.js", | 5 | "file": "src/components/auth/Pricing.js", |
6 | "start": { | 6 | "start": { |
7 | "line": 15, | 7 | "line": 15, |
@@ -13,12 +13,12 @@ | |||
13 | } | 13 | } |
14 | }, | 14 | }, |
15 | { | 15 | { |
16 | "id": "pricing.trial.subheadline", | 16 | "id": "pricing.trial.intro.specialTreat", |
17 | "defaultMessage": "!!!Here's a special welcome for you:", | 17 | "defaultMessage": "!!!We have a special treat for you.", |
18 | "file": "src/components/auth/Pricing.js", | 18 | "file": "src/components/auth/Pricing.js", |
19 | "start": { | 19 | "start": { |
20 | "line": 19, | 20 | "line": 19, |
21 | "column": 17 | 21 | "column": 16 |
22 | }, | 22 | }, |
23 | "end": { | 23 | "end": { |
24 | "line": 22, | 24 | "line": 22, |
@@ -26,15 +26,41 @@ | |||
26 | } | 26 | } |
27 | }, | 27 | }, |
28 | { | 28 | { |
29 | "id": "pricing.trial.intro.tryPro", | ||
30 | "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.", | ||
31 | "file": "src/components/auth/Pricing.js", | ||
32 | "start": { | ||
33 | "line": 23, | ||
34 | "column": 10 | ||
35 | }, | ||
36 | "end": { | ||
37 | "line": 26, | ||
38 | "column": 3 | ||
39 | } | ||
40 | }, | ||
41 | { | ||
42 | "id": "pricing.trial.intro.happyMessaging", | ||
43 | "defaultMessage": "!!!Happy messaging,", | ||
44 | "file": "src/components/auth/Pricing.js", | ||
45 | "start": { | ||
46 | "line": 27, | ||
47 | "column": 18 | ||
48 | }, | ||
49 | "end": { | ||
50 | "line": 30, | ||
51 | "column": 3 | ||
52 | } | ||
53 | }, | ||
54 | { | ||
29 | "id": "pricing.trial.terms.headline", | 55 | "id": "pricing.trial.terms.headline", |
30 | "defaultMessage": "!!!No strings attached", | 56 | "defaultMessage": "!!!No strings attached", |
31 | "file": "src/components/auth/Pricing.js", | 57 | "file": "src/components/auth/Pricing.js", |
32 | "start": { | 58 | "start": { |
33 | "line": 23, | 59 | "line": 31, |
34 | "column": 29 | 60 | "column": 29 |
35 | }, | 61 | }, |
36 | "end": { | 62 | "end": { |
37 | "line": 26, | 63 | "line": 34, |
38 | "column": 3 | 64 | "column": 3 |
39 | } | 65 | } |
40 | }, | 66 | }, |
@@ -43,11 +69,11 @@ | |||
43 | "defaultMessage": "!!!No credit card required", | 69 | "defaultMessage": "!!!No credit card required", |
44 | "file": "src/components/auth/Pricing.js", | 70 | "file": "src/components/auth/Pricing.js", |
45 | "start": { | 71 | "start": { |
46 | "line": 27, | 72 | "line": 35, |
47 | "column": 16 | 73 | "column": 16 |
48 | }, | 74 | }, |
49 | "end": { | 75 | "end": { |
50 | "line": 30, | 76 | "line": 38, |
51 | "column": 3 | 77 | "column": 3 |
52 | } | 78 | } |
53 | }, | 79 | }, |
@@ -56,11 +82,11 @@ | |||
56 | "defaultMessage": "!!!Your free trial ends automatically after 14 days", | 82 | "defaultMessage": "!!!Your free trial ends automatically after 14 days", |
57 | "file": "src/components/auth/Pricing.js", | 83 | "file": "src/components/auth/Pricing.js", |
58 | "start": { | 84 | "start": { |
59 | "line": 31, | 85 | "line": 39, |
60 | "column": 21 | 86 | "column": 21 |
61 | }, | 87 | }, |
62 | "end": { | 88 | "end": { |
63 | "line": 34, | 89 | "line": 42, |
64 | "column": 3 | 90 | "column": 3 |
65 | } | 91 | } |
66 | }, | 92 | }, |
@@ -69,11 +95,11 @@ | |||
69 | "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", | 95 | "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", |
70 | "file": "src/components/auth/Pricing.js", | 96 | "file": "src/components/auth/Pricing.js", |
71 | "start": { | 97 | "start": { |
72 | "line": 35, | 98 | "line": 43, |
73 | "column": 14 | 99 | "column": 14 |
74 | }, | 100 | }, |
75 | "end": { | 101 | "end": { |
76 | "line": 38, | 102 | "line": 46, |
77 | "column": 3 | 103 | "column": 3 |
78 | } | 104 | } |
79 | }, | 105 | }, |
@@ -82,11 +108,11 @@ | |||
82 | "defaultMessage": "!!!Sorry, we could not activate your trial!", | 108 | "defaultMessage": "!!!Sorry, we could not activate your trial!", |
83 | "file": "src/components/auth/Pricing.js", | 109 | "file": "src/components/auth/Pricing.js", |
84 | "start": { | 110 | "start": { |
85 | "line": 39, | 111 | "line": 47, |
86 | "column": 19 | 112 | "column": 19 |
87 | }, | 113 | }, |
88 | "end": { | 114 | "end": { |
89 | "line": 42, | 115 | "line": 50, |
90 | "column": 3 | 116 | "column": 3 |
91 | } | 117 | } |
92 | }, | 118 | }, |
@@ -95,11 +121,24 @@ | |||
95 | "defaultMessage": "!!!Start my 14-day Franz Professional Trial", | 121 | "defaultMessage": "!!!Start my 14-day Franz Professional Trial", |
96 | "file": "src/components/auth/Pricing.js", | 122 | "file": "src/components/auth/Pricing.js", |
97 | "start": { | 123 | "start": { |
98 | "line": 43, | 124 | "line": 51, |
99 | "column": 13 | 125 | "column": 13 |
100 | }, | 126 | }, |
101 | "end": { | 127 | "end": { |
102 | "line": 46, | 128 | "line": 54, |
129 | "column": 3 | ||
130 | } | ||
131 | }, | ||
132 | { | ||
133 | "id": "pricing.trial.cta.start", | ||
134 | "defaultMessage": "!!!Start using Franz", | ||
135 | "file": "src/components/auth/Pricing.js", | ||
136 | "start": { | ||
137 | "line": 55, | ||
138 | "column": 12 | ||
139 | }, | ||
140 | "end": { | ||
141 | "line": 58, | ||
103 | "column": 3 | 142 | "column": 3 |
104 | } | 143 | } |
105 | }, | 144 | }, |
@@ -108,11 +147,11 @@ | |||
108 | "defaultMessage": "!!!Continue to Franz", | 147 | "defaultMessage": "!!!Continue to Franz", |
109 | "file": "src/components/auth/Pricing.js", | 148 | "file": "src/components/auth/Pricing.js", |
110 | "start": { | 149 | "start": { |
111 | "line": 47, | 150 | "line": 59, |
112 | "column": 11 | 151 | "column": 11 |
113 | }, | 152 | }, |
114 | "end": { | 153 | "end": { |
115 | "line": 50, | 154 | "line": 62, |
116 | "column": 3 | 155 | "column": 3 |
117 | } | 156 | } |
118 | }, | 157 | }, |
@@ -121,11 +160,11 @@ | |||
121 | "defaultMessage": "!!!Franz Professional includes:", | 160 | "defaultMessage": "!!!Franz Professional includes:", |
122 | "file": "src/components/auth/Pricing.js", | 161 | "file": "src/components/auth/Pricing.js", |
123 | "start": { | 162 | "start": { |
124 | "line": 51, | 163 | "line": 63, |
125 | "column": 20 | 164 | "column": 20 |
126 | }, | 165 | }, |
127 | "end": { | 166 | "end": { |
128 | "line": 54, | 167 | "line": 66, |
129 | "column": 3 | 168 | "column": 3 |
130 | } | 169 | } |
131 | } | 170 | } |
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index 5d379fd3e..adbd401b4 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js | |||
@@ -67,6 +67,7 @@ export default class FeaturesStore extends Store { | |||
67 | if (this.stores.user.isLoggedIn) { | 67 | if (this.stores.user.isLoggedIn) { |
68 | this.featuresRequest.invalidate({ immediately: true }); | 68 | this.featuresRequest.invalidate({ immediately: true }); |
69 | } else { | 69 | } else { |
70 | this.defaultFeaturesRequest.execute(); | ||
70 | this.defaultFeaturesRequest.invalidate({ immediately: true }); | 71 | this.defaultFeaturesRequest.invalidate({ immediately: true }); |
71 | } | 72 | } |
72 | } | 73 | } |
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index 735e8f886..297ea1121 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js | |||
@@ -205,7 +205,7 @@ export default class UserStore extends Store { | |||
205 | } | 205 | } |
206 | 206 | ||
207 | @action async _signup({ | 207 | @action async _signup({ |
208 | firstname, lastname, email, password, accountType, company, | 208 | firstname, lastname, email, password, accountType, company, plan, currency, |
209 | }) { | 209 | }) { |
210 | const authToken = await this.signupRequest.execute({ | 210 | const authToken = await this.signupRequest.execute({ |
211 | firstname, | 211 | firstname, |
@@ -215,6 +215,8 @@ export default class UserStore extends Store { | |||
215 | accountType, | 215 | accountType, |
216 | company, | 216 | company, |
217 | locale: this.stores.app.locale, | 217 | locale: this.stores.app.locale, |
218 | plan, | ||
219 | currency, | ||
218 | }); | 220 | }); |
219 | 221 | ||
220 | this.hasCompletedSignup = false; | 222 | this.hasCompletedSignup = false; |