aboutsummaryrefslogtreecommitdiffstats
path: root/src/features
diff options
context:
space:
mode:
authorLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-02-26 15:38:20 +0100
committerLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-02-26 15:38:20 +0100
commitb5ad31e316c1074cfa6f57f83e262a607eda9d44 (patch)
treeaffcfbc28b8892388ab23d97415902edfc682cab /src/features
parentfinish basic workspace settings (diff)
parentremove unused packages (diff)
downloadferdium-app-b5ad31e316c1074cfa6f57f83e262a607eda9d44.tar.gz
ferdium-app-b5ad31e316c1074cfa6f57f83e262a607eda9d44.tar.zst
ferdium-app-b5ad31e316c1074cfa6f57f83e262a607eda9d44.zip
fixes merge conflicts with latest develop
Diffstat (limited to 'src/features')
-rw-r--r--src/features/basicAuth/Component.js1
-rw-r--r--src/features/basicAuth/index.js3
-rw-r--r--src/features/delayApp/index.js6
-rw-r--r--src/features/shareFranz/Component.js170
-rw-r--r--src/features/shareFranz/index.js52
5 files changed, 229 insertions, 3 deletions
diff --git a/src/features/basicAuth/Component.js b/src/features/basicAuth/Component.js
index 13395fb40..a8252acb7 100644
--- a/src/features/basicAuth/Component.js
+++ b/src/features/basicAuth/Component.js
@@ -62,6 +62,7 @@ export default @injectSheet(styles) @observer class BasicAuthModal extends Compo
62 isOpen={isModalVisible} 62 isOpen={isModalVisible}
63 className={classes.modal} 63 className={classes.modal}
64 close={this.cancel.bind(this)} 64 close={this.cancel.bind(this)}
65 showClose={false}
65 > 66 >
66 <h1>Sign in</h1> 67 <h1>Sign in</h1>
67 <p> 68 <p>
diff --git a/src/features/basicAuth/index.js b/src/features/basicAuth/index.js
index 00ad65ce6..89607824b 100644
--- a/src/features/basicAuth/index.js
+++ b/src/features/basicAuth/index.js
@@ -6,7 +6,7 @@ import BasicAuthComponent from './Component';
6const debug = require('debug')('Franz:feature:basicAuth'); 6const debug = require('debug')('Franz:feature:basicAuth');
7 7
8const defaultState = { 8const defaultState = {
9 isModalVisible: false, 9 isModalVisible: true,
10 service: null, 10 service: null,
11 authInfo: null, 11 authInfo: null,
12}; 12};
@@ -15,7 +15,6 @@ export const state = observable(defaultState);
15 15
16export function resetState() { 16export function resetState() {
17 Object.assign(state, defaultState); 17 Object.assign(state, defaultState);
18 console.log('reset state', state);
19} 18}
20 19
21export default function initialize() { 20export default function initialize() {
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index 48aac34b6..abc8274cf 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -28,8 +28,12 @@ export default function init(stores) {
28 let shownAfterLaunch = false; 28 let shownAfterLaunch = false;
29 let timeLastDelay = moment(); 29 let timeLastDelay = moment();
30 30
31 window.franz.features.delayApp = {
32 state,
33 };
34
31 reaction( 35 reaction(
32 () => stores.features.features.needToWaitToProceed && !stores.user.data.isPremium, 36 () => stores.user.isLoggedIn && stores.features.features.needToWaitToProceed && !stores.user.data.isPremium,
33 (isEnabled) => { 37 (isEnabled) => {
34 if (isEnabled) { 38 if (isEnabled) {
35 debug('Enabling `delayApp` feature'); 39 debug('Enabling `delayApp` feature');
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
new file mode 100644
index 000000000..d463664df
--- /dev/null
+++ b/src/features/shareFranz/Component.js
@@ -0,0 +1,170 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { Button } from '@meetfranz/forms';
7import { H1, Icon } from '@meetfranz/ui';
8
9import Modal from '../../components/ui/Modal';
10import { state } from '.';
11import { gaEvent } from '../../lib/analytics';
12import ServicesStore from '../../stores/ServicesStore';
13
14const messages = defineMessages({
15 headline: {
16 id: 'feature.shareFranz.headline',
17 defaultMessage: '!!!Franz is better together!',
18 },
19 text: {
20 id: 'feature.shareFranz.text',
21 defaultMessage: '!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.',
22 },
23 actions: {
24 email: {
25 id: 'feature.shareFranz.action.email',
26 defaultMessage: '!!!Share as email',
27 },
28 facebook: {
29 id: 'feature.shareFranz.action.facebook',
30 defaultMessage: '!!!Share on Facebook',
31 },
32 twitter: {
33 id: 'feature.shareFranz.action.twitter',
34 defaultMessage: '!!!Share on Twitter',
35 },
36 },
37 shareText: {
38 email: {
39 id: 'feature.shareFranz.shareText.email',
40 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com',
41 },
42 twitter: {
43 id: 'feature.shareFranz.shareText.twitter',
44 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz',
45 },
46 },
47});
48
49const styles = theme => ({
50 modal: {
51 width: '80%',
52 maxWidth: 600,
53 background: theme.styleTypes.primary.accent,
54 textAlign: 'center',
55 color: theme.styleTypes.primary.contrast,
56 },
57 heartContainer: {
58 display: 'flex',
59 justifyContent: 'center',
60 borderRadius: '100%',
61 background: theme.brandDanger,
62 padding: 20,
63 width: 100,
64 height: 100,
65 margin: [-70, 'auto', 30],
66 },
67 heart: {
68 fill: theme.styleTypes.primary.contrast,
69 },
70 headline: {
71 textAlign: 'center',
72 fontSize: 40,
73 marginBottom: 20,
74 },
75 actions: {
76 display: 'flex',
77 justifyContent: 'space-between',
78 marginTop: 30,
79 },
80 cta: {
81 background: theme.styleTypes.primary.contrast,
82 color: theme.styleTypes.primary.accent,
83
84 '& svg': {
85 fill: theme.styleTypes.primary.accent,
86 },
87 },
88});
89
90export default @injectSheet(styles) @inject('stores') @observer class ShareFranzModal extends Component {
91 static propTypes = {
92 classes: PropTypes.object.isRequired,
93 }
94
95 static contextTypes = {
96 intl: intlShape,
97 };
98
99 close() {
100 state.isModalVisible = false;
101 }
102
103 render() {
104 const { isModalVisible } = state;
105
106 const {
107 classes,
108 stores,
109 } = this.props;
110
111 const serviceCount = stores.services.all.length;
112
113 const { intl } = this.context;
114
115 return (
116 <Modal
117 isOpen={isModalVisible}
118 className={classes.modal}
119 shouldCloseOnOverlayClick
120 close={this.close.bind(this)}
121 >
122 <div className={classes.heartContainer}>
123 <Icon icon="mdiHeart" className={classes.heart} size={4} />
124 </div>
125 <H1 className={classes.headline}>
126 {intl.formatMessage(messages.headline)}
127 </H1>
128 <p>{intl.formatMessage(messages.text)}</p>
129 <div className={classes.actions}>
130 <Button
131 label={intl.formatMessage(messages.actions.email)}
132 className={classes.cta}
133 icon="mdiEmail"
134 href={`mailto:?subject=Meet the cool app Franz&body=${intl.formatMessage(messages.shareText.email, { count: serviceCount })}}`}
135 target="_blank"
136 onClick={() => {
137 gaEvent('Share Franz', 'share', 'Share via email');
138 }}
139 />
140 <Button
141 label={intl.formatMessage(messages.actions.facebook)}
142 className={classes.cta}
143 icon="mdiFacebookBox"
144 href="https://www.facebook.com/sharer/sharer.php?u=https://www.meetfranz.com?utm_source=facebook&utm_medium=referral&utm_campaign=share-button"
145 target="_blank"
146 onClick={() => {
147 gaEvent('Share Franz', 'share', 'Share via Facebook');
148 }}
149 />
150 <Button
151 label={intl.formatMessage(messages.actions.twitter)}
152 className={classes.cta}
153 icon="mdiTwitter"
154 href={`http://twitter.com/intent/tweet?status=${intl.formatMessage(messages.shareText.twitter, { count: serviceCount })}`}
155 target="_blank"
156 onClick={() => {
157 gaEvent('Share Franz', 'share', 'Share via Twitter');
158 }}
159 />
160 </div>
161 </Modal>
162 );
163 }
164}
165
166ShareFranzModal.wrappedComponent.propTypes = {
167 stores: PropTypes.shape({
168 services: PropTypes.instanceOf(ServicesStore).isRequired,
169 }).isRequired,
170};
diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js
new file mode 100644
index 000000000..3a8ec95d3
--- /dev/null
+++ b/src/features/shareFranz/index.js
@@ -0,0 +1,52 @@
1import { observable, reaction } from 'mobx';
2import ms from 'ms';
3
4import { state as delayAppState } from '../delayApp';
5import { gaEvent, gaPage } from '../../lib/analytics';
6
7export { default as Component } from './Component';
8
9const debug = require('debug')('Franz:feature:shareFranz');
10
11const defaultState = {
12 isModalVisible: false,
13 lastShown: null,
14};
15
16export const state = observable(defaultState);
17
18export default function initialize(stores) {
19 debug('Initialize shareFranz feature');
20
21 window.franz.features.shareFranz = {
22 state,
23 };
24
25 function showModal() {
26 debug('Showing share window');
27
28 state.isModalVisible = true;
29
30 gaEvent('Share Franz', 'show');
31 gaPage('/share-modal');
32 }
33
34 reaction(
35 () => stores.user.isLoggedIn,
36 () => {
37 setTimeout(() => {
38 if (stores.settings.stats.appStarts % 30 === 0) {
39 if (delayAppState.isDelayAppScreenVisible) {
40 debug('Delaying share modal by 5 minutes');
41 setTimeout(() => showModal(), ms('5m'));
42 } else {
43 showModal();
44 }
45 }
46 }, ms('2s'));
47 },
48 {
49 fireImmediately: true,
50 },
51 );
52}