aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Amine Mouafik <amine@mouafik.fr>2019-12-18 15:49:26 +0100
committerLibravatar Amine Mouafik <amine@mouafik.fr>2019-12-18 15:49:26 +0100
commitfffa3875f888aef2109dc7d91dc681069786fc0b (patch)
treec96b67b275d8ebae6f793a0455a75ae8edc87d3c
parentUpdate Electron and Sentry for latest fixes (diff)
downloadferdium-app-fffa3875f888aef2109dc7d91dc681069786fc0b.tar.gz
ferdium-app-fffa3875f888aef2109dc7d91dc681069786fc0b.tar.zst
ferdium-app-fffa3875f888aef2109dc7d91dc681069786fc0b.zip
Better handling of account settings (if using without account)
-rw-r--r--src/components/settings/account/AccountDashboard.js316
-rw-r--r--src/containers/settings/AccountScreen.js37
-rw-r--r--src/i18n/locales/defaultMessages.json98
-rw-r--r--src/i18n/locales/en-US.json2
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json98
5 files changed, 335 insertions, 216 deletions
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 83dc34a52..7d6bad883 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -3,9 +3,7 @@ import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import { 6import { ProBadge, H1, H2 } from '@meetfranz/ui';
7 ProBadge, H1, H2,
8} from '@meetfranz/ui';
9import moment from 'moment'; 7import moment from 'moment';
10 8
11import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
@@ -13,6 +11,7 @@ import Button from '../../ui/Button';
13import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
14import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen'; 12import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen';
15import { i18nPlanName } from '../../../helpers/plan-helpers'; 13import { i18nPlanName } from '../../../helpers/plan-helpers';
14import { LOCAL_SERVER } from '../../../config';
16 15
17const messages = defineMessages({ 16const messages = defineMessages({
18 headline: { 17 headline: {
@@ -69,11 +68,13 @@ const messages = defineMessages({
69 }, 68 },
70 deleteInfo: { 69 deleteInfo: {
71 id: 'settings.account.deleteInfo', 70 id: 'settings.account.deleteInfo',
72 defaultMessage: '!!!If you don\'t need your Ferdi account any longer, you can delete your account and all related data here.', 71 defaultMessage:
72 "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
73 }, 73 },
74 deleteEmailSent: { 74 deleteEmailSent: {
75 id: 'settings.account.deleteEmailSent', 75 id: 'settings.account.deleteEmailSent',
76 defaultMessage: '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', 76 defaultMessage:
77 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
77 }, 78 },
78 trial: { 79 trial: {
79 id: 'settings.account.trial', 80 id: 'settings.account.trial',
@@ -89,7 +90,16 @@ const messages = defineMessages({
89 }, 90 },
90 trialUpdateBillingInformation: { 91 trialUpdateBillingInformation: {
91 id: 'settings.account.trialUpdateBillingInfo', 92 id: 'settings.account.trialUpdateBillingInfo',
92 defaultMessage: '!!!Please update your billing info to continue using {license} after your trial period.', 93 defaultMessage:
94 '!!!Please update your billing info to continue using {license} after your trial period.',
95 },
96 accountUnavailable: {
97 id: 'settings.account.accountUnavailable',
98 defaultMessage: 'Account is unavailable',
99 },
100 accountUnavailableInfo: {
101 id: 'settings.account.accountUnavailableInfo',
102 defaultMessage: 'You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.',
93 }, 103 },
94}); 104});
95 105
@@ -110,6 +120,7 @@ class AccountDashboard extends Component {
110 upgradeToPro: PropTypes.func.isRequired, 120 upgradeToPro: PropTypes.func.isRequired,
111 openInvoices: PropTypes.func.isRequired, 121 openInvoices: PropTypes.func.isRequired,
112 onCloseSubscriptionWindow: PropTypes.func.isRequired, 122 onCloseSubscriptionWindow: PropTypes.func.isRequired,
123 server: PropTypes.string.isRequired,
113 }; 124 };
114 125
115 static contextTypes = { 126 static contextTypes = {
@@ -132,6 +143,7 @@ class AccountDashboard extends Component {
132 upgradeToPro, 143 upgradeToPro,
133 openInvoices, 144 openInvoices,
134 onCloseSubscriptionWindow, 145 onCloseSubscriptionWindow,
146 server,
135 } = this.props; 147 } = this.props;
136 const { intl } = this.context; 148 const { intl } = this.context;
137 149
@@ -141,6 +153,8 @@ class AccountDashboard extends Component {
141 planName = i18nPlanName(user.team.plan, intl); 153 planName = i18nPlanName(user.team.plan, intl);
142 } 154 }
143 155
156 const isUsingWithoutAccount = server === LOCAL_SERVER;
157
144 return ( 158 return (
145 <div className="settings__main"> 159 <div className="settings__main">
146 <div className="settings__header"> 160 <div className="settings__header">
@@ -149,154 +163,186 @@ class AccountDashboard extends Component {
149 </span> 163 </span>
150 </div> 164 </div>
151 <div className="settings__body"> 165 <div className="settings__body">
152 {isLoading && ( 166 {isUsingWithoutAccount && (
153 <Loader /> 167 <>
168 <h1 style={{ marginBottom: 0 }}>
169 {intl.formatMessage(messages.accountUnavailable)}
170 </h1>
171 <p
172 className="settings__message"
173 style={{
174 borderTop: 0,
175 marginTop: 0,
176 }}
177 >
178 {intl.formatMessage(messages.accountUnavailableInfo)}
179 </p>
180 </>
154 )} 181 )}
182 {!isUsingWithoutAccount && (
183 <>
184 {isLoading && <Loader />}
155 185
156 {!isLoading && userInfoRequestFailed && ( 186 {!isLoading && userInfoRequestFailed && (
157 <Infobox 187 <Infobox
158 icon="alert" 188 icon="alert"
159 type="danger" 189 type="danger"
160 ctaLabel={intl.formatMessage(messages.tryReloadUserInfoRequest)} 190 ctaLabel={intl.formatMessage(
161 ctaLoading={isLoading} 191 messages.tryReloadUserInfoRequest,
162 ctaOnClick={retryUserInfoRequest} 192 )}
163 > 193 ctaLoading={isLoading}
164 {intl.formatMessage(messages.userInfoRequestFailed)} 194 ctaOnClick={retryUserInfoRequest}
165 </Infobox> 195 >
166 )} 196 {intl.formatMessage(messages.userInfoRequestFailed)}
197 </Infobox>
198 )}
167 199
168 {!userInfoRequestFailed && ( 200 {!userInfoRequestFailed && (
169 <>
170 {!isLoading && (
171 <> 201 <>
172 <div className="account"> 202 {!isLoading && (
173 <div className="account__box account__box--flex"> 203 <>
174 <div className="account__avatar"> 204 <div className="account">
175 <img 205 <div className="account__box account__box--flex">
176 src="./assets/images/logo.svg" 206 <div className="account__avatar">
177 alt="" 207 <img src="./assets/images/logo.svg" alt="" />
178 /> 208 </div>
179 </div> 209 <div className="account__info">
180 <div className="account__info"> 210 <H1>
181 <H1> 211 <span className="username">{`${user.firstname} ${user.lastname}`}</span>
182 <span className="username">{`${user.firstname} ${user.lastname}`}</span> 212 {user.isPremium && (
183 {user.isPremium && ( 213 <>
184 <> 214 {' '}
185 {' '} 215 <ProBadge />
186 <ProBadge /> 216 </>
187 </> 217 )}
188 )} 218 </H1>
189 </H1> 219 <p>
190 <p> 220 {user.organization && `${user.organization}, `}
191 {user.organization && `${user.organization}, `} 221 {user.email}
192 {user.email} 222 </p>
193 </p> 223 {user.isPremium && (
194 {user.isPremium && ( 224 <div className="manage-user-links">
195 <div className="manage-user-links"> 225 <Button
226 label={intl.formatMessage(
227 messages.accountEditButton,
228 )}
229 className="franz-form__button--inverted"
230 onClick={openEditAccount}
231 />
232 </div>
233 )}
234 </div>
235 {!user.isPremium && (
196 <Button 236 <Button
197 label={intl.formatMessage(messages.accountEditButton)} 237 label={intl.formatMessage(
238 messages.accountEditButton,
239 )}
198 className="franz-form__button--inverted" 240 className="franz-form__button--inverted"
199 onClick={openEditAccount} 241 onClick={openEditAccount}
200 /> 242 />
201 </div>
202 )}
203 </div>
204 {!user.isPremium && (
205 <Button
206 label={intl.formatMessage(messages.accountEditButton)}
207 className="franz-form__button--inverted"
208 onClick={openEditAccount}
209 />
210 )}
211 </div>
212 </div>
213 {user.isPremium && user.isSubscriptionOwner && (
214 <div className="account">
215 <div className="account__box">
216 <H2>
217 {intl.formatMessage(messages.yourLicense)}
218 </H2>
219 <p>
220 Franz
221 {' '}
222 {isPremiumOverrideUser ? 'Premium' : planName}
223 {user.team.isTrial && (
224 <>
225 {' – '}
226 {intl.formatMessage(messages.trial)}
227 </>
228 )} 243 )}
229 </p> 244 </div>
230 {user.team.isTrial && ( 245 </div>
231 <> 246 {user.isPremium && user.isSubscriptionOwner && (
232 <br /> 247 <div className="account">
233 <p> 248 <div className="account__box">
234 {intl.formatMessage(messages.trialEndsIn, { 249 <H2>{intl.formatMessage(messages.yourLicense)}</H2>
235 duration: moment.duration(moment().diff(user.team.trialEnd)).humanize(),
236 })}
237 </p>
238 <p> 250 <p>
239 {intl.formatMessage(messages.trialUpdateBillingInformation, { 251 Franz
240 license: planName, 252 {' '}
241 })} 253 {isPremiumOverrideUser ? 'Premium' : planName}
254 {user.team.isTrial && (
255 <>
256 {' – '}
257 {intl.formatMessage(messages.trial)}
258 </>
259 )}
242 </p> 260 </p>
243 </> 261 {user.team.isTrial && (
244 )} 262 <>
245 {!isProUser && ( 263 <br />
246 <div className="manage-user-links"> 264 <p>
247 <Button 265 {intl.formatMessage(messages.trialEndsIn, {
248 label={intl.formatMessage(messages.upgradeAccountToPro)} 266 duration: moment
249 className="franz-form__button--primary" 267 .duration(
250 onClick={upgradeToPro} 268 moment().diff(user.team.trialEnd),
269 )
270 .humanize(),
271 })}
272 </p>
273 <p>
274 {intl.formatMessage(
275 messages.trialUpdateBillingInformation,
276 {
277 license: planName,
278 },
279 )}
280 </p>
281 </>
282 )}
283 {!isProUser && (
284 <div className="manage-user-links">
285 <Button
286 label={intl.formatMessage(
287 messages.upgradeAccountToPro,
288 )}
289 className="franz-form__button--primary"
290 onClick={upgradeToPro}
291 />
292 </div>
293 )}
294 <div className="manage-user-links">
295 <Button
296 label={intl.formatMessage(
297 messages.manageSubscriptionButtonLabel,
298 )}
299 className="franz-form__button--inverted"
300 onClick={openBilling}
301 />
302 <Button
303 label={intl.formatMessage(
304 messages.invoicesButton,
305 )}
306 className="franz-form__button--inverted"
307 onClick={openInvoices}
308 />
309 </div>
310 </div>
311 </div>
312 )}
313 {!user.isPremium && (
314 <div className="account franz-form">
315 <div className="account__box">
316 <SubscriptionForm
317 onCloseWindow={onCloseSubscriptionWindow}
251 /> 318 />
252 </div> 319 </div>
253 )} 320 </div>
254 <div className="manage-user-links"> 321 )}
255 <Button 322 </>
256 label={intl.formatMessage(messages.manageSubscriptionButtonLabel)} 323 )}
257 className="franz-form__button--inverted" 324
258 onClick={openBilling} 325 <div className="account franz-form">
259 /> 326 <div className="account__box">
327 <H2>{intl.formatMessage(messages.headlineDangerZone)}</H2>
328 {!isDeleteAccountSuccessful && (
329 <div className="account__subscription">
330 <p>{intl.formatMessage(messages.deleteInfo)}</p>
260 <Button 331 <Button
261 label={intl.formatMessage(messages.invoicesButton)} 332 label={intl.formatMessage(messages.deleteAccount)}
262 className="franz-form__button--inverted" 333 buttonType="danger"
263 onClick={openInvoices} 334 onClick={() => deleteAccount()}
335 loaded={!isLoadingDeleteAccount}
264 /> 336 />
265 </div> 337 </div>
266 </div> 338 )}
267 </div> 339 {isDeleteAccountSuccessful && (
268 )} 340 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
269 {!user.isPremium && ( 341 )}
270 <div className="account franz-form">
271 <div className="account__box">
272 <SubscriptionForm
273 onCloseWindow={onCloseSubscriptionWindow}
274 />
275 </div>
276 </div> 342 </div>
277 )} 343 </div>
278 </> 344 </>
279 )} 345 )}
280
281 <div className="account franz-form">
282 <div className="account__box">
283 <H2>{intl.formatMessage(messages.headlineDangerZone)}</H2>
284 {!isDeleteAccountSuccessful && (
285 <div className="account__subscription">
286 <p>{intl.formatMessage(messages.deleteInfo)}</p>
287 <Button
288 label={intl.formatMessage(messages.deleteAccount)}
289 buttonType="danger"
290 onClick={() => deleteAccount()}
291 loaded={!isLoadingDeleteAccount}
292 />
293 </div>
294 )}
295 {isDeleteAccountSuccessful && (
296 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
297 )}
298 </div>
299 </div>
300 </> 346 </>
301 )} 347 )}
302 </div> 348 </div>
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index 93ab44690..12c912bac 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -6,12 +6,16 @@ import PaymentStore from '../../stores/PaymentStore';
6import UserStore from '../../stores/UserStore'; 6import UserStore from '../../stores/UserStore';
7import AppStore from '../../stores/AppStore'; 7import AppStore from '../../stores/AppStore';
8import FeaturesStore from '../../stores/FeaturesStore'; 8import FeaturesStore from '../../stores/FeaturesStore';
9import SettingsStore from '../../stores/SettingsStore';
9 10
10import AccountDashboard from '../../components/settings/account/AccountDashboard'; 11import AccountDashboard from '../../components/settings/account/AccountDashboard';
11import ErrorBoundary from '../../components/util/ErrorBoundary'; 12import ErrorBoundary from '../../components/util/ErrorBoundary';
12import { WEBSITE } from '../../environment'; 13import { WEBSITE } from '../../environment';
13 14
14export default @inject('stores', 'actions') @observer class AccountScreen extends Component { 15export default
16@inject('stores', 'actions')
17@observer
18class AccountScreen extends Component {
15 onCloseWindow() { 19 onCloseWindow() {
16 const { user, features } = this.props.stores; 20 const { user, features } = this.props.stores;
17 user.getUserInfoRequest.invalidate({ immediately: true }); 21 user.getUserInfoRequest.invalidate({ immediately: true });
@@ -32,7 +36,9 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
32 36
33 let url; 37 let url;
34 if (api === 'https://api.franzinfra.com') { 38 if (api === 'https://api.franzinfra.com') {
35 url = stores.user.getAuthURL(`${WEBSITE}${route}?utm_source=app&utm_medium=account_dashboard`); 39 url = stores.user.getAuthURL(
40 `${WEBSITE}${route}?utm_source=app&utm_medium=account_dashboard`,
41 );
36 } else { 42 } else {
37 url = `${api}${route}`; 43 url = `${api}${route}`;
38 } 44 }
@@ -41,11 +47,13 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
41 } 47 }
42 48
43 render() { 49 render() {
44 const { user, payment, features } = this.props.stores;
45 const { 50 const {
46 user: userActions, 51 user,
47 payment: paymentActions, 52 payment,
48 } = this.props.actions; 53 features,
54 settings,
55 } = this.props.stores;
56 const { user: userActions, payment: paymentActions } = this.props.actions;
49 57
50 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting; 58 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting;
51 const isLoadingPlans = payment.plansRequest.isExecuting; 59 const isLoadingPlans = payment.plansRequest.isExecuting;
@@ -55,19 +63,29 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
55 return ( 63 return (
56 <ErrorBoundary> 64 <ErrorBoundary>
57 <AccountDashboard 65 <AccountDashboard
66 server={settings.all.app.server}
58 user={user.data} 67 user={user.data}
59 isPremiumOverrideUser={user.isPremiumOverride} 68 isPremiumOverrideUser={user.isPremiumOverride}
60 isProUser={user.isPro} 69 isProUser={user.isPro}
61 isLoading={isLoadingUserInfo} 70 isLoading={isLoadingUserInfo}
62 isLoadingPlans={isLoadingPlans} 71 isLoadingPlans={isLoadingPlans}
63 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 72 userInfoRequestFailed={
73 user.getUserInfoRequest.wasExecuted
74 && user.getUserInfoRequest.isError
75 }
64 retryUserInfoRequest={() => this.reloadData()} 76 retryUserInfoRequest={() => this.reloadData()}
65 onCloseSubscriptionWindow={() => this.onCloseWindow()} 77 onCloseSubscriptionWindow={() => this.onCloseWindow()}
66 deleteAccount={userActions.delete} 78 deleteAccount={userActions.delete}
67 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting} 79 isLoadingDeleteAccount={user.deleteAccountRequest.isExecuting}
68 isDeleteAccountSuccessful={user.deleteAccountRequest.wasExecuted && !user.deleteAccountRequest.isError} 80 isDeleteAccountSuccessful={
81 user.deleteAccountRequest.wasExecuted
82 && !user.deleteAccountRequest.isError
83 }
69 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 84 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
70 upgradeToPro={() => upgradeAccount({ planId: features.features.pricingConfig.plans.pro.yearly.id })} 85 upgradeToPro={() => upgradeAccount({
86 planId: features.features.pricingConfig.plans.pro.yearly.id,
87 })
88 }
71 openBilling={() => this.handleWebsiteLink('/user/billing')} 89 openBilling={() => this.handleWebsiteLink('/user/billing')}
72 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 90 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
73 /> 91 />
@@ -81,6 +99,7 @@ AccountScreen.wrappedComponent.propTypes = {
81 user: PropTypes.instanceOf(UserStore).isRequired, 99 user: PropTypes.instanceOf(UserStore).isRequired,
82 features: PropTypes.instanceOf(FeaturesStore).isRequired, 100 features: PropTypes.instanceOf(FeaturesStore).isRequired,
83 payment: PropTypes.instanceOf(PaymentStore).isRequired, 101 payment: PropTypes.instanceOf(PaymentStore).isRequired,
102 settings: PropTypes.instanceOf(SettingsStore).isRequired,
84 app: PropTypes.instanceOf(AppStore).isRequired, 103 app: PropTypes.instanceOf(AppStore).isRequired,
85 }).isRequired, 104 }).isRequired,
86 actions: PropTypes.shape({ 105 actions: PropTypes.shape({
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index cc60891c3..429930278 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -1533,169 +1533,169 @@
1533 "defaultMessage": "!!!Account", 1533 "defaultMessage": "!!!Account",
1534 "end": { 1534 "end": {
1535 "column": 3, 1535 "column": 3,
1536 "line": 21 1536 "line": 20
1537 }, 1537 },
1538 "file": "src/components/settings/account/AccountDashboard.js", 1538 "file": "src/components/settings/account/AccountDashboard.js",
1539 "id": "settings.account.headline", 1539 "id": "settings.account.headline",
1540 "start": { 1540 "start": {
1541 "column": 12, 1541 "column": 12,
1542 "line": 18 1542 "line": 17
1543 } 1543 }
1544 }, 1544 },
1545 { 1545 {
1546 "defaultMessage": "!!!Your Subscription", 1546 "defaultMessage": "!!!Your Subscription",
1547 "end": { 1547 "end": {
1548 "column": 3, 1548 "column": 3,
1549 "line": 25 1549 "line": 24
1550 }, 1550 },
1551 "file": "src/components/settings/account/AccountDashboard.js", 1551 "file": "src/components/settings/account/AccountDashboard.js",
1552 "id": "settings.account.headlineSubscription", 1552 "id": "settings.account.headlineSubscription",
1553 "start": { 1553 "start": {
1554 "column": 24, 1554 "column": 24,
1555 "line": 22 1555 "line": 21
1556 } 1556 }
1557 }, 1557 },
1558 { 1558 {
1559 "defaultMessage": "!!Danger Zone", 1559 "defaultMessage": "!!Danger Zone",
1560 "end": { 1560 "end": {
1561 "column": 3, 1561 "column": 3,
1562 "line": 29 1562 "line": 28
1563 }, 1563 },
1564 "file": "src/components/settings/account/AccountDashboard.js", 1564 "file": "src/components/settings/account/AccountDashboard.js",
1565 "id": "settings.account.headlineDangerZone", 1565 "id": "settings.account.headlineDangerZone",
1566 "start": { 1566 "start": {
1567 "column": 22, 1567 "column": 22,
1568 "line": 26 1568 "line": 25
1569 } 1569 }
1570 }, 1570 },
1571 { 1571 {
1572 "defaultMessage": "!!!Manage your subscription", 1572 "defaultMessage": "!!!Manage your subscription",
1573 "end": { 1573 "end": {
1574 "column": 3, 1574 "column": 3,
1575 "line": 33 1575 "line": 32
1576 }, 1576 },
1577 "file": "src/components/settings/account/AccountDashboard.js", 1577 "file": "src/components/settings/account/AccountDashboard.js",
1578 "id": "settings.account.manageSubscription.label", 1578 "id": "settings.account.manageSubscription.label",
1579 "start": { 1579 "start": {
1580 "column": 33, 1580 "column": 33,
1581 "line": 30 1581 "line": 29
1582 } 1582 }
1583 }, 1583 },
1584 { 1584 {
1585 "defaultMessage": "!!!Upgrade to Franz Professional", 1585 "defaultMessage": "!!!Upgrade to Franz Professional",
1586 "end": { 1586 "end": {
1587 "column": 3, 1587 "column": 3,
1588 "line": 37 1588 "line": 36
1589 }, 1589 },
1590 "file": "src/components/settings/account/AccountDashboard.js", 1590 "file": "src/components/settings/account/AccountDashboard.js",
1591 "id": "settings.account.upgradeToPro.label", 1591 "id": "settings.account.upgradeToPro.label",
1592 "start": { 1592 "start": {
1593 "column": 23, 1593 "column": 23,
1594 "line": 34 1594 "line": 33
1595 } 1595 }
1596 }, 1596 },
1597 { 1597 {
1598 "defaultMessage": "!!!Basic Account", 1598 "defaultMessage": "!!!Basic Account",
1599 "end": { 1599 "end": {
1600 "column": 3, 1600 "column": 3,
1601 "line": 41 1601 "line": 40
1602 }, 1602 },
1603 "file": "src/components/settings/account/AccountDashboard.js", 1603 "file": "src/components/settings/account/AccountDashboard.js",
1604 "id": "settings.account.accountType.basic", 1604 "id": "settings.account.accountType.basic",
1605 "start": { 1605 "start": {
1606 "column": 20, 1606 "column": 20,
1607 "line": 38 1607 "line": 37
1608 } 1608 }
1609 }, 1609 },
1610 { 1610 {
1611 "defaultMessage": "!!!Premium Supporter Account", 1611 "defaultMessage": "!!!Premium Supporter Account",
1612 "end": { 1612 "end": {
1613 "column": 3, 1613 "column": 3,
1614 "line": 45 1614 "line": 44
1615 }, 1615 },
1616 "file": "src/components/settings/account/AccountDashboard.js", 1616 "file": "src/components/settings/account/AccountDashboard.js",
1617 "id": "settings.account.accountType.premium", 1617 "id": "settings.account.accountType.premium",
1618 "start": { 1618 "start": {
1619 "column": 22, 1619 "column": 22,
1620 "line": 42 1620 "line": 41
1621 } 1621 }
1622 }, 1622 },
1623 { 1623 {
1624 "defaultMessage": "!!!Edit Account", 1624 "defaultMessage": "!!!Edit Account",
1625 "end": { 1625 "end": {
1626 "column": 3, 1626 "column": 3,
1627 "line": 49 1627 "line": 48
1628 }, 1628 },
1629 "file": "src/components/settings/account/AccountDashboard.js", 1629 "file": "src/components/settings/account/AccountDashboard.js",
1630 "id": "settings.account.account.editButton", 1630 "id": "settings.account.account.editButton",
1631 "start": { 1631 "start": {
1632 "column": 21, 1632 "column": 21,
1633 "line": 46 1633 "line": 45
1634 } 1634 }
1635 }, 1635 },
1636 { 1636 {
1637 "defaultMessage": "!!Invoices", 1637 "defaultMessage": "!!Invoices",
1638 "end": { 1638 "end": {
1639 "column": 3, 1639 "column": 3,
1640 "line": 53 1640 "line": 52
1641 }, 1641 },
1642 "file": "src/components/settings/account/AccountDashboard.js", 1642 "file": "src/components/settings/account/AccountDashboard.js",
1643 "id": "settings.account.headlineInvoices", 1643 "id": "settings.account.headlineInvoices",
1644 "start": { 1644 "start": {
1645 "column": 18, 1645 "column": 18,
1646 "line": 50 1646 "line": 49
1647 } 1647 }
1648 }, 1648 },
1649 { 1649 {
1650 "defaultMessage": "!!!Download", 1650 "defaultMessage": "!!!Download",
1651 "end": { 1651 "end": {
1652 "column": 3, 1652 "column": 3,
1653 "line": 57 1653 "line": 56
1654 }, 1654 },
1655 "file": "src/components/settings/account/AccountDashboard.js", 1655 "file": "src/components/settings/account/AccountDashboard.js",
1656 "id": "settings.account.invoiceDownload", 1656 "id": "settings.account.invoiceDownload",
1657 "start": { 1657 "start": {
1658 "column": 19, 1658 "column": 19,
1659 "line": 54 1659 "line": 53
1660 } 1660 }
1661 }, 1661 },
1662 { 1662 {
1663 "defaultMessage": "!!!Could not load user information", 1663 "defaultMessage": "!!!Could not load user information",
1664 "end": { 1664 "end": {
1665 "column": 3, 1665 "column": 3,
1666 "line": 61 1666 "line": 60
1667 }, 1667 },
1668 "file": "src/components/settings/account/AccountDashboard.js", 1668 "file": "src/components/settings/account/AccountDashboard.js",
1669 "id": "settings.account.userInfoRequestFailed", 1669 "id": "settings.account.userInfoRequestFailed",
1670 "start": { 1670 "start": {
1671 "column": 25, 1671 "column": 25,
1672 "line": 58 1672 "line": 57
1673 } 1673 }
1674 }, 1674 },
1675 { 1675 {
1676 "defaultMessage": "!!!Try again", 1676 "defaultMessage": "!!!Try again",
1677 "end": { 1677 "end": {
1678 "column": 3, 1678 "column": 3,
1679 "line": 65 1679 "line": 64
1680 }, 1680 },
1681 "file": "src/components/settings/account/AccountDashboard.js", 1681 "file": "src/components/settings/account/AccountDashboard.js",
1682 "id": "settings.account.tryReloadUserInfoRequest", 1682 "id": "settings.account.tryReloadUserInfoRequest",
1683 "start": { 1683 "start": {
1684 "column": 28, 1684 "column": 28,
1685 "line": 62 1685 "line": 61
1686 } 1686 }
1687 }, 1687 },
1688 { 1688 {
1689 "defaultMessage": "!!!Delete account", 1689 "defaultMessage": "!!!Delete account",
1690 "end": { 1690 "end": {
1691 "column": 3, 1691 "column": 3,
1692 "line": 69 1692 "line": 68
1693 }, 1693 },
1694 "file": "src/components/settings/account/AccountDashboard.js", 1694 "file": "src/components/settings/account/AccountDashboard.js",
1695 "id": "settings.account.deleteAccount", 1695 "id": "settings.account.deleteAccount",
1696 "start": { 1696 "start": {
1697 "column": 17, 1697 "column": 17,
1698 "line": 66 1698 "line": 65
1699 } 1699 }
1700 }, 1700 },
1701 { 1701 {
@@ -1708,14 +1708,14 @@
1708 "id": "settings.account.deleteInfo", 1708 "id": "settings.account.deleteInfo",
1709 "start": { 1709 "start": {
1710 "column": 14, 1710 "column": 14,
1711 "line": 70 1711 "line": 69
1712 } 1712 }
1713 }, 1713 },
1714 { 1714 {
1715 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 1715 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
1716 "end": { 1716 "end": {
1717 "column": 3, 1717 "column": 3,
1718 "line": 77 1718 "line": 78
1719 }, 1719 },
1720 "file": "src/components/settings/account/AccountDashboard.js", 1720 "file": "src/components/settings/account/AccountDashboard.js",
1721 "id": "settings.account.deleteEmailSent", 1721 "id": "settings.account.deleteEmailSent",
@@ -1728,52 +1728,78 @@
1728 "defaultMessage": "!!!Free Trial", 1728 "defaultMessage": "!!!Free Trial",
1729 "end": { 1729 "end": {
1730 "column": 3, 1730 "column": 3,
1731 "line": 81 1731 "line": 82
1732 }, 1732 },
1733 "file": "src/components/settings/account/AccountDashboard.js", 1733 "file": "src/components/settings/account/AccountDashboard.js",
1734 "id": "settings.account.trial", 1734 "id": "settings.account.trial",
1735 "start": { 1735 "start": {
1736 "column": 9, 1736 "column": 9,
1737 "line": 78 1737 "line": 79
1738 } 1738 }
1739 }, 1739 },
1740 { 1740 {
1741 "defaultMessage": "!!!Your Franz License:", 1741 "defaultMessage": "!!!Your Franz License:",
1742 "end": { 1742 "end": {
1743 "column": 3, 1743 "column": 3,
1744 "line": 85 1744 "line": 86
1745 }, 1745 },
1746 "file": "src/components/settings/account/AccountDashboard.js", 1746 "file": "src/components/settings/account/AccountDashboard.js",
1747 "id": "settings.account.yourLicense", 1747 "id": "settings.account.yourLicense",
1748 "start": { 1748 "start": {
1749 "column": 15, 1749 "column": 15,
1750 "line": 82 1750 "line": 83
1751 } 1751 }
1752 }, 1752 },
1753 { 1753 {
1754 "defaultMessage": "!!!Your free trial ends in {duration}.", 1754 "defaultMessage": "!!!Your free trial ends in {duration}.",
1755 "end": { 1755 "end": {
1756 "column": 3, 1756 "column": 3,
1757 "line": 89 1757 "line": 90
1758 }, 1758 },
1759 "file": "src/components/settings/account/AccountDashboard.js", 1759 "file": "src/components/settings/account/AccountDashboard.js",
1760 "id": "settings.account.trialEndsIn", 1760 "id": "settings.account.trialEndsIn",
1761 "start": { 1761 "start": {
1762 "column": 15, 1762 "column": 15,
1763 "line": 86 1763 "line": 87
1764 } 1764 }
1765 }, 1765 },
1766 { 1766 {
1767 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.", 1767 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
1768 "end": { 1768 "end": {
1769 "column": 3, 1769 "column": 3,
1770 "line": 93 1770 "line": 95
1771 }, 1771 },
1772 "file": "src/components/settings/account/AccountDashboard.js", 1772 "file": "src/components/settings/account/AccountDashboard.js",
1773 "id": "settings.account.trialUpdateBillingInfo", 1773 "id": "settings.account.trialUpdateBillingInfo",
1774 "start": { 1774 "start": {
1775 "column": 33, 1775 "column": 33,
1776 "line": 90 1776 "line": 91
1777 }
1778 },
1779 {
1780 "defaultMessage": "Account is unavailable",
1781 "end": {
1782 "column": 3,
1783 "line": 99
1784 },
1785 "file": "src/components/settings/account/AccountDashboard.js",
1786 "id": "settings.account.accountUnavailable",
1787 "start": {
1788 "column": 22,
1789 "line": 96
1790 }
1791 },
1792 {
1793 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
1794 "end": {
1795 "column": 3,
1796 "line": 103
1797 },
1798 "file": "src/components/settings/account/AccountDashboard.js",
1799 "id": "settings.account.accountUnavailableInfo",
1800 "start": {
1801 "column": 26,
1802 "line": 100
1777 } 1803 }
1778 } 1804 }
1779 ], 1805 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index e586cb852..ee85566bb 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -224,6 +224,8 @@
224 "settings.account.account.editButton": "Edit account", 224 "settings.account.account.editButton": "Edit account",
225 "settings.account.accountType.basic": "Basic Account", 225 "settings.account.accountType.basic": "Basic Account",
226 "settings.account.accountType.premium": "Premium Supporter Account", 226 "settings.account.accountType.premium": "Premium Supporter Account",
227 "settings.account.accountUnavailable": "Account is unavailable",
228 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
227 "settings.account.buttonSave": "Update profile", 229 "settings.account.buttonSave": "Update profile",
228 "settings.account.deleteAccount": "Delete account", 230 "settings.account.deleteAccount": "Delete account",
229 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 231 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
index 48078c18d..f0bb087d6 100644
--- a/src/i18n/messages/src/components/settings/account/AccountDashboard.json
+++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Account", 4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/account/AccountDashboard.js", 5 "file": "src/components/settings/account/AccountDashboard.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Your Subscription", 17 "defaultMessage": "!!!Your Subscription",
18 "file": "src/components/settings/account/AccountDashboard.js", 18 "file": "src/components/settings/account/AccountDashboard.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 21,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!Danger Zone", 30 "defaultMessage": "!!Danger Zone",
31 "file": "src/components/settings/account/AccountDashboard.js", 31 "file": "src/components/settings/account/AccountDashboard.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 25,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Manage your subscription", 43 "defaultMessage": "!!!Manage your subscription",
44 "file": "src/components/settings/account/AccountDashboard.js", 44 "file": "src/components/settings/account/AccountDashboard.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 29,
47 "column": 33 47 "column": 33
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Upgrade to Franz Professional", 56 "defaultMessage": "!!!Upgrade to Franz Professional",
57 "file": "src/components/settings/account/AccountDashboard.js", 57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": { 58 "start": {
59 "line": 34, 59 "line": 33,
60 "column": 23 60 "column": 23
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 37, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Basic Account", 69 "defaultMessage": "!!!Basic Account",
70 "file": "src/components/settings/account/AccountDashboard.js", 70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": { 71 "start": {
72 "line": 38, 72 "line": 37,
73 "column": 20 73 "column": 20
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 41, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Premium Supporter Account", 82 "defaultMessage": "!!!Premium Supporter Account",
83 "file": "src/components/settings/account/AccountDashboard.js", 83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": { 84 "start": {
85 "line": 42, 85 "line": 41,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 45, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Edit Account", 95 "defaultMessage": "!!!Edit Account",
96 "file": "src/components/settings/account/AccountDashboard.js", 96 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": { 97 "start": {
98 "line": 46, 98 "line": 45,
99 "column": 21 99 "column": 21
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 49, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!Invoices", 108 "defaultMessage": "!!Invoices",
109 "file": "src/components/settings/account/AccountDashboard.js", 109 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": { 110 "start": {
111 "line": 50, 111 "line": 49,
112 "column": 18 112 "column": 18
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 53, 115 "line": 52,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Download", 121 "defaultMessage": "!!!Download",
122 "file": "src/components/settings/account/AccountDashboard.js", 122 "file": "src/components/settings/account/AccountDashboard.js",
123 "start": { 123 "start": {
124 "line": 54, 124 "line": 53,
125 "column": 19 125 "column": 19
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 57, 128 "line": 56,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Could not load user information", 134 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js", 135 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": { 136 "start": {
137 "line": 58, 137 "line": 57,
138 "column": 25 138 "column": 25
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 61, 141 "line": 60,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Try again", 147 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js", 148 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": { 149 "start": {
150 "line": 62, 150 "line": 61,
151 "column": 28 151 "column": 28
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 65, 154 "line": 64,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Delete account", 160 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js", 161 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": { 162 "start": {
163 "line": 66, 163 "line": 65,
164 "column": 17 164 "column": 17
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 69, 167 "line": 68,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,7 +173,7 @@
173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
174 "file": "src/components/settings/account/AccountDashboard.js", 174 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": { 175 "start": {
176 "line": 70, 176 "line": 69,
177 "column": 14 177 "column": 14
178 }, 178 },
179 "end": { 179 "end": {
@@ -190,7 +190,7 @@
190 "column": 19 190 "column": 19
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 77, 193 "line": 78,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Free Trial", 199 "defaultMessage": "!!!Free Trial",
200 "file": "src/components/settings/account/AccountDashboard.js", 200 "file": "src/components/settings/account/AccountDashboard.js",
201 "start": { 201 "start": {
202 "line": 78, 202 "line": 79,
203 "column": 9 203 "column": 9
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 81, 206 "line": 82,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Your Franz License:", 212 "defaultMessage": "!!!Your Franz License:",
213 "file": "src/components/settings/account/AccountDashboard.js", 213 "file": "src/components/settings/account/AccountDashboard.js",
214 "start": { 214 "start": {
215 "line": 82, 215 "line": 83,
216 "column": 15 216 "column": 15
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 85, 219 "line": 86,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Your free trial ends in {duration}.", 225 "defaultMessage": "!!!Your free trial ends in {duration}.",
226 "file": "src/components/settings/account/AccountDashboard.js", 226 "file": "src/components/settings/account/AccountDashboard.js",
227 "start": { 227 "start": {
228 "line": 86, 228 "line": 87,
229 "column": 15 229 "column": 15
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 89, 232 "line": 90,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,37 @@
238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.", 238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
239 "file": "src/components/settings/account/AccountDashboard.js", 239 "file": "src/components/settings/account/AccountDashboard.js",
240 "start": { 240 "start": {
241 "line": 90, 241 "line": 91,
242 "column": 33 242 "column": 33
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 93, 245 "line": 95,
246 "column": 3
247 }
248 },
249 {
250 "id": "settings.account.accountUnavailable",
251 "defaultMessage": "Account is unavailable",
252 "file": "src/components/settings/account/AccountDashboard.js",
253 "start": {
254 "line": 96,
255 "column": 22
256 },
257 "end": {
258 "line": 99,
259 "column": 3
260 }
261 },
262 {
263 "id": "settings.account.accountUnavailableInfo",
264 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
265 "file": "src/components/settings/account/AccountDashboard.js",
266 "start": {
267 "line": 100,
268 "column": 26
269 },
270 "end": {
271 "line": 103,
246 "column": 3 272 "column": 3
247 } 273 }
248 } 274 }