aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2019-09-05 09:49:25 +0200
committerLibravatar Stefan Malzner <stefan@adlk.io>2019-09-05 09:49:25 +0200
commit24d0223fee38c36ec19d9c662579dba7d787f8b4 (patch)
tree17a50e725cef1266506fc9ac6352c15a120cba78 /src/components
parentdon't warn on react/destructuring-assignment (diff)
downloadferdium-app-24d0223fee38c36ec19d9c662579dba7d787f8b4.tar.gz
ferdium-app-24d0223fee38c36ec19d9c662579dba7d787f8b4.tar.zst
ferdium-app-24d0223fee38c36ec19d9c662579dba7d787f8b4.zip
polishing
Diffstat (limited to 'src/components')
-rw-r--r--src/components/settings/team/TeamDashboard.js62
-rw-r--r--src/components/ui/UpgradeButton/index.js90
2 files changed, 136 insertions, 16 deletions
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index 990ee52e7..51a3f375d 100644
--- a/src/components/settings/team/TeamDashboard.js
+++ b/src/components/settings/team/TeamDashboard.js
@@ -5,10 +5,14 @@ import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import injectSheet from 'react-jss'; 6import injectSheet from 'react-jss';
7 7
8import { Badge } from '@meetfranz/ui';
8import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
9import Button from '../../ui/Button'; 10import Button from '../../ui/Button';
10import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
11import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 12import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
13import globalMessages from '../../../i18n/globalMessages';
14import ActivateTrialButton from '../../ui/ActivateTrialButton';
15import UpgradeButton from '../../ui/UpgradeButton';
12 16
13const messages = defineMessages({ 17const messages = defineMessages({
14 headline: { 18 headline: {
@@ -40,6 +44,7 @@ const messages = defineMessages({
40const styles = { 44const styles = {
41 cta: { 45 cta: {
42 margin: [40, 'auto'], 46 margin: [40, 'auto'],
47 height: 'auto',
43 }, 48 },
44 container: { 49 container: {
45 display: 'flex', 50 display: 'flex',
@@ -69,6 +74,17 @@ const styles = {
69 order: 1, 74 order: 1,
70 }, 75 },
71 }, 76 },
77 headline: {
78 marginBottom: 0,
79 },
80 proRequired: {
81 margin: [10, 0, 40],
82 height: 'auto',
83 },
84 buttonContainer: {
85 display: 'flex',
86 height: 'auto',
87 },
72}; 88};
73 89
74 90
@@ -79,6 +95,7 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
79 retryUserInfoRequest: PropTypes.func.isRequired, 95 retryUserInfoRequest: PropTypes.func.isRequired,
80 openTeamManagement: PropTypes.func.isRequired, 96 openTeamManagement: PropTypes.func.isRequired,
81 classes: PropTypes.object.isRequired, 97 classes: PropTypes.object.isRequired,
98 isProUser: PropTypes.bool.isRequired,
82 }; 99 };
83 100
84 static contextTypes = { 101 static contextTypes = {
@@ -91,6 +108,7 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
91 userInfoRequestFailed, 108 userInfoRequestFailed,
92 retryUserInfoRequest, 109 retryUserInfoRequest,
93 openTeamManagement, 110 openTeamManagement,
111 isProUser,
94 classes, 112 classes,
95 } = this.props; 113 } = this.props;
96 const { intl } = this.context; 114 const { intl } = this.context;
@@ -123,23 +141,35 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
123 <> 141 <>
124 {!isLoading && ( 142 {!isLoading && (
125 <> 143 <>
126 <PremiumFeatureContainer> 144 <>
127 <> 145 <h1 className={classes.headline}>{intl.formatMessage(messages.contentHeadline)}</h1>
128 <h1>{intl.formatMessage(messages.contentHeadline)}</h1> 146 {!isProUser && (
129 <div className={classes.container}> 147 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
130 <div className={classes.content}> 148 )}
131 <p>{intl.formatMessage(messages.intro)}</p> 149 <div className={classes.container}>
132 <p>{intl.formatMessage(messages.copy)}</p> 150 <div className={classes.content}>
133 </div> 151 <p>{intl.formatMessage(messages.intro)}</p>
134 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" /> 152 <p>{intl.formatMessage(messages.copy)}</p>
135 </div> 153 </div>
136 </> 154 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" />
137 </PremiumFeatureContainer> 155 </div>
138 <Button 156 <div className={classes.buttonContainer}>
139 label={intl.formatMessage(messages.manageButton)} 157 {!isProUser ? (
140 onClick={openTeamManagement} 158 <UpgradeButton
141 className={classes.cta} 159 className={classes.cta}
142 /> 160 gaEventInfo={{ category: 'Todos', event: 'upgrade' }}
161 requiresPro
162 short
163 />
164 ) : (
165 <Button
166 label={intl.formatMessage(messages.manageButton)}
167 onClick={openTeamManagement}
168 className={classes.cta}
169 />
170 )}
171 </div>
172 </>
143 </> 173 </>
144 )} 174 )}
145 </> 175 </>
diff --git a/src/components/ui/UpgradeButton/index.js b/src/components/ui/UpgradeButton/index.js
new file mode 100644
index 000000000..4aa494e38
--- /dev/null
+++ b/src/components/ui/UpgradeButton/index.js
@@ -0,0 +1,90 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import classnames from 'classnames';
6
7import { Button } from '@meetfranz/forms';
8import { gaEvent } from '../../../lib/analytics';
9
10import UserStore from '../../../stores/UserStore';
11import ActivateTrialButton from '../ActivateTrialButton';
12
13const messages = defineMessages({
14 upgradeToPro: {
15 id: 'global.upgradeButton.upgradeToPro',
16 defaultMessage: '!!!Upgrade to Franz Professional',
17 },
18});
19
20@inject('stores', 'actions') @observer
21class UpgradeButton extends Component {
22 static propTypes = {
23 // eslint-disable-next-line
24 classes: PropTypes.object.isRequired,
25 className: PropTypes.string,
26 gaEventInfo: PropTypes.shape({
27 category: PropTypes.string.isRequired,
28 event: PropTypes.string.isRequired,
29 label: PropTypes.string,
30 }),
31 requiresPro: PropTypes.bool,
32 };
33
34 static defaultProps = {
35 className: '',
36 gaEventInfo: null,
37 requiresPro: false,
38 }
39
40 static contextTypes = {
41 intl: intlShape,
42 };
43
44 handleCTAClick() {
45 const { actions, gaEventInfo } = this.props;
46
47 actions.ui.openSettings({ path: 'user' });
48 if (gaEventInfo) {
49 const { category, event } = gaEventInfo;
50 gaEvent(category, event, 'Upgrade Account');
51 }
52 }
53
54 render() {
55 const { stores, requiresPro } = this.props;
56 const { intl } = this.context;
57
58 const { isPremium, isPersonal } = stores.user;
59
60 if (isPremium && isPersonal && requiresPro) {
61 return (
62 <Button
63 label={intl.formatMessage(messages.upgradeToPro)}
64 onClick={this.handleCTAClick.bind(this)}
65 className={this.props.className}
66 buttonType="inverted"
67 />
68 );
69 }
70
71 if (!isPremium) {
72 return <ActivateTrialButton {...this.props} />;
73 }
74
75 return null;
76 }
77}
78
79export default UpgradeButton;
80
81UpgradeButton.wrappedComponent.propTypes = {
82 stores: PropTypes.shape({
83 user: PropTypes.instanceOf(UserStore).isRequired,
84 }).isRequired,
85 actions: PropTypes.shape({
86 ui: PropTypes.shape({
87 openSettings: PropTypes.func.isRequired,
88 }).isRequired,
89 }).isRequired,
90};