aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/theme/src/themes/dark/index.ts21
-rw-r--r--packages/theme/src/themes/default/index.ts21
-rw-r--r--src/actions/index.js6
-rw-r--r--src/actions/payment.js12
-rw-r--r--src/actions/user.js4
-rw-r--r--src/api/PaymentApi.js14
-rw-r--r--src/api/UserApi.js4
-rw-r--r--src/api/index.js2
-rw-r--r--src/api/server/ServerApi.js41
-rw-r--r--src/assets/themeInfo.json2
-rw-r--r--src/components/TrialActivationInfoBar.js94
-rw-r--r--src/components/auth/Pricing.js270
-rw-r--r--src/components/layout/AppLayout.js10
-rw-r--r--src/components/services/content/ServiceRestricted.js78
-rw-r--r--src/components/services/content/Services.js5
-rw-r--r--src/components/settings/account/AccountDashboard.js147
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js16
-rw-r--r--src/components/settings/recipes/RecipesDashboard.js58
-rw-r--r--src/components/settings/services/EditServiceForm.js124
-rw-r--r--src/components/settings/services/ServicesDashboard.js2
-rw-r--r--src/components/settings/settings/EditSettingsForm.js29
-rw-r--r--src/components/settings/team/TeamDashboard.js39
-rw-r--r--src/components/subscription/SubscriptionForm.js78
-rw-r--r--src/components/subscription/SubscriptionPopup.js84
-rw-r--r--src/components/subscription/TrialForm.js115
-rw-r--r--src/components/ui/ActivateTrialButton/index.js107
-rw-r--r--src/components/ui/FeatureList.js81
-rw-r--r--src/components/ui/PremiumFeatureContainer/index.js101
-rw-r--r--src/components/ui/PremiumFeatureContainer/styles.js34
-rw-r--r--src/components/ui/UpgradeButton/index.js83
-rw-r--r--src/config.js31
-rw-r--r--src/containers/auth/PricingScreen.js83
-rw-r--r--src/containers/auth/SetupAssistantScreen.js9
-rw-r--r--src/containers/auth/SignupScreen.js11
-rw-r--r--src/containers/layout/AppLayoutContainer.js5
-rw-r--r--src/containers/settings/AccountScreen.js20
-rw-r--r--src/containers/settings/EditServiceScreen.js3
-rw-r--r--src/containers/settings/EditSettingsScreen.js6
-rw-r--r--src/containers/settings/RecipesScreen.js4
-rw-r--r--src/containers/settings/TeamScreen.js3
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js99
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js41
-rw-r--r--src/environment.js1
-rw-r--r--src/features/communityRecipes/index.js19
-rw-r--r--src/features/communityRecipes/store.js4
-rw-r--r--src/features/delayApp/Component.js120
-rw-r--r--src/features/delayApp/constants.js6
-rw-r--r--src/features/delayApp/index.js80
-rw-r--r--src/features/delayApp/styles.js22
-rw-r--r--src/features/planSelection/actions.js9
-rw-r--r--src/features/planSelection/api.js26
-rw-r--r--src/features/planSelection/components/PlanItem.js215
-rw-r--r--src/features/planSelection/components/PlanSelection.js269
-rw-r--r--src/features/planSelection/containers/PlanSelectionScreen.js120
-rw-r--r--src/features/planSelection/index.js28
-rw-r--r--src/features/planSelection/store.js68
-rw-r--r--src/features/serviceLimit/components/LimitReachedInfobox.js75
-rw-r--r--src/features/serviceLimit/index.js31
-rw-r--r--src/features/serviceLimit/store.js42
-rw-r--r--src/features/serviceProxy/index.js2
-rw-r--r--src/features/shareFranz/Component.js4
-rw-r--r--src/features/shareFranz/index.js13
-rw-r--r--src/features/spellchecker/index.js27
-rw-r--r--src/features/todos/components/TodosWebview.js20
-rw-r--r--src/features/todos/store.js3
-rw-r--r--src/features/trialStatusBar/actions.js13
-rw-r--r--src/features/trialStatusBar/components/ProgressBar.js45
-rw-r--r--src/features/trialStatusBar/components/TrialStatusBar.js135
-rw-r--r--src/features/trialStatusBar/containers/TrialStatusBarScreen.js112
-rw-r--r--src/features/trialStatusBar/index.js30
-rw-r--r--src/features/trialStatusBar/store.js72
-rw-r--r--src/features/workspaces/components/WorkspaceDrawer.js141
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js129
-rw-r--r--src/features/workspaces/store.js47
-rw-r--r--src/helpers/plan-helpers.js53
-rw-r--r--src/i18n/globalMessages.js4
-rw-r--r--src/i18n/locales/ar.json7
-rw-r--r--src/i18n/locales/bg.json7
-rw-r--r--src/i18n/locales/ca.json7
-rw-r--r--src/i18n/locales/de.json23
-rw-r--r--src/i18n/locales/defaultMessages.json2202
-rw-r--r--src/i18n/locales/el.json23
-rw-r--r--src/i18n/locales/en-US.json87
-rw-r--r--src/i18n/locales/es.json7
-rw-r--r--src/i18n/locales/et.json7
-rw-r--r--src/i18n/locales/fa.json7
-rw-r--r--src/i18n/locales/fi.json7
-rw-r--r--src/i18n/locales/fil.json7
-rw-r--r--src/i18n/locales/fr.json7
-rw-r--r--src/i18n/locales/ga.json7
-rw-r--r--src/i18n/locales/he.json7
-rw-r--r--src/i18n/locales/hi.json7
-rw-r--r--src/i18n/locales/it.json7
-rw-r--r--src/i18n/locales/ja.json7
-rw-r--r--src/i18n/locales/ka.json7
-rw-r--r--src/i18n/locales/kk.json7
-rw-r--r--src/i18n/locales/ko.json7
-rw-r--r--src/i18n/locales/pt.json23
-rw-r--r--src/i18n/locales/ro.json23
-rw-r--r--src/i18n/messages/src/components/TrialActivationInfoBar.json15
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json171
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json16
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json138
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json32
-rw-r--r--src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json56
-rw-r--r--src/i18n/messages/src/components/settings/services/EditServiceForm.json130
-rw-r--r--src/i18n/messages/src/components/settings/services/ServicesDashboard.json36
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json128
-rw-r--r--src/i18n/messages/src/components/settings/team/TeamDashboard.json41
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionForm.json54
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionPopup.json28
-rw-r--r--src/i18n/messages/src/components/subscription/TrialForm.json93
-rw-r--r--src/i18n/messages/src/components/ui/ActivateTrialButton/index.json93
-rw-r--r--src/i18n/messages/src/components/ui/FeatureList.json109
-rw-r--r--src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json15
-rw-r--r--src/i18n/messages/src/components/ui/UpgradeButton/index.json15
-rw-r--r--src/i18n/messages/src/containers/settings/EditServiceScreen.json76
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json180
-rw-r--r--src/i18n/messages/src/features/delayApp/Component.json67
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanItem.json41
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanSelection.json158
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanTeaser.json28
-rw-r--r--src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json54
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json15
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json28
-rw-r--r--src/i18n/messages/src/features/shareFranz/Component.json4
-rw-r--r--src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json41
-rw-r--r--src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json54
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json50
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json32
-rw-r--r--src/i18n/messages/src/helpers/plan-helpers.json54
-rw-r--r--src/i18n/messages/src/helpers/pricing-helpers.json80
-rw-r--r--src/i18n/messages/src/i18n/globalMessages.json13
m---------src/internal-server0
-rw-r--r--src/lib/Menu.js24
-rw-r--r--src/lib/TouchBar.js4
-rw-r--r--src/models/Plan.js17
-rw-r--r--src/models/Service.js5
-rw-r--r--src/models/User.js3
-rw-r--r--src/routes.js4
-rw-r--r--src/stores/FeaturesStore.js18
-rw-r--r--src/stores/PaymentStore.js68
-rw-r--r--src/stores/ServicesStore.js34
-rw-r--r--src/stores/UserStore.js65
-rw-r--r--src/stores/index.js6
-rw-r--r--src/styles/badge.scss6
-rw-r--r--src/styles/main.scss4
-rw-r--r--src/styles/settings.scss24
-rw-r--r--src/styles/subscription-popup.scss18
-rw-r--r--src/styles/subscription.scss49
150 files changed, 1055 insertions, 7921 deletions
diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts
index 684865124..c8ad78829 100644
--- a/packages/theme/src/themes/dark/index.ts
+++ b/packages/theme/src/themes/dark/index.ts
@@ -144,16 +144,6 @@ export default (brandPrimary: string) => {
144 }, 144 },
145 }), 145 }),
146 146
147 // Signup
148 signup: merge({}, defaultStyles.signup, {
149 pricing: {
150 feature: {
151 background: legacyStyles.darkThemeGrayLight,
152 border: color(legacyStyles.darkThemeGrayLight).lighten(0.2).hex(),
153 },
154 },
155 }),
156
157 // Todos 147 // Todos
158 todos: merge({}, defaultStyles.todos, { 148 todos: merge({}, defaultStyles.todos, {
159 todosLayer: { 149 todosLayer: {
@@ -168,16 +158,5 @@ export default (brandPrimary: string) => {
168 background: legacyStyles.themeGrayLight, 158 background: legacyStyles.themeGrayLight,
169 }, 159 },
170 }), 160 }),
171
172 // TrialStatusBar
173 trialStatusBar: merge({}, defaultStyles.trialStatusBar, {
174 bar: {
175 background: legacyStyles.darkThemeGray,
176 },
177 progressBar: {
178 background: legacyStyles.darkThemeGrayLighter,
179 progressIndicator: legacyStyles.darkThemeGrayLightest,
180 },
181 }),
182 }; 161 };
183}; 162};
diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts
index cceb321c9..b8f3e3201 100644
--- a/packages/theme/src/themes/default/index.ts
+++ b/packages/theme/src/themes/default/index.ts
@@ -227,16 +227,6 @@ export default (brandPrimary: string) => {
227 }, 227 },
228 }, 228 },
229 229
230 // Signup
231 signup: {
232 pricing: {
233 feature: {
234 background: legacyStyles.themeGrayLightest,
235 border: legacyStyles.themeGrayLighter,
236 },
237 },
238 },
239
240 // Todos 230 // Todos
241 todos: { 231 todos: {
242 todosLayer: { 232 todosLayer: {
@@ -255,17 +245,6 @@ export default (brandPrimary: string) => {
255 }, 245 },
256 }, 246 },
257 247
258 // TrialStatusBar
259 trialStatusBar: {
260 bar: {
261 background: legacyStyles.themeGrayLightest,
262 },
263 progressBar: {
264 background: color(legacyStyles.themeGrayLighter).darken(0.1).hex(),
265 progressIndicator: legacyStyles.themeGrayLight,
266 },
267 },
268
269 legacyStyles, 248 legacyStyles,
270 }; 249 };
271}; 250};
diff --git a/src/actions/index.js b/src/actions/index.js
index 6f32732b9..ed8283d6c 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -7,15 +7,12 @@ import recipePreview from './recipePreview';
7import ui from './ui'; 7import ui from './ui';
8import app from './app'; 8import app from './app';
9import user from './user'; 9import user from './user';
10import payment from './payment';
11import news from './news'; 10import news from './news';
12import settings from './settings'; 11import settings from './settings';
13import requests from './requests'; 12import requests from './requests';
14import announcements from '../features/announcements/actions'; 13import announcements from '../features/announcements/actions';
15import workspaces from '../features/workspaces/actions'; 14import workspaces from '../features/workspaces/actions';
16import todos from '../features/todos/actions'; 15import todos from '../features/todos/actions';
17import planSelection from '../features/planSelection/actions';
18import trialStatusBar from '../features/trialStatusBar/actions';
19 16
20const actions = { 17const actions = {
21 service, 18 service,
@@ -24,7 +21,6 @@ const actions = {
24 ui, 21 ui,
25 app, 22 app,
26 user, 23 user,
27 payment,
28 news, 24 news,
29 settings, 25 settings,
30 requests, 26 requests,
@@ -35,6 +31,4 @@ export default Object.assign(
35 { announcements }, 31 { announcements },
36 { workspaces }, 32 { workspaces },
37 { todos }, 33 { todos },
38 { planSelection },
39 { trialStatusBar },
40); 34);
diff --git a/src/actions/payment.js b/src/actions/payment.js
deleted file mode 100644
index f61faf197..000000000
--- a/src/actions/payment.js
+++ /dev/null
@@ -1,12 +0,0 @@
1import PropTypes from 'prop-types';
2
3export default {
4 createHostedPage: {
5 planId: PropTypes.string.isRequired,
6 },
7 upgradeAccount: {
8 planId: PropTypes.string.isRequired,
9 onCloseWindow: PropTypes.func,
10 },
11 createDashboardUrl: {},
12};
diff --git a/src/actions/user.js b/src/actions/user.js
index 7061a367a..20d27ee53 100644
--- a/src/actions/user.js
+++ b/src/actions/user.js
@@ -13,15 +13,11 @@ export default {
13 password: PropTypes.string.isRequired, 13 password: PropTypes.string.isRequired,
14 accountType: PropTypes.string, 14 accountType: PropTypes.string,
15 company: PropTypes.string, 15 company: PropTypes.string,
16 plan: PropTypes.string,
17 currency: PropTypes.string, 16 currency: PropTypes.string,
18 }, 17 },
19 retrievePassword: { 18 retrievePassword: {
20 email: PropTypes.string.isRequired, 19 email: PropTypes.string.isRequired,
21 }, 20 },
22 activateTrial: {
23 planId: PropTypes.string.isRequired,
24 },
25 invite: { 21 invite: {
26 invites: PropTypes.array.isRequired, 22 invites: PropTypes.array.isRequired,
27 }, 23 },
diff --git a/src/api/PaymentApi.js b/src/api/PaymentApi.js
deleted file mode 100644
index 7325151e9..000000000
--- a/src/api/PaymentApi.js
+++ /dev/null
@@ -1,14 +0,0 @@
1export default class PaymentApi {
2 constructor(server, local) {
3 this.server = server;
4 this.local = local;
5 }
6
7 plans() {
8 return this.server.getPlans();
9 }
10
11 getHostedPage(planId) {
12 return this.server.getHostedPage(planId);
13 }
14}
diff --git a/src/api/UserApi.js b/src/api/UserApi.js
index 8ba8cd1e9..edfb88988 100644
--- a/src/api/UserApi.js
+++ b/src/api/UserApi.js
@@ -25,10 +25,6 @@ export default class UserApi {
25 return this.server.retrievePassword(email); 25 return this.server.retrievePassword(email);
26 } 26 }
27 27
28 activateTrial(data) {
29 return this.server.activateTrial(data);
30 }
31
32 invite(data) { 28 invite(data) {
33 return this.server.inviteUser(data); 29 return this.server.inviteUser(data);
34 } 30 }
diff --git a/src/api/index.js b/src/api/index.js
index 3c87cc087..ed6c13488 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -4,7 +4,6 @@ import RecipePreviewsApi from './RecipePreviewsApi';
4import RecipesApi from './RecipesApi'; 4import RecipesApi from './RecipesApi';
5import UserApi from './UserApi'; 5import UserApi from './UserApi';
6import LocalApi from './LocalApi'; 6import LocalApi from './LocalApi';
7import PaymentApi from './PaymentApi';
8import NewsApi from './NewsApi'; 7import NewsApi from './NewsApi';
9import FeaturesApi from './FeaturesApi'; 8import FeaturesApi from './FeaturesApi';
10 9
@@ -16,6 +15,5 @@ export default (server, local) => ({
16 features: new FeaturesApi(server, local), 15 features: new FeaturesApi(server, local),
17 user: new UserApi(server, local), 16 user: new UserApi(server, local),
18 local: new LocalApi(server, local), 17 local: new LocalApi(server, local),
19 payment: new PaymentApi(server, local),
20 news: new NewsApi(server, local), 18 news: new NewsApi(server, local),
21}); 19});
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index c63aa7dda..78a98e544 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -6,7 +6,6 @@ import { app, require as remoteRequire } from '@electron/remote';
6import ServiceModel from '../../models/Service'; 6import ServiceModel from '../../models/Service';
7import RecipePreviewModel from '../../models/RecipePreview'; 7import RecipePreviewModel from '../../models/RecipePreview';
8import RecipeModel from '../../models/Recipe'; 8import RecipeModel from '../../models/Recipe';
9import PlanModel from '../../models/Plan';
10import NewsModel from '../../models/News'; 9import NewsModel from '../../models/News';
11import UserModel from '../../models/User'; 10import UserModel from '../../models/User';
12import OrderModel from '../../models/Order'; 11import OrderModel from '../../models/Order';
@@ -73,20 +72,6 @@ export default class ServerApi {
73 return u.token; 72 return u.token;
74 } 73 }
75 74
76 async activateTrial(data) {
77 const request = await sendAuthRequest(`${apiBase()}/payment/trial`, {
78 method: 'POST',
79 body: JSON.stringify(data),
80 });
81 if (!request.ok) {
82 throw request;
83 }
84 const trial = await request.json();
85
86 debug('ServerApi::activateTrial resolves', trial);
87 return true;
88 }
89
90 async inviteUser(data) { 75 async inviteUser(data) {
91 const request = await sendAuthRequest(`${apiBase()}/invite`, { 76 const request = await sendAuthRequest(`${apiBase()}/invite`, {
92 method: 'POST', 77 method: 'POST',
@@ -427,32 +412,6 @@ export default class ServerApi {
427 } 412 }
428 } 413 }
429 414
430 // Payment
431 async getPlans() {
432 const request = await sendAuthRequest(`${apiBase()}/payment/plans`);
433 if (!request.ok) throw request;
434 const data = await request.json();
435 const plan = new PlanModel(data);
436 debug('ServerApi::getPlans resolves', plan);
437 return plan;
438 }
439
440 async getHostedPage(planId) {
441 const request = await sendAuthRequest(`${apiBase()}/payment/init`, {
442 method: 'POST',
443 body: JSON.stringify({
444 planId,
445 }),
446 });
447 if (!request.ok) {
448 throw request;
449 }
450 const data = await request.json();
451
452 debug('ServerApi::getHostedPage resolves', data);
453 return data;
454 }
455
456 // News 415 // News
457 async getLatestNews() { 416 async getLatestNews() {
458 const url = `${apiBase(true)}/news?platform=${osPlatform}&arch=${osArch}&version=${app.getVersion()}`; 417 const url = `${apiBase(true)}/news?platform=${osPlatform}&arch=${osArch}&version=${app.getVersion()}`;
diff --git a/src/assets/themeInfo.json b/src/assets/themeInfo.json
index 0791cf459..54e833789 100644
--- a/src/assets/themeInfo.json
+++ b/src/assets/themeInfo.json
@@ -1 +1 @@
{"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .tab-item.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.link, button.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-color":".theme__dark .settings .premium-info, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings-navigation .settings-navigation__link.is-active, a.button, button.button, .auth, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark .badge.badge--premium, .badge.badge--primary, .badge.badge--premium, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .franz-form__button, .ferdi__fab, .franz-form .franz-form__slider-wrapper .slider::-webkit-slider-thumb","border-right-color":".settings .settings__header .separator"} \ No newline at end of file {"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .tab-item.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.link, button.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-color":".theme__dark .settings, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings-navigation .settings-navigation__link.is-active, a.button, button.button, .auth, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark, .badge.badge--primary, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .franz-form__button, .ferdi__fab, .franz-form .franz-form__slider-wrapper .slider::-webkit-slider-thumb","border-right-color":".settings .settings__header .separator"}
diff --git a/src/components/TrialActivationInfoBar.js b/src/components/TrialActivationInfoBar.js
deleted file mode 100644
index 77ab97565..000000000
--- a/src/components/TrialActivationInfoBar.js
+++ /dev/null
@@ -1,94 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4import ms from 'ms';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7
8import InfoBar from './ui/InfoBar';
9
10const messages = defineMessages({
11 message: {
12 id: 'infobar.trialActivated',
13 defaultMessage: '!!!Your trial was successfully activated. Happy messaging!',
14 },
15});
16
17const styles = {
18 notification: {
19 height: 'auto',
20 position: 'absolute',
21 top: -50,
22 transition: 'top 0.3s',
23 zIndex: 500,
24 width: 'calc(100% - 300px)',
25 },
26 show: {
27 top: 0,
28 },
29};
30
31@injectSheet(styles)
32class TrialActivationInfoBar extends Component {
33 static propTypes = {
34 // eslint-disable-next-line
35 classes: PropTypes.object.isRequired,
36 };
37
38 static contextTypes = {
39 intl: intlShape,
40 };
41
42 state = {
43 showing: false,
44 removed: false,
45 }
46
47 componentDidMount() {
48 setTimeout(() => {
49 this.setState({
50 showing: true,
51 });
52 }, 0);
53
54 setTimeout(() => {
55 this.setState({
56 showing: false,
57 });
58 }, ms('6s'));
59
60 setTimeout(() => {
61 this.setState({
62 removed: true,
63 });
64 }, ms('7s'));
65 }
66
67 render() {
68 const { classes } = this.props;
69 const { showing, removed } = this.state;
70 const { intl } = this.context;
71
72 if (removed) return null;
73
74 return (
75 <div
76 className={classnames({
77 [classes.notification]: true,
78 [classes.show]: showing,
79 })}
80 >
81 <InfoBar
82 type="primary"
83 position="top"
84 sticky
85 >
86 <span className="mdi mdi-information" />
87 {intl.formatMessage(messages.message)}
88 </InfoBar>
89 </div>
90 );
91 }
92}
93
94export default TrialActivationInfoBar;
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
deleted file mode 100644
index 2fcabe54d..000000000
--- a/src/components/auth/Pricing.js
+++ /dev/null
@@ -1,270 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { H2, Loader } from '@meetfranz/ui';
7import classnames from 'classnames';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureItem } from '../ui/FeatureItem';
11import { FeatureList } from '../ui/FeatureList';
12
13const messages = defineMessages({
14 headline: {
15 id: 'pricing.trial.headline.pro',
16 defaultMessage: '!!!Hi {name}, welcome to Franz',
17 },
18 specialTreat: {
19 id: 'pricing.trial.intro.specialTreat',
20 defaultMessage: '!!!We have a special treat for you.',
21 },
22 tryPro: {
23 id: 'pricing.trial.intro.tryPro',
24 defaultMessage: '!!!Enjoy the full Franz Professional experience completely free for 14 days.',
25 },
26 happyMessaging: {
27 id: 'pricing.trial.intro.happyMessaging',
28 defaultMessage: '!!!Happy messaging,',
29 },
30 noStringsAttachedHeadline: {
31 id: 'pricing.trial.terms.headline',
32 defaultMessage: '!!!No strings attached',
33 },
34 noCreditCard: {
35 id: 'pricing.trial.terms.noCreditCard',
36 defaultMessage: '!!!No credit card required',
37 },
38 automaticTrialEnd: {
39 id: 'pricing.trial.terms.automaticTrialEnd',
40 defaultMessage: '!!!Your free trial ends automatically after 14 days',
41 },
42 trialWorth: {
43 id: 'pricing.trial.terms.trialWorth',
44 defaultMessage: '!!!Free trial (normally {currency}{price} per month)',
45 },
46 activationError: {
47 id: 'pricing.trial.error',
48 defaultMessage: '!!!Sorry, we could not activate your trial!',
49 },
50 ctaAccept: {
51 id: 'pricing.trial.cta.accept',
52 defaultMessage: '!!!Start my 14-day Franz Professional Trial ',
53 },
54 ctaStart: {
55 id: 'pricing.trial.cta.start',
56 defaultMessage: '!!!Start using Franz',
57 },
58 ctaSkip: {
59 id: 'pricing.trial.cta.skip',
60 defaultMessage: '!!!Continue to Ferdi',
61 },
62 featuresHeadline: {
63 id: 'pricing.trial.features.headline',
64 defaultMessage: '!!!Franz Professional includes:',
65 },
66});
67
68const styles = theme => ({
69 root: {
70 width: '500px !important',
71 textAlign: 'center',
72 padding: 20,
73 zIndex: 100,
74
75 '& h1': {
76 },
77 },
78 container: {
79 position: 'relative',
80 marginLeft: -150,
81 },
82 welcomeOffer: {
83 textAlign: 'center',
84 fontWeight: 'bold',
85 marginBottom: '6 !important',
86 },
87 keyTerms: {
88 textAlign: 'center',
89 },
90 content: {
91 position: 'relative',
92 zIndex: 20,
93 },
94 featureContainer: {
95 width: 300,
96 position: 'absolute',
97 left: 'calc(100% / 2 + 250px)',
98 marginTop: 20,
99 background: theme.signup.pricing.feature.background,
100 height: 'auto',
101 padding: 20,
102 borderTopRightRadius: theme.borderRadius,
103 borderBottomRightRadius: theme.borderRadius,
104 zIndex: 10,
105 },
106 featureItem: {
107 borderBottom: [1, 'solid', theme.signup.pricing.feature.border],
108 },
109 cta: {
110 marginTop: 40,
111 width: '100%',
112 },
113 skipLink: {
114 textAlign: 'center',
115 marginTop: 10,
116 },
117 error: {
118 margin: [20, 0, 0],
119 color: theme.styleTypes.danger.accent,
120 },
121 priceContainer: {
122 display: 'flex',
123 justifyContent: 'space-evenly',
124 margin: [10, 0, 15],
125 },
126 price: {
127 '& sup': {
128 verticalAlign: 14,
129 fontSize: 20,
130 },
131 },
132 figure: {
133 fontSize: 40,
134 },
135 regularPrice: {
136 position: 'relative',
137
138 '&:before': {
139 content: '" "',
140 position: 'absolute',
141 width: '130%',
142 height: 1,
143 top: 14,
144 left: -12,
145 borderBottom: [3, 'solid', 'red'],
146 transform: 'rotateZ(-20deg)',
147 },
148 },
149});
150
151export default @injectSheet(styles) @observer class Signup extends Component {
152 static propTypes = {
153 onSubmit: PropTypes.func.isRequired,
154 isLoadingRequiredData: PropTypes.bool.isRequired,
155 isActivatingTrial: PropTypes.bool.isRequired,
156 trialActivationError: PropTypes.bool.isRequired,
157 canSkipTrial: PropTypes.bool.isRequired,
158 classes: PropTypes.object.isRequired,
159 currency: PropTypes.string.isRequired,
160 price: PropTypes.number.isRequired,
161 name: PropTypes.string.isRequired,
162 };
163
164 static contextTypes = {
165 intl: intlShape,
166 };
167
168 render() {
169 const {
170 onSubmit,
171 isLoadingRequiredData,
172 isActivatingTrial,
173 trialActivationError,
174 canSkipTrial,
175 classes,
176 currency,
177 price,
178 name,
179 } = this.props;
180 const { intl } = this.context;
181
182 const [intPart, fractionPart] = (price).toString().split('.');
183
184 return (
185 <>
186 <div className={classnames('auth__container', classes.root, classes.container)}>
187 <form className="franz-form auth__form">
188 {isLoadingRequiredData ? <Loader /> : (
189 <img
190 src="./assets/images/sm.png"
191 className="auth__logo auth__logo--sm"
192 alt=""
193 />
194 )}
195 <h1>{intl.formatMessage(messages.headline, { name })}</h1>
196 <div className="auth__letter">
197 <p>
198 {intl.formatMessage(messages.specialTreat)}
199 <br />
200 </p>
201 <p>
202 {intl.formatMessage(messages.tryPro)}
203 <br />
204 </p>
205 <p>
206 {intl.formatMessage(messages.happyMessaging)}
207 </p>
208 <p>
209 <strong>Stefan Malzner</strong>
210 </p>
211 </div>
212 <div className={classes.priceContainer}>
213 <p className={classnames(classes.price, classes.regularPrice)}>
214 <span className={classes.figure}>
215 {currency}
216 {intPart}
217 </span>
218 <sup>{fractionPart}</sup>
219 </p>
220 <p className={classnames(classes.price, classes.trialPrice)}>
221 <span className={classes.figure}>
222 {currency}
223 0
224 </span>
225 <sup>00</sup>
226 </p>
227 </div>
228 <div className={classes.keyTerms}>
229 <H2>
230 {intl.formatMessage(messages.noStringsAttachedHeadline)}
231 </H2>
232 <ul className={classes.keyTermsList}>
233 <FeatureItem
234 icon="👉"
235 name={intl.formatMessage(messages.trialWorth, {
236 currency,
237 price,
238 })}
239 />
240 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
241 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
242 </ul>
243 </div>
244 {trialActivationError && (
245 <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p>
246 )}
247 <Button
248 label={intl.formatMessage(!canSkipTrial ? messages.ctaStart : messages.ctaAccept)}
249 className={classes.cta}
250 onClick={onSubmit}
251 busy={isActivatingTrial}
252 disabled={isLoadingRequiredData || isActivatingTrial}
253 />
254 {canSkipTrial && (
255 <p className={classes.skipLink}>
256 <a href="#/">{intl.formatMessage(messages.ctaSkip)}</a>
257 </p>
258 )}
259 </form>
260 </div>
261 <div className={classes.featureContainer}>
262 <H2>
263 {intl.formatMessage(messages.featuresHeadline)}
264 </H2>
265 <FeatureList />
266 </div>
267 </>
268 );
269 }
270}
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index a60270a6f..7e4d0e53e 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -19,10 +19,7 @@ import { isWindows } from '../../environment';
19import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 19import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
20import { workspaceStore } from '../../features/workspaces'; 20import { workspaceStore } from '../../features/workspaces';
21import AppUpdateInfoBar from '../AppUpdateInfoBar'; 21import AppUpdateInfoBar from '../AppUpdateInfoBar';
22import TrialActivationInfoBar from '../TrialActivationInfoBar';
23import Todos from '../../features/todos/containers/TodosScreen'; 22import Todos from '../../features/todos/containers/TodosScreen';
24import PlanSelection from '../../features/planSelection/containers/PlanSelectionScreen';
25import TrialStatusBar from '../../features/trialStatusBar/containers/TrialStatusBarScreen';
26 23
27function createMarkup(HTMLString) { 24function createMarkup(HTMLString) {
28 return { __html: HTMLString }; 25 return { __html: HTMLString };
@@ -79,7 +76,6 @@ class AppLayout extends Component {
79 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 76 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
80 retryRequiredRequests: PropTypes.func.isRequired, 77 retryRequiredRequests: PropTypes.func.isRequired,
81 areRequiredRequestsLoading: PropTypes.bool.isRequired, 78 areRequiredRequestsLoading: PropTypes.bool.isRequired,
82 hasActivatedTrial: PropTypes.bool.isRequired,
83 }; 79 };
84 80
85 state = { 81 state = {
@@ -115,7 +111,6 @@ class AppLayout extends Component {
115 areRequiredRequestsSuccessful, 111 areRequiredRequestsSuccessful,
116 retryRequiredRequests, 112 retryRequiredRequests,
117 areRequiredRequestsLoading, 113 areRequiredRequestsLoading,
118 hasActivatedTrial,
119 } = this.props; 114 } = this.props;
120 115
121 const { intl } = this.context; 116 const { intl } = this.context;
@@ -148,9 +143,6 @@ class AppLayout extends Component {
148 /> 143 />
149 </InfoBar> 144 </InfoBar>
150 ))} 145 ))}
151 {hasActivatedTrial && (
152 <TrialActivationInfoBar />
153 )}
154 {!areRequiredRequestsSuccessful && showRequiredRequestsError && ( 146 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
155 <InfoBar 147 <InfoBar
156 type="danger" 148 type="danger"
@@ -202,11 +194,9 @@ class AppLayout extends Component {
202 <PublishDebugInfo /> 194 <PublishDebugInfo />
203 {services} 195 {services}
204 {children} 196 {children}
205 <TrialStatusBar />
206 </div> 197 </div>
207 <Todos /> 198 <Todos />
208 </div> 199 </div>
209 <PlanSelection />
210 </div> 200 </div>
211 </ErrorBoundary> 201 </ErrorBoundary>
212 ); 202 );
diff --git a/src/components/services/content/ServiceRestricted.js b/src/components/services/content/ServiceRestricted.js
deleted file mode 100644
index 4b8d926aa..000000000
--- a/src/components/services/content/ServiceRestricted.js
+++ /dev/null
@@ -1,78 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { serviceLimitStore } from '../../../features/serviceLimit';
7import Button from '../../ui/Button';
8import { RESTRICTION_TYPES } from '../../../models/Service';
9
10const messages = defineMessages({
11 headlineServiceLimit: {
12 id: 'service.restrictedHandler.serviceLimit.headline',
13 defaultMessage: '!!!You have reached your service limit.',
14 },
15 textServiceLimit: {
16 id: 'service.restrictedHandler.serviceLimit.text',
17 defaultMessage: '!!!Please upgrade your account to use more than {count} services.',
18 },
19 headlineCustomUrl: {
20 id: 'service.restrictedHandler.customUrl.headline',
21 defaultMessage: '!!!Franz Professional Plan required',
22 },
23 textCustomUrl: {
24 id: 'service.restrictedHandler.customUrl.text',
25 defaultMessage: '!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.',
26 },
27 action: {
28 id: 'service.restrictedHandler.action',
29 defaultMessage: '!!!Upgrade Account',
30 },
31});
32
33export default @observer class ServiceRestricted extends Component {
34 static propTypes = {
35 name: PropTypes.string.isRequired,
36 upgrade: PropTypes.func.isRequired,
37 type: PropTypes.number.isRequired,
38 };
39
40 static contextTypes = {
41 intl: intlShape,
42 };
43
44 countdownInterval = null;
45
46 countdownIntervalTimeout = 1000;
47
48 render() {
49 const {
50 name,
51 upgrade,
52 type,
53 } = this.props;
54 const { intl } = this.context;
55
56 return (
57 <div className="services__info-layer">
58 {type === RESTRICTION_TYPES.SERVICE_LIMIT && (
59 <>
60 <h1>{intl.formatMessage(messages.headlineServiceLimit)}</h1>
61 <p>{intl.formatMessage(messages.textServiceLimit, { count: serviceLimitStore.serviceLimit })}</p>
62 </>
63 )}
64 {type === RESTRICTION_TYPES.CUSTOM_URL && (
65 <>
66 <h1>{intl.formatMessage(messages.headlineCustomUrl)}</h1>
67 <p>{intl.formatMessage(messages.textCustomUrl)}</p>
68 </>
69 )}
70 <Button
71 label={intl.formatMessage(messages.action, { name })}
72 buttonType="inverted"
73 onClick={() => upgrade()}
74 />
75 </div>
76 );
77 }
78}
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index caa3cf9aa..6e46a60d2 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -54,7 +54,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
54 openSettings: PropTypes.func.isRequired, 54 openSettings: PropTypes.func.isRequired,
55 update: PropTypes.func.isRequired, 55 update: PropTypes.func.isRequired,
56 userHasCompletedSignup: PropTypes.bool.isRequired, 56 userHasCompletedSignup: PropTypes.bool.isRequired,
57 hasActivatedTrial: PropTypes.bool.isRequired,
58 classes: PropTypes.object.isRequired, 57 classes: PropTypes.object.isRequired,
59 actions: PropTypes.object.isRequired, 58 actions: PropTypes.object.isRequired,
60 isSpellcheckerEnabled: PropTypes.bool.isRequired, 59 isSpellcheckerEnabled: PropTypes.bool.isRequired,
@@ -109,7 +108,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
109 openSettings, 108 openSettings,
110 update, 109 update,
111 userHasCompletedSignup, 110 userHasCompletedSignup,
112 hasActivatedTrial,
113 classes, 111 classes,
114 isSpellcheckerEnabled, 112 isSpellcheckerEnabled,
115 } = this.props; 113 } = this.props;
@@ -123,7 +121,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
123 121
124 return ( 122 return (
125 <div className="services"> 123 <div className="services">
126 {(userHasCompletedSignup || hasActivatedTrial) && ( 124 {userHasCompletedSignup && (
127 <div className={classes.confettiContainer}> 125 <div className={classes.confettiContainer}>
128 <Confetti 126 <Confetti
129 width={window.width} 127 width={window.width}
@@ -186,7 +184,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
186 }, 184 },
187 redirect: false, 185 redirect: false,
188 })} 186 })}
189 upgrade={() => openSettings({ path: 'user' })}
190 isSpellcheckerEnabled={isSpellcheckerEnabled} 187 isSpellcheckerEnabled={isSpellcheckerEnabled}
191 /> 188 />
192 ))} 189 ))}
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 68d88e218..d3d75a979 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -3,14 +3,11 @@ 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 { ProBadge, H1, H2 } from '@meetfranz/ui'; 6import { H1, H2 } from '@meetfranz/ui';
7import moment from 'moment';
8 7
9import Loader from '../../ui/Loader'; 8import Loader from '../../ui/Loader';
10import Button from '../../ui/Button'; 9import Button from '../../ui/Button';
11import Infobox from '../../ui/Infobox'; 10import Infobox from '../../ui/Infobox';
12import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen';
13import { i18nPlanName } from '../../../helpers/plan-helpers';
14import { LOCAL_SERVER, LIVE_FRANZ_API } from '../../../config'; 11import { LOCAL_SERVER, LIVE_FRANZ_API } from '../../../config';
15 12
16const messages = defineMessages({ 13const messages = defineMessages({
@@ -30,18 +27,6 @@ const messages = defineMessages({
30 id: 'settings.account.manageSubscription.label', 27 id: 'settings.account.manageSubscription.label',
31 defaultMessage: '!!!Manage your subscription', 28 defaultMessage: '!!!Manage your subscription',
32 }, 29 },
33 upgradeAccountToPro: {
34 id: 'settings.account.upgradeToPro.label',
35 defaultMessage: '!!!Upgrade to Franz Professional',
36 },
37 accountTypeBasic: {
38 id: 'settings.account.accountType.basic',
39 defaultMessage: '!!!Basic Account',
40 },
41 accountTypePremium: {
42 id: 'settings.account.accountType.premium',
43 defaultMessage: '!!!Premium Supporter Account',
44 },
45 accountEditButton: { 30 accountEditButton: {
46 id: 'settings.account.account.editButton', 31 id: 'settings.account.account.editButton',
47 defaultMessage: '!!!Edit Account', 32 defaultMessage: '!!!Edit Account',
@@ -76,23 +61,10 @@ const messages = defineMessages({
76 defaultMessage: 61 defaultMessage:
77 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', 62 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
78 }, 63 },
79 trial: {
80 id: 'settings.account.trial',
81 defaultMessage: '!!!Free Trial',
82 },
83 yourLicense: { 64 yourLicense: {
84 id: 'settings.account.yourLicense', 65 id: 'settings.account.yourLicense',
85 defaultMessage: '!!!Your Franz License:', 66 defaultMessage: '!!!Your Franz License:',
86 }, 67 },
87 trialEndsIn: {
88 id: 'settings.account.trialEndsIn',
89 defaultMessage: '!!!Your free trial ends in {duration}.',
90 },
91 trialUpdateBillingInformation: {
92 id: 'settings.account.trialUpdateBillingInfo',
93 defaultMessage:
94 '!!!Please update your billing info to continue using {license} after your trial period.',
95 },
96 accountUnavailable: { 68 accountUnavailable: {
97 id: 'settings.account.accountUnavailable', 69 id: 'settings.account.accountUnavailable',
98 defaultMessage: 'Account is unavailable', 70 defaultMessage: 'Account is unavailable',
@@ -107,8 +79,6 @@ const messages = defineMessages({
107class AccountDashboard extends Component { 79class AccountDashboard extends Component {
108 static propTypes = { 80 static propTypes = {
109 user: MobxPropTypes.observableObject.isRequired, 81 user: MobxPropTypes.observableObject.isRequired,
110 isPremiumOverrideUser: PropTypes.bool.isRequired,
111 isProUser: PropTypes.bool.isRequired,
112 isLoading: PropTypes.bool.isRequired, 82 isLoading: PropTypes.bool.isRequired,
113 userInfoRequestFailed: PropTypes.bool.isRequired, 83 userInfoRequestFailed: PropTypes.bool.isRequired,
114 retryUserInfoRequest: PropTypes.func.isRequired, 84 retryUserInfoRequest: PropTypes.func.isRequired,
@@ -116,10 +86,7 @@ class AccountDashboard extends Component {
116 isLoadingDeleteAccount: PropTypes.bool.isRequired, 86 isLoadingDeleteAccount: PropTypes.bool.isRequired,
117 isDeleteAccountSuccessful: PropTypes.bool.isRequired, 87 isDeleteAccountSuccessful: PropTypes.bool.isRequired,
118 openEditAccount: PropTypes.func.isRequired, 88 openEditAccount: PropTypes.func.isRequired,
119 openBilling: PropTypes.func.isRequired,
120 upgradeToPro: PropTypes.func.isRequired,
121 openInvoices: PropTypes.func.isRequired, 89 openInvoices: PropTypes.func.isRequired,
122 onCloseSubscriptionWindow: PropTypes.func.isRequired,
123 server: PropTypes.string.isRequired, 90 server: PropTypes.string.isRequired,
124 }; 91 };
125 92
@@ -130,8 +97,6 @@ class AccountDashboard extends Component {
130 render() { 97 render() {
131 const { 98 const {
132 user, 99 user,
133 isPremiumOverrideUser,
134 isProUser,
135 isLoading, 100 isLoading,
136 userInfoRequestFailed, 101 userInfoRequestFailed,
137 retryUserInfoRequest, 102 retryUserInfoRequest,
@@ -139,20 +104,11 @@ class AccountDashboard extends Component {
139 isLoadingDeleteAccount, 104 isLoadingDeleteAccount,
140 isDeleteAccountSuccessful, 105 isDeleteAccountSuccessful,
141 openEditAccount, 106 openEditAccount,
142 openBilling,
143 upgradeToPro,
144 openInvoices, 107 openInvoices,
145 onCloseSubscriptionWindow,
146 server, 108 server,
147 } = this.props; 109 } = this.props;
148 const { intl } = this.context; 110 const { intl } = this.context;
149 111
150 let planName = '';
151
152 if (user.team && user.team.plan) {
153 planName = i18nPlanName(user.team.plan, intl);
154 }
155
156 const isUsingWithoutAccount = server === LOCAL_SERVER; 112 const isUsingWithoutAccount = server === LOCAL_SERVER;
157 const isUsingFranzServer = server === LIVE_FRANZ_API; 113 const isUsingFranzServer = server === LIVE_FRANZ_API;
158 114
@@ -210,98 +166,40 @@ class AccountDashboard extends Component {
210 <div className="account__info"> 166 <div className="account__info">
211 <H1> 167 <H1>
212 <span className="username">{`${user.firstname} ${user.lastname}`}</span> 168 <span className="username">{`${user.firstname} ${user.lastname}`}</span>
213 {user.isPremium && (
214 <>
215 {' '}
216 <ProBadge />
217 </>
218 )}
219 </H1> 169 </H1>
220 <p> 170 <p>
221 {user.organization && `${user.organization}, `} 171 {user.organization && `${user.organization}, `}
222 {user.email} 172 {user.email}
223 </p> 173 </p>
224 {user.isPremium && ( 174 <div className="manage-user-links">
225 <div className="manage-user-links"> 175 <Button
226 <Button 176 label={intl.formatMessage(
227 label={intl.formatMessage( 177 messages.accountEditButton,
228 messages.accountEditButton, 178 )}
229 )} 179 className="franz-form__button--inverted"
230 className="franz-form__button--inverted" 180 onClick={openEditAccount}
231 onClick={openEditAccount} 181 />
232 /> 182 </div>
233 </div>
234 )}
235 </div> 183 </div>
236 {!user.isPremium && ( 184 <Button
237 <Button 185 label={intl.formatMessage(
238 label={intl.formatMessage( 186 messages.accountEditButton,
239 messages.accountEditButton, 187 )}
240 )} 188 className="franz-form__button--inverted"
241 className="franz-form__button--inverted" 189 onClick={openEditAccount}
242 onClick={openEditAccount} 190 />
243 />
244 )}
245 </div> 191 </div>
246 </div> 192 </div>
247 {user.isPremium && user.isSubscriptionOwner && isUsingFranzServer && ( 193 {user.isSubscriptionOwner && isUsingFranzServer && (
248 <div className="account"> 194 <div className="account">
249 <div className="account__box"> 195 <div className="account__box">
250 <H2>{intl.formatMessage(messages.yourLicense)}</H2> 196 <H2>{intl.formatMessage(messages.yourLicense)}</H2>
251 <p> 197 <p>
252 Franz 198 Franz
253 {' '}
254 {isPremiumOverrideUser ? 'Premium' : planName}
255 {user.team.isTrial && (
256 <>
257 {' – '}
258 {intl.formatMessage(messages.trial)}
259 </>
260 )}
261 </p> 199 </p>
262 {user.team.isTrial && (
263 <>
264 <br />
265 <p>
266 {intl.formatMessage(messages.trialEndsIn, {
267 duration: moment
268 .duration(
269 moment().diff(user.team.trialEnd),
270 )
271 .humanize(),
272 })}
273 </p>
274 <p>
275 {intl.formatMessage(
276 messages.trialUpdateBillingInformation,
277 {
278 license: planName,
279 },
280 )}
281 </p>
282 </>
283 )}
284 {!isProUser && (
285 <div className="manage-user-links">
286 <Button
287 label={intl.formatMessage(
288 messages.upgradeAccountToPro,
289 )}
290 className="franz-form__button--primary"
291 onClick={upgradeToPro}
292 />
293 </div>
294 )}
295 <div className="manage-user-links"> 200 <div className="manage-user-links">
296 <Button 201 <Button
297 label={intl.formatMessage( 202 label={intl.formatMessage(
298 messages.manageSubscriptionButtonLabel,
299 )}
300 className="franz-form__button--inverted"
301 onClick={openBilling}
302 />
303 <Button
304 label={intl.formatMessage(
305 messages.invoicesButton, 203 messages.invoicesButton,
306 )} 204 )}
307 className="franz-form__button--inverted" 205 className="franz-form__button--inverted"
@@ -311,15 +209,6 @@ class AccountDashboard extends Component {
311 </div> 209 </div>
312 </div> 210 </div>
313 )} 211 )}
314 {!user.isPremium && (
315 <div className="account franz-form">
316 <div className="account__box">
317 <SubscriptionForm
318 onCloseWindow={onCloseSubscriptionWindow}
319 />
320 </div>
321 </div>
322 )}
323 </> 212 </>
324 )} 213 )}
325 214
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js
index cebab2f12..02cae6b69 100644
--- a/src/components/settings/navigation/SettingsNavigation.js
+++ b/src/components/settings/navigation/SettingsNavigation.js
@@ -2,7 +2,6 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
4import { inject, observer } from 'mobx-react'; 4import { inject, observer } from 'mobx-react';
5import { ProBadge } from '@meetfranz/ui';
6import { RouterStore } from 'mobx-react-router'; 5import { RouterStore } from 'mobx-react-router';
7 6
8import { LOCAL_SERVER, LIVE_FERDI_API, LIVE_FRANZ_API } from '../../../config'; 7import { LOCAL_SERVER, LIVE_FERDI_API, LIVE_FRANZ_API } from '../../../config';
@@ -11,7 +10,6 @@ import { workspaceStore } from '../../../features/workspaces';
11import UIStore from '../../../stores/UIStore'; 10import UIStore from '../../../stores/UIStore';
12import SettingsStore from '../../../stores/SettingsStore'; 11import SettingsStore from '../../../stores/SettingsStore';
13import UserStore from '../../../stores/UserStore'; 12import UserStore from '../../../stores/UserStore';
14import { serviceLimitStore } from '../../../features/serviceLimit';
15 13
16const messages = defineMessages({ 14const messages = defineMessages({
17 availableServices: { 15 availableServices: {
@@ -98,8 +96,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
98 96
99 render() { 97 render() {
100 const { serviceCount, workspaceCount, stores } = this.props; 98 const { serviceCount, workspaceCount, stores } = this.props;
101 const { isDarkThemeActive } = stores.ui;
102 const { router, user } = stores;
103 const { intl } = this.context; 99 const { intl } = this.context;
104 const isLoggedIn = Boolean(localStorage.getItem('authToken')); 100 const isLoggedIn = Boolean(localStorage.getItem('authToken'));
105 const isUsingWithoutAccount = stores.settings.app.server === LOCAL_SERVER; 101 const isUsingWithoutAccount = stores.settings.app.server === LOCAL_SERVER;
@@ -124,9 +120,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
124 {' '} 120 {' '}
125 <span className="badge"> 121 <span className="badge">
126 {serviceCount} 122 {serviceCount}
127 {serviceLimitStore.serviceLimit !== 0 && (
128 `/${serviceLimitStore.serviceLimit}`
129 )}
130 </span> 123 </span>
131 </Link> 124 </Link>
132 {workspaceStore.isFeatureEnabled ? ( 125 {workspaceStore.isFeatureEnabled ? (
@@ -138,11 +131,7 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
138 > 131 >
139 {intl.formatMessage(messages.yourWorkspaces)} 132 {intl.formatMessage(messages.yourWorkspaces)}
140 {' '} 133 {' '}
141 {workspaceStore.isPremiumUpgradeRequired ? ( 134 <span className="badge">{workspaceCount}</span>
142 <ProBadge inverted={!isDarkThemeActive && workspaceStore.isSettingsRouteActive} />
143 ) : (
144 <span className="badge">{workspaceCount}</span>
145 )}
146 </Link> 135 </Link>
147 ) : null} 136 ) : null}
148 {!isUsingWithoutAccount && ( 137 {!isUsingWithoutAccount && (
@@ -163,9 +152,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
163 disabled={!isLoggedIn} 152 disabled={!isLoggedIn}
164 > 153 >
165 {intl.formatMessage(messages.team)} 154 {intl.formatMessage(messages.team)}
166 {!user.data.isPremium && (
167 <ProBadge inverted={!isDarkThemeActive && router.location.pathname === '/settings/team'} />
168 )}
169 </Link> 155 </Link>
170 )} 156 )}
171 <Link 157 <Link
diff --git a/src/components/settings/recipes/RecipesDashboard.js b/src/components/settings/recipes/RecipesDashboard.js
index b4e2fc05c..e82324cff 100644
--- a/src/components/settings/recipes/RecipesDashboard.js
+++ b/src/components/settings/recipes/RecipesDashboard.js
@@ -13,8 +13,6 @@ import RecipeItem from './RecipeItem';
13import Loader from '../../ui/Loader'; 13import Loader from '../../ui/Loader';
14import Appear from '../../ui/effects/Appear'; 14import Appear from '../../ui/effects/Appear';
15import { FRANZ_SERVICE_REQUEST } from '../../../config'; 15import { FRANZ_SERVICE_REQUEST } from '../../../config';
16import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
17import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
18import RecipePreview from '../../../models/RecipePreview'; 16import RecipePreview from '../../../models/RecipePreview';
19 17
20const messages = defineMessages({ 18const messages = defineMessages({
@@ -120,7 +118,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
120 openRecipeDirectory: PropTypes.func.isRequired, 118 openRecipeDirectory: PropTypes.func.isRequired,
121 openDevDocs: PropTypes.func.isRequired, 119 openDevDocs: PropTypes.func.isRequired,
122 classes: PropTypes.object.isRequired, 120 classes: PropTypes.object.isRequired,
123 isCommunityRecipesIncludedInCurrentPlan: PropTypes.bool.isRequired,
124 }; 121 };
125 122
126 static defaultProps = { 123 static defaultProps = {
@@ -148,7 +145,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
148 openRecipeDirectory, 145 openRecipeDirectory,
149 openDevDocs, 146 openDevDocs,
150 classes, 147 classes,
151 isCommunityRecipesIncludedInCurrentPlan,
152 } = this.props; 148 } = this.props;
153 const { intl } = this.context; 149 const { intl } = this.context;
154 150
@@ -163,7 +159,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
163 <div className="settings__header"> 159 <div className="settings__header">
164 <h1>{intl.formatMessage(messages.headline)}</h1> 160 <h1>{intl.formatMessage(messages.headline)}</h1>
165 </div> 161 </div>
166 <LimitReachedInfobox />
167 <div className="settings__body recipes"> 162 <div className="settings__body recipes">
168 {serviceStatus.length > 0 && serviceStatus.includes('created') && ( 163 {serviceStatus.length > 0 && serviceStatus.includes('created') && (
169 <Appear> 164 <Appear>
@@ -223,9 +218,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
223 <> 218 <>
224 <H2> 219 <H2>
225 {intl.formatMessage(messages.headlineCustomRecipes)} 220 {intl.formatMessage(messages.headlineCustomRecipes)}
226 {!isCommunityRecipesIncludedInCurrentPlan && (
227 <ProBadge className={classes.proBadge} />
228 )}
229 </H2> 221 </H2>
230 <div className={classes.devRecipeIntroContainer}> 222 <div className={classes.devRecipeIntroContainer}>
231 <p> 223 <p>
@@ -251,37 +243,33 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
251 </div> 243 </div>
252 </> 244 </>
253 )} 245 )}
254 <PremiumFeatureContainer 246 {recipeFilter === 'dev' && communityRecipes.length > 0 && (
255 condition={(recipeFilter === 'dev' && communityRecipes.length > 0) && !isCommunityRecipesIncludedInCurrentPlan} 247 <H3>{intl.formatMessage(messages.headlineCommunityRecipes)}</H3>
256 > 248 )}
257 {recipeFilter === 'dev' && communityRecipes.length > 0 && ( 249 <div className="recipes__list">
258 <H3>{intl.formatMessage(messages.headlineCommunityRecipes)}</H3> 250 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && (
259 )} 251 <div className="align-middle settings__empty-state">
260 <div className="recipes__list"> 252 <span className="emoji">
261 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && ( 253 <img src="./assets/images/emoji/dontknow.png" alt="" />
262 <div className="align-middle settings__empty-state"> 254 </span>
263 <span className="emoji">
264 <img src="./assets/images/emoji/dontknow.png" alt="" />
265 </span>
266 255
267 <p className="settings__empty-state-text">{intl.formatMessage(messages.nothingFound)}</p> 256 <p className="settings__empty-state-text">{intl.formatMessage(messages.nothingFound)}</p>
268 257
269 <RecipeItem
270 key={customWebsiteRecipe.id}
271 recipe={customWebsiteRecipe}
272 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })}
273 />
274 </div>
275 )}
276 {communityRecipes.map(recipe => (
277 <RecipeItem 258 <RecipeItem
278 key={recipe.id} 259 key={customWebsiteRecipe.id}
279 recipe={recipe} 260 recipe={customWebsiteRecipe}
280 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })} 261 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })}
281 /> 262 />
282 ))} 263 </div>
283 </div> 264 )}
284 </PremiumFeatureContainer> 265 {communityRecipes.map(recipe => (
266 <RecipeItem
267 key={recipe.id}
268 recipe={recipe}
269 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })}
270 />
271 ))}
272 </div>
285 {recipeFilter === 'dev' && devRecipes.length > 0 && ( 273 {recipeFilter === 'dev' && devRecipes.length > 0 && (
286 <div className={classes.devRecipeList}> 274 <div className={classes.devRecipeList}>
287 <H3>{intl.formatMessage(messages.headlineDevRecipes)}</H3> 275 <H3>{intl.formatMessage(messages.headlineDevRecipes)}</H3>
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 513c75eed..0f7c29de5 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -6,7 +6,6 @@ import { defineMessages, intlShape } from 'react-intl';
6import normalizeUrl from 'normalize-url'; 6import normalizeUrl from 'normalize-url';
7 7
8import Form from '../../../lib/Form'; 8import Form from '../../../lib/Form';
9import User from '../../../models/User';
10import Recipe from '../../../models/Recipe'; 9import Recipe from '../../../models/Recipe';
11import Service from '../../../models/Service'; 10import Service from '../../../models/Service';
12import Tabs, { TabItem } from '../../ui/Tabs'; 11import Tabs, { TabItem } from '../../ui/Tabs';
@@ -17,9 +16,6 @@ import Button from '../../ui/Button';
17import ImageUpload from '../../ui/ImageUpload'; 16import ImageUpload from '../../ui/ImageUpload';
18import Select from '../../ui/Select'; 17import Select from '../../ui/Select';
19 18
20import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
21import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
22import { serviceLimitStore } from '../../../features/serviceLimit';
23import { isMac } from '../../../environment'; 19import { isMac } from '../../../environment';
24import globalMessages from '../../../i18n/globalMessages'; 20import globalMessages from '../../../i18n/globalMessages';
25 21
@@ -80,14 +76,6 @@ const messages = defineMessages({
80 id: 'settings.service.form.customUrlValidationError', 76 id: 'settings.service.form.customUrlValidationError',
81 defaultMessage: '!!!Could not validate custom {name} server.', 77 defaultMessage: '!!!Could not validate custom {name} server.',
82 }, 78 },
83 customUrlPremiumInfo: {
84 id: 'settings.service.form.customUrlPremiumInfo',
85 defaultMessage: '!!!To add self hosted services, you need a Ferdi Premium Supporter Account.',
86 },
87 customUrlUpgradeAccount: {
88 id: 'settings.service.form.customUrlUpgradeAccount',
89 defaultMessage: '!!!Upgrade your account',
90 },
91 indirectMessageInfo: { 79 indirectMessageInfo: {
92 id: 'settings.service.form.indirectMessageInfo', 80 id: 'settings.service.form.indirectMessageInfo',
93 defaultMessage: '!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...', 81 defaultMessage: '!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...',
@@ -149,7 +137,6 @@ export default @observer class EditServiceForm extends Component {
149 137
150 return null; 138 return null;
151 }, 139 },
152 user: PropTypes.instanceOf(User).isRequired,
153 action: PropTypes.string.isRequired, 140 action: PropTypes.string.isRequired,
154 form: PropTypes.instanceOf(Form).isRequired, 141 form: PropTypes.instanceOf(Form).isRequired,
155 onSubmit: PropTypes.func.isRequired, 142 onSubmit: PropTypes.func.isRequired,
@@ -158,8 +145,6 @@ export default @observer class EditServiceForm extends Component {
158 isSaving: PropTypes.bool.isRequired, 145 isSaving: PropTypes.bool.isRequired,
159 isDeleting: PropTypes.bool.isRequired, 146 isDeleting: PropTypes.bool.isRequired,
160 isProxyFeatureEnabled: PropTypes.bool.isRequired, 147 isProxyFeatureEnabled: PropTypes.bool.isRequired,
161 isServiceProxyIncludedInCurrentPlan: PropTypes.bool.isRequired,
162 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
163 isHibernationFeatureActive: PropTypes.bool.isRequired, 148 isHibernationFeatureActive: PropTypes.bool.isRequired,
164 }; 149 };
165 150
@@ -217,15 +202,12 @@ export default @observer class EditServiceForm extends Component {
217 recipe, 202 recipe,
218 service, 203 service,
219 action, 204 action,
220 user,
221 form, 205 form,
222 isSaving, 206 isSaving,
223 isDeleting, 207 isDeleting,
224 onDelete, 208 onDelete,
225 openRecipeFile, 209 openRecipeFile,
226 isProxyFeatureEnabled, 210 isProxyFeatureEnabled,
227 isServiceProxyIncludedInCurrentPlan,
228 isSpellcheckerIncludedInCurrentPlan,
229 isHibernationFeatureActive, 211 isHibernationFeatureActive,
230 } = this.props; 212 } = this.props;
231 const { intl } = this.context; 213 const { intl } = this.context;
@@ -285,7 +267,6 @@ export default @observer class EditServiceForm extends Component {
285 )} 267 )}
286 </span> 268 </span>
287 </div> 269 </div>
288 <LimitReachedInfobox />
289 <div className="settings__body"> 270 <div className="settings__body">
290 <form onSubmit={e => this.submit(e)} id="form"> 271 <form onSubmit={e => this.submit(e)} id="form">
291 <div className="service-name"> 272 <div className="service-name">
@@ -311,24 +292,11 @@ export default @observer class EditServiceForm extends Component {
311 )} 292 )}
312 {recipe.hasCustomUrl && ( 293 {recipe.hasCustomUrl && (
313 <TabItem title={intl.formatMessage(messages.tabOnPremise)}> 294 <TabItem title={intl.formatMessage(messages.tabOnPremise)}>
314 {user.isPremium || recipe.author.find(a => a.email === user.email) ? ( 295 <Input field={form.$('customUrl')} />
315 <> 296 {form.error === 'url-validation-error' && (
316 <Input field={form.$('customUrl')} /> 297 <p className="franz-form__error">
317 {form.error === 'url-validation-error' && ( 298 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })}
318 <p className="franz-form__error"> 299 </p>
319 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })}
320 </p>
321 )}
322 </>
323 ) : (
324 <div className="center premium-info">
325 <p>{intl.formatMessage(messages.customUrlPremiumInfo)}</p>
326 <p>
327 <Link to="/settings/user" className="button">
328 {intl.formatMessage(messages.customUrlUpgradeAccount)}
329 </Link>
330 </p>
331 </div>
332 )} 300 )}
333 </TabItem> 301 </TabItem>
334 )} 302 )}
@@ -403,56 +371,46 @@ export default @observer class EditServiceForm extends Component {
403 </div> 371 </div>
404 372
405 {!isMac && ( 373 {!isMac && (
406 <PremiumFeatureContainer 374 <div className="settings__settings-group">
407 condition={!isSpellcheckerIncludedInCurrentPlan} 375 <Select field={form.$('spellcheckerLanguage')} />
408 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 376 </div>
409 >
410 <div className="settings__settings-group">
411 <Select field={form.$('spellcheckerLanguage')} />
412 </div>
413 </PremiumFeatureContainer>
414 )} 377 )}
415 378
416 {isProxyFeatureEnabled && ( 379 {isProxyFeatureEnabled && (
417 <PremiumFeatureContainer 380 <div className="settings__settings-group">
418 condition={!isServiceProxyIncludedInCurrentPlan} 381 <h3>
419 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'proxy' }} 382 {intl.formatMessage(messages.headlineProxy)}
420 > 383 <span className="badge badge--success">beta</span>
421 <div className="settings__settings-group"> 384 </h3>
422 <h3> 385 <Toggle field={form.$('proxy.isEnabled')} />
423 {intl.formatMessage(messages.headlineProxy)} 386 {form.$('proxy.isEnabled').value && (
424 <span className="badge badge--success">beta</span> 387 <>
425 </h3> 388 <div className="grid">
426 <Toggle field={form.$('proxy.isEnabled')} /> 389 <div className="grid__row">
427 {form.$('proxy.isEnabled').value && ( 390 <Input field={form.$('proxy.host')} className="proxyHost" />
428 <> 391 <Input field={form.$('proxy.port')} />
429 <div className="grid">
430 <div className="grid__row">
431 <Input field={form.$('proxy.host')} className="proxyHost" />
432 <Input field={form.$('proxy.port')} />
433 </div>
434 </div> 392 </div>
435 <div className="grid"> 393 </div>
436 <div className="grid__row"> 394 <div className="grid">
437 <Input field={form.$('proxy.user')} /> 395 <div className="grid__row">
438 <Input 396 <Input field={form.$('proxy.user')} />
439 field={form.$('proxy.password')} 397 <Input
440 showPasswordToggle 398 field={form.$('proxy.password')}
441 /> 399 showPasswordToggle
442 </div> 400 />
443 </div> 401 </div>
444 <p> 402 </div>
445 <span className="mdi mdi-information" /> 403 <p>
446 {intl.formatMessage(messages.proxyRestartInfo)} 404 <span className="mdi mdi-information" />
447 </p> 405 {intl.formatMessage(messages.proxyRestartInfo)}
448 <p> 406 </p>
449 <span className="mdi mdi-information" /> 407 <p>
450 {intl.formatMessage(messages.proxyInfo)} 408 <span className="mdi mdi-information" />
451 </p> 409 {intl.formatMessage(messages.proxyInfo)}
452 </> 410 </p>
453 )} 411 </>
454 </div> 412 )}
455 </PremiumFeatureContainer> 413 </div>
456 )} 414 )}
457 415
458 <div className="user-agent"> 416 <div className="user-agent">
@@ -512,7 +470,7 @@ export default @observer class EditServiceForm extends Component {
512 type="submit" 470 type="submit"
513 label={intl.formatMessage(messages.saveService)} 471 label={intl.formatMessage(messages.saveService)}
514 htmlForm="form" 472 htmlForm="form"
515 disabled={action !== 'edit' && ((form.isPristine && requiresUserInput) || serviceLimitStore.userHasReachedServiceLimit)} 473 disabled={action !== 'edit' && (form.isPristine && requiresUserInput)}
516 /> 474 />
517 )} 475 )}
518 </div> 476 </div>
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index a0f05fd20..a05af5da0 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -10,7 +10,6 @@ import Loader from '../../ui/Loader';
10import FAB from '../../ui/FAB'; 10import FAB from '../../ui/FAB';
11import ServiceItem from './ServiceItem'; 11import ServiceItem from './ServiceItem';
12import Appear from '../../ui/effects/Appear'; 12import Appear from '../../ui/effects/Appear';
13import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
14 13
15const messages = defineMessages({ 14const messages = defineMessages({
16 headline: { 15 headline: {
@@ -93,7 +92,6 @@ export default @observer class ServicesDashboard extends Component {
93 <div className="settings__header"> 92 <div className="settings__header">
94 <h1>{intl.formatMessage(messages.headline)}</h1> 93 <h1>{intl.formatMessage(messages.headline)}</h1>
95 </div> 94 </div>
96 <LimitReachedInfobox />
97 <div className="settings__body"> 95 <div className="settings__body">
98 {(services.length !== 0 || searchNeedle) && !isLoading && ( 96 {(services.length !== 0 || searchNeedle) && !isLoading && (
99 <SearchInput 97 <SearchInput
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 52b26d65b..a8ba8748d 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -10,7 +10,6 @@ import Button from '../../ui/Button';
10import Toggle from '../../ui/Toggle'; 10import Toggle from '../../ui/Toggle';
11import ToggleRaw from '../../ui/ToggleRaw'; 11import ToggleRaw from '../../ui/ToggleRaw';
12import Select from '../../ui/Select'; 12import Select from '../../ui/Select';
13import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
14import Input from '../../ui/Input'; 13import Input from '../../ui/Input';
15 14
16import { 15import {
@@ -168,7 +167,6 @@ export default @observer class EditSettingsForm extends Component {
168 isClearingAllCache: PropTypes.bool.isRequired, 167 isClearingAllCache: PropTypes.bool.isRequired,
169 onClearAllCache: PropTypes.func.isRequired, 168 onClearAllCache: PropTypes.func.isRequired,
170 getCacheSize: PropTypes.func.isRequired, 169 getCacheSize: PropTypes.func.isRequired,
171 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
172 isTodosEnabled: PropTypes.bool.isRequired, 170 isTodosEnabled: PropTypes.bool.isRequired,
173 isTodosActivated: PropTypes.bool.isRequired, 171 isTodosActivated: PropTypes.bool.isRequired,
174 isWorkspaceEnabled: PropTypes.bool.isRequired, 172 isWorkspaceEnabled: PropTypes.bool.isRequired,
@@ -224,7 +222,6 @@ export default @observer class EditSettingsForm extends Component {
224 isClearingAllCache, 222 isClearingAllCache,
225 onClearAllCache, 223 onClearAllCache,
226 getCacheSize, 224 getCacheSize,
227 isSpellcheckerIncludedInCurrentPlan,
228 isTodosEnabled, 225 isTodosEnabled,
229 isWorkspaceEnabled, 226 isWorkspaceEnabled,
230 automaticUpdates, 227 automaticUpdates,
@@ -564,22 +561,16 @@ export default @observer class EditSettingsForm extends Component {
564 561
565 <Hr /> 562 <Hr />
566 563
567 <PremiumFeatureContainer 564 <Toggle
568 condition={!isSpellcheckerIncludedInCurrentPlan} 565 field={form.$('enableSpellchecking')}
569 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 566 />
570 > 567 {!isMac && form.$('enableSpellchecking').value && (
571 <> 568 <Select field={form.$('spellcheckerLanguage')} />
572 <Toggle 569 )}
573 field={form.$('enableSpellchecking')} 570 {isMac && form.$('enableSpellchecking').value && (
574 /> 571 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p>
575 {!isMac && form.$('enableSpellchecking').value && ( 572 )}
576 <Select field={form.$('spellcheckerLanguage')} /> 573
577 )}
578 {isMac && form.$('enableSpellchecking').value && (
579 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p>
580 )}
581 </>
582 </PremiumFeatureContainer>
583 <a 574 <a
584 href={FRANZ_TRANSLATION} 575 href={FRANZ_TRANSLATION}
585 target="_blank" 576 target="_blank"
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index 602d6e490..437225058 100644
--- a/src/components/settings/team/TeamDashboard.js
+++ b/src/components/settings/team/TeamDashboard.js
@@ -6,12 +6,9 @@ import ReactTooltip from 'react-tooltip';
6import injectSheet from 'react-jss'; 6import injectSheet from 'react-jss';
7import classnames from 'classnames'; 7import classnames from 'classnames';
8 8
9import { Badge } from '@meetfranz/ui';
10import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
11import Button from '../../ui/Button'; 10import Button from '../../ui/Button';
12import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
13import globalMessages from '../../../i18n/globalMessages';
14import UpgradeButton from '../../ui/UpgradeButton';
15import { LIVE_FRANZ_API } from '../../../config'; 12import { LIVE_FRANZ_API } from '../../../config';
16 13
17const messages = defineMessages({ 14const messages = defineMessages({
@@ -35,10 +32,6 @@ const messages = defineMessages({
35 id: 'settings.team.manageAction', 32 id: 'settings.team.manageAction',
36 defaultMessage: '!!!Manage your Team on meetfranz.com', 33 defaultMessage: '!!!Manage your Team on meetfranz.com',
37 }, 34 },
38 upgradeButton: {
39 id: 'settings.team.upgradeAction',
40 defaultMessage: '!!!Upgrade your Account',
41 },
42 teamsUnavailable: { 35 teamsUnavailable: {
43 id: 'settings.team.teamsUnavailable', 36 id: 'settings.team.teamsUnavailable',
44 defaultMessage: '!!!Teams are unavailable', 37 defaultMessage: '!!!Teams are unavailable',
@@ -88,10 +81,6 @@ const styles = {
88 headlineWithSpacing: { 81 headlineWithSpacing: {
89 marginBottom: 'inherit', 82 marginBottom: 'inherit',
90 }, 83 },
91 proRequired: {
92 margin: [10, 0, 40],
93 height: 'auto',
94 },
95 buttonContainer: { 84 buttonContainer: {
96 display: 'flex', 85 display: 'flex',
97 height: 'auto', 86 height: 'auto',
@@ -105,7 +94,6 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
105 retryUserInfoRequest: PropTypes.func.isRequired, 94 retryUserInfoRequest: PropTypes.func.isRequired,
106 openTeamManagement: PropTypes.func.isRequired, 95 openTeamManagement: PropTypes.func.isRequired,
107 classes: PropTypes.object.isRequired, 96 classes: PropTypes.object.isRequired,
108 isProUser: PropTypes.bool.isRequired,
109 server: PropTypes.string.isRequired, 97 server: PropTypes.string.isRequired,
110 }; 98 };
111 99
@@ -119,7 +107,6 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
119 userInfoRequestFailed, 107 userInfoRequestFailed,
120 retryUserInfoRequest, 108 retryUserInfoRequest,
121 openTeamManagement, 109 openTeamManagement,
122 isProUser,
123 classes, 110 classes,
124 server, 111 server,
125 } = this.props; 112 } = this.props;
@@ -157,37 +144,25 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
157 <> 144 <>
158 <h1 className={classnames({ 145 <h1 className={classnames({
159 [classes.headline]: true, 146 [classes.headline]: true,
160 [classes.headlineWithSpacing]: isProUser, 147 [classes.headlineWithSpacing]: true,
161 })} 148 })}
162 > 149 >
163 {intl.formatMessage(messages.contentHeadline)} 150 {intl.formatMessage(messages.contentHeadline)}
164 151
165 </h1> 152 </h1>
166 {!isProUser && (
167 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
168 )}
169 <div className={classes.container}> 153 <div className={classes.container}>
170 <div className={classes.content}> 154 <div className={classes.content}>
171 <p>{intl.formatMessage(messages.intro)}</p> 155 <p>{intl.formatMessage(messages.intro)}</p>
172 <p>{intl.formatMessage(messages.copy)}</p> 156 <p>{intl.formatMessage(messages.copy)}</p>
173 </div> 157 </div>
174 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" /> 158 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Ferdi for Teams" />
175 </div> 159 </div>
176 <div className={classes.buttonContainer}> 160 <div className={classes.buttonContainer}>
177 {!isProUser ? ( 161 <Button
178 <UpgradeButton 162 label={intl.formatMessage(messages.manageButton)}
179 className={classes.cta} 163 onClick={openTeamManagement}
180 gaEventInfo={{ category: 'Todos', event: 'upgrade' }} 164 className={classes.cta}
181 requiresPro 165 />
182 short
183 />
184 ) : (
185 <Button
186 label={intl.formatMessage(messages.manageButton)}
187 onClick={openTeamManagement}
188 className={classes.cta}
189 />
190 )}
191 </div> 166 </div>
192 </> 167 </>
193 </> 168 </>
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js
deleted file mode 100644
index ec486e5d0..000000000
--- a/src/components/subscription/SubscriptionForm.js
+++ /dev/null
@@ -1,78 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { H3, H2 } from '@meetfranz/ui';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
11
12const messages = defineMessages({
13 submitButtonLabel: {
14 id: 'subscription.cta.choosePlan',
15 defaultMessage: '!!!Choose your plan',
16 },
17 teaserHeadline: {
18 id: 'settings.account.headlineUpgradeAccount',
19 defaultMessage: '!!!Upgrade your account and get the full Franz experience',
20 },
21 teaserText: {
22 id: 'subscription.teaser.intro',
23 defaultMessage: '!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!',
24 },
25 includedFeatures: {
26 id: 'subscription.teaser.includedFeatures',
27 defaultMessage: '!!!Paid Franz Plans include:',
28 },
29});
30
31const styles = () => ({
32 activateTrialButton: {
33 margin: [40, 'auto', 50],
34 display: 'flex',
35 },
36});
37
38export default @injectSheet(styles) @observer class SubscriptionForm extends Component {
39 static propTypes = {
40 selectPlan: PropTypes.func.isRequired,
41 isActivatingTrial: PropTypes.bool.isRequired,
42 classes: PropTypes.object.isRequired,
43 };
44
45 static contextTypes = {
46 intl: intlShape,
47 };
48
49 render() {
50 const {
51 isActivatingTrial,
52 selectPlan,
53 classes,
54 } = this.props;
55 const { intl } = this.context;
56
57 return (
58 <>
59 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
60 <p>{intl.formatMessage(messages.teaserText)}</p>
61 <Button
62 label={intl.formatMessage(messages.submitButtonLabel)}
63 className={classes.activateTrialButton}
64 busy={isActivatingTrial}
65 onClick={selectPlan}
66 />
67 <div className="subscription__premium-info">
68 <H3>
69 {intl.formatMessage(messages.includedFeatures)}
70 </H3>
71 <div className="subscription">
72 <FeatureList />
73 </div>
74 </div>
75 </>
76 );
77 }
78}
diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js
deleted file mode 100644
index 0df43fd4b..000000000
--- a/src/components/subscription/SubscriptionPopup.js
+++ /dev/null
@@ -1,84 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import Webview from 'react-electron-web-view';
6import ms from 'ms';
7
8import Button from '../ui/Button';
9
10const messages = defineMessages({
11 buttonCancel: {
12 id: 'subscriptionPopup.buttonCancel',
13 defaultMessage: '!!!Cancel',
14 },
15 buttonDone: {
16 id: 'subscriptionPopup.buttonDone',
17 defaultMessage: '!!!Done',
18 },
19});
20
21export default @observer class SubscriptionPopup extends Component {
22 static propTypes = {
23 url: PropTypes.string.isRequired,
24 closeWindow: PropTypes.func.isRequired,
25 completeCheck: PropTypes.func.isRequired,
26 isCompleted: PropTypes.bool.isRequired,
27 };
28
29 static contextTypes = {
30 intl: intlShape,
31 };
32
33 state = {
34 isFakeLoading: false,
35 };
36
37 // We delay the window closing a bit in order to give
38 // the Recurly webhook a few seconds to do it's magic
39 delayedCloseWindow() {
40 this.setState({
41 isFakeLoading: true,
42 });
43
44 setTimeout(() => {
45 this.props.closeWindow();
46 }, ms('1s'));
47 }
48
49 render() {
50 const {
51 url, closeWindow, completeCheck, isCompleted,
52 } = this.props;
53 const { intl } = this.context;
54
55 return (
56 <div className="subscription-popup">
57 <div className="subscription-popup__content">
58 <Webview
59 className="subscription-popup__webview"
60 autosize
61 allowpopups
62 src={encodeURI(url)}
63 onDidNavigate={completeCheck}
64 onDidNavigateInPage={completeCheck}
65 />
66 </div>
67 <div className="subscription-popup__toolbar franz-form">
68 <Button
69 label={intl.formatMessage(messages.buttonCancel)}
70 buttonType="secondary"
71 onClick={closeWindow}
72 disabled={isCompleted}
73 />
74 <Button
75 label={intl.formatMessage(messages.buttonDone)}
76 onClick={() => this.delayedCloseWindow()}
77 disabled={!isCompleted}
78 loaded={!this.state.isFakeLoading}
79 />
80 </div>
81 </div>
82 );
83 }
84}
diff --git a/src/components/subscription/TrialForm.js b/src/components/subscription/TrialForm.js
deleted file mode 100644
index d61b779ed..000000000
--- a/src/components/subscription/TrialForm.js
+++ /dev/null
@@ -1,115 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { H3, H2 } from '@meetfranz/ui';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
11import { FeatureItem } from '../ui/FeatureItem';
12
13const messages = defineMessages({
14 submitButtonLabel: {
15 id: 'subscription.cta.activateTrial',
16 defaultMessage: '!!!Yes, start the free Franz Professional trial',
17 },
18 allOptionsButton: {
19 id: 'subscription.cta.allOptions',
20 defaultMessage: '!!!See all options',
21 },
22 teaserHeadline: {
23 id: 'settings.account.headlineTrialUpgrade',
24 defaultMessage: '!!!Get the free 14 day Franz Professional Trial',
25 },
26 includedFeatures: {
27 id: 'subscription.includedProFeatures',
28 defaultMessage: '!!!The Franz Professional Plan includes:',
29 },
30 noStringsAttachedHeadline: {
31 id: 'pricing.trial.terms.headline',
32 defaultMessage: '!!!No strings attached',
33 },
34 noCreditCard: {
35 id: 'pricing.trial.terms.noCreditCard',
36 defaultMessage: '!!!No credit card required',
37 },
38 automaticTrialEnd: {
39 id: 'pricing.trial.terms.automaticTrialEnd',
40 defaultMessage: '!!!Your free trial ends automatically after 14 days',
41 },
42});
43
44const styles = theme => ({
45 activateTrialButton: {
46 margin: [40, 'auto', 10],
47 display: 'flex',
48 },
49 allOptionsButton: {
50 margin: [0, 0, 40],
51 background: 'none',
52 border: 'none',
53 color: theme.colorText,
54 },
55 keyTerms: {
56 marginTop: 20,
57 },
58});
59
60export default @injectSheet(styles) @observer class TrialForm extends Component {
61 static propTypes = {
62 activateTrial: PropTypes.func.isRequired,
63 isActivatingTrial: PropTypes.bool.isRequired,
64 showAllOptions: PropTypes.func.isRequired,
65 classes: PropTypes.object.isRequired,
66 };
67
68 static contextTypes = {
69 intl: intlShape,
70 };
71
72 render() {
73 const {
74 isActivatingTrial,
75 activateTrial,
76 showAllOptions,
77 classes,
78 } = this.props;
79 const { intl } = this.context;
80
81 return (
82 <>
83 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
84 <H3 className={classes.keyTerms}>
85 {intl.formatMessage(messages.noStringsAttachedHeadline)}
86 </H3>
87 <ul>
88 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
89 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
90 </ul>
91
92 <Button
93 label={intl.formatMessage(messages.submitButtonLabel)}
94 className={classes.activateTrialButton}
95 busy={isActivatingTrial}
96 onClick={activateTrial}
97 />
98 <Button
99 label={intl.formatMessage(messages.allOptionsButton)}
100 className={classes.allOptionsButton}
101 onClick={showAllOptions}
102 stretch
103 />
104 <div className="subscription__premium-info">
105 <H3>
106 {intl.formatMessage(messages.includedFeatures)}
107 </H3>
108 <div className="subscription">
109 <FeatureList />
110 </div>
111 </div>
112 </>
113 );
114 }
115}
diff --git a/src/components/ui/ActivateTrialButton/index.js b/src/components/ui/ActivateTrialButton/index.js
deleted file mode 100644
index 8f4d21f64..000000000
--- a/src/components/ui/ActivateTrialButton/index.js
+++ /dev/null
@@ -1,107 +0,0 @@
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';
8
9import UserStore from '../../../stores/UserStore';
10import UIStore from '../../../stores/UIStore';
11
12const messages = defineMessages({
13 action: {
14 id: 'feature.delayApp.upgrade.action',
15 defaultMessage: '!!!Get a Franz Supporter License',
16 },
17 actionTrial: {
18 id: 'feature.delayApp.trial.action',
19 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
20 },
21 shortAction: {
22 id: 'feature.delayApp.upgrade.actionShort',
23 defaultMessage: '!!!Upgrade account',
24 },
25 shortActionTrial: {
26 id: 'feature.delayApp.trial.actionShort',
27 defaultMessage: '!!!Activate the free Franz Professional trial',
28 },
29 noStringsAttachedHeadline: {
30 id: 'pricing.trial.terms.headline',
31 defaultMessage: '!!!No strings attached',
32 },
33 noCreditCard: {
34 id: 'pricing.trial.terms.noCreditCard',
35 defaultMessage: '!!!No credit card required',
36 },
37 automaticTrialEnd: {
38 id: 'pricing.trial.terms.automaticTrialEnd',
39 defaultMessage: '!!!Your free trial ends automatically after 14 days',
40 },
41});
42
43@inject('stores', 'actions') @observer
44class ActivateTrialButton extends Component {
45 static propTypes = {
46 className: PropTypes.string,
47 short: PropTypes.bool,
48 gaEventInfo: PropTypes.shape({
49 category: PropTypes.string.isRequired,
50 event: PropTypes.string.isRequired,
51 label: PropTypes.string,
52 }),
53 };
54
55 static defaultProps = {
56 className: '',
57 short: false,
58 gaEventInfo: null,
59 }
60
61 static contextTypes = {
62 intl: intlShape,
63 };
64
65 handleCTAClick() {
66 const { actions } = this.props;
67
68 actions.ui.openSettings({ path: 'user' });
69 }
70
71 render() {
72 const { stores, className, short } = this.props;
73 const { intl } = this.context;
74
75 const { hadSubscription } = stores.user.data;
76
77 let label;
78 if (hadSubscription) {
79 label = short ? messages.shortAction : messages.action;
80 } else {
81 label = short ? messages.shortActionTrial : messages.actionTrial;
82 }
83
84 return (
85 <Button
86 label={intl.formatMessage(label)}
87 className={classnames({
88 [className]: className,
89 })}
90 buttonType="inverted"
91 onClick={this.handleCTAClick.bind(this)}
92 busy={stores.user.activateTrialRequest.isExecuting}
93 />
94 );
95 }
96}
97
98export default ActivateTrialButton;
99
100ActivateTrialButton.wrappedComponent.propTypes = {
101 stores: PropTypes.shape({
102 user: PropTypes.instanceOf(UserStore).isRequired,
103 }).isRequired,
104 actions: PropTypes.shape({
105 ui: PropTypes.instanceOf(UIStore).isRequired,
106 }).isRequired,
107};
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js
index 72c799819..ada15244b 100644
--- a/src/components/ui/FeatureList.js
+++ b/src/components/ui/FeatureList.js
@@ -3,12 +3,11 @@ import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
4 4
5import { FeatureItem } from './FeatureItem'; 5import { FeatureItem } from './FeatureItem';
6import { PLANS } from '../../config';
7 6
8const messages = defineMessages({ 7const messages = defineMessages({
9 availableRecipes: { 8 availableRecipes: {
10 id: 'pricing.features.recipes', 9 id: 'pricing.features.recipes',
11 defaultMessage: '!!!Choose from more than 70 Services', 10 defaultMessage: '!!!Choose from more than 70 Services', // TODO: Make this dynamic
12 }, 11 },
13 accountSync: { 12 accountSync: {
14 id: 'pricing.features.accountSync', 13 id: 'pricing.features.accountSync',
@@ -22,14 +21,6 @@ const messages = defineMessages({
22 id: 'pricing.features.unlimitedServices', 21 id: 'pricing.features.unlimitedServices',
23 defaultMessage: '!!!Add unlimited services', 22 defaultMessage: '!!!Add unlimited services',
24 }, 23 },
25 upToThreeServices: {
26 id: 'pricing.features.upToThreeServices',
27 defaultMessage: '!!!Add up to 3 services',
28 },
29 upToSixServices: {
30 id: 'pricing.features.upToSixServices',
31 defaultMessage: '!!!Add up to 6 services',
32 },
33 spellchecker: { 24 spellchecker: {
34 id: 'pricing.features.spellchecker', 25 id: 'pricing.features.spellchecker',
35 defaultMessage: '!!!Spellchecker support', 26 defaultMessage: '!!!Spellchecker support',
@@ -58,31 +49,17 @@ const messages = defineMessages({
58 id: 'pricing.features.teamManagement', 49 id: 'pricing.features.teamManagement',
59 defaultMessage: '!!!Team Management', 50 defaultMessage: '!!!Team Management',
60 }, 51 },
61 appDelays: {
62 id: 'pricing.features.appDelays',
63 defaultMessage: '!!!No Waiting Screens',
64 },
65 adFree: {
66 id: 'pricing.features.adFree',
67 defaultMessage: '!!!Forever ad-free',
68 },
69 appDelayEnabled: {
70 id: 'pricing.features.appDelaysEnabled',
71 defaultMessage: '!!!Occasional Waiting Screens',
72 },
73}); 52});
74 53
75export class FeatureList extends Component { 54export class FeatureList extends Component {
76 static propTypes = { 55 static propTypes = {
77 className: PropTypes.string, 56 className: PropTypes.string,
78 featureClassName: PropTypes.string, 57 featureClassName: PropTypes.string,
79 plan: PropTypes.oneOf(Object.keys(PLANS)),
80 }; 58 };
81 59
82 static defaultProps = { 60 static defaultProps = {
83 className: '', 61 className: '',
84 featureClassName: '', 62 featureClassName: '',
85 plan: false,
86 } 63 }
87 64
88 static contextTypes = { 65 static contextTypes = {
@@ -93,49 +70,25 @@ export class FeatureList extends Component {
93 const { 70 const {
94 className, 71 className,
95 featureClassName, 72 featureClassName,
96 plan,
97 } = this.props; 73 } = this.props;
98 const { intl } = this.context; 74 const { intl } = this.context;
99 75
100 const features = []; 76 const features = [
101 if (plan === PLANS.FREE) { 77 messages.availableRecipes,
102 features.push( 78 messages.accountSync,
103 messages.appDelayEnabled, 79 messages.desktopNotifications,
104 messages.upToThreeServices, 80
105 messages.availableRecipes, 81 messages.spellchecker,
106 messages.accountSync, 82
107 messages.desktopNotifications, 83 messages.workspaces,
108 ); 84 messages.customWebsites,
109 } else if (plan === PLANS.PERSONAL) { 85 messages.thirdPartyServices,
110 features.push( 86
111 messages.upToSixServices, 87 messages.unlimitedServices,
112 messages.spellchecker, 88 messages.onPremise,
113 messages.appDelays, 89 messages.serviceProxies,
114 messages.adFree, 90 messages.teamManagement,
115 ); 91 ];
116 } else if (plan === PLANS.PRO) {
117 features.push(
118 messages.unlimitedServices,
119 messages.workspaces,
120 messages.customWebsites,
121 // messages.onPremise,
122 messages.thirdPartyServices,
123 // messages.serviceProxies,
124 );
125 } else {
126 features.push(
127 messages.unlimitedServices,
128 messages.spellchecker,
129 messages.workspaces,
130 messages.customWebsites,
131 messages.onPremise,
132 messages.thirdPartyServices,
133 messages.serviceProxies,
134 messages.teamManagement,
135 messages.appDelays,
136 messages.adFree,
137 );
138 }
139 92
140 return ( 93 return (
141 <ul className={className}> 94 <ul className={className}>
diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js
deleted file mode 100644
index 1e100f9d8..000000000
--- a/src/components/ui/PremiumFeatureContainer/index.js
+++ /dev/null
@@ -1,101 +0,0 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { oneOrManyChildElements } from '../../../prop-types';
8
9import UserStore from '../../../stores/UserStore';
10
11import styles from './styles';
12import FeaturesStore from '../../../stores/FeaturesStore';
13import UIStore from '../../../stores/UIStore';
14
15const messages = defineMessages({
16 action: {
17 id: 'premiumFeature.button.upgradeAccount',
18 defaultMessage: '!!!Upgrade account',
19 },
20});
21
22@inject('stores', 'actions') @injectSheet(styles) @observer
23class PremiumFeatureContainer extends Component {
24 static propTypes = {
25 classes: PropTypes.object.isRequired,
26 condition: PropTypes.oneOfType([
27 PropTypes.bool,
28 PropTypes.func,
29 ]),
30 gaEventInfo: PropTypes.shape({
31 category: PropTypes.string.isRequired,
32 event: PropTypes.string.isRequired,
33 label: PropTypes.string,
34 }),
35 };
36
37 static defaultProps = {
38 condition: null,
39 gaEventInfo: null,
40 };
41
42 static contextTypes = {
43 intl: intlShape,
44 };
45
46 render() {
47 const {
48 classes,
49 children,
50 actions,
51 condition,
52 stores,
53 } = this.props;
54
55 const { intl } = this.context;
56
57 let showWrapper = !!condition;
58
59 if (condition === null) {
60 showWrapper = !stores.user.data.isPremium;
61 } else if (typeof condition === 'function') {
62 showWrapper = condition({
63 isPremium: stores.user.data.isPremium,
64 features: stores.features.features,
65 });
66 }
67
68 return showWrapper ? (
69 <div className={classes.container}>
70 <div className={classes.titleContainer}>
71 <p className={classes.title}>Premium Feature</p>
72 <button
73 className={classes.actionButton}
74 type="button"
75 onClick={() => {
76 actions.ui.openSettings({ path: 'user' });
77 }}
78 >
79 {intl.formatMessage(messages.action)}
80 </button>
81 </div>
82 <div className={classes.content}>
83 {children}
84 </div>
85 </div>
86 ) : children;
87 }
88}
89
90PremiumFeatureContainer.wrappedComponent.propTypes = {
91 children: oneOrManyChildElements.isRequired,
92 stores: PropTypes.shape({
93 user: PropTypes.instanceOf(UserStore).isRequired,
94 features: PropTypes.instanceOf(FeaturesStore).isRequired,
95 }).isRequired,
96 actions: PropTypes.shape({
97 ui: PropTypes.instanceOf(UIStore).isRequired,
98 }).isRequired,
99};
100
101export default PremiumFeatureContainer;
diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js
deleted file mode 100644
index 41881e044..000000000
--- a/src/components/ui/PremiumFeatureContainer/styles.js
+++ /dev/null
@@ -1,34 +0,0 @@
1export default theme => ({
2 container: {
3 background: theme.colorSubscriptionContainerBackground,
4 border: theme.colorSubscriptionContainerBorder,
5 margin: [0, 0, 20, -20],
6 padding: 20,
7 'border-radius': theme.borderRadius,
8 pointerEvents: 'none',
9 height: 'auto',
10 },
11 titleContainer: {
12 display: 'flex',
13 },
14 title: {
15 'font-weight': 'bold',
16 color: theme.colorSubscriptionContainerTitle,
17 },
18 actionButton: {
19 background: theme.colorSubscriptionContainerActionButtonBackground,
20 color: theme.colorSubscriptionContainerActionButtonColor,
21 'margin-left': 'auto',
22 'border-radius': theme.borderRadiusSmall,
23 padding: [4, 8],
24 'font-size': 12,
25 pointerEvents: 'initial',
26 },
27 content: {
28 opacity: 0.5,
29 'margin-top': 20,
30 '& > :last-child': {
31 'margin-bottom': 0,
32 },
33 },
34});
diff --git a/src/components/ui/UpgradeButton/index.js b/src/components/ui/UpgradeButton/index.js
deleted file mode 100644
index eade46cfd..000000000
--- a/src/components/ui/UpgradeButton/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { Button } from '@meetfranz/forms';
7
8import UserStore from '../../../stores/UserStore';
9import ActivateTrialButton from '../ActivateTrialButton';
10import UIStore from '../../../stores/UIStore';
11
12const messages = defineMessages({
13 upgradeToPro: {
14 id: 'global.upgradeButton.upgradeToPro',
15 defaultMessage: '!!!Upgrade to Franz Professional',
16 },
17});
18
19@inject('stores', 'actions') @observer
20class UpgradeButton extends Component {
21 static propTypes = {
22 // eslint-disable-next-line
23 classes: PropTypes.object.isRequired,
24 className: PropTypes.string,
25 gaEventInfo: PropTypes.shape({
26 category: PropTypes.string.isRequired,
27 event: PropTypes.string.isRequired,
28 label: PropTypes.string,
29 }),
30 requiresPro: PropTypes.bool,
31 };
32
33 static defaultProps = {
34 className: '',
35 gaEventInfo: null,
36 requiresPro: false,
37 }
38
39 static contextTypes = {
40 intl: intlShape,
41 };
42
43 handleCTAClick() {
44 const { actions } = this.props;
45
46 actions.ui.openSettings({ path: 'user' });
47 }
48
49 render() {
50 const { stores, requiresPro } = this.props;
51 const { intl } = this.context;
52
53 const { isPremium, isPersonal } = stores.user;
54
55 if (isPremium && isPersonal && requiresPro) {
56 return (
57 <Button
58 label={intl.formatMessage(messages.upgradeToPro)}
59 onClick={this.handleCTAClick.bind(this)}
60 className={this.props.className}
61 buttonType="inverted"
62 />
63 );
64 }
65
66 if (!isPremium) {
67 return <ActivateTrialButton {...this.props} />;
68 }
69
70 return null;
71 }
72}
73
74export default UpgradeButton;
75
76UpgradeButton.wrappedComponent.propTypes = {
77 stores: PropTypes.shape({
78 user: PropTypes.instanceOf(UserStore).isRequired,
79 }).isRequired,
80 actions: PropTypes.shape({
81 ui: PropTypes.instanceOf(UIStore).isRequired,
82 }).isRequired,
83};
diff --git a/src/config.js b/src/config.js
index 7762a8cae..24888e518 100644
--- a/src/config.js
+++ b/src/config.js
@@ -120,18 +120,9 @@ export const ICON_SIZES = {
120export const iconSizeBias = 20; 120export const iconSizeBias = 20;
121 121
122export const DEFAULT_FEATURES_CONFIG = { 122export const DEFAULT_FEATURES_CONFIG = {
123 isSpellcheckerIncludedInCurrentPlan: true,
124 needToWaitToProceed: false,
125 needToWaitToProceedConfig: {
126 delayOffset: ms('1h'),
127 wait: ms('10s'),
128 },
129 isServiceProxyEnabled: false, 123 isServiceProxyEnabled: false,
130 isServiceProxyIncludedInCurrentPlan: true,
131 isAnnouncementsEnabled: true, 124 isAnnouncementsEnabled: true,
132 isWorkspaceIncludedInCurrentPlan: true,
133 isWorkspaceEnabled: false, 125 isWorkspaceEnabled: false,
134 isCommunityRecipesIncludedInCurrentPlan: true,
135}; 126};
136 127
137export const DEFAULT_WINDOW_OPTIONS = { 128export const DEFAULT_WINDOW_OPTIONS = {
@@ -166,28 +157,6 @@ export const ALLOWED_PROTOCOLS = [
166 'ferdi:', 157 'ferdi:',
167]; 158];
168 159
169export const PLANS = {
170 PERSONAL: 'personal',
171 PRO: 'pro',
172 LEGACY: 'legacy',
173 FREE: 'free',
174};
175
176export const PLANS_MAPPING = {
177 'franz-personal-monthly': PLANS.PERSONAL,
178 'franz-personal-yearly': PLANS.PERSONAL,
179 'franz-pro-monthly': PLANS.PRO,
180 'franz-pro-yearly': PLANS.PRO,
181 'franz-supporter-license': PLANS.LEGACY,
182 'franz-supporter-license-x1': PLANS.LEGACY,
183 'franz-supporter-license-x2': PLANS.LEGACY,
184 'franz-supporter-license-year': PLANS.LEGACY,
185 'franz-supporter-license-year-x1': PLANS.LEGACY,
186 'franz-supporter-license-year-x2': PLANS.LEGACY,
187 'franz-supporter-license-year-2019': PLANS.LEGACY,
188 free: PLANS.FREE,
189};
190
191export const DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED = false; 160export const DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED = false;
192 161
193export const DEFAULT_SERVICE_LIMIT = 3; 162export const DEFAULT_SERVICE_LIMIT = 3;
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
deleted file mode 100644
index 97bf1f6be..000000000
--- a/src/containers/auth/PricingScreen.js
+++ /dev/null
@@ -1,83 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { RouterStore } from 'mobx-react-router';
5
6import Pricing from '../../components/auth/Pricing';
7import UserStore from '../../stores/UserStore';
8
9import { globalError as globalErrorPropType } from '../../prop-types';
10import FeaturesStore from '../../stores/FeaturesStore';
11
12export default @inject('stores', 'actions') @observer class PricingScreen extends Component {
13 static propTypes = {
14 error: globalErrorPropType.isRequired,
15 };
16
17 async submit() {
18 const {
19 actions,
20 stores,
21 } = this.props;
22
23 const { activateTrialRequest } = stores.user;
24 const { defaultTrialPlan, canSkipTrial } = stores.features.anonymousFeatures;
25
26 if (!canSkipTrial) {
27 stores.router.push('/');
28 stores.user.hasCompletedSignup = true;
29 } else {
30 actions.user.activateTrial({ planId: defaultTrialPlan });
31 await activateTrialRequest._promise;
32
33 if (!activateTrialRequest.isError) {
34 stores.router.push('/');
35 stores.user.hasCompletedSignup = true;
36 }
37 }
38 }
39
40 render() {
41 const {
42 error,
43 stores,
44 } = this.props;
45
46 const { getUserInfoRequest, activateTrialRequest, data } = stores.user;
47 const { featuresRequest, features } = stores.features;
48
49 const { pricingConfig } = features;
50
51 let currency = '$';
52 let price = 5.99;
53 if (pricingConfig) {
54 ({ currency } = pricingConfig);
55 ({ price } = pricingConfig.plans.pro.yearly);
56 }
57
58 return (
59 <Pricing
60 onSubmit={this.submit.bind(this)}
61 isLoadingRequiredData={(getUserInfoRequest.isExecuting || !getUserInfoRequest.wasExecuted) || (featuresRequest.isExecuting || !featuresRequest.wasExecuted)}
62 isActivatingTrial={activateTrialRequest.isExecuting}
63 trialActivationError={activateTrialRequest.isError}
64 canSkipTrial={features.canSkipTrial}
65 error={error}
66 currency={currency}
67 price={price}
68 name={data.firstname}
69 />
70 );
71 }
72}
73
74PricingScreen.wrappedComponent.propTypes = {
75 actions: PropTypes.shape({
76 user: PropTypes.instanceOf(UserStore).isRequired,
77 }).isRequired,
78 stores: PropTypes.shape({
79 user: PropTypes.instanceOf(UserStore).isRequired,
80 router: PropTypes.instanceOf(RouterStore).isRequired,
81 features: PropTypes.instanceOf(FeaturesStore).isRequired,
82 }).isRequired,
83};
diff --git a/src/containers/auth/SetupAssistantScreen.js b/src/containers/auth/SetupAssistantScreen.js
index 2a8f2c010..eaf3fda8a 100644
--- a/src/containers/auth/SetupAssistantScreen.js
+++ b/src/containers/auth/SetupAssistantScreen.js
@@ -12,6 +12,7 @@ import RecipesStore from '../../stores/RecipesStore';
12import UserStore from '../../stores/UserStore'; 12import UserStore from '../../stores/UserStore';
13 13
14export default @inject('stores', 'actions') @observer class SetupAssistantScreen extends Component { 14export default @inject('stores', 'actions') @observer class SetupAssistantScreen extends Component {
15 // TODO: Why are these hardcoded here? Do they need to conform to specific services in the packaged recipes? If so, its more important to fix this
15 services = { 16 services = {
16 whatsapp: { 17 whatsapp: {
17 name: 'WhatsApp', 18 name: 'WhatsApp',
@@ -56,14 +57,14 @@ export default @inject('stores', 'actions') @observer class SetupAssistantScreen
56 } 57 }
57 58
58 async setupServices(serviceConfig) { 59 async setupServices(serviceConfig) {
59 const { stores: { services, router, user } } = this.props; 60 const { stores: { services } } = this.props;
60 console.log(serviceConfig); 61 console.log(serviceConfig);
61 62
62 this.setState({ 63 this.setState({
63 isSettingUpServices: true, 64 isSettingUpServices: true,
64 }); 65 });
65 66
66 // The store requests are not build for paralell requests so we need to finish one request after another 67 // The store requests are not build for parallel requests so we need to finish one request after another
67 for (const config of serviceConfig) { 68 for (const config of serviceConfig) {
68 const serviceData = { 69 const serviceData = {
69 name: this.services[config.id].name, 70 name: this.services[config.id].name,
@@ -96,10 +97,6 @@ export default @inject('stores', 'actions') @observer class SetupAssistantScreen
96 this.setState({ 97 this.setState({
97 isSettingUpServices: false, 98 isSettingUpServices: false,
98 }); 99 });
99
100 await sleep(100);
101
102 router.push(user.pricingRoute);
103 } 100 }
104 101
105 render() { 102 render() {
diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js
index 42ee09f33..eeab63a0c 100644
--- a/src/containers/auth/SignupScreen.js
+++ b/src/containers/auth/SignupScreen.js
@@ -14,16 +14,7 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends
14 }; 14 };
15 15
16 onSignup(values) { 16 onSignup(values) {
17 const { actions, stores } = this.props; 17 const { actions } = 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 18
28 actions.user.signup(values); 19 actions.user.signup(values);
29 } 20 }
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index 7a12aee83..9cdb20727 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -20,7 +20,6 @@ import Sidebar from '../../components/layout/Sidebar';
20import Services from '../../components/services/content/Services'; 20import Services from '../../components/services/content/Services';
21import AppLoader from '../../components/ui/AppLoader'; 21import AppLoader from '../../components/ui/AppLoader';
22 22
23import { state as delayAppState } from '../../features/delayApp';
24import { workspaceActions } from '../../features/workspaces/actions'; 23import { workspaceActions } from '../../features/workspaces/actions';
25import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; 24import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer';
26import { workspaceStore } from '../../features/workspaces'; 25import { workspaceStore } from '../../features/workspaces';
@@ -94,7 +93,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
94 getServicesForWorkspace={workspace => ( 93 getServicesForWorkspace={workspace => (
95 workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) : services.all.map(s => s.name) 94 workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) : services.all.map(s => s.name)
96 )} 95 )}
97 onUpgradeAccountClick={() => openSettings({ path: 'user' })}
98 /> 96 />
99 ); 97 );
100 98
@@ -131,7 +129,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
131 openSettings={openSettings} 129 openSettings={openSettings}
132 update={updateService} 130 update={updateService}
133 userHasCompletedSignup={user.hasCompletedSignup} 131 userHasCompletedSignup={user.hasCompletedSignup}
134 hasActivatedTrial={user.hasActivatedTrial}
135 isSpellcheckerEnabled={settings.app.enableSpellchecking} 132 isSpellcheckerEnabled={settings.app.enableSpellchecking}
136 /> 133 />
137 ); 134 );
@@ -157,8 +154,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
157 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful} 154 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful}
158 retryRequiredRequests={retryRequiredRequests} 155 retryRequiredRequests={retryRequiredRequests}
159 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 156 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
160 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
161 hasActivatedTrial={user.hasActivatedTrial}
162 > 157 >
163 {React.Children.count(children) > 0 ? children : null} 158 {React.Children.count(children) > 0 ? children : null}
164 </AppLayout> 159 </AppLayout>
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index db3b2a4a7..4ee932895 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -2,7 +2,6 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4 4
5import PaymentStore from '../../stores/PaymentStore';
6import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
7import AppStore from '../../stores/AppStore'; 6import AppStore from '../../stores/AppStore';
8import FeaturesStore from '../../stores/FeaturesStore'; 7import FeaturesStore from '../../stores/FeaturesStore';
@@ -24,10 +23,9 @@ class AccountScreen extends Component {
24 } 23 }
25 24
26 reloadData() { 25 reloadData() {
27 const { user, payment } = this.props.stores; 26 const { user } = this.props.stores;
28 27
29 user.getUserInfoRequest.reload(); 28 user.getUserInfoRequest.reload();
30 payment.plansRequest.reload();
31 } 29 }
32 30
33 handleWebsiteLink(route) { 31 handleWebsiteLink(route) {
@@ -50,26 +48,18 @@ class AccountScreen extends Component {
50 render() { 48 render() {
51 const { 49 const {
52 user, 50 user,
53 payment,
54 features,
55 settings, 51 settings,
56 } = this.props.stores; 52 } = this.props.stores;
57 const { user: userActions, payment: paymentActions } = this.props.actions; 53 const { user: userActions } = this.props.actions;
58 54
59 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting; 55 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting;
60 const isLoadingPlans = payment.plansRequest.isExecuting;
61
62 const { upgradeAccount } = paymentActions;
63 56
64 return ( 57 return (
65 <ErrorBoundary> 58 <ErrorBoundary>
66 <AccountDashboard 59 <AccountDashboard
67 server={settings.all.app.server} 60 server={settings.all.app.server}
68 user={user.data} 61 user={user.data}
69 isPremiumOverrideUser={user.isPremiumOverride}
70 isProUser={user.isPro}
71 isLoading={isLoadingUserInfo} 62 isLoading={isLoadingUserInfo}
72 isLoadingPlans={isLoadingPlans}
73 userInfoRequestFailed={ 63 userInfoRequestFailed={
74 user.getUserInfoRequest.wasExecuted 64 user.getUserInfoRequest.wasExecuted
75 && user.getUserInfoRequest.isError 65 && user.getUserInfoRequest.isError
@@ -83,10 +73,6 @@ class AccountScreen extends Component {
83 && !user.deleteAccountRequest.isError 73 && !user.deleteAccountRequest.isError
84 } 74 }
85 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 75 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
86 upgradeToPro={() => upgradeAccount({
87 planId: features.features.pricingConfig.plans.pro.yearly.id,
88 })}
89 openBilling={() => this.handleWebsiteLink('/user/billing')}
90 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 76 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
91 /> 77 />
92 </ErrorBoundary> 78 </ErrorBoundary>
@@ -98,12 +84,10 @@ AccountScreen.wrappedComponent.propTypes = {
98 stores: PropTypes.shape({ 84 stores: PropTypes.shape({
99 user: PropTypes.instanceOf(UserStore).isRequired, 85 user: PropTypes.instanceOf(UserStore).isRequired,
100 features: PropTypes.instanceOf(FeaturesStore).isRequired, 86 features: PropTypes.instanceOf(FeaturesStore).isRequired,
101 payment: PropTypes.instanceOf(PaymentStore).isRequired,
102 settings: PropTypes.instanceOf(SettingsStore).isRequired, 87 settings: PropTypes.instanceOf(SettingsStore).isRequired,
103 app: PropTypes.instanceOf(AppStore).isRequired, 88 app: PropTypes.instanceOf(AppStore).isRequired,
104 }).isRequired, 89 }).isRequired,
105 actions: PropTypes.shape({ 90 actions: PropTypes.shape({
106 payment: PropTypes.instanceOf(PaymentStore).isRequired,
107 app: PropTypes.instanceOf(AppStore).isRequired, 91 app: PropTypes.instanceOf(AppStore).isRequired,
108 user: PropTypes.instanceOf(UserStore).isRequired, 92 user: PropTypes.instanceOf(UserStore).isRequired,
109 }).isRequired, 93 }).isRequired,
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index ddf2d2d25..e22e91822 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -19,7 +19,6 @@ import { required, url, oneRequired } from '../../helpers/validation-helpers';
19import { getSelectOptions } from '../../helpers/i18n-helpers'; 19import { getSelectOptions } from '../../helpers/i18n-helpers';
20 20
21import { config as proxyFeature } from '../../features/serviceProxy'; 21import { config as proxyFeature } from '../../features/serviceProxy';
22import { config as spellcheckerFeature } from '../../features/spellchecker';
23 22
24import { SPELLCHECKER_LOCALES } from '../../i18n/languages'; 23import { SPELLCHECKER_LOCALES } from '../../i18n/languages';
25 24
@@ -399,8 +398,6 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
399 onDelete={() => this.deleteService()} 398 onDelete={() => this.deleteService()}
400 openRecipeFile={file => this.openRecipeFile(file)} 399 openRecipeFile={file => this.openRecipeFile(file)}
401 isProxyFeatureEnabled={proxyFeature.isEnabled} 400 isProxyFeatureEnabled={proxyFeature.isEnabled}
402 isServiceProxyIncludedInCurrentPlan={proxyFeature.isIncludedInCurrentPlan}
403 isSpellcheckerIncludedInCurrentPlan={spellcheckerFeature.isIncludedInCurrentPlan}
404 isHibernationFeatureActive={settings.app.hibernate} 401 isHibernationFeatureActive={settings.app.hibernate}
405 /> 402 />
406 </ErrorBoundary> 403 </ErrorBoundary>
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index d601e03d4..3b8f03ae4 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -14,7 +14,6 @@ import {
14 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED, DEFAULT_IS_FEATURE_ENABLED_BY_USER, 14 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED, DEFAULT_IS_FEATURE_ENABLED_BY_USER,
15} from '../../config'; 15} from '../../config';
16import { DEFAULT_APP_SETTINGS, isMac } from '../../environment'; 16import { DEFAULT_APP_SETTINGS, isMac } from '../../environment';
17import { config as spellcheckerConfig } from '../../features/spellchecker';
18 17
19import { getSelectOptions } from '../../helpers/i18n-helpers'; 18import { getSelectOptions } from '../../helpers/i18n-helpers';
20import { hash } from '../../helpers/password-helpers'; 19import { hash } from '../../helpers/password-helpers';
@@ -516,8 +515,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
516 }, 515 },
517 enableSpellchecking: { 516 enableSpellchecking: {
518 label: intl.formatMessage(messages.enableSpellchecking), 517 label: intl.formatMessage(messages.enableSpellchecking),
519 value: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : settings.all.app.enableSpellchecking, 518 value: settings.all.app.enableSpellchecking,
520 default: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : DEFAULT_APP_SETTINGS.enableSpellchecking, 519 default: DEFAULT_APP_SETTINGS.enableSpellchecking,
521 }, 520 },
522 spellcheckerLanguage: { 521 spellcheckerLanguage: {
523 label: intl.formatMessage(globalMessages.spellcheckerLanguage), 522 label: intl.formatMessage(globalMessages.spellcheckerLanguage),
@@ -650,7 +649,6 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
650 getCacheSize={() => app.cacheSize} 649 getCacheSize={() => app.cacheSize}
651 isClearingAllCache={isClearingAllCache} 650 isClearingAllCache={isClearingAllCache}
652 onClearAllCache={clearAllCache} 651 onClearAllCache={clearAllCache}
653 isSpellcheckerIncludedInCurrentPlan={spellcheckerConfig.isIncludedInCurrentPlan}
654 isTodosEnabled={todos.isFeatureActive} 652 isTodosEnabled={todos.isFeatureActive}
655 isWorkspaceEnabled={workspaces.isFeatureActive} 653 isWorkspaceEnabled={workspaces.isFeatureActive}
656 lockingFeatureEnabled={lockingFeatureEnabled} 654 lockingFeatureEnabled={lockingFeatureEnabled}
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index f12f67b1f..9a16fd064 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -107,7 +107,6 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
107 recipePreviews, 107 recipePreviews,
108 recipes, 108 recipes,
109 services, 109 services,
110 user,
111 } = this.props.stores; 110 } = this.props.stores;
112 111
113 const { 112 const {
@@ -155,7 +154,6 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
155 customWebsiteRecipe={customWebsiteRecipe} 154 customWebsiteRecipe={customWebsiteRecipe}
156 isLoading={isLoading} 155 isLoading={isLoading}
157 addedServiceCount={services.all.length} 156 addedServiceCount={services.all.length}
158 isPremium={user.data.isPremium}
159 hasLoadedRecipes={recipePreviews.featuredRecipePreviewsRequest.wasExecuted} 157 hasLoadedRecipes={recipePreviews.featuredRecipePreviewsRequest.wasExecuted}
160 showAddServiceInterface={serviceActions.showAddServiceInterface} 158 showAddServiceInterface={serviceActions.showAddServiceInterface}
161 searchRecipes={e => this.searchRecipes(e)} 159 searchRecipes={e => this.searchRecipes(e)}
@@ -171,8 +169,6 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
171 openDevDocs={() => { 169 openDevDocs={() => {
172 appActions.openExternalUrl({ url: FRANZ_DEV_DOCS }); 170 appActions.openExternalUrl({ url: FRANZ_DEV_DOCS });
173 }} 171 }}
174 isCommunityRecipesIncludedInCurrentPlan={communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan}
175 isUserPremiumUser={user.isPremium}
176 /> 172 />
177 </ErrorBoundary> 173 </ErrorBoundary>
178 ); 174 );
diff --git a/src/containers/settings/TeamScreen.js b/src/containers/settings/TeamScreen.js
index a627a047a..10c2e36ef 100644
--- a/src/containers/settings/TeamScreen.js
+++ b/src/containers/settings/TeamScreen.js
@@ -9,7 +9,6 @@ import SettingsStore from '../../stores/SettingsStore';
9import TeamDashboard from '../../components/settings/team/TeamDashboard'; 9import TeamDashboard from '../../components/settings/team/TeamDashboard';
10import ErrorBoundary from '../../components/util/ErrorBoundary'; 10import ErrorBoundary from '../../components/util/ErrorBoundary';
11import { DEV_API_FRANZ_WEBSITE } from '../../config'; 11import { DEV_API_FRANZ_WEBSITE } from '../../config';
12import PaymentStore from '../../stores/PaymentStore';
13 12
14export default @inject('stores', 'actions') @observer class TeamScreen extends Component { 13export default @inject('stores', 'actions') @observer class TeamScreen extends Component {
15 handleWebsiteLink(route) { 14 handleWebsiteLink(route) {
@@ -33,7 +32,6 @@ export default @inject('stores', 'actions') @observer class TeamScreen extends C
33 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 32 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError}
34 retryUserInfoRequest={() => this.reloadData()} 33 retryUserInfoRequest={() => this.reloadData()}
35 openTeamManagement={() => this.handleWebsiteLink('/user/team')} 34 openTeamManagement={() => this.handleWebsiteLink('/user/team')}
36 isProUser={user.isPro}
37 server={server} 35 server={server}
38 /> 36 />
39 </ErrorBoundary> 37 </ErrorBoundary>
@@ -48,7 +46,6 @@ TeamScreen.wrappedComponent.propTypes = {
48 settings: PropTypes.instanceOf(SettingsStore).isRequired, 46 settings: PropTypes.instanceOf(SettingsStore).isRequired,
49 }).isRequired, 47 }).isRequired,
50 actions: PropTypes.shape({ 48 actions: PropTypes.shape({
51 payment: PropTypes.instanceOf(PaymentStore).isRequired,
52 app: PropTypes.instanceOf(AppStore).isRequired, 49 app: PropTypes.instanceOf(AppStore).isRequired,
53 user: PropTypes.instanceOf(UserStore).isRequired, 50 user: PropTypes.instanceOf(UserStore).isRequired,
54 }).isRequired, 51 }).isRequired,
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
deleted file mode 100644
index e5c8207be..000000000
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ /dev/null
@@ -1,99 +0,0 @@
1import React, { Component } from 'react';
2import { BrowserWindow, getCurrentWindow } from '@electron/remote';
3import PropTypes from 'prop-types';
4import { inject, observer } from 'mobx-react';
5
6import PaymentStore from '../../stores/PaymentStore';
7
8import SubscriptionForm from '../../components/subscription/SubscriptionForm';
9import TrialForm from '../../components/subscription/TrialForm';
10import UserStore from '../../stores/UserStore';
11import FeaturesStore from '../../stores/FeaturesStore';
12import AppStore from '../../stores/AppStore';
13
14export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component {
15 static propTypes = {
16 onCloseWindow: PropTypes.func,
17 }
18
19 static defaultProps = {
20 onCloseWindow: () => null,
21 }
22
23 async openBrowser() {
24 const {
25 stores,
26 onCloseWindow,
27 } = this.props;
28
29 const {
30 user,
31 features,
32 } = stores;
33
34 let hostedPageURL = features.features.planSelectionURL;
35 hostedPageURL = user.getAuthURL(hostedPageURL);
36
37 const paymentWindow = new BrowserWindow({
38 parent: getCurrentWindow(),
39 modal: true,
40 title: '🔒 Franz Supporter License',
41 width: 800,
42 height: window.innerHeight - 100,
43 maxWidth: 800,
44 minWidth: 600,
45 webPreferences: {
46 nodeIntegration: true,
47 webviewTag: true,
48 enableRemoteModule: true,
49 contextIsolation: false,
50 },
51 });
52 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`);
53
54 paymentWindow.on('closed', () => {
55 onCloseWindow();
56 });
57 }
58
59 render() {
60 const {
61 actions,
62 stores,
63 } = this.props;
64
65 const { data: user } = stores.user;
66
67 if (user.hadSubscription) {
68 return (
69 <SubscriptionForm
70 plan={stores.payment.plan}
71 selectPlan={() => this.openBrowser()}
72 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
73 />
74 );
75 }
76
77 return (
78 <TrialForm
79 plan={stores.payment.plan}
80 activateTrial={() => actions.user.activateTrial({ planId: stores.features.features.defaultTrialPlan })}
81 showAllOptions={() => this.openBrowser()}
82 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
83 />
84 );
85 }
86}
87
88SubscriptionFormScreen.wrappedComponent.propTypes = {
89 actions: PropTypes.shape({
90 app: PropTypes.instanceOf(AppStore).isRequired,
91 payment: PropTypes.instanceOf(PaymentStore).isRequired,
92 user: PropTypes.instanceOf(UserStore).isRequired,
93 }).isRequired,
94 stores: PropTypes.shape({
95 payment: PropTypes.instanceOf(PaymentStore).isRequired,
96 user: PropTypes.instanceOf(UserStore).isRequired,
97 features: PropTypes.instanceOf(FeaturesStore).isRequired,
98 }).isRequired,
99};
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
deleted file mode 100644
index 43966b6a4..000000000
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ /dev/null
@@ -1,41 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4
5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup';
6import { isDevMode } from '../../environment';
7
8export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component {
9 state = {
10 complete: false,
11 };
12
13 completeCheck(event) {
14 const { url } = event;
15
16 if ((url.includes('recurly') && url.includes('confirmation')) || ((url.includes('meetfranz') || isDevMode) && url.includes('success'))) {
17 this.setState({
18 complete: true,
19 });
20 }
21 }
22
23 render() {
24 return (
25 <SubscriptionPopup
26 url={this.props.router.params.url}
27 closeWindow={() => window.close()}
28 completeCheck={e => this.completeCheck(e)}
29 isCompleted={this.state.complete}
30 />
31 );
32 }
33}
34
35SubscriptionPopupScreen.wrappedComponent.propTypes = {
36 router: PropTypes.shape({
37 params: PropTypes.shape({
38 url: PropTypes.string.isRequired,
39 }).isRequired,
40 }).isRequired,
41};
diff --git a/src/environment.js b/src/environment.js
index 758a33380..e13e5f676 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -120,7 +120,6 @@ export const DEFAULT_APP_SETTINGS = {
120 beta: false, 120 beta: false,
121 isAppMuted: false, 121 isAppMuted: false,
122 enableGPUAcceleration: true, 122 enableGPUAcceleration: true,
123 serviceLimit: 5,
124 123
125 // Ferdi specific options 124 // Ferdi specific options
126 server: LIVE_FERDI_API, 125 server: LIVE_FERDI_API,
diff --git a/src/features/communityRecipes/index.js b/src/features/communityRecipes/index.js
index 39f7e9cd6..828c6d867 100644
--- a/src/features/communityRecipes/index.js
+++ b/src/features/communityRecipes/index.js
@@ -1,26 +1,7 @@
1import { reaction } from 'mobx';
2import { CommunityRecipesStore } from './store'; 1import { CommunityRecipesStore } from './store';
3 2
4const debug = require('debug')('Ferdi:feature:communityRecipes');
5
6export const communityRecipesStore = new CommunityRecipesStore(); 3export const communityRecipesStore = new CommunityRecipesStore();
7 4
8export default function initCommunityRecipes(stores, actions) { 5export default function initCommunityRecipes(stores, actions) {
9 const { features } = stores;
10
11 communityRecipesStore.start(stores, actions); 6 communityRecipesStore.start(stores, actions);
12
13 // Toggle communityRecipe premium status
14 reaction(
15 () => (
16 features.features.isCommunityRecipesIncludedInCurrentPlan
17 ),
18 (isPremiumFeature) => {
19 debug('Community recipes is premium feature: ', isPremiumFeature);
20 communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan = true;
21 },
22 {
23 fireImmediately: true,
24 },
25 );
26} 7}
diff --git a/src/features/communityRecipes/store.js b/src/features/communityRecipes/store.js
index 3a60e5449..acc1e52f6 100644
--- a/src/features/communityRecipes/store.js
+++ b/src/features/communityRecipes/store.js
@@ -1,11 +1,9 @@
1import { computed, observable } from 'mobx'; 1import { computed } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore'; 2import { FeatureStore } from '../utils/FeatureStore';
3 3
4const debug = require('debug')('Ferdi:feature:communityRecipes:store'); 4const debug = require('debug')('Ferdi:feature:communityRecipes:store');
5 5
6export class CommunityRecipesStore extends FeatureStore { 6export class CommunityRecipesStore extends FeatureStore {
7 @observable isCommunityRecipesIncludedInCurrentPlan = true;
8
9 start(stores, actions) { 7 start(stores, actions) {
10 debug('start'); 8 debug('start');
11 this.stores = stores; 9 this.stores = stores;
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
deleted file mode 100644
index 6471240ab..000000000
--- a/src/features/delayApp/Component.js
+++ /dev/null
@@ -1,120 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { Button } from '@meetfranz/forms';
8
9import { config } from './constants';
10import styles from './styles';
11import UserStore from '../../stores/UserStore';
12import UIStore from '../../stores/UIStore';
13import { FeatureStore } from '../utils/FeatureStore';
14
15const messages = defineMessages({
16 headline: {
17 id: 'feature.delayApp.headline',
18 defaultMessage: '!!!Please purchase license to skip waiting',
19 },
20 headlineTrial: {
21 id: 'feature.delayApp.trial.headline',
22 defaultMessage: '!!!Get the free Franz Professional 14 day trial and skip the line',
23 },
24 action: {
25 id: 'feature.delayApp.upgrade.action',
26 defaultMessage: '!!!Upgrade Franz',
27 },
28 actionTrial: {
29 id: 'feature.delayApp.trial.action',
30 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
31 },
32 text: {
33 id: 'feature.delayApp.text',
34 defaultMessage: '!!!Ferdi will continue in {seconds} seconds.',
35 },
36});
37
38export default @inject('stores', 'actions') @injectSheet(styles) @observer class DelayApp extends Component {
39 static propTypes = {
40 // eslint-disable-next-line
41 classes: PropTypes.object.isRequired,
42 };
43
44 static contextTypes = {
45 intl: intlShape,
46 };
47
48 state = {
49 countdown: config.delayDuration,
50 };
51
52 countdownInterval = null;
53
54 countdownIntervalTimeout = 1000;
55
56 componentDidMount() {
57 this.countdownInterval = setInterval(() => {
58 this.setState(prevState => ({
59 countdown: prevState.countdown - this.countdownIntervalTimeout,
60 }));
61
62 if (this.state.countdown <= 0) {
63 // reload();
64 clearInterval(this.countdownInterval);
65 }
66 }, this.countdownIntervalTimeout);
67 }
68
69 componentWillUnmount() {
70 clearInterval(this.countdownInterval);
71 }
72
73 handleCTAClick() {
74 const { actions, stores } = this.props;
75 const { hadSubscription } = stores.user.data;
76 const { defaultTrialPlan } = stores.features.features;
77
78 if (!hadSubscription) {
79 actions.user.activateTrial({ planId: defaultTrialPlan });
80 } else {
81 actions.ui.openSettings({ path: 'user' });
82 }
83 }
84
85 render() {
86 const { classes, stores } = this.props;
87 const { intl } = this.context;
88
89 const { hadSubscription } = stores.user.data;
90
91 return (
92 <div className={`${classes.container}`}>
93 <h1 className={classes.headline}>{intl.formatMessage(hadSubscription ? messages.headline : messages.headlineTrial)}</h1>
94 <Button
95 label={intl.formatMessage(hadSubscription ? messages.action : messages.actionTrial)}
96 className={classes.button}
97 buttonType="inverted"
98 onClick={this.handleCTAClick.bind(this)}
99 busy={stores.user.activateTrialRequest.isExecuting}
100 />
101 <p className="footnote">
102 {intl.formatMessage(messages.text, {
103 seconds: this.state.countdown / 1000,
104 })}
105 </p>
106 </div>
107 );
108 }
109}
110
111DelayApp.wrappedComponent.propTypes = {
112 stores: PropTypes.shape({
113 user: PropTypes.instanceOf(UserStore).isRequired,
114 features: PropTypes.instanceOf(FeatureStore).isRequired,
115 }).isRequired,
116 actions: PropTypes.shape({
117 ui: PropTypes.instanceOf(UIStore).isRequired,
118 user: PropTypes.instanceOf(UserStore).isRequired,
119 }).isRequired,
120};
diff --git a/src/features/delayApp/constants.js b/src/features/delayApp/constants.js
deleted file mode 100644
index 72cc4246e..000000000
--- a/src/features/delayApp/constants.js
+++ /dev/null
@@ -1,6 +0,0 @@
1import { DEFAULT_FEATURES_CONFIG } from '../../config';
2
3export const config = {
4 delayOffset: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset,
5 delayDuration: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait,
6};
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
deleted file mode 100644
index f0c2bdc82..000000000
--- a/src/features/delayApp/index.js
+++ /dev/null
@@ -1,80 +0,0 @@
1import { autorun, observable, reaction } from 'mobx';
2import moment from 'moment';
3import DelayAppComponent from './Component';
4import { config } from './constants';
5import { DEFAULT_FEATURES_CONFIG } from '../../config';
6import { getUserWorkspacesRequest } from '../workspaces/api';
7
8const debug = require('debug')('Ferdi:feature:delayApp');
9
10export const state = observable({
11 isDelayAppScreenVisible: DEFAULT_FEATURES_CONFIG.needToWaitToProceed,
12});
13
14function setVisibility(value) {
15 Object.assign(state, {
16 isDelayAppScreenVisible: value,
17 });
18}
19
20export default function init(stores) {
21 debug('Initializing `delayApp` feature');
22
23 let shownAfterLaunch = false;
24 let timeLastDelay = moment();
25
26 window.ferdi.features.delayApp = {
27 state,
28 };
29
30 reaction(
31 () => (
32 stores.user.isLoggedIn
33 && stores.services.allServicesRequest.wasExecuted
34 && getUserWorkspacesRequest.wasExecuted
35 && stores.features.features.needToWaitToProceed
36 && !stores.user.data.isPremium
37 ),
38 (isEnabled) => {
39 if (isEnabled) {
40 debug('Enabling `delayApp` feature');
41
42 const { needToWaitToProceedConfig: globalConfig } = stores.features.features;
43
44 config.delayOffset = globalConfig.delayOffset !== undefined ? globalConfig.delayOffset : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset;
45 config.delayDuration = globalConfig.wait !== undefined ? globalConfig.wait : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait;
46
47 autorun(() => {
48 const { isAnnouncementShown } = stores.announcements;
49 if (stores.services.allDisplayed.length === 0 || isAnnouncementShown) {
50 shownAfterLaunch = true;
51 setVisibility(false);
52 return;
53 }
54
55 const diff = moment().diff(timeLastDelay);
56 const itsTimeToWait = diff >= config.delayOffset;
57 if (!isAnnouncementShown && ((stores.app.isFocused && itsTimeToWait) || !shownAfterLaunch)) {
58 debug(`App will be delayed for ${config.delayDuration / 1000}s`);
59
60 setVisibility(true);
61
62 setTimeout(() => {
63 debug('Resetting app delay');
64
65 shownAfterLaunch = true;
66 timeLastDelay = moment();
67 setVisibility(false);
68 }, config.delayDuration + 1000); // timer needs to be able to hit 0
69 } else {
70 setVisibility(false);
71 }
72 });
73 } else {
74 setVisibility(false);
75 }
76 },
77 );
78}
79
80export const Component = DelayAppComponent;
diff --git a/src/features/delayApp/styles.js b/src/features/delayApp/styles.js
deleted file mode 100644
index 69c3c7a27..000000000
--- a/src/features/delayApp/styles.js
+++ /dev/null
@@ -1,22 +0,0 @@
1export default theme => ({
2 container: {
3 background: theme.colorBackground,
4 top: 0,
5 width: '100%',
6 display: 'flex',
7 'flex-direction': 'column',
8 'align-items': 'center',
9 'justify-content': 'center',
10 'z-index': 150,
11 },
12 headline: {
13 color: theme.colorHeadline,
14 margin: [25, 0, 40],
15 'max-width': 500,
16 'text-align': 'center',
17 'line-height': '1.3em',
18 },
19 button: {
20 margin: [40, 0, 20],
21 },
22});
diff --git a/src/features/planSelection/actions.js b/src/features/planSelection/actions.js
deleted file mode 100644
index 83f58bfd7..000000000
--- a/src/features/planSelection/actions.js
+++ /dev/null
@@ -1,9 +0,0 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const planSelectionActions = createActionsFromDefinitions({
5 downgradeAccount: {},
6 hideOverlay: {},
7}, PropTypes.checkPropTypes);
8
9export default planSelectionActions;
diff --git a/src/features/planSelection/api.js b/src/features/planSelection/api.js
deleted file mode 100644
index 16bf9ff2d..000000000
--- a/src/features/planSelection/api.js
+++ /dev/null
@@ -1,26 +0,0 @@
1import { sendAuthRequest } from '../../api/utils/auth';
2import Request from '../../stores/lib/Request';
3import apiBase from '../../api/apiBase';
4
5const debug = require('debug')('Ferdi:feature:planSelection:api');
6
7export const planSelectionApi = {
8 downgrade: async () => {
9 const url = `${apiBase()}/payment/downgrade`;
10 const options = {
11 method: 'PUT',
12 };
13 debug('downgrade UPDATE', url, options);
14 const result = await sendAuthRequest(url, options);
15 debug('downgrade RESULT', result);
16 if (!result.ok) throw result;
17
18 return result.ok;
19 },
20};
21
22export const downgradeUserRequest = new Request(planSelectionApi, 'downgrade');
23
24export const resetApiRequests = () => {
25 downgradeUserRequest.reset();
26};
diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js
deleted file mode 100644
index e90532dec..000000000
--- a/src/features/planSelection/components/PlanItem.js
+++ /dev/null
@@ -1,215 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7import color from 'color';
8
9import { H2 } from '@meetfranz/ui';
10
11import { Button } from '@meetfranz/forms';
12import { mdiArrowRight } from '@mdi/js';
13
14const messages = defineMessages({
15 perMonth: {
16 id: 'subscription.interval.perMonth',
17 defaultMessage: '!!!per month',
18 },
19 perMonthPerUser: {
20 id: 'subscription.interval.perMonthPerUser',
21 defaultMessage: '!!!per month & user',
22 },
23 bestValue: {
24 id: 'subscription.bestValue',
25 defaultMessage: '!!!Best value',
26 },
27});
28
29const styles = theme => ({
30 root: {
31 display: 'flex',
32 flexDirection: 'column',
33 borderRadius: theme.borderRadius,
34 flex: 1,
35 color: theme.styleTypes.primary.accent,
36 overflow: 'hidden',
37 textAlign: 'center',
38
39 '& h2': {
40 textAlign: 'center',
41 marginBottom: 10,
42 fontSize: 30,
43 color: theme.styleTypes.primary.contrast,
44 },
45 },
46 currency: {
47 fontSize: 35,
48 },
49 priceWrapper: {
50 height: 50,
51 marginBottom: 0,
52 marginTop: ({ text }) => (!text ? 15 : 0),
53 },
54 price: {
55 fontSize: 50,
56
57 '& sup': {
58 fontSize: 20,
59 verticalAlign: 20,
60 },
61 },
62 text: {
63 marginBottom: 'auto',
64 },
65 cta: {
66 background: theme.styleTypes.primary.accent,
67 color: theme.styleTypes.primary.contrast,
68 margin: [30, 'auto', 0, 'auto'],
69 },
70 divider: {
71 width: 40,
72 border: 0,
73 borderTop: [1, 'solid', theme.styleTypes.primary.contrast],
74 margin: [15, 'auto', 20],
75 },
76 header: {
77 padding: 20,
78 background: color(theme.styleTypes.primary.accent).darken(0.25).hex(),
79 color: theme.styleTypes.primary.contrast,
80 position: 'relative',
81 height: 'auto',
82 },
83 content: {
84 padding: [10, 20, 20],
85 background: '#EFEFEF',
86 display: 'flex',
87 flexDirection: 'column',
88 justifyContent: 'space-between',
89 },
90 simpleCTA: {
91 background: 'none',
92 color: theme.styleTypes.primary.accent,
93
94 '& svg': {
95 fill: theme.styleTypes.primary.accent,
96 },
97 },
98 bestValue: {
99 background: theme.styleTypes.success.accent,
100 color: theme.styleTypes.success.contrast,
101 right: -66,
102 top: -40,
103 height: 'auto',
104 position: 'absolute',
105 transform: 'rotateZ(45deg)',
106 textAlign: 'center',
107 padding: [5, 50],
108 transformOrigin: 'left bottom',
109 fontSize: 12,
110 boxShadow: '0 2px 6px rgba(0,0,0,0.15)',
111 },
112});
113
114export default @observer @injectSheet(styles) class PlanItem extends Component {
115 static propTypes = {
116 name: PropTypes.string.isRequired,
117 text: PropTypes.string.isRequired,
118 price: PropTypes.number.isRequired,
119 currency: PropTypes.string.isRequired,
120 upgrade: PropTypes.func.isRequired,
121 ctaLabel: PropTypes.string.isRequired,
122 simpleCTA: PropTypes.bool,
123 perUser: PropTypes.bool,
124 classes: PropTypes.object.isRequired,
125 bestValue: PropTypes.bool,
126 className: PropTypes.string,
127 children: PropTypes.element,
128 };
129
130 static defaultProps = {
131 simpleCTA: false,
132 perUser: false,
133 children: null,
134 bestValue: false,
135 className: '',
136 }
137
138 static contextTypes = {
139 intl: intlShape,
140 };
141
142 render() {
143 const {
144 name,
145 text,
146 price,
147 currency,
148 classes,
149 upgrade,
150 ctaLabel,
151 simpleCTA,
152 perUser,
153 bestValue,
154 className,
155 children,
156 } = this.props;
157 const { intl } = this.context;
158
159 const priceParts = `${price}`.split('.');
160
161 return (
162 <div className={classnames({
163 [classes.root]: true,
164 [className]: className,
165 })}
166 >
167 <div className={classes.header}>
168 {bestValue && (
169 <div className={classes.bestValue}>
170 {intl.formatMessage(messages.bestValue)}
171 </div>
172 )}
173 <H2 className={classes.planName}>{name}</H2>
174 {text && (
175 <>
176 <p className={classes.text}>
177 {text}
178 </p>
179 <hr className={classes.divider} />
180 </>
181 )}
182 <p className={classes.priceWrapper}>
183 <span className={classes.currency}>{currency}</span>
184 <span className={classes.price}>
185 {priceParts[0]}
186 <sup>{priceParts[1]}</sup>
187 </span>
188 </p>
189 <p className={classes.interval}>
190 {intl.formatMessage(perUser ? messages.perMonthPerUser : messages.perMonth)}
191 </p>
192 </div>
193
194 <div className={classes.content}>
195 {children}
196
197 <Button
198 className={classnames({
199 [classes.cta]: true,
200 [classes.simpleCTA]: simpleCTA,
201 })}
202 icon={simpleCTA ? mdiArrowRight : null}
203 label={(
204 <>
205 {ctaLabel}
206 </>
207 )}
208 onClick={upgrade}
209 />
210 </div>
211
212 </div>
213 );
214 }
215}
diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js
deleted file mode 100644
index 819a9df5b..000000000
--- a/src/features/planSelection/components/PlanSelection.js
+++ /dev/null
@@ -1,269 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { H1, H2, Icon } from '@meetfranz/ui';
7import color from 'color';
8
9import { mdiArrowRight } from '@mdi/js';
10import PlanItem from './PlanItem';
11import { i18nPlanName } from '../../../helpers/plan-helpers';
12import { DEV_API_FRANZ_WEBSITE, PLANS } from '../../../config';
13import { FeatureList } from '../../../components/ui/FeatureList';
14import Appear from '../../../components/ui/effects/Appear';
15
16const messages = defineMessages({
17 welcome: {
18 id: 'feature.planSelection.fullscreen.welcome',
19 defaultMessage: '!!!Are you ready to choose, {name}',
20 },
21 subheadline: {
22 id: 'feature.planSelection.fullscreen.subheadline',
23 defaultMessage: '!!!It\'s time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.',
24 },
25 textFree: {
26 id: 'feature.planSelection.free.text',
27 defaultMessage: '!!!Basic functionality',
28 },
29 textPersonal: {
30 id: 'feature.planSelection.personal.text',
31 defaultMessage: '!!!More services, no waiting - ideal for personal use.',
32 },
33 textProfessional: {
34 id: 'feature.planSelection.pro.text',
35 defaultMessage: '!!!Unlimited services and professional features for you - and your team.',
36 },
37 ctaStayOnFree: {
38 id: 'feature.planSelection.cta.stayOnFree',
39 defaultMessage: '!!!Stay on Free',
40 },
41 ctaDowngradeFree: {
42 id: 'feature.planSelection.cta.ctaDowngradeFree',
43 defaultMessage: '!!!Downgrade to Free',
44 },
45 actionTrial: {
46 id: 'feature.planSelection.cta.trial',
47 defaultMessage: '!!!Start my free 14-days Trial',
48 },
49 shortActionPersonal: {
50 id: 'feature.planSelection.cta.upgradePersonal',
51 defaultMessage: '!!!Choose Personal',
52 },
53 shortActionPro: {
54 id: 'feature.planSelection.cta.upgradePro',
55 defaultMessage: '!!!Choose Professional',
56 },
57 fullFeatureList: {
58 id: 'feature.planSelection.fullFeatureList',
59 defaultMessage: '!!!Complete comparison of all plans',
60 },
61 pricesBasedOnAnnualPayment: {
62 id: 'feature.planSelection.pricesBasedOnAnnualPayment',
63 defaultMessage: '!!!All prices based on yearly payment',
64 },
65});
66
67const styles = theme => ({
68 root: {
69 background: theme.colorModalOverlayBackground,
70 width: '100%',
71 height: '100%',
72 position: 'absolute',
73 top: 0,
74 left: 0,
75 display: 'flex',
76 justifyContent: 'center',
77 alignItems: 'center',
78 zIndex: 999999,
79 overflowY: 'scroll',
80 },
81 container: {
82 // width: '80%',
83 height: 'auto',
84 // background: theme.styleTypes.primary.accent,
85 // padding: 40,
86 borderRadius: theme.borderRadius,
87 maxWidth: 1000,
88
89 '& h1, & h2': {
90 textAlign: 'center',
91 color: theme.styleTypes.primary.contrast,
92 },
93 },
94 plans: {
95 display: 'flex',
96 margin: [40, 0, 0],
97 height: 'auto',
98
99 '& > div': {
100 margin: [0, 15],
101 flex: 1,
102 height: 'auto',
103 background: theme.styleTypes.primary.contrast,
104 boxShadow: [0, 2, 30, color('#000').alpha(0.1).rgb().string()],
105 },
106 },
107 headline: {
108 fontSize: 40,
109 },
110 subheadline: {
111 maxWidth: 660,
112 fontSize: 22,
113 lineHeight: 1.1,
114 margin: [0, 'auto'],
115 },
116 featureList: {
117 '& li': {
118 borderBottom: [1, 'solid', '#CECECE'],
119 },
120 },
121 footer: {
122 display: 'flex',
123 color: theme.styleTypes.primary.contrast,
124 marginTop: 20,
125 padding: [0, 15],
126 },
127 fullFeatureList: {
128 marginRight: 'auto',
129 textAlign: 'center',
130 display: 'flex',
131 justifyContent: 'center',
132 alignItems: 'center',
133 color: `${theme.styleTypes.primary.contrast} !important`,
134
135 '& svg': {
136 marginRight: 5,
137 },
138 },
139 scrollContainer: {
140 border: '1px solid red',
141 overflow: 'scroll-x',
142 },
143 featuredPlan: {
144 transform: ({ isPersonalPlanAvailable }) => (isPersonalPlanAvailable ? 'scale(1.05)' : null),
145 },
146 disclaimer: {
147 textAlign: 'right',
148 margin: [10, 15, 0, 0],
149 },
150});
151
152@injectSheet(styles) @observer
153class PlanSelection extends Component {
154 static propTypes = {
155 classes: PropTypes.object.isRequired,
156 firstname: PropTypes.string.isRequired,
157 plans: PropTypes.object.isRequired,
158 currency: PropTypes.string.isRequired,
159 subscriptionExpired: PropTypes.bool.isRequired,
160 upgradeAccount: PropTypes.func.isRequired,
161 stayOnFree: PropTypes.func.isRequired,
162 hadSubscription: PropTypes.bool.isRequired,
163 isPersonalPlanAvailable: PropTypes.bool,
164 };
165
166 static defaultProps = {
167 isPersonalPlanAvailable: true,
168 }
169
170 static contextTypes = {
171 intl: intlShape,
172 };
173
174 componentDidMount() {
175 }
176
177 render() {
178 const {
179 classes,
180 firstname,
181 plans,
182 currency,
183 subscriptionExpired,
184 upgradeAccount,
185 stayOnFree,
186 hadSubscription,
187 isPersonalPlanAvailable,
188 } = this.props;
189
190 const { intl } = this.context;
191
192 return (
193 <Appear>
194 <div
195 className={classes.root}
196 >
197 <div className={classes.container}>
198 <H1 className={classes.headline}>{intl.formatMessage(messages.welcome, { name: firstname })}</H1>
199 {isPersonalPlanAvailable && (
200 <H2 className={classes.subheadline}>{intl.formatMessage(messages.subheadline)}</H2>
201 )}
202 <div className={classes.plans}>
203 <PlanItem
204 name={i18nPlanName(PLANS.FREE, intl)}
205 text={isPersonalPlanAvailable ? intl.formatMessage(messages.textFree) : null}
206 price={0}
207 currency={currency}
208 ctaLabel={intl.formatMessage(subscriptionExpired ? messages.ctaDowngradeFree : messages.ctaStayOnFree)}
209 upgrade={() => stayOnFree()}
210 simpleCTA
211 >
212 <FeatureList
213 plan={PLANS.FREE}
214 className={classes.featureList}
215 />
216 </PlanItem>
217 <PlanItem
218 name={i18nPlanName(plans.pro.yearly.id, intl)}
219 text={isPersonalPlanAvailable ? intl.formatMessage(messages.textProfessional) : null}
220 price={plans.pro.yearly.price}
221 currency={currency}
222 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPro : messages.actionTrial)}
223 upgrade={() => upgradeAccount(plans.pro.yearly.id)}
224 className={classes.featuredPlan}
225 perUser
226 bestValue={isPersonalPlanAvailable}
227 >
228 <FeatureList
229 plan={isPersonalPlanAvailable ? PLANS.PRO : null}
230 className={classes.featureList}
231 />
232 </PlanItem>
233 {isPersonalPlanAvailable && (
234 <PlanItem
235 name={i18nPlanName(plans.personal.yearly.id, intl)}
236 text={intl.formatMessage(messages.textPersonal)}
237 price={plans.personal.yearly.price}
238 currency={currency}
239 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPersonal : messages.actionTrial)}
240 upgrade={() => upgradeAccount(plans.personal.yearly.id)}
241 >
242 <FeatureList
243 plan={PLANS.PERSONAL}
244 className={classes.featureList}
245 />
246 </PlanItem>
247 )}
248 </div>
249 <div className={classes.footer}>
250 <a
251 href={`${DEV_API_FRANZ_WEBSITE}/pricing`}
252 target="_blank"
253 className={classes.fullFeatureList}
254 >
255 <Icon icon={mdiArrowRight} />
256 {intl.formatMessage(messages.fullFeatureList)}
257 </a>
258 {/* <p className={classes.disclaimer}> */}
259 {intl.formatMessage(messages.pricesBasedOnAnnualPayment)}
260 {/* </p> */}
261 </div>
262 </div>
263 </div>
264 </Appear>
265 );
266 }
267}
268
269export default PlanSelection;
diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js
deleted file mode 100644
index 594829c01..000000000
--- a/src/features/planSelection/containers/PlanSelectionScreen.js
+++ /dev/null
@@ -1,120 +0,0 @@
1import React, { Component } from 'react';
2import { observer, inject } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { dialog, app } from '@electron/remote';
5import { defineMessages, intlShape } from 'react-intl';
6
7import FeaturesStore from '../../../stores/FeaturesStore';
8import UserStore from '../../../stores/UserStore';
9import PlanSelection from '../components/PlanSelection';
10import ErrorBoundary from '../../../components/util/ErrorBoundary';
11import { planSelectionStore } from '..';
12import PaymentStore from '../../../stores/PaymentStore';
13
14const messages = defineMessages({
15 dialogTitle: {
16 id: 'feature.planSelection.fullscreen.dialog.title',
17 defaultMessage: '!!!Downgrade your Franz Plan',
18 },
19 dialogMessage: {
20 id: 'feature.planSelection.fullscreen.dialog.message',
21 defaultMessage: '!!!You\'re about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.',
22 },
23 dialogCTADowngrade: {
24 id: 'feature.planSelection.fullscreen.dialog.cta.downgrade',
25 defaultMessage: '!!!Downgrade to Free',
26 },
27 dialogCTAUpgrade: {
28 id: 'feature.planSelection.fullscreen.dialog.cta.upgrade',
29 defaultMessage: '!!!Choose Personal',
30 },
31});
32
33@inject('stores', 'actions') @observer
34class PlanSelectionScreen extends Component {
35 static contextTypes = {
36 intl: intlShape,
37 };
38
39 upgradeAccount(planId) {
40 const { upgradeAccount } = this.props.actions.payment;
41
42 upgradeAccount({
43 planId,
44 });
45 }
46
47 render() {
48 if (!planSelectionStore || !planSelectionStore.isFeatureActive || !planSelectionStore.showPlanSelectionOverlay) {
49 return null;
50 }
51
52 const { intl } = this.context;
53
54 const { user, features } = this.props.stores;
55 const { isPersonalPlanAvailable, pricingConfig } = features.features;
56 const { plans, currency } = pricingConfig;
57 const { activateTrial } = this.props.actions.user;
58 const { downgradeAccount, hideOverlay } = this.props.actions.planSelection;
59
60 return (
61 <ErrorBoundary>
62 <PlanSelection
63 firstname={user.data.firstname}
64 plans={plans}
65 currency={currency}
66 upgradeAccount={(planId) => {
67 if (user.data.hadSubscription) {
68 this.upgradeAccount(planId);
69 } else {
70 activateTrial({
71 planId,
72 });
73 }
74 }}
75 stayOnFree={() => {
76 const selection = dialog.showMessageBoxSync(app.mainWindow, {
77 type: 'question',
78 message: intl.formatMessage(messages.dialogTitle),
79 detail: intl.formatMessage(messages.dialogMessage, {
80 currency,
81 price: plans.personal.yearly.price,
82 }),
83 buttons: [
84 intl.formatMessage(messages.dialogCTADowngrade),
85 intl.formatMessage(messages.dialogCTAUpgrade),
86 ],
87 });
88
89 if (selection === 0) {
90 downgradeAccount();
91 hideOverlay();
92 } else {
93 this.upgradeAccount(plans.personal.yearly.id);
94 }
95 }}
96 subscriptionExpired={user.team && user.team.state === 'expired' && !user.team.userHasDowngraded}
97 hadSubscription={user.data.hadSubscription}
98 isPersonalPlanAvailable={isPersonalPlanAvailable}
99 />
100 </ErrorBoundary>
101 );
102 }
103}
104
105export default PlanSelectionScreen;
106
107PlanSelectionScreen.wrappedComponent.propTypes = {
108 stores: PropTypes.shape({
109 features: PropTypes.instanceOf(FeaturesStore).isRequired,
110 user: PropTypes.instanceOf(UserStore).isRequired,
111 }).isRequired,
112 actions: PropTypes.shape({
113 payment: PropTypes.instanceOf(PaymentStore),
114 planSelection: PropTypes.shape({
115 downgradeAccount: PropTypes.func.isRequired,
116 hideOverlay: PropTypes.func.isRequired,
117 }),
118 user: PropTypes.instanceOf(UserStore).isRequired,
119 }).isRequired,
120};
diff --git a/src/features/planSelection/index.js b/src/features/planSelection/index.js
deleted file mode 100644
index b96ad6d8f..000000000
--- a/src/features/planSelection/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
1import { reaction } from 'mobx';
2import PlanSelectionStore from './store';
3
4const debug = require('debug')('Ferdi:feature:planSelection');
5
6export const planSelectionStore = new PlanSelectionStore();
7
8export default function initPlanSelection(stores, actions) {
9 stores.planSelection = planSelectionStore;
10 const { features } = stores;
11
12 // Toggle planSelection feature
13 reaction(
14 () => features.features.isPlanSelectionEnabled,
15 (isEnabled) => {
16 if (isEnabled) {
17 debug('Initializing `planSelection` feature');
18 planSelectionStore.start(stores, actions);
19 } else if (planSelectionStore.isFeatureActive) {
20 debug('Disabling `planSelection` feature');
21 planSelectionStore.stop();
22 }
23 },
24 {
25 fireImmediately: true,
26 },
27 );
28}
diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js
deleted file mode 100644
index de8fc7584..000000000
--- a/src/features/planSelection/store.js
+++ /dev/null
@@ -1,68 +0,0 @@
1import {
2 action,
3 observable,
4 computed,
5} from 'mobx';
6
7import { planSelectionActions } from './actions';
8import { FeatureStore } from '../utils/FeatureStore';
9import { createActionBindings } from '../utils/ActionBinding';
10import { downgradeUserRequest } from './api';
11
12const debug = require('debug')('Ferdi:feature:planSelection:store');
13
14export default class PlanSelectionStore extends FeatureStore {
15 @observable isFeatureEnabled = false;
16
17 @observable isFeatureActive = false;
18
19 @observable hideOverlay = false;
20
21 @computed get showPlanSelectionOverlay() {
22 const { team, isPremium } = this.stores.user;
23 if (team && !this.hideOverlay && !isPremium) {
24 return team.state === 'expired' && !team.userHasDowngraded;
25 }
26
27 return false;
28 }
29
30 // ========== PUBLIC API ========= //
31
32 @action start(stores, actions, api) {
33 debug('PlanSelectionStore::start');
34 this.stores = stores;
35 this.actions = actions;
36 this.api = api;
37
38 // ACTIONS
39
40 this._registerActions(createActionBindings([
41 [planSelectionActions.downgradeAccount, this._downgradeAccount],
42 [planSelectionActions.hideOverlay, this._hideOverlay],
43 ]));
44
45 this.isFeatureActive = true;
46 }
47
48 @action stop() {
49 super.stop();
50 debug('PlanSelectionStore::stop');
51 this.isFeatureActive = false;
52 }
53
54 // ========== PRIVATE METHODS ========= //
55
56 // Actions
57 @action _downgradeAccount = () => {
58 downgradeUserRequest.execute();
59 }
60
61 @action _hideOverlay = () => {
62 this.hideOverlay = true;
63 }
64
65 @action _showOverlay = () => {
66 this.hideOverlay = false;
67 }
68}
diff --git a/src/features/serviceLimit/components/LimitReachedInfobox.js b/src/features/serviceLimit/components/LimitReachedInfobox.js
deleted file mode 100644
index 424c92990..000000000
--- a/src/features/serviceLimit/components/LimitReachedInfobox.js
+++ /dev/null
@@ -1,75 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { Infobox } from '@meetfranz/ui';
7
8const messages = defineMessages({
9 limitReached: {
10 id: 'feature.serviceLimit.limitReached',
11 defaultMessage: '!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.',
12 },
13 action: {
14 id: 'premiumFeature.button.upgradeAccount',
15 defaultMessage: '!!!Upgrade account',
16 },
17});
18
19const styles = theme => ({
20 container: {
21 height: 'auto',
22 background: theme.styleTypes.warning.accent,
23 color: theme.styleTypes.warning.contrast,
24 borderRadius: 0,
25 marginBottom: 0,
26
27 '& > div': {
28 marginBottom: 0,
29 },
30
31 '& button': {
32 color: theme.styleTypes.primary.contrast,
33 },
34 },
35});
36
37@inject('stores', 'actions') @injectSheet(styles) @observer
38class LimitReachedInfobox extends Component {
39 static propTypes = {
40 classes: PropTypes.object.isRequired,
41 stores: PropTypes.object.isRequired,
42 actions: PropTypes.object.isRequired,
43 };
44
45 static contextTypes = {
46 intl: intlShape,
47 };
48
49 render() {
50 const { classes, stores, actions } = this.props;
51 const { intl } = this.context;
52
53 const {
54 serviceLimit,
55 } = stores;
56
57 if (!serviceLimit.userHasReachedServiceLimit) return null;
58
59 return (
60 <Infobox
61 icon="mdiInformation"
62 type="warning"
63 className={classes.container}
64 ctaLabel={intl.formatMessage(messages.action)}
65 ctaOnClick={() => {
66 actions.ui.openSettings({ path: 'user' });
67 }}
68 >
69 {intl.formatMessage(messages.limitReached, { amount: serviceLimit.serviceCount, limit: serviceLimit.serviceLimit })}
70 </Infobox>
71 );
72 }
73}
74
75export default LimitReachedInfobox;
diff --git a/src/features/serviceLimit/index.js b/src/features/serviceLimit/index.js
deleted file mode 100644
index f867e3d87..000000000
--- a/src/features/serviceLimit/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
1import { reaction } from 'mobx';
2import { ServiceLimitStore } from './store';
3
4const debug = require('debug')('Ferdi:feature:serviceLimit');
5
6let store = null;
7
8export const serviceLimitStore = new ServiceLimitStore();
9
10export default function initServiceLimit(stores, actions) {
11 const { features } = stores;
12
13 // Toggle serviceLimit feature
14 reaction(
15 () => (
16 features.features.isServiceLimitEnabled
17 ),
18 (isEnabled) => {
19 if (isEnabled) {
20 debug('Initializing `serviceLimit` feature');
21 store = serviceLimitStore.start(stores, actions);
22 } else if (store) {
23 debug('Disabling `serviceLimit` feature');
24 serviceLimitStore.stop();
25 }
26 },
27 {
28 fireImmediately: true,
29 },
30 );
31}
diff --git a/src/features/serviceLimit/store.js b/src/features/serviceLimit/store.js
deleted file mode 100644
index b1e55a1fc..000000000
--- a/src/features/serviceLimit/store.js
+++ /dev/null
@@ -1,42 +0,0 @@
1import { computed, observable } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore';
3import { DEFAULT_SERVICE_LIMIT } from '../../config';
4
5const debug = require('debug')('Ferdi:feature:serviceLimit:store');
6
7export class ServiceLimitStore extends FeatureStore {
8 @observable isServiceLimitEnabled = false;
9
10 start(stores, actions) {
11 debug('start');
12 this.stores = stores;
13 this.actions = actions;
14
15 this.isServiceLimitEnabled = false;
16 }
17
18 stop() {
19 super.stop();
20
21 this.isServiceLimitEnabled = false;
22 }
23
24 @computed get userHasReachedServiceLimit() {
25 return false;
26 // if (!this.isServiceLimitEnabled) return false;
27
28 // return this.serviceLimit !== 0 && this.serviceCount >= this.serviceLimit;
29 }
30
31 @computed get serviceLimit() {
32 if (!this.isServiceLimitEnabled || this.stores.features.features.serviceLimitCount === 0) return 0;
33
34 return this.stores.features.features.serviceLimitCount || DEFAULT_SERVICE_LIMIT;
35 }
36
37 @computed get serviceCount() {
38 return this.stores.services.all.length;
39 }
40}
41
42export default ServiceLimitStore;
diff --git a/src/features/serviceProxy/index.js b/src/features/serviceProxy/index.js
index f74f5f0b2..eb7116651 100644
--- a/src/features/serviceProxy/index.js
+++ b/src/features/serviceProxy/index.js
@@ -5,7 +5,6 @@ const debug = require('debug')('Ferdi:feature:serviceProxy');
5 5
6export const config = observable({ 6export const config = observable({
7 isEnabled: true, 7 isEnabled: true,
8 isPremium: true,
9}); 8});
10 9
11export default function init(stores) { 10export default function init(stores) {
@@ -13,7 +12,6 @@ export default function init(stores) {
13 12
14 autorun(() => { 13 autorun(() => {
15 config.isEnabled = true; 14 config.isEnabled = true;
16 config.isIncludedInCurrentPlan = true;
17 15
18 const services = stores.services.enabled; 16 const services = stores.services.enabled;
19 const proxySettings = stores.settings.proxy; 17 const proxySettings = stores.settings.proxy;
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
index f7f8dc41c..b66375453 100644
--- a/src/features/shareFranz/Component.js
+++ b/src/features/shareFranz/Component.js
@@ -36,11 +36,11 @@ const messages = defineMessages({
36 }, 36 },
37 shareTextEmail: { 37 shareTextEmail: {
38 id: 'feature.shareFranz.shareText.email', 38 id: 'feature.shareFranz.shareText.email',
39 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com', 39 defaultMessage: '!!! I\'ve added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com',
40 }, 40 },
41 shareTextTwitter: { 41 shareTextTwitter: {
42 id: 'feature.shareFranz.shareText.twitter', 42 id: 'feature.shareFranz.shareText.twitter',
43 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger', 43 defaultMessage: '!!! I\'ve added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger',
44 }, 44 },
45}); 45});
46 46
diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js
index 34475f674..9add0f65e 100644
--- a/src/features/shareFranz/index.js
+++ b/src/features/shareFranz/index.js
@@ -1,8 +1,6 @@
1import { reaction } from 'mobx'; 1import { reaction } from 'mobx';
2import ms from 'ms'; 2import ms from 'ms';
3import { state as ModalState } from './store'; 3import { state as ModalState } from './store';
4import { state as delayAppState } from '../delayApp';
5import { planSelectionStore } from '../planSelection';
6 4
7export { default as Component } from './Component'; 5export { default as Component } from './Component';
8 6
@@ -19,21 +17,14 @@ export default function initialize(stores) {
19 17
20 function showModal() { 18 function showModal() {
21 debug('Would have showed share window'); 19 debug('Would have showed share window');
22
23 // state.isModalVisible = true;
24 } 20 }
25 21
26 reaction( 22 reaction(
27 () => stores.user.isLoggedIn, 23 () => stores.user.isLoggedIn,
28 () => { 24 () => {
29 setTimeout(() => { 25 setTimeout(() => {
30 if (stores.settings.stats.appStarts % 50 === 0 && !planSelectionStore.showPlanSelectionOverlay) { 26 if (stores.settings.stats.appStarts % 50 === 0) {
31 if (delayAppState.isDelayAppScreenVisible) { 27 showModal();
32 debug('Delaying share modal by 5 minutes');
33 setTimeout(() => showModal(), ms('5m'));
34 } else {
35 showModal();
36 }
37 } 28 }
38 }, ms('2s')); 29 }, ms('2s'));
39 }, 30 },
diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js
deleted file mode 100644
index 6a393e250..000000000
--- a/src/features/spellchecker/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
1import { autorun, observable } from 'mobx';
2
3import { DEFAULT_FEATURES_CONFIG } from '../../config';
4
5const debug = require('debug')('Ferdi:feature:spellchecker');
6
7export const config = observable({
8 isIncludedInCurrentPlan: DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan,
9});
10
11export default function init() {
12 debug('Initializing `spellchecker` feature');
13
14 autorun(() => {
15 // const { isSpellcheckerIncludedInCurrentPlan } = stores.features.features;
16
17 // config.isIncludedInCurrentPlan = isSpellcheckerIncludedInCurrentPlan !== undefined ? isSpellcheckerIncludedInCurrentPlan : DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan;
18
19 // if (!stores.user.data.isPremium && config.isIncludedInCurrentPlan && stores.settings.app.enableSpellchecking) {
20 // debug('Override settings.spellcheckerEnabled flag to false');
21
22 // Object.assign(stores.settings.app, {
23 // enableSpellchecking: false,
24 // });
25 // }
26 });
27}
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index ca8460f94..2dc30cdf2 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -35,26 +35,6 @@ const styles = (theme) => ({
35 zIndex: 400, 35 zIndex: 400,
36 background: theme.todos.dragIndicator.background, 36 background: theme.todos.dragIndicator.background,
37 }, 37 },
38 premiumContainer: {
39 display: 'flex',
40 flexDirection: 'column',
41 justifyContent: 'center',
42 alignItems: 'center',
43 width: '80%',
44 maxWidth: 300,
45 margin: [0, 'auto'],
46 textAlign: 'center',
47 },
48 premiumIcon: {
49 marginBottom: 40,
50 background: theme.styleTypes.primary.accent,
51 fill: theme.styleTypes.primary.contrast,
52 padding: 10,
53 borderRadius: 10,
54 },
55 premiumCTA: {
56 marginTop: 40,
57 },
58 isTodosServiceActive: { 38 isTodosServiceActive: {
59 width: 'calc(100% - 368px)', 39 width: 'calc(100% - 368px)',
60 position: 'absolute', 40 position: 'absolute',
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
index 429507927..abaec677f 100644
--- a/src/features/todos/store.js
+++ b/src/features/todos/store.js
@@ -20,7 +20,6 @@ import { FeatureStore } from '../utils/FeatureStore';
20import { createReactions } from '../../stores/lib/Reaction'; 20import { createReactions } from '../../stores/lib/Reaction';
21import { createActionBindings } from '../utils/ActionBinding'; 21import { createActionBindings } from '../utils/ActionBinding';
22import { IPC, TODOS_ROUTES } from './constants'; 22import { IPC, TODOS_ROUTES } from './constants';
23import { state as delayAppState } from '../delayApp';
24import UserAgent from '../../models/UserAgent'; 23import UserAgent from '../../models/UserAgent';
25 24
26const debug = require('debug')('Ferdi:feature:todos:store'); 25const debug = require('debug')('Ferdi:feature:todos:store');
@@ -46,7 +45,7 @@ export default class TodoStore extends FeatureStore {
46 45
47 @computed get isTodosPanelForceHidden() { 46 @computed get isTodosPanelForceHidden() {
48 const { isAnnouncementShown } = this.stores.announcements; 47 const { isAnnouncementShown } = this.stores.announcements;
49 return delayAppState.isDelayAppScreenVisible || !this.isFeatureEnabledByUser || isAnnouncementShown; 48 return !this.isFeatureEnabledByUser || isAnnouncementShown;
50 } 49 }
51 50
52 @computed get isTodosPanelVisible() { 51 @computed get isTodosPanelVisible() {
diff --git a/src/features/trialStatusBar/actions.js b/src/features/trialStatusBar/actions.js
deleted file mode 100644
index 38df76458..000000000
--- a/src/features/trialStatusBar/actions.js
+++ /dev/null
@@ -1,13 +0,0 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const trialStatusBarActions = createActionsFromDefinitions({
5 upgradeAccount: {
6 planId: PropTypes.string.isRequired,
7 onCloseWindow: PropTypes.func.isRequired,
8 },
9 downgradeAccount: {},
10 hideOverlay: {},
11}, PropTypes.checkPropTypes);
12
13export default trialStatusBarActions;
diff --git a/src/features/trialStatusBar/components/ProgressBar.js b/src/features/trialStatusBar/components/ProgressBar.js
deleted file mode 100644
index 41b74d396..000000000
--- a/src/features/trialStatusBar/components/ProgressBar.js
+++ /dev/null
@@ -1,45 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5
6const styles = theme => ({
7 root: {
8 background: theme.trialStatusBar.progressBar.background,
9 width: '25%',
10 maxWidth: 200,
11 height: 8,
12 display: 'flex',
13 alignItems: 'center',
14 borderRadius: theme.borderRadius,
15 overflow: 'hidden',
16 },
17 progress: {
18 background: theme.trialStatusBar.progressBar.progressIndicator,
19 width: ({ percent }) => `${percent}%`,
20 height: '100%',
21 },
22});
23
24@injectSheet(styles) @observer
25class ProgressBar extends Component {
26 static propTypes = {
27 classes: PropTypes.object.isRequired,
28 };
29
30 render() {
31 const {
32 classes,
33 } = this.props;
34
35 return (
36 <div
37 className={classes.root}
38 >
39 <div className={classes.progress} />
40 </div>
41 );
42 }
43}
44
45export default ProgressBar;
diff --git a/src/features/trialStatusBar/components/TrialStatusBar.js b/src/features/trialStatusBar/components/TrialStatusBar.js
deleted file mode 100644
index b8fe4acc9..000000000
--- a/src/features/trialStatusBar/components/TrialStatusBar.js
+++ /dev/null
@@ -1,135 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { Icon } from '@meetfranz/ui';
7import { mdiArrowRight, mdiWindowClose } from '@mdi/js';
8import classnames from 'classnames';
9
10import ProgressBar from './ProgressBar';
11
12const messages = defineMessages({
13 restTime: {
14 id: 'feature.trialStatusBar.restTime',
15 defaultMessage: '!!!Your Free Franz {plan} Trial ends in {time}.',
16 },
17 expired: {
18 id: 'feature.trialStatusBar.expired',
19 defaultMessage: '!!!Your free Franz {plan} Trial has expired, please upgrade your account.',
20 },
21 cta: {
22 id: 'feature.trialStatusBar.cta',
23 defaultMessage: '!!!Upgrade now',
24 },
25});
26
27const styles = theme => ({
28 root: {
29 background: theme.trialStatusBar.bar.background,
30 width: '100%',
31 height: 25,
32 order: 10,
33 display: 'flex',
34 alignItems: 'center',
35 fontSize: 12,
36 padding: [0, 10],
37 justifyContent: 'flex-end',
38 },
39 ended: {
40 background: theme.styleTypes.warning.accent,
41 color: theme.styleTypes.warning.contrast,
42 },
43 message: {
44 marginLeft: 20,
45 },
46 action: {
47 marginLeft: 20,
48 fontSize: 12,
49 color: theme.colorText,
50 textDecoration: 'underline',
51 display: 'flex',
52
53 '& svg': {
54 margin: [1, 2, 0, 0],
55 },
56 },
57});
58
59@injectSheet(styles) @observer
60class TrialStatusBar extends Component {
61 static propTypes = {
62 planName: PropTypes.string.isRequired,
63 percent: PropTypes.number.isRequired,
64 upgradeAccount: PropTypes.func.isRequired,
65 hideOverlay: PropTypes.func.isRequired,
66 trialEnd: PropTypes.string.isRequired,
67 hasEnded: PropTypes.bool.isRequired,
68 classes: PropTypes.object.isRequired,
69 };
70
71 static contextTypes = {
72 intl: intlShape,
73 };
74
75 render() {
76 const {
77 planName,
78 percent,
79 upgradeAccount,
80 hideOverlay,
81 trialEnd,
82 hasEnded,
83 classes,
84 } = this.props;
85
86 const { intl } = this.context;
87
88 return (
89 <div
90 className={classnames({
91 [classes.root]: true,
92 [classes.ended]: hasEnded,
93 })}
94 >
95 <ProgressBar
96 percent={percent}
97 />
98 {' '}
99 <span className={classes.message}>
100 {!hasEnded ? (
101 intl.formatMessage(messages.restTime, {
102 plan: planName,
103 time: trialEnd,
104 })
105 ) : (
106 intl.formatMessage(messages.expired, {
107 plan: planName,
108 })
109 )}
110 </span>
111 <button
112 className={classes.action}
113 type="button"
114 onClick={() => {
115 upgradeAccount();
116 }}
117 >
118 <Icon icon={mdiArrowRight} />
119 {intl.formatMessage(messages.cta)}
120 </button>
121 <button
122 className={classes.action}
123 type="button"
124 onClick={() => {
125 hideOverlay();
126 }}
127 >
128 <Icon icon={mdiWindowClose} />
129 </button>
130 </div>
131 );
132 }
133}
134
135export default TrialStatusBar;
diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
deleted file mode 100644
index e0f5ab5f2..000000000
--- a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
+++ /dev/null
@@ -1,112 +0,0 @@
1import React, { Component } from 'react';
2import { observer, inject } from 'mobx-react';
3import PropTypes from 'prop-types';
4import ms from 'ms';
5import { intlShape } from 'react-intl';
6
7import FeaturesStore from '../../../stores/FeaturesStore';
8import UserStore from '../../../stores/UserStore';
9import TrialStatusBar from '../components/TrialStatusBar';
10import ErrorBoundary from '../../../components/util/ErrorBoundary';
11import { trialStatusBarStore } from '..';
12import { i18nPlanName } from '../../../helpers/plan-helpers';
13import PaymentStore from '../../../stores/PaymentStore';
14
15@inject('stores', 'actions')
16@observer
17class TrialStatusBarScreen extends Component {
18 static contextTypes = {
19 intl: intlShape,
20 };
21
22 state = {
23 showOverlay: true,
24 percent: 0,
25 restTime: '',
26 hasEnded: false,
27 };
28
29 percentInterval = null;
30
31 componentDidMount() {
32 this.percentInterval = setInterval(() => {
33 this.calculateRestTime();
34 }, ms('1m'));
35
36 this.calculateRestTime();
37 }
38
39 componentWillUnmount() {
40 clearInterval(this.percentInterval);
41 }
42
43 calculateRestTime() {
44 const { trialEndTime } = trialStatusBarStore;
45 const percent = (
46 Math.abs(100 - Math.abs(trialEndTime.asMilliseconds()) * 100) / ms('14d')
47 ).toFixed(2);
48 const restTime = trialEndTime.humanize();
49 const hasEnded = trialEndTime.asMilliseconds() > 0;
50
51 this.setState({
52 percent,
53 restTime,
54 hasEnded,
55 });
56 }
57
58 hideOverlay() {
59 this.setState({
60 showOverlay: false,
61 });
62 }
63
64 render() {
65 const { intl } = this.context;
66
67 const {
68 showOverlay, percent, restTime, hasEnded,
69 } = this.state;
70
71 if (
72 !trialStatusBarStore
73 || !trialStatusBarStore.isFeatureActive
74 || !showOverlay
75 || !trialStatusBarStore.showTrialStatusBarOverlay
76 ) {
77 return null;
78 }
79
80 const { user } = this.props.stores;
81 const { upgradeAccount } = this.props.actions.payment;
82
83 const planName = i18nPlanName(user.team.plan, intl);
84
85 return (
86 <ErrorBoundary>
87 <TrialStatusBar
88 planName={planName}
89 percent={parseFloat(percent < 5 ? 5 : percent)}
90 trialEnd={restTime}
91 upgradeAccount={() => upgradeAccount({
92 planId: user.team.plan,
93 })}
94 hideOverlay={() => this.hideOverlay()}
95 hasEnded={hasEnded}
96 />
97 </ErrorBoundary>
98 );
99 }
100}
101
102export default TrialStatusBarScreen;
103
104TrialStatusBarScreen.wrappedComponent.propTypes = {
105 stores: PropTypes.shape({
106 features: PropTypes.instanceOf(FeaturesStore).isRequired,
107 user: PropTypes.instanceOf(UserStore).isRequired,
108 }).isRequired,
109 actions: PropTypes.shape({
110 payment: PropTypes.instanceOf(PaymentStore),
111 }).isRequired,
112};
diff --git a/src/features/trialStatusBar/index.js b/src/features/trialStatusBar/index.js
deleted file mode 100644
index 987b5c04e..000000000
--- a/src/features/trialStatusBar/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
1import { reaction } from 'mobx';
2import TrialStatusBarStore from './store';
3
4const debug = require('debug')('Ferdi:feature:trialStatusBar');
5
6export const GA_CATEGORY_TRIAL_STATUS_BAR = 'trialStatusBar';
7
8export const trialStatusBarStore = new TrialStatusBarStore();
9
10export default function initTrialStatusBar(stores, actions) {
11 stores.trialStatusBar = trialStatusBarStore;
12 const { features } = stores;
13
14 // Toggle trialStatusBar feature
15 reaction(
16 () => features.features.isTrialStatusBarEnabled,
17 (isEnabled) => {
18 if (isEnabled) {
19 debug('Initializing `trialStatusBar` feature');
20 trialStatusBarStore.start(stores, actions);
21 } else if (trialStatusBarStore.isFeatureActive) {
22 debug('Disabling `trialStatusBar` feature');
23 trialStatusBarStore.stop();
24 }
25 },
26 {
27 fireImmediately: true,
28 },
29 );
30}
diff --git a/src/features/trialStatusBar/store.js b/src/features/trialStatusBar/store.js
deleted file mode 100644
index 858a08238..000000000
--- a/src/features/trialStatusBar/store.js
+++ /dev/null
@@ -1,72 +0,0 @@
1import {
2 action,
3 observable,
4 computed,
5} from 'mobx';
6import moment from 'moment';
7
8import { trialStatusBarActions } from './actions';
9import { FeatureStore } from '../utils/FeatureStore';
10import { createActionBindings } from '../utils/ActionBinding';
11
12const debug = require('debug')('Ferdi:feature:trialStatusBar:store');
13
14export default class TrialStatusBarStore extends FeatureStore {
15 @observable isFeatureActive = false;
16
17 @observable isFeatureEnabled = false;
18
19 @computed get showTrialStatusBarOverlay() {
20 if (this.isFeatureActive) {
21 const { team } = this.stores.user;
22 if (team && !this.hideOverlay) {
23 return team.state !== 'expired' && team.isTrial;
24 }
25 }
26
27 return false;
28 }
29
30 @computed get trialEndTime() {
31 if (this.isFeatureActive) {
32 const { team } = this.stores.user;
33
34 if (team && !this.hideOverlay) {
35 return moment.duration(moment().diff(team.trialEnd));
36 }
37 }
38
39 return moment.duration();
40 }
41
42 // ========== PUBLIC API ========= //
43
44 @action start(stores, actions, api) {
45 debug('TrialStatusBarStore::start');
46 this.stores = stores;
47 this.actions = actions;
48 this.api = api;
49
50 // ACTIONS
51
52 this._registerActions(createActionBindings([
53 [trialStatusBarActions.hideOverlay, this._hideOverlay],
54 ]));
55
56 this.isFeatureActive = true;
57 }
58
59 @action stop() {
60 super.stop();
61 debug('TrialStatusBarStore::stop');
62 this.isFeatureActive = false;
63 }
64
65 // ========== PRIVATE METHODS ========= //
66
67 // Actions
68
69 @action _hideOverlay = () => {
70 this.hideOverlay = true;
71 }
72}
diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js
index bf7016e2f..3ddc9cf16 100644
--- a/src/features/workspaces/components/WorkspaceDrawer.js
+++ b/src/features/workspaces/components/WorkspaceDrawer.js
@@ -2,12 +2,11 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss'; 4import injectSheet from 'react-jss';
5import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl'; 5import { defineMessages, intlShape } from 'react-intl';
6import { H1, Icon, ProBadge } from '@meetfranz/ui'; 6import { H1, Icon } from '@meetfranz/ui';
7import { Button } from '@meetfranz/forms/lib';
8import ReactTooltip from 'react-tooltip'; 7import ReactTooltip from 'react-tooltip';
9 8
10import { mdiPlusBox, mdiSettings, mdiStar } from '@mdi/js'; 9import { mdiPlusBox, mdiSettings } from '@mdi/js';
11import WorkspaceDrawerItem from './WorkspaceDrawerItem'; 10import WorkspaceDrawerItem from './WorkspaceDrawerItem';
12import { workspaceActions } from '../actions'; 11import { workspaceActions } from '../actions';
13import { workspaceStore } from '../index'; 12import { workspaceStore } from '../index';
@@ -29,22 +28,10 @@ const messages = defineMessages({
29 id: 'workspaceDrawer.workspaceFeatureInfo', 28 id: 'workspaceDrawer.workspaceFeatureInfo',
30 defaultMessage: '!!!Info about workspace feature', 29 defaultMessage: '!!!Info about workspace feature',
31 }, 30 },
32 premiumCtaButtonLabel: {
33 id: 'workspaceDrawer.premiumCtaButtonLabel',
34 defaultMessage: '!!!Create your first workspace',
35 },
36 reactivatePremiumAccount: {
37 id: 'workspaceDrawer.reactivatePremiumAccountLabel',
38 defaultMessage: '!!!Reactivate premium account',
39 },
40 addNewWorkspaceLabel: { 31 addNewWorkspaceLabel: {
41 id: 'workspaceDrawer.addNewWorkspaceLabel', 32 id: 'workspaceDrawer.addNewWorkspaceLabel',
42 defaultMessage: '!!!add new workspace', 33 defaultMessage: '!!!add new workspace',
43 }, 34 },
44 premiumFeatureBadge: {
45 id: 'workspaceDrawer.proFeatureBadge',
46 defaultMessage: '!!!Premium feature',
47 },
48}); 35});
49 36
50const styles = theme => ({ 37const styles = theme => ({
@@ -60,9 +47,6 @@ const styles = theme => ({
60 marginBottom: '25px', 47 marginBottom: '25px',
61 marginLeft: theme.workspaces.drawer.padding, 48 marginLeft: theme.workspaces.drawer.padding,
62 }, 49 },
63 headlineProBadge: {
64 marginRight: 15,
65 },
66 workspacesSettingsButton: { 50 workspacesSettingsButton: {
67 float: 'right', 51 float: 'right',
68 marginRight: theme.workspaces.drawer.padding, 52 marginRight: theme.workspaces.drawer.padding,
@@ -78,16 +62,6 @@ const styles = theme => ({
78 height: 'auto', 62 height: 'auto',
79 overflowY: 'auto', 63 overflowY: 'auto',
80 }, 64 },
81 premiumAnnouncement: {
82 padding: '20px',
83 paddingTop: '0',
84 height: 'auto',
85 },
86 premiumCtaButton: {
87 marginTop: '20px',
88 width: '100%',
89 color: 'white !important',
90 },
91 addNewWorkspaceLabel: { 65 addNewWorkspaceLabel: {
92 height: 'auto', 66 height: 'auto',
93 color: theme.workspaces.drawer.buttons.color, 67 color: theme.workspaces.drawer.buttons.color,
@@ -116,7 +90,6 @@ class WorkspaceDrawer extends Component {
116 static propTypes = { 90 static propTypes = {
117 classes: PropTypes.object.isRequired, 91 classes: PropTypes.object.isRequired,
118 getServicesForWorkspace: PropTypes.func.isRequired, 92 getServicesForWorkspace: PropTypes.func.isRequired,
119 onUpgradeAccountClick: PropTypes.func.isRequired,
120 }; 93 };
121 94
122 static contextTypes = { 95 static contextTypes = {
@@ -131,7 +104,6 @@ class WorkspaceDrawer extends Component {
131 const { 104 const {
132 classes, 105 classes,
133 getServicesForWorkspace, 106 getServicesForWorkspace,
134 onUpgradeAccountClick,
135 } = this.props; 107 } = this.props;
136 const { intl } = this.context; 108 const { intl } = this.context;
137 const { 109 const {
@@ -144,14 +116,6 @@ class WorkspaceDrawer extends Component {
144 return ( 116 return (
145 <div className={`${classes.drawer} workspaces-drawer`}> 117 <div className={`${classes.drawer} workspaces-drawer`}>
146 <H1 className={classes.headline}> 118 <H1 className={classes.headline}>
147 {workspaceStore.isPremiumUpgradeRequired && (
148 <span
149 className={classes.headlineProBadge}
150 data-tip={`${intl.formatMessage(messages.premiumFeatureBadge)}`}
151 >
152 <ProBadge />
153 </span>
154 )}
155 {intl.formatMessage(messages.headline)} 119 {intl.formatMessage(messages.headline)}
156 <span 120 <span
157 className={classes.workspacesSettingsButton} 121 className={classes.workspacesSettingsButton}
@@ -167,75 +131,48 @@ class WorkspaceDrawer extends Component {
167 /> 131 />
168 </span> 132 </span>
169 </H1> 133 </H1>
170 {workspaceStore.isPremiumUpgradeRequired ? ( 134 <div className={classes.workspaces}>
171 <div className={classes.premiumAnnouncement}> 135 <WorkspaceDrawerItem
172 <FormattedHTMLMessage {...messages.workspaceFeatureInfo} /> 136 name={intl.formatMessage(messages.allServices)}
173 {workspaceStore.userHasWorkspaces ? ( 137 onClick={() => {
174 <Button 138 workspaceActions.deactivate();
175 className={classes.premiumCtaButton} 139 workspaceActions.toggleWorkspaceDrawer();
176 buttonType="primary" 140 }}
177 label={intl.formatMessage(messages.reactivatePremiumAccount)} 141 services={getServicesForWorkspace(null)}
178 icon={mdiStar} 142 isActive={actualWorkspace == null}
179 onClick={() => { 143 shortcutIndex={0}
180 onUpgradeAccountClick(); 144 />
181 }} 145 {workspaces.map((workspace, index) => (
182 />
183 ) : (
184 <Button
185 className={classes.premiumCtaButton}
186 buttonType="primary"
187 label={intl.formatMessage(messages.premiumCtaButtonLabel)}
188 icon={mdiPlusBox}
189 onClick={() => {
190 workspaceActions.openWorkspaceSettings();
191 }}
192 />
193 )}
194 </div>
195 ) : (
196 <div className={classes.workspaces}>
197 <WorkspaceDrawerItem 146 <WorkspaceDrawerItem
198 name={intl.formatMessage(messages.allServices)} 147 key={workspace.id}
148 name={workspace.name}
149 isActive={actualWorkspace === workspace}
199 onClick={() => { 150 onClick={() => {
200 workspaceActions.deactivate(); 151 if (actualWorkspace === workspace) return;
152 workspaceActions.activate({ workspace });
201 workspaceActions.toggleWorkspaceDrawer(); 153 workspaceActions.toggleWorkspaceDrawer();
202 }} 154 }}
203 services={getServicesForWorkspace(null)} 155 onContextMenuEditClick={() => workspaceActions.edit({ workspace })}
204 isActive={actualWorkspace == null} 156 services={getServicesForWorkspace(workspace)}
205 shortcutIndex={0} 157 shortcutIndex={index + 1}
206 /> 158 />
207 {workspaces.map((workspace, index) => ( 159 ))}
208 <WorkspaceDrawerItem 160 <div
209 key={workspace.id} 161 className={classes.addNewWorkspaceLabel}
210 name={workspace.name} 162 onClick={() => {
211 isActive={actualWorkspace === workspace} 163 workspaceActions.openWorkspaceSettings();
212 onClick={() => { 164 }}
213 if (actualWorkspace === workspace) return; 165 >
214 workspaceActions.activate({ workspace }); 166 <Icon
215 workspaceActions.toggleWorkspaceDrawer(); 167 icon={mdiPlusBox}
216 }} 168 size={1}
217 onContextMenuEditClick={() => workspaceActions.edit({ workspace })} 169 className={classes.workspacesSettingsButtonIcon}
218 services={getServicesForWorkspace(workspace)} 170 />
219 shortcutIndex={index + 1} 171 <span>
220 /> 172 {intl.formatMessage(messages.addNewWorkspaceLabel)}
221 ))} 173 </span>
222 <div
223 className={classes.addNewWorkspaceLabel}
224 onClick={() => {
225 workspaceActions.openWorkspaceSettings();
226 }}
227 >
228 <Icon
229 icon={mdiPlusBox}
230 size={1}
231 className={classes.workspacesSettingsButtonIcon}
232 />
233 <span>
234 {intl.formatMessage(messages.addNewWorkspaceLabel)}
235 </span>
236 </div>
237 </div> 174 </div>
238 )} 175 </div>
239 <ReactTooltip place="right" type="dark" effect="solid" /> 176 <ReactTooltip place="right" type="dark" effect="solid" />
240 </div> 177 </div>
241 ); 178 );
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index cfaacd56e..0c2588c42 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -1,9 +1,9 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes, inject } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes, inject } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6import { Infobox, Badge } from '@meetfranz/ui'; 6import { Infobox } from '@meetfranz/ui';
7 7
8import { mdiCheckboxMarkedCircleOutline } from '@mdi/js'; 8import { mdiCheckboxMarkedCircleOutline } from '@mdi/js';
9import Loader from '../../../components/ui/Loader'; 9import Loader from '../../../components/ui/Loader';
@@ -11,10 +11,7 @@ import WorkspaceItem from './WorkspaceItem';
11import CreateWorkspaceForm from './CreateWorkspaceForm'; 11import CreateWorkspaceForm from './CreateWorkspaceForm';
12import Request from '../../../stores/lib/Request'; 12import Request from '../../../stores/lib/Request';
13import Appear from '../../../components/ui/effects/Appear'; 13import Appear from '../../../components/ui/effects/Appear';
14import { workspaceStore } from '../index';
15import UIStore from '../../../stores/UIStore'; 14import UIStore from '../../../stores/UIStore';
16import globalMessages from '../../../i18n/globalMessages';
17import UpgradeButton from '../../../components/ui/UpgradeButton';
18 15
19const messages = defineMessages({ 16const messages = defineMessages({
20 headline: { 17 headline: {
@@ -64,12 +61,6 @@ const styles = () => ({
64 appear: { 61 appear: {
65 height: 'auto', 62 height: 'auto',
66 }, 63 },
67 premiumAnnouncement: {
68 height: 'auto',
69 },
70 premiumAnnouncementContainer: {
71 display: 'flex',
72 },
73 announcementHeadline: { 64 announcementHeadline: {
74 marginBottom: 0, 65 marginBottom: 0,
75 }, 66 },
@@ -78,12 +69,6 @@ const styles = () => ({
78 margin: [-8, 0, 0, 20], 69 margin: [-8, 0, 0, 20],
79 alignSelf: 'center', 70 alignSelf: 'center',
80 }, 71 },
81 upgradeCTA: {
82 margin: [40, 'auto'],
83 },
84 proRequired: {
85 margin: [10, 0, 40],
86 },
87}); 72});
88 73
89@inject('stores') @injectSheet(styles) @observer 74@inject('stores') @injectSheet(styles) @observer
@@ -152,77 +137,53 @@ class WorkspacesDashboard extends Component {
152 </Appear> 137 </Appear>
153 )} 138 )}
154 139
155 {workspaceStore.isPremiumUpgradeRequired && ( 140 {/* ===== Create workspace form ===== */}
156 <div className={classes.premiumAnnouncement}> 141 <div className={classes.createForm}>
157 142 <CreateWorkspaceForm
158 <h1 className={classes.announcementHeadline}>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h1> 143 isSubmitting={createWorkspaceRequest.isExecuting}
159 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge> 144 onSubmit={onCreateWorkspaceSubmit}
160 <div className={classes.premiumAnnouncementContainer}> 145 />
161 <div className={classes.premiumAnnouncementContent}> 146 </div>
162 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p> 147 {getUserWorkspacesRequest.isExecuting ? (
163 <UpgradeButton 148 <Loader />
164 className={classes.upgradeCTA} 149 ) : (
165 gaEventInfo={{ category: 'Workspaces', event: 'upgrade' }}
166 short
167 requiresPro
168 />
169 </div>
170 <img src={`https://cdn.franzinfra.com/announcements/assets/workspaces_${this.props.stores.ui.isDarkThemeActive ? 'dark' : 'light'}.png`} className={classes.teaserImage} alt="" />
171 </div>
172 </div>
173 )}
174
175 {!workspaceStore.isPremiumUpgradeRequired && (
176 <> 150 <>
177 {/* ===== Create workspace form ===== */} 151 {/* ===== Workspace could not be loaded error ===== */}
178 <div className={classes.createForm}> 152 {getUserWorkspacesRequest.error ? (
179 <CreateWorkspaceForm 153 <Infobox
180 isSubmitting={createWorkspaceRequest.isExecuting} 154 icon="alert"
181 onSubmit={onCreateWorkspaceSubmit} 155 type="danger"
182 /> 156 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
183 </div> 157 ctaLoading={getUserWorkspacesRequest.isExecuting}
184 {getUserWorkspacesRequest.isExecuting ? ( 158 ctaOnClick={getUserWorkspacesRequest.retry}
185 <Loader /> 159 >
160 {intl.formatMessage(messages.workspacesRequestFailed)}
161 </Infobox>
186 ) : ( 162 ) : (
187 <> 163 <>
188 {/* ===== Workspace could not be loaded error ===== */} 164 {workspaces.length === 0 ? (
189 {getUserWorkspacesRequest.error ? ( 165 <div className="align-middle settings__empty-state">
190 <Infobox 166 {/* ===== Workspaces empty state ===== */}
191 icon="alert" 167 <p className="settings__empty-text">
192 type="danger" 168 <span className="emoji">
193 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)} 169 <img src="./assets/images/emoji/sad.png" alt="" />
194 ctaLoading={getUserWorkspacesRequest.isExecuting} 170 </span>
195 ctaOnClick={getUserWorkspacesRequest.retry} 171 {intl.formatMessage(messages.noServicesAdded)}
196 > 172 </p>
197 {intl.formatMessage(messages.workspacesRequestFailed)} 173 </div>
198 </Infobox>
199 ) : ( 174 ) : (
200 <> 175 <table className={classes.table}>
201 {workspaces.length === 0 ? ( 176 {/* ===== Workspaces list ===== */}
202 <div className="align-middle settings__empty-state"> 177 <tbody>
203 {/* ===== Workspaces empty state ===== */} 178 {workspaces.map(workspace => (
204 <p className="settings__empty-text"> 179 <WorkspaceItem
205 <span className="emoji"> 180 key={workspace.id}
206 <img src="./assets/images/emoji/sad.png" alt="" /> 181 workspace={workspace}
207 </span> 182 onItemClick={w => onWorkspaceClick(w)}
208 {intl.formatMessage(messages.noServicesAdded)} 183 />
209 </p> 184 ))}
210 </div> 185 </tbody>
211 ) : ( 186 </table>
212 <table className={classes.table}>
213 {/* ===== Workspaces list ===== */}
214 <tbody>
215 {workspaces.map(workspace => (
216 <WorkspaceItem
217 key={workspace.id}
218 workspace={workspace}
219 onItemClick={w => onWorkspaceClick(w)}
220 />
221 ))}
222 </tbody>
223 </table>
224 )}
225 </>
226 )} 187 )}
227 </> 188 </>
228 )} 189 )}
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index 632f3c299..8c73516bc 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -22,10 +22,6 @@ export default class WorkspacesStore extends FeatureStore {
22 22
23 @observable isFeatureActive = false; 23 @observable isFeatureActive = false;
24 24
25 @observable isPremiumFeature = false;
26
27 @observable isPremiumUpgradeRequired = false;
28
29 @observable activeWorkspace = null; 25 @observable activeWorkspace = null;
30 26
31 @observable nextWorkspace = null; 27 @observable nextWorkspace = null;
@@ -58,7 +54,6 @@ export default class WorkspacesStore extends FeatureStore {
58 54
59 @computed get isUserAllowedToUseFeature() { 55 @computed get isUserAllowedToUseFeature() {
60 return true; 56 return true;
61 // return !this.isPremiumUpgradeRequired;
62 } 57 }
63 58
64 @computed get isAnyWorkspaceActive() { 59 @computed get isAnyWorkspaceActive() {
@@ -69,16 +64,8 @@ export default class WorkspacesStore extends FeatureStore {
69 64
70 _wasDrawerOpenBeforeSettingsRoute = null; 65 _wasDrawerOpenBeforeSettingsRoute = null;
71 66
72 _freeUserActions = [];
73
74 _premiumUserActions = [];
75
76 _allActions = []; 67 _allActions = [];
77 68
78 _freeUserReactions = [];
79
80 _premiumUserReactions = [];
81
82 _allReactions = []; 69 _allReactions = [];
83 70
84 // ========== PUBLIC API ========= // 71 // ========== PUBLIC API ========= //
@@ -90,11 +77,9 @@ export default class WorkspacesStore extends FeatureStore {
90 77
91 // ACTIONS 78 // ACTIONS
92 79
93 this._freeUserActions = createActionBindings([ 80 this._allActions = createActionBindings([
94 [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer], 81 [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer],
95 [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings], 82 [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings],
96 ]);
97 this._premiumUserActions = createActionBindings([
98 [workspaceActions.edit, this._edit], 83 [workspaceActions.edit, this._edit],
99 [workspaceActions.create, this._create], 84 [workspaceActions.create, this._create],
100 [workspaceActions.delete, this._delete], 85 [workspaceActions.delete, this._delete],
@@ -106,27 +91,18 @@ export default class WorkspacesStore extends FeatureStore {
106 this._toggleKeepAllWorkspacesLoadedSetting, 91 this._toggleKeepAllWorkspacesLoadedSetting,
107 ], 92 ],
108 ]); 93 ]);
109 this._allActions = this._freeUserActions.concat(this._premiumUserActions);
110 this._registerActions(this._allActions); 94 this._registerActions(this._allActions);
111 95
112 // REACTIONS 96 // REACTIONS
113 97
114 this._freeUserReactions = createReactions([ 98 this._allReactions = createReactions([
115 this._disablePremiumFeatures,
116 this._openDrawerWithSettingsReaction, 99 this._openDrawerWithSettingsReaction,
117 this._setFeatureEnabledReaction, 100 this._setFeatureEnabledReaction,
118 this._setIsPremiumFeatureReaction,
119 this._cleanupInvalidServiceReferences, 101 this._cleanupInvalidServiceReferences,
120 ]);
121 this._premiumUserReactions = createReactions([
122 this._setActiveServiceOnWorkspaceSwitchReaction, 102 this._setActiveServiceOnWorkspaceSwitchReaction,
123 this._activateLastUsedWorkspaceReaction, 103 this._activateLastUsedWorkspaceReaction,
124 this._setWorkspaceBeingEditedReaction, 104 this._setWorkspaceBeingEditedReaction,
125 ]); 105 ]);
126 this._allReactions = this._freeUserReactions.concat(
127 this._premiumUserReactions,
128 );
129
130 this._registerReactions(this._allReactions); 106 this._registerReactions(this._allReactions);
131 107
132 getUserWorkspacesRequest.execute(); 108 getUserWorkspacesRequest.execute();
@@ -273,13 +249,6 @@ export default class WorkspacesStore extends FeatureStore {
273 this.isFeatureEnabled = isWorkspaceEnabled; 249 this.isFeatureEnabled = isWorkspaceEnabled;
274 }; 250 };
275 251
276 _setIsPremiumFeatureReaction = () => {
277 // const { features } = this.stores;
278 // const { isWorkspaceIncludedInCurrentPlan } = features.features;
279 // this.isPremiumFeature = !isWorkspaceIncludedInCurrentPlan;
280 // this.isPremiumUpgradeRequired = !isWorkspaceIncludedInCurrentPlan;
281 };
282
283 _setWorkspaceBeingEditedReaction = () => { 252 _setWorkspaceBeingEditedReaction = () => {
284 const { pathname } = this.stores.router.location; 253 const { pathname } = this.stores.router.location;
285 const match = matchRoute('/settings/workspaces/edit/:id', pathname); 254 const match = matchRoute('/settings/workspaces/edit/:id', pathname);
@@ -357,16 +326,4 @@ export default class WorkspacesStore extends FeatureStore {
357 }); 326 });
358 }); 327 });
359 }; 328 };
360
361 _disablePremiumFeatures = () => {
362 if (!this.isUserAllowedToUseFeature) {
363 debug('_disablePremiumFeatures');
364 this._stopActions(this._premiumUserActions);
365 this._stopReactions(this._premiumUserReactions);
366 this.reset();
367 } else {
368 this._startActions(this._premiumUserActions);
369 this._startReactions(this._premiumUserReactions);
370 }
371 };
372} 329}
diff --git a/src/helpers/plan-helpers.js b/src/helpers/plan-helpers.js
deleted file mode 100644
index b474f8bbd..000000000
--- a/src/helpers/plan-helpers.js
+++ /dev/null
@@ -1,53 +0,0 @@
1import { defineMessages } from 'react-intl';
2import { PLANS_MAPPING, PLANS } from '../config';
3
4const messages = defineMessages({
5 [PLANS.PRO]: {
6 id: 'pricing.plan.pro',
7 defaultMessage: '!!!Professional',
8 },
9 [PLANS.PERSONAL]: {
10 id: 'pricing.plan.personal',
11 defaultMessage: '!!!Personal',
12 },
13 [PLANS.FREE]: {
14 id: 'pricing.plan.free',
15 defaultMessage: '!!!Free',
16 },
17 [PLANS.LEGACY]: {
18 id: 'pricing.plan.legacy',
19 defaultMessage: '!!!Premium',
20 },
21});
22
23export function cleanupPlanId(id) {
24 return id.replace(/(.*)-x[0-9]/, '$1');
25}
26
27export function i18nPlanName(planId, intl) {
28 if (!planId) {
29 throw new Error('planId is required');
30 }
31
32 if (!intl) {
33 throw new Error('intl context is required');
34 }
35
36 const id = cleanupPlanId(planId);
37
38 const plan = PLANS_MAPPING[id];
39
40 return intl.formatMessage(messages[plan]);
41}
42
43export function getPlan(planId) {
44 if (!planId) {
45 throw new Error('planId is required');
46 }
47
48 const id = cleanupPlanId(planId);
49
50 const plan = PLANS_MAPPING[id];
51
52 return plan;
53}
diff --git a/src/i18n/globalMessages.js b/src/i18n/globalMessages.js
index 190417536..cc219957a 100644
--- a/src/i18n/globalMessages.js
+++ b/src/i18n/globalMessages.js
@@ -33,8 +33,4 @@ export default defineMessages({
33 id: 'global.userAgentHelp', 33 id: 'global.userAgentHelp',
34 defaultMessage: "!!!Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 34 defaultMessage: "!!!Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
35 }, 35 },
36 proRequired: {
37 id: 'global.franzProRequired',
38 defaultMessage: '!!!Franz Professional Required',
39 },
40}); 36});
diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json
index e2af263a5..ef9e3ecee 100644
--- a/src/i18n/locales/ar.json
+++ b/src/i18n/locales/ar.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "أوه لا! فقد فردي الاتصال بـ.", 12 "connectionLostBanner.message": "أوه لا! فقد فردي الاتصال بـ.",
13 "feature.announcements.changelog.headline": "تغيرات في فريدي {version}", 13 "feature.announcements.changelog.headline": "تغيرات في فريدي {version}",
14 "feature.debugger.title": "نشر معلومات تصحيح الأخطاء", 14 "feature.debugger.title": "نشر معلومات تصحيح الأخطاء",
15 "feature.delayApp.headline": "رجاء قيم بشراء رخصة الدعم لبرنامج فريدي للتخلص من وقت الانتظار",
16 "feature.delayApp.text": "فريدي سوف يستكمل خلال {seconds} ثانية.",
17 "feature.delayApp.trial.action": "أجل, أريد الحصول على 14 يوم تجريبي مجاني من برنامج فريدي بروفشنال",
18 "feature.delayApp.trial.actionShort": "تفعيل الفتره التجريبية لرنامج فريدي بروفشنال",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "الحصول على ترخيص الدعم لفردي",
21 "feature.delayApp.upgrade.actionShort": "ترقية الحساب",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "إلغاء", 16 "feature.nightlyBuilds.cancel": "إلغاء",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
diff --git a/src/i18n/locales/bg.json b/src/i18n/locales/bg.json
index a2a28c856..188ad3922 100644
--- a/src/i18n/locales/bg.json
+++ b/src/i18n/locales/bg.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 8 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free", 9 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 10 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 561fe3c4c..2cdc3e136 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Oh no! Ferdi ha perdut la connexió a {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perdut la connexió a {name}.",
13 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}", 13 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}",
14 "feature.debugger.title": "Registra la informació de depuració", 14 "feature.debugger.title": "Registra la informació de depuració",
15 "feature.delayApp.headline": "Si us plau, compra una llicència de suport per a Ferdi per saltar l'espera",
16 "feature.delayApp.text": "Ferdi continuarà en {seconds} segons",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Aconsegueix una llicència de suport per a Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Millorar el teu compte",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel·la", 16 "feature.nightlyBuilds.cancel": "Cancel·la",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 6f76f74ea..0d2e55ae2 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nein! Ferdi hat die Verbindung zu {name} verloren.", 12 "connectionLostBanner.message": "Oh nein! Ferdi hat die Verbindung zu {name} verloren.",
13 "feature.announcements.changelog.headline": "Was ist neu in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Was ist neu in Ferdi {version}",
14 "feature.debugger.title": "Debug-Informationen veröffentlichen", 14 "feature.debugger.title": "Debug-Informationen veröffentlichen",
15 "feature.delayApp.headline": "Bitte kaufe eine Ferdi Supporter Lizenz, um das Warten zu überspringen",
16 "feature.delayApp.text": "In {seconds} Sekunden geht's weiter!",
17 "feature.delayApp.trial.action": "Ja, ich möchte Ferdi Professional 14 Tage gratis testen",
18 "feature.delayApp.trial.actionShort": "Aktiviere die kostenlose Ferdi Professional Testlizenz",
19 "feature.delayApp.trial.headline": "Hol dir die kostenlose Ferdi Professional Testlizenz und es geht ohne Warten weiter",
20 "feature.delayApp.upgrade.action": "Hol dir Ferdi Premium",
21 "feature.delayApp.upgrade.actionShort": "Account erweitern",
22 "feature.nightlyBuilds.activate": "Aktivieren", 15 "feature.nightlyBuilds.activate": "Aktivieren",
23 "feature.nightlyBuilds.cancel": "Abbrechen", 16 "feature.nightlyBuilds.cancel": "Abbrechen",
24 "feature.nightlyBuilds.info": "Nightly builds sind experimentelle Versionen von Ferdi die unfertige Funktionen enthalten kann. Nightly builds werden hauptsächlich von Entwicklern genutzt um neu entwickelte Features zu testen und zu sehen wie sie sich in der finalen Version verhalten. Wenn du nicht genau weisst was du tust, empfehlen wir dir Nightly Builds nicht zu aktivieren.", 17 "feature.nightlyBuilds.info": "Nightly builds sind experimentelle Versionen von Ferdi die unfertige Funktionen enthalten kann. Nightly builds werden hauptsächlich von Entwicklern genutzt um neu entwickelte Features zu testen und zu sehen wie sie sich in der finalen Version verhalten. Wenn du nicht genau weisst was du tust, empfehlen wir dir Nightly Builds nicht zu aktivieren.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Auf kostenlosen Plan herunterstufen",
27 "feature.planSelection.cta.stayOnFree": "Auf kostenlosem Plan bleiben",
28 "feature.planSelection.cta.trial": "Starte meine 14-Tage Testversion",
29 "feature.planSelection.cta.upgradePersonal": "Personal Plan wählen",
30 "feature.planSelection.cta.upgradePro": "Professional Plan wählen",
31 "feature.planSelection.free.text": "Einfache Funktionalität",
32 "feature.planSelection.fullFeatureList": "Kompletter Vergleich aller Pläne",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Auf kostenlosen Plan herunterstufen",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Personal Plan wählen",
35 "feature.planSelection.fullscreen.dialog.message": "Du bist dabei, auf ein kostenloses Konto herunterzustufen. Bist du sicher? Klicke stattdessen hier, um mehr Dienste und Funktionen für nur {currency}{price} pro Monat zu erhalten.",
36 "feature.planSelection.fullscreen.dialog.title": "Deinen Ferdi Plan herunterstufen",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Bist du bereit zu wählen, {name}",
39 "feature.planSelection.personal.text": "Weitere Dienste, keine Wartezeiten - ideal für den persönlichen Gebrauch.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Beim Veröffentlichen der Debug-Informationen ist ein Fehler aufgetreten. Bitte versuche es später noch einmal oder sehe dir die Konsole für weitere Informationen an.", 19 "feature.publishDebugInfo.error": "Beim Veröffentlichen der Debug-Informationen ist ein Fehler aufgetreten. Bitte versuche es später noch einmal oder sehe dir die Konsole für weitere Informationen an.",
43 "feature.publishDebugInfo.info": "Die Veröffentlichung deiner Debug-Informationen hilft uns, Probleme und Fehler in Ferdi zu finden. Indem du deine Debug-Informationen veröffentlichst, akzeptierst du die Datenschutzbestimmungen und Nutzungsbedingungen vom Ferdi Debugger", 20 "feature.publishDebugInfo.info": "Die Veröffentlichung deiner Debug-Informationen hilft uns, Probleme und Fehler in Ferdi zu finden. Indem du deine Debug-Informationen veröffentlichst, akzeptierst du die Datenschutzbestimmungen und Nutzungsbedingungen vom Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Datenschutzrichtlinien", 21 "feature.publishDebugInfo.privacy": "Datenschutzrichtlinien",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 370a6fb92..37e065d28 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -661,180 +661,6 @@
661 { 661 {
662 "descriptors": [ 662 "descriptors": [
663 { 663 {
664 "defaultMessage": "!!!Hi {name}, welcome to Franz",
665 "end": {
666 "column": 3,
667 "line": 17
668 },
669 "file": "src/components/auth/Pricing.js",
670 "id": "pricing.trial.headline.pro",
671 "start": {
672 "column": 12,
673 "line": 14
674 }
675 },
676 {
677 "defaultMessage": "!!!We have a special treat for you.",
678 "end": {
679 "column": 3,
680 "line": 21
681 },
682 "file": "src/components/auth/Pricing.js",
683 "id": "pricing.trial.intro.specialTreat",
684 "start": {
685 "column": 16,
686 "line": 18
687 }
688 },
689 {
690 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.",
691 "end": {
692 "column": 3,
693 "line": 25
694 },
695 "file": "src/components/auth/Pricing.js",
696 "id": "pricing.trial.intro.tryPro",
697 "start": {
698 "column": 10,
699 "line": 22
700 }
701 },
702 {
703 "defaultMessage": "!!!Happy messaging,",
704 "end": {
705 "column": 3,
706 "line": 29
707 },
708 "file": "src/components/auth/Pricing.js",
709 "id": "pricing.trial.intro.happyMessaging",
710 "start": {
711 "column": 18,
712 "line": 26
713 }
714 },
715 {
716 "defaultMessage": "!!!No strings attached",
717 "end": {
718 "column": 3,
719 "line": 33
720 },
721 "file": "src/components/auth/Pricing.js",
722 "id": "pricing.trial.terms.headline",
723 "start": {
724 "column": 29,
725 "line": 30
726 }
727 },
728 {
729 "defaultMessage": "!!!No credit card required",
730 "end": {
731 "column": 3,
732 "line": 37
733 },
734 "file": "src/components/auth/Pricing.js",
735 "id": "pricing.trial.terms.noCreditCard",
736 "start": {
737 "column": 16,
738 "line": 34
739 }
740 },
741 {
742 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
743 "end": {
744 "column": 3,
745 "line": 41
746 },
747 "file": "src/components/auth/Pricing.js",
748 "id": "pricing.trial.terms.automaticTrialEnd",
749 "start": {
750 "column": 21,
751 "line": 38
752 }
753 },
754 {
755 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
756 "end": {
757 "column": 3,
758 "line": 45
759 },
760 "file": "src/components/auth/Pricing.js",
761 "id": "pricing.trial.terms.trialWorth",
762 "start": {
763 "column": 14,
764 "line": 42
765 }
766 },
767 {
768 "defaultMessage": "!!!Sorry, we could not activate your trial!",
769 "end": {
770 "column": 3,
771 "line": 49
772 },
773 "file": "src/components/auth/Pricing.js",
774 "id": "pricing.trial.error",
775 "start": {
776 "column": 19,
777 "line": 46
778 }
779 },
780 {
781 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
782 "end": {
783 "column": 3,
784 "line": 53
785 },
786 "file": "src/components/auth/Pricing.js",
787 "id": "pricing.trial.cta.accept",
788 "start": {
789 "column": 13,
790 "line": 50
791 }
792 },
793 {
794 "defaultMessage": "!!!Start using Franz",
795 "end": {
796 "column": 3,
797 "line": 57
798 },
799 "file": "src/components/auth/Pricing.js",
800 "id": "pricing.trial.cta.start",
801 "start": {
802 "column": 12,
803 "line": 54
804 }
805 },
806 {
807 "defaultMessage": "!!!Continue to Ferdi",
808 "end": {
809 "column": 3,
810 "line": 61
811 },
812 "file": "src/components/auth/Pricing.js",
813 "id": "pricing.trial.cta.skip",
814 "start": {
815 "column": 11,
816 "line": 58
817 }
818 },
819 {
820 "defaultMessage": "!!!Franz Professional includes:",
821 "end": {
822 "column": 3,
823 "line": 65
824 },
825 "file": "src/components/auth/Pricing.js",
826 "id": "pricing.trial.features.headline",
827 "start": {
828 "column": 20,
829 "line": 62
830 }
831 }
832 ],
833 "path": "src/components/auth/Pricing.json"
834 },
835 {
836 "descriptors": [
837 {
838 "defaultMessage": "!!!Invite Friends", 664 "defaultMessage": "!!!Invite Friends",
839 "end": { 665 "end": {
840 "column": 3, 666 "column": 3,
@@ -1209,52 +1035,52 @@
1209 "defaultMessage": "!!!Your services have been updated.", 1035 "defaultMessage": "!!!Your services have been updated.",
1210 "end": { 1036 "end": {
1211 "column": 3, 1037 "column": 3,
1212 "line": 35 1038 "line": 32
1213 }, 1039 },
1214 "file": "src/components/layout/AppLayout.js", 1040 "file": "src/components/layout/AppLayout.js",
1215 "id": "infobar.servicesUpdated", 1041 "id": "infobar.servicesUpdated",
1216 "start": { 1042 "start": {
1217 "column": 19, 1043 "column": 19,
1218 "line": 32 1044 "line": 29
1219 } 1045 }
1220 }, 1046 },
1221 { 1047 {
1222 "defaultMessage": "!!!Reload services", 1048 "defaultMessage": "!!!Reload services",
1223 "end": { 1049 "end": {
1224 "column": 3, 1050 "column": 3,
1225 "line": 39 1051 "line": 36
1226 }, 1052 },
1227 "file": "src/components/layout/AppLayout.js", 1053 "file": "src/components/layout/AppLayout.js",
1228 "id": "infobar.buttonReloadServices", 1054 "id": "infobar.buttonReloadServices",
1229 "start": { 1055 "start": {
1230 "column": 24, 1056 "column": 24,
1231 "line": 36 1057 "line": 33
1232 } 1058 }
1233 }, 1059 },
1234 { 1060 {
1235 "defaultMessage": "!!!Could not load services and user information", 1061 "defaultMessage": "!!!Could not load services and user information",
1236 "end": { 1062 "end": {
1237 "column": 3, 1063 "column": 3,
1238 "line": 43 1064 "line": 40
1239 }, 1065 },
1240 "file": "src/components/layout/AppLayout.js", 1066 "file": "src/components/layout/AppLayout.js",
1241 "id": "infobar.requiredRequestsFailed", 1067 "id": "infobar.requiredRequestsFailed",
1242 "start": { 1068 "start": {
1243 "column": 26, 1069 "column": 26,
1244 "line": 40 1070 "line": 37
1245 } 1071 }
1246 }, 1072 },
1247 { 1073 {
1248 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 1074 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
1249 "end": { 1075 "end": {
1250 "column": 3, 1076 "column": 3,
1251 "line": 47 1077 "line": 44
1252 }, 1078 },
1253 "file": "src/components/layout/AppLayout.js", 1079 "file": "src/components/layout/AppLayout.js",
1254 "id": "infobar.authRequestFailed", 1080 "id": "infobar.authRequestFailed",
1255 "start": { 1081 "start": {
1256 "column": 21, 1082 "column": 21,
1257 "line": 44 1083 "line": 41
1258 } 1084 }
1259 } 1085 }
1260 ], 1086 ],
@@ -2075,273 +1901,195 @@
2075 "defaultMessage": "!!!Account", 1901 "defaultMessage": "!!!Account",
2076 "end": { 1902 "end": {
2077 "column": 3, 1903 "column": 3,
2078 "line": 20 1904 "line": 17
2079 }, 1905 },
2080 "file": "src/components/settings/account/AccountDashboard.js", 1906 "file": "src/components/settings/account/AccountDashboard.js",
2081 "id": "settings.account.headline", 1907 "id": "settings.account.headline",
2082 "start": { 1908 "start": {
2083 "column": 12, 1909 "column": 12,
2084 "line": 17 1910 "line": 14
2085 } 1911 }
2086 }, 1912 },
2087 { 1913 {
2088 "defaultMessage": "!!!Your Subscription", 1914 "defaultMessage": "!!!Your Subscription",
2089 "end": { 1915 "end": {
2090 "column": 3, 1916 "column": 3,
2091 "line": 24 1917 "line": 21
2092 }, 1918 },
2093 "file": "src/components/settings/account/AccountDashboard.js", 1919 "file": "src/components/settings/account/AccountDashboard.js",
2094 "id": "settings.account.headlineSubscription", 1920 "id": "settings.account.headlineSubscription",
2095 "start": { 1921 "start": {
2096 "column": 24, 1922 "column": 24,
2097 "line": 21 1923 "line": 18
2098 } 1924 }
2099 }, 1925 },
2100 { 1926 {
2101 "defaultMessage": "!!Danger Zone", 1927 "defaultMessage": "!!Danger Zone",
2102 "end": { 1928 "end": {
2103 "column": 3, 1929 "column": 3,
2104 "line": 28 1930 "line": 25
2105 }, 1931 },
2106 "file": "src/components/settings/account/AccountDashboard.js", 1932 "file": "src/components/settings/account/AccountDashboard.js",
2107 "id": "settings.account.headlineDangerZone", 1933 "id": "settings.account.headlineDangerZone",
2108 "start": { 1934 "start": {
2109 "column": 22, 1935 "column": 22,
2110 "line": 25 1936 "line": 22
2111 } 1937 }
2112 }, 1938 },
2113 { 1939 {
2114 "defaultMessage": "!!!Manage your subscription", 1940 "defaultMessage": "!!!Manage your subscription",
2115 "end": { 1941 "end": {
2116 "column": 3, 1942 "column": 3,
2117 "line": 32 1943 "line": 29
2118 }, 1944 },
2119 "file": "src/components/settings/account/AccountDashboard.js", 1945 "file": "src/components/settings/account/AccountDashboard.js",
2120 "id": "settings.account.manageSubscription.label", 1946 "id": "settings.account.manageSubscription.label",
2121 "start": { 1947 "start": {
2122 "column": 33, 1948 "column": 33,
2123 "line": 29 1949 "line": 26
2124 }
2125 },
2126 {
2127 "defaultMessage": "!!!Upgrade to Franz Professional",
2128 "end": {
2129 "column": 3,
2130 "line": 36
2131 },
2132 "file": "src/components/settings/account/AccountDashboard.js",
2133 "id": "settings.account.upgradeToPro.label",
2134 "start": {
2135 "column": 23,
2136 "line": 33
2137 }
2138 },
2139 {
2140 "defaultMessage": "!!!Basic Account",
2141 "end": {
2142 "column": 3,
2143 "line": 40
2144 },
2145 "file": "src/components/settings/account/AccountDashboard.js",
2146 "id": "settings.account.accountType.basic",
2147 "start": {
2148 "column": 20,
2149 "line": 37
2150 }
2151 },
2152 {
2153 "defaultMessage": "!!!Premium Supporter Account",
2154 "end": {
2155 "column": 3,
2156 "line": 44
2157 },
2158 "file": "src/components/settings/account/AccountDashboard.js",
2159 "id": "settings.account.accountType.premium",
2160 "start": {
2161 "column": 22,
2162 "line": 41
2163 } 1950 }
2164 }, 1951 },
2165 { 1952 {
2166 "defaultMessage": "!!!Edit Account", 1953 "defaultMessage": "!!!Edit Account",
2167 "end": { 1954 "end": {
2168 "column": 3, 1955 "column": 3,
2169 "line": 48 1956 "line": 33
2170 }, 1957 },
2171 "file": "src/components/settings/account/AccountDashboard.js", 1958 "file": "src/components/settings/account/AccountDashboard.js",
2172 "id": "settings.account.account.editButton", 1959 "id": "settings.account.account.editButton",
2173 "start": { 1960 "start": {
2174 "column": 21, 1961 "column": 21,
2175 "line": 45 1962 "line": 30
2176 } 1963 }
2177 }, 1964 },
2178 { 1965 {
2179 "defaultMessage": "!!Invoices", 1966 "defaultMessage": "!!Invoices",
2180 "end": { 1967 "end": {
2181 "column": 3, 1968 "column": 3,
2182 "line": 52 1969 "line": 37
2183 }, 1970 },
2184 "file": "src/components/settings/account/AccountDashboard.js", 1971 "file": "src/components/settings/account/AccountDashboard.js",
2185 "id": "settings.account.headlineInvoices", 1972 "id": "settings.account.headlineInvoices",
2186 "start": { 1973 "start": {
2187 "column": 18, 1974 "column": 18,
2188 "line": 49 1975 "line": 34
2189 } 1976 }
2190 }, 1977 },
2191 { 1978 {
2192 "defaultMessage": "!!!Download", 1979 "defaultMessage": "!!!Download",
2193 "end": { 1980 "end": {
2194 "column": 3, 1981 "column": 3,
2195 "line": 56 1982 "line": 41
2196 }, 1983 },
2197 "file": "src/components/settings/account/AccountDashboard.js", 1984 "file": "src/components/settings/account/AccountDashboard.js",
2198 "id": "settings.account.invoiceDownload", 1985 "id": "settings.account.invoiceDownload",
2199 "start": { 1986 "start": {
2200 "column": 19, 1987 "column": 19,
2201 "line": 53 1988 "line": 38
2202 } 1989 }
2203 }, 1990 },
2204 { 1991 {
2205 "defaultMessage": "!!!Could not load user information", 1992 "defaultMessage": "!!!Could not load user information",
2206 "end": { 1993 "end": {
2207 "column": 3, 1994 "column": 3,
2208 "line": 60 1995 "line": 45
2209 }, 1996 },
2210 "file": "src/components/settings/account/AccountDashboard.js", 1997 "file": "src/components/settings/account/AccountDashboard.js",
2211 "id": "settings.account.userInfoRequestFailed", 1998 "id": "settings.account.userInfoRequestFailed",
2212 "start": { 1999 "start": {
2213 "column": 25, 2000 "column": 25,
2214 "line": 57 2001 "line": 42
2215 } 2002 }
2216 }, 2003 },
2217 { 2004 {
2218 "defaultMessage": "!!!Try again", 2005 "defaultMessage": "!!!Try again",
2219 "end": { 2006 "end": {
2220 "column": 3, 2007 "column": 3,
2221 "line": 64 2008 "line": 49
2222 }, 2009 },
2223 "file": "src/components/settings/account/AccountDashboard.js", 2010 "file": "src/components/settings/account/AccountDashboard.js",
2224 "id": "settings.account.tryReloadUserInfoRequest", 2011 "id": "settings.account.tryReloadUserInfoRequest",
2225 "start": { 2012 "start": {
2226 "column": 28, 2013 "column": 28,
2227 "line": 61 2014 "line": 46
2228 } 2015 }
2229 }, 2016 },
2230 { 2017 {
2231 "defaultMessage": "!!!Delete account", 2018 "defaultMessage": "!!!Delete account",
2232 "end": { 2019 "end": {
2233 "column": 3, 2020 "column": 3,
2234 "line": 68 2021 "line": 53
2235 }, 2022 },
2236 "file": "src/components/settings/account/AccountDashboard.js", 2023 "file": "src/components/settings/account/AccountDashboard.js",
2237 "id": "settings.account.deleteAccount", 2024 "id": "settings.account.deleteAccount",
2238 "start": { 2025 "start": {
2239 "column": 17, 2026 "column": 17,
2240 "line": 65 2027 "line": 50
2241 } 2028 }
2242 }, 2029 },
2243 { 2030 {
2244 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 2031 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
2245 "end": { 2032 "end": {
2246 "column": 3, 2033 "column": 3,
2247 "line": 73 2034 "line": 58
2248 }, 2035 },
2249 "file": "src/components/settings/account/AccountDashboard.js", 2036 "file": "src/components/settings/account/AccountDashboard.js",
2250 "id": "settings.account.deleteInfo", 2037 "id": "settings.account.deleteInfo",
2251 "start": { 2038 "start": {
2252 "column": 14, 2039 "column": 14,
2253 "line": 69 2040 "line": 54
2254 } 2041 }
2255 }, 2042 },
2256 { 2043 {
2257 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 2044 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
2258 "end": { 2045 "end": {
2259 "column": 3, 2046 "column": 3,
2260 "line": 78 2047 "line": 63
2261 }, 2048 },
2262 "file": "src/components/settings/account/AccountDashboard.js", 2049 "file": "src/components/settings/account/AccountDashboard.js",
2263 "id": "settings.account.deleteEmailSent", 2050 "id": "settings.account.deleteEmailSent",
2264 "start": { 2051 "start": {
2265 "column": 19, 2052 "column": 19,
2266 "line": 74 2053 "line": 59
2267 }
2268 },
2269 {
2270 "defaultMessage": "!!!Free Trial",
2271 "end": {
2272 "column": 3,
2273 "line": 82
2274 },
2275 "file": "src/components/settings/account/AccountDashboard.js",
2276 "id": "settings.account.trial",
2277 "start": {
2278 "column": 9,
2279 "line": 79
2280 } 2054 }
2281 }, 2055 },
2282 { 2056 {
2283 "defaultMessage": "!!!Your Franz License:", 2057 "defaultMessage": "!!!Your Franz License:",
2284 "end": { 2058 "end": {
2285 "column": 3, 2059 "column": 3,
2286 "line": 86 2060 "line": 67
2287 }, 2061 },
2288 "file": "src/components/settings/account/AccountDashboard.js", 2062 "file": "src/components/settings/account/AccountDashboard.js",
2289 "id": "settings.account.yourLicense", 2063 "id": "settings.account.yourLicense",
2290 "start": { 2064 "start": {
2291 "column": 15, 2065 "column": 15,
2292 "line": 83 2066 "line": 64
2293 }
2294 },
2295 {
2296 "defaultMessage": "!!!Your free trial ends in {duration}.",
2297 "end": {
2298 "column": 3,
2299 "line": 90
2300 },
2301 "file": "src/components/settings/account/AccountDashboard.js",
2302 "id": "settings.account.trialEndsIn",
2303 "start": {
2304 "column": 15,
2305 "line": 87
2306 }
2307 },
2308 {
2309 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
2310 "end": {
2311 "column": 3,
2312 "line": 95
2313 },
2314 "file": "src/components/settings/account/AccountDashboard.js",
2315 "id": "settings.account.trialUpdateBillingInfo",
2316 "start": {
2317 "column": 33,
2318 "line": 91
2319 } 2067 }
2320 }, 2068 },
2321 { 2069 {
2322 "defaultMessage": "Account is unavailable", 2070 "defaultMessage": "Account is unavailable",
2323 "end": { 2071 "end": {
2324 "column": 3, 2072 "column": 3,
2325 "line": 99 2073 "line": 71
2326 }, 2074 },
2327 "file": "src/components/settings/account/AccountDashboard.js", 2075 "file": "src/components/settings/account/AccountDashboard.js",
2328 "id": "settings.account.accountUnavailable", 2076 "id": "settings.account.accountUnavailable",
2329 "start": { 2077 "start": {
2330 "column": 22, 2078 "column": 22,
2331 "line": 96 2079 "line": 68
2332 } 2080 }
2333 }, 2081 },
2334 { 2082 {
2335 "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.", 2083 "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.",
2336 "end": { 2084 "end": {
2337 "column": 3, 2085 "column": 3,
2338 "line": 103 2086 "line": 75
2339 }, 2087 },
2340 "file": "src/components/settings/account/AccountDashboard.js", 2088 "file": "src/components/settings/account/AccountDashboard.js",
2341 "id": "settings.account.accountUnavailableInfo", 2089 "id": "settings.account.accountUnavailableInfo",
2342 "start": { 2090 "start": {
2343 "column": 26, 2091 "column": 26,
2344 "line": 100 2092 "line": 72
2345 } 2093 }
2346 } 2094 }
2347 ], 2095 ],
@@ -2353,104 +2101,104 @@
2353 "defaultMessage": "!!!Available services", 2101 "defaultMessage": "!!!Available services",
2354 "end": { 2102 "end": {
2355 "column": 3, 2103 "column": 3,
2356 "line": 20 2104 "line": 18
2357 }, 2105 },
2358 "file": "src/components/settings/navigation/SettingsNavigation.js", 2106 "file": "src/components/settings/navigation/SettingsNavigation.js",
2359 "id": "settings.navigation.availableServices", 2107 "id": "settings.navigation.availableServices",
2360 "start": { 2108 "start": {
2361 "column": 21, 2109 "column": 21,
2362 "line": 17 2110 "line": 15
2363 } 2111 }
2364 }, 2112 },
2365 { 2113 {
2366 "defaultMessage": "!!!Your services", 2114 "defaultMessage": "!!!Your services",
2367 "end": { 2115 "end": {
2368 "column": 3, 2116 "column": 3,
2369 "line": 24 2117 "line": 22
2370 }, 2118 },
2371 "file": "src/components/settings/navigation/SettingsNavigation.js", 2119 "file": "src/components/settings/navigation/SettingsNavigation.js",
2372 "id": "settings.navigation.yourServices", 2120 "id": "settings.navigation.yourServices",
2373 "start": { 2121 "start": {
2374 "column": 16, 2122 "column": 16,
2375 "line": 21 2123 "line": 19
2376 } 2124 }
2377 }, 2125 },
2378 { 2126 {
2379 "defaultMessage": "!!!Your workspaces", 2127 "defaultMessage": "!!!Your workspaces",
2380 "end": { 2128 "end": {
2381 "column": 3, 2129 "column": 3,
2382 "line": 28 2130 "line": 26
2383 }, 2131 },
2384 "file": "src/components/settings/navigation/SettingsNavigation.js", 2132 "file": "src/components/settings/navigation/SettingsNavigation.js",
2385 "id": "settings.navigation.yourWorkspaces", 2133 "id": "settings.navigation.yourWorkspaces",
2386 "start": { 2134 "start": {
2387 "column": 18, 2135 "column": 18,
2388 "line": 25 2136 "line": 23
2389 } 2137 }
2390 }, 2138 },
2391 { 2139 {
2392 "defaultMessage": "!!!Account", 2140 "defaultMessage": "!!!Account",
2393 "end": { 2141 "end": {
2394 "column": 3, 2142 "column": 3,
2395 "line": 32 2143 "line": 30
2396 }, 2144 },
2397 "file": "src/components/settings/navigation/SettingsNavigation.js", 2145 "file": "src/components/settings/navigation/SettingsNavigation.js",
2398 "id": "settings.navigation.account", 2146 "id": "settings.navigation.account",
2399 "start": { 2147 "start": {
2400 "column": 11, 2148 "column": 11,
2401 "line": 29 2149 "line": 27
2402 } 2150 }
2403 }, 2151 },
2404 { 2152 {
2405 "defaultMessage": "!!!Manage Team", 2153 "defaultMessage": "!!!Manage Team",
2406 "end": { 2154 "end": {
2407 "column": 3, 2155 "column": 3,
2408 "line": 36 2156 "line": 34
2409 }, 2157 },
2410 "file": "src/components/settings/navigation/SettingsNavigation.js", 2158 "file": "src/components/settings/navigation/SettingsNavigation.js",
2411 "id": "settings.navigation.team", 2159 "id": "settings.navigation.team",
2412 "start": { 2160 "start": {
2413 "column": 8, 2161 "column": 8,
2414 "line": 33 2162 "line": 31
2415 } 2163 }
2416 }, 2164 },
2417 { 2165 {
2418 "defaultMessage": "!!!Settings", 2166 "defaultMessage": "!!!Settings",
2419 "end": { 2167 "end": {
2420 "column": 3, 2168 "column": 3,
2421 "line": 40 2169 "line": 38
2422 }, 2170 },
2423 "file": "src/components/settings/navigation/SettingsNavigation.js", 2171 "file": "src/components/settings/navigation/SettingsNavigation.js",
2424 "id": "settings.navigation.settings", 2172 "id": "settings.navigation.settings",
2425 "start": { 2173 "start": {
2426 "column": 12, 2174 "column": 12,
2427 "line": 37 2175 "line": 35
2428 } 2176 }
2429 }, 2177 },
2430 { 2178 {
2431 "defaultMessage": "!!!About Ferdi", 2179 "defaultMessage": "!!!About Ferdi",
2432 "end": { 2180 "end": {
2433 "column": 3, 2181 "column": 3,
2434 "line": 44 2182 "line": 42
2435 }, 2183 },
2436 "file": "src/components/settings/navigation/SettingsNavigation.js", 2184 "file": "src/components/settings/navigation/SettingsNavigation.js",
2437 "id": "settings.navigation.supportFerdi", 2185 "id": "settings.navigation.supportFerdi",
2438 "start": { 2186 "start": {
2439 "column": 16, 2187 "column": 16,
2440 "line": 41 2188 "line": 39
2441 } 2189 }
2442 }, 2190 },
2443 { 2191 {
2444 "defaultMessage": "!!!Logout", 2192 "defaultMessage": "!!!Logout",
2445 "end": { 2193 "end": {
2446 "column": 3, 2194 "column": 3,
2447 "line": 48 2195 "line": 46
2448 }, 2196 },
2449 "file": "src/components/settings/navigation/SettingsNavigation.js", 2197 "file": "src/components/settings/navigation/SettingsNavigation.js",
2450 "id": "settings.navigation.logout", 2198 "id": "settings.navigation.logout",
2451 "start": { 2199 "start": {
2452 "column": 10, 2200 "column": 10,
2453 "line": 45 2201 "line": 43
2454 } 2202 }
2455 } 2203 }
2456 ], 2204 ],
@@ -2462,182 +2210,182 @@
2462 "defaultMessage": "!!!Available Services", 2210 "defaultMessage": "!!!Available Services",
2463 "end": { 2211 "end": {
2464 "column": 3, 2212 "column": 3,
2465 "line": 24 2213 "line": 22
2466 }, 2214 },
2467 "file": "src/components/settings/recipes/RecipesDashboard.js", 2215 "file": "src/components/settings/recipes/RecipesDashboard.js",
2468 "id": "settings.recipes.headline", 2216 "id": "settings.recipes.headline",
2469 "start": { 2217 "start": {
2470 "column": 12, 2218 "column": 12,
2471 "line": 21 2219 "line": 19
2472 } 2220 }
2473 }, 2221 },
2474 { 2222 {
2475 "defaultMessage": "!!!Search service", 2223 "defaultMessage": "!!!Search service",
2476 "end": { 2224 "end": {
2477 "column": 3, 2225 "column": 3,
2478 "line": 28 2226 "line": 26
2479 }, 2227 },
2480 "file": "src/components/settings/recipes/RecipesDashboard.js", 2228 "file": "src/components/settings/recipes/RecipesDashboard.js",
2481 "id": "settings.searchService", 2229 "id": "settings.searchService",
2482 "start": { 2230 "start": {
2483 "column": 17, 2231 "column": 17,
2484 "line": 25 2232 "line": 23
2485 } 2233 }
2486 }, 2234 },
2487 { 2235 {
2488 "defaultMessage": "!!!Most popular", 2236 "defaultMessage": "!!!Most popular",
2489 "end": { 2237 "end": {
2490 "column": 3, 2238 "column": 3,
2491 "line": 32 2239 "line": 30
2492 }, 2240 },
2493 "file": "src/components/settings/recipes/RecipesDashboard.js", 2241 "file": "src/components/settings/recipes/RecipesDashboard.js",
2494 "id": "settings.recipes.mostPopular", 2242 "id": "settings.recipes.mostPopular",
2495 "start": { 2243 "start": {
2496 "column": 22, 2244 "column": 22,
2497 "line": 29 2245 "line": 27
2498 } 2246 }
2499 }, 2247 },
2500 { 2248 {
2501 "defaultMessage": "!!!All services", 2249 "defaultMessage": "!!!All services",
2502 "end": { 2250 "end": {
2503 "column": 3, 2251 "column": 3,
2504 "line": 36 2252 "line": 34
2505 }, 2253 },
2506 "file": "src/components/settings/recipes/RecipesDashboard.js", 2254 "file": "src/components/settings/recipes/RecipesDashboard.js",
2507 "id": "settings.recipes.all", 2255 "id": "settings.recipes.all",
2508 "start": { 2256 "start": {
2509 "column": 14, 2257 "column": 14,
2510 "line": 33 2258 "line": 31
2511 } 2259 }
2512 }, 2260 },
2513 { 2261 {
2514 "defaultMessage": "!!!Custom Services", 2262 "defaultMessage": "!!!Custom Services",
2515 "end": { 2263 "end": {
2516 "column": 3, 2264 "column": 3,
2517 "line": 40 2265 "line": 38
2518 }, 2266 },
2519 "file": "src/components/settings/recipes/RecipesDashboard.js", 2267 "file": "src/components/settings/recipes/RecipesDashboard.js",
2520 "id": "settings.recipes.custom", 2268 "id": "settings.recipes.custom",
2521 "start": { 2269 "start": {
2522 "column": 17, 2270 "column": 17,
2523 "line": 37 2271 "line": 35
2524 } 2272 }
2525 }, 2273 },
2526 { 2274 {
2527 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 2275 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
2528 "end": { 2276 "end": {
2529 "column": 3, 2277 "column": 3,
2530 "line": 44 2278 "line": 42
2531 }, 2279 },
2532 "file": "src/components/settings/recipes/RecipesDashboard.js", 2280 "file": "src/components/settings/recipes/RecipesDashboard.js",
2533 "id": "settings.recipes.nothingFound", 2281 "id": "settings.recipes.nothingFound",
2534 "start": { 2282 "start": {
2535 "column": 16, 2283 "column": 16,
2536 "line": 41 2284 "line": 39
2537 } 2285 }
2538 }, 2286 },
2539 { 2287 {
2540 "defaultMessage": "!!!Service successfully added", 2288 "defaultMessage": "!!!Service successfully added",
2541 "end": { 2289 "end": {
2542 "column": 3, 2290 "column": 3,
2543 "line": 48 2291 "line": 46
2544 }, 2292 },
2545 "file": "src/components/settings/recipes/RecipesDashboard.js", 2293 "file": "src/components/settings/recipes/RecipesDashboard.js",
2546 "id": "settings.recipes.servicesSuccessfulAddedInfo", 2294 "id": "settings.recipes.servicesSuccessfulAddedInfo",
2547 "start": { 2295 "start": {
2548 "column": 31, 2296 "column": 31,
2549 "line": 45 2297 "line": 43
2550 } 2298 }
2551 }, 2299 },
2552 { 2300 {
2553 "defaultMessage": "!!!Missing a service?", 2301 "defaultMessage": "!!!Missing a service?",
2554 "end": { 2302 "end": {
2555 "column": 3, 2303 "column": 3,
2556 "line": 52 2304 "line": 50
2557 }, 2305 },
2558 "file": "src/components/settings/recipes/RecipesDashboard.js", 2306 "file": "src/components/settings/recipes/RecipesDashboard.js",
2559 "id": "settings.recipes.missingService", 2307 "id": "settings.recipes.missingService",
2560 "start": { 2308 "start": {
2561 "column": 18, 2309 "column": 18,
2562 "line": 49 2310 "line": 47
2563 } 2311 }
2564 }, 2312 },
2565 { 2313 {
2566 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:", 2314 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
2567 "end": { 2315 "end": {
2568 "column": 3, 2316 "column": 3,
2569 "line": 56 2317 "line": 54
2570 }, 2318 },
2571 "file": "src/components/settings/recipes/RecipesDashboard.js", 2319 "file": "src/components/settings/recipes/RecipesDashboard.js",
2572 "id": "settings.recipes.customService.intro", 2320 "id": "settings.recipes.customService.intro",
2573 "start": { 2321 "start": {
2574 "column": 21, 2322 "column": 21,
2575 "line": 53 2323 "line": 51
2576 } 2324 }
2577 }, 2325 },
2578 { 2326 {
2579 "defaultMessage": "!!!Open directory", 2327 "defaultMessage": "!!!Open directory",
2580 "end": { 2328 "end": {
2581 "column": 3, 2329 "column": 3,
2582 "line": 60 2330 "line": 58
2583 }, 2331 },
2584 "file": "src/components/settings/recipes/RecipesDashboard.js", 2332 "file": "src/components/settings/recipes/RecipesDashboard.js",
2585 "id": "settings.recipes.customService.openFolder", 2333 "id": "settings.recipes.customService.openFolder",
2586 "start": { 2334 "start": {
2587 "column": 14, 2335 "column": 14,
2588 "line": 57 2336 "line": 55
2589 } 2337 }
2590 }, 2338 },
2591 { 2339 {
2592 "defaultMessage": "!!!Developer Documentation", 2340 "defaultMessage": "!!!Developer Documentation",
2593 "end": { 2341 "end": {
2594 "column": 3, 2342 "column": 3,
2595 "line": 64 2343 "line": 62
2596 }, 2344 },
2597 "file": "src/components/settings/recipes/RecipesDashboard.js", 2345 "file": "src/components/settings/recipes/RecipesDashboard.js",
2598 "id": "settings.recipes.customService.openDevDocs", 2346 "id": "settings.recipes.customService.openDevDocs",
2599 "start": { 2347 "start": {
2600 "column": 15, 2348 "column": 15,
2601 "line": 61 2349 "line": 59
2602 } 2350 }
2603 }, 2351 },
2604 { 2352 {
2605 "defaultMessage": "!!!Custom 3rd Party Recipes", 2353 "defaultMessage": "!!!Custom 3rd Party Recipes",
2606 "end": { 2354 "end": {
2607 "column": 3, 2355 "column": 3,
2608 "line": 68 2356 "line": 66
2609 }, 2357 },
2610 "file": "src/components/settings/recipes/RecipesDashboard.js", 2358 "file": "src/components/settings/recipes/RecipesDashboard.js",
2611 "id": "settings.recipes.customService.headline.customRecipes", 2359 "id": "settings.recipes.customService.headline.customRecipes",
2612 "start": { 2360 "start": {
2613 "column": 25, 2361 "column": 25,
2614 "line": 65 2362 "line": 63
2615 } 2363 }
2616 }, 2364 },
2617 { 2365 {
2618 "defaultMessage": "!!!Community 3rd Party Recipes", 2366 "defaultMessage": "!!!Community 3rd Party Recipes",
2619 "end": { 2367 "end": {
2620 "column": 3, 2368 "column": 3,
2621 "line": 72 2369 "line": 70
2622 }, 2370 },
2623 "file": "src/components/settings/recipes/RecipesDashboard.js", 2371 "file": "src/components/settings/recipes/RecipesDashboard.js",
2624 "id": "settings.recipes.customService.headline.communityRecipes", 2372 "id": "settings.recipes.customService.headline.communityRecipes",
2625 "start": { 2373 "start": {
2626 "column": 28, 2374 "column": 28,
2627 "line": 69 2375 "line": 67
2628 } 2376 }
2629 }, 2377 },
2630 { 2378 {
2631 "defaultMessage": "!!!Your Development Service Recipes", 2379 "defaultMessage": "!!!Your Development Service Recipes",
2632 "end": { 2380 "end": {
2633 "column": 3, 2381 "column": 3,
2634 "line": 76 2382 "line": 74
2635 }, 2383 },
2636 "file": "src/components/settings/recipes/RecipesDashboard.js", 2384 "file": "src/components/settings/recipes/RecipesDashboard.js",
2637 "id": "settings.recipes.customService.headline.devRecipes", 2385 "id": "settings.recipes.customService.headline.devRecipes",
2638 "start": { 2386 "start": {
2639 "column": 22, 2387 "column": 22,
2640 "line": 73 2388 "line": 71
2641 } 2389 }
2642 } 2390 }
2643 ], 2391 ],
@@ -2649,364 +2397,338 @@
2649 "defaultMessage": "!!!Save service", 2397 "defaultMessage": "!!!Save service",
2650 "end": { 2398 "end": {
2651 "column": 3, 2399 "column": 3,
2652 "line": 30 2400 "line": 26
2653 }, 2401 },
2654 "file": "src/components/settings/services/EditServiceForm.js", 2402 "file": "src/components/settings/services/EditServiceForm.js",
2655 "id": "settings.service.form.saveButton", 2403 "id": "settings.service.form.saveButton",
2656 "start": { 2404 "start": {
2657 "column": 15, 2405 "column": 15,
2658 "line": 27 2406 "line": 23
2659 } 2407 }
2660 }, 2408 },
2661 { 2409 {
2662 "defaultMessage": "!!!Delete Service", 2410 "defaultMessage": "!!!Delete Service",
2663 "end": { 2411 "end": {
2664 "column": 3, 2412 "column": 3,
2665 "line": 34 2413 "line": 30
2666 }, 2414 },
2667 "file": "src/components/settings/services/EditServiceForm.js", 2415 "file": "src/components/settings/services/EditServiceForm.js",
2668 "id": "settings.service.form.deleteButton", 2416 "id": "settings.service.form.deleteButton",
2669 "start": { 2417 "start": {
2670 "column": 17, 2418 "column": 17,
2671 "line": 31 2419 "line": 27
2672 } 2420 }
2673 }, 2421 },
2674 { 2422 {
2675 "defaultMessage": "!!!Open darkmode.css", 2423 "defaultMessage": "!!!Open darkmode.css",
2676 "end": { 2424 "end": {
2677 "column": 3, 2425 "column": 3,
2678 "line": 38 2426 "line": 34
2679 }, 2427 },
2680 "file": "src/components/settings/services/EditServiceForm.js", 2428 "file": "src/components/settings/services/EditServiceForm.js",
2681 "id": "settings.service.form.openDarkmodeCss", 2429 "id": "settings.service.form.openDarkmodeCss",
2682 "start": { 2430 "start": {
2683 "column": 19, 2431 "column": 19,
2684 "line": 35 2432 "line": 31
2685 } 2433 }
2686 }, 2434 },
2687 { 2435 {
2688 "defaultMessage": "!!!Open user.css", 2436 "defaultMessage": "!!!Open user.css",
2689 "end": { 2437 "end": {
2690 "column": 3, 2438 "column": 3,
2691 "line": 42 2439 "line": 38
2692 }, 2440 },
2693 "file": "src/components/settings/services/EditServiceForm.js", 2441 "file": "src/components/settings/services/EditServiceForm.js",
2694 "id": "settings.service.form.openUserCss", 2442 "id": "settings.service.form.openUserCss",
2695 "start": { 2443 "start": {
2696 "column": 15, 2444 "column": 15,
2697 "line": 39 2445 "line": 35
2698 } 2446 }
2699 }, 2447 },
2700 { 2448 {
2701 "defaultMessage": "!!!Open user.js", 2449 "defaultMessage": "!!!Open user.js",
2702 "end": { 2450 "end": {
2703 "column": 3, 2451 "column": 3,
2704 "line": 46 2452 "line": 42
2705 }, 2453 },
2706 "file": "src/components/settings/services/EditServiceForm.js", 2454 "file": "src/components/settings/services/EditServiceForm.js",
2707 "id": "settings.service.form.openUserJs", 2455 "id": "settings.service.form.openUserJs",
2708 "start": { 2456 "start": {
2709 "column": 14, 2457 "column": 14,
2710 "line": 43 2458 "line": 39
2711 } 2459 }
2712 }, 2460 },
2713 { 2461 {
2714 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 2462 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
2715 "end": { 2463 "end": {
2716 "column": 3, 2464 "column": 3,
2717 "line": 50 2465 "line": 46
2718 }, 2466 },
2719 "file": "src/components/settings/services/EditServiceForm.js", 2467 "file": "src/components/settings/services/EditServiceForm.js",
2720 "id": "settings.service.form.recipeFileInfo", 2468 "id": "settings.service.form.recipeFileInfo",
2721 "start": { 2469 "start": {
2722 "column": 18, 2470 "column": 18,
2723 "line": 47 2471 "line": 43
2724 } 2472 }
2725 }, 2473 },
2726 { 2474 {
2727 "defaultMessage": "!!!Available services", 2475 "defaultMessage": "!!!Available services",
2728 "end": { 2476 "end": {
2729 "column": 3, 2477 "column": 3,
2730 "line": 54 2478 "line": 50
2731 }, 2479 },
2732 "file": "src/components/settings/services/EditServiceForm.js", 2480 "file": "src/components/settings/services/EditServiceForm.js",
2733 "id": "settings.service.form.availableServices", 2481 "id": "settings.service.form.availableServices",
2734 "start": { 2482 "start": {
2735 "column": 21, 2483 "column": 21,
2736 "line": 51 2484 "line": 47
2737 } 2485 }
2738 }, 2486 },
2739 { 2487 {
2740 "defaultMessage": "!!!Your services", 2488 "defaultMessage": "!!!Your services",
2741 "end": { 2489 "end": {
2742 "column": 3, 2490 "column": 3,
2743 "line": 58 2491 "line": 54
2744 }, 2492 },
2745 "file": "src/components/settings/services/EditServiceForm.js", 2493 "file": "src/components/settings/services/EditServiceForm.js",
2746 "id": "settings.service.form.yourServices", 2494 "id": "settings.service.form.yourServices",
2747 "start": { 2495 "start": {
2748 "column": 16, 2496 "column": 16,
2749 "line": 55 2497 "line": 51
2750 } 2498 }
2751 }, 2499 },
2752 { 2500 {
2753 "defaultMessage": "!!!Add {name}", 2501 "defaultMessage": "!!!Add {name}",
2754 "end": { 2502 "end": {
2755 "column": 3, 2503 "column": 3,
2756 "line": 62 2504 "line": 58
2757 }, 2505 },
2758 "file": "src/components/settings/services/EditServiceForm.js", 2506 "file": "src/components/settings/services/EditServiceForm.js",
2759 "id": "settings.service.form.addServiceHeadline", 2507 "id": "settings.service.form.addServiceHeadline",
2760 "start": { 2508 "start": {
2761 "column": 22, 2509 "column": 22,
2762 "line": 59 2510 "line": 55
2763 } 2511 }
2764 }, 2512 },
2765 { 2513 {
2766 "defaultMessage": "!!!Edit {name}", 2514 "defaultMessage": "!!!Edit {name}",
2767 "end": { 2515 "end": {
2768 "column": 3, 2516 "column": 3,
2769 "line": 66 2517 "line": 62
2770 }, 2518 },
2771 "file": "src/components/settings/services/EditServiceForm.js", 2519 "file": "src/components/settings/services/EditServiceForm.js",
2772 "id": "settings.service.form.editServiceHeadline", 2520 "id": "settings.service.form.editServiceHeadline",
2773 "start": { 2521 "start": {
2774 "column": 23, 2522 "column": 23,
2775 "line": 63 2523 "line": 59
2776 } 2524 }
2777 }, 2525 },
2778 { 2526 {
2779 "defaultMessage": "!!!Hosted", 2527 "defaultMessage": "!!!Hosted",
2780 "end": { 2528 "end": {
2781 "column": 3, 2529 "column": 3,
2782 "line": 70 2530 "line": 66
2783 }, 2531 },
2784 "file": "src/components/settings/services/EditServiceForm.js", 2532 "file": "src/components/settings/services/EditServiceForm.js",
2785 "id": "settings.service.form.tabHosted", 2533 "id": "settings.service.form.tabHosted",
2786 "start": { 2534 "start": {
2787 "column": 13, 2535 "column": 13,
2788 "line": 67 2536 "line": 63
2789 } 2537 }
2790 }, 2538 },
2791 { 2539 {
2792 "defaultMessage": "!!!Self hosted ⭐️", 2540 "defaultMessage": "!!!Self hosted ⭐️",
2793 "end": { 2541 "end": {
2794 "column": 3, 2542 "column": 3,
2795 "line": 74 2543 "line": 70
2796 }, 2544 },
2797 "file": "src/components/settings/services/EditServiceForm.js", 2545 "file": "src/components/settings/services/EditServiceForm.js",
2798 "id": "settings.service.form.tabOnPremise", 2546 "id": "settings.service.form.tabOnPremise",
2799 "start": { 2547 "start": {
2800 "column": 16, 2548 "column": 16,
2801 "line": 71 2549 "line": 67
2802 } 2550 }
2803 }, 2551 },
2804 { 2552 {
2805 "defaultMessage": "!!!Use the hosted {name} service.", 2553 "defaultMessage": "!!!Use the hosted {name} service.",
2806 "end": { 2554 "end": {
2807 "column": 3, 2555 "column": 3,
2808 "line": 78 2556 "line": 74
2809 }, 2557 },
2810 "file": "src/components/settings/services/EditServiceForm.js", 2558 "file": "src/components/settings/services/EditServiceForm.js",
2811 "id": "settings.service.form.useHostedService", 2559 "id": "settings.service.form.useHostedService",
2812 "start": { 2560 "start": {
2813 "column": 20, 2561 "column": 20,
2814 "line": 75 2562 "line": 71
2815 } 2563 }
2816 }, 2564 },
2817 { 2565 {
2818 "defaultMessage": "!!!Could not validate custom {name} server.", 2566 "defaultMessage": "!!!Could not validate custom {name} server.",
2819 "end": { 2567 "end": {
2820 "column": 3, 2568 "column": 3,
2821 "line": 82 2569 "line": 78
2822 }, 2570 },
2823 "file": "src/components/settings/services/EditServiceForm.js", 2571 "file": "src/components/settings/services/EditServiceForm.js",
2824 "id": "settings.service.form.customUrlValidationError", 2572 "id": "settings.service.form.customUrlValidationError",
2825 "start": { 2573 "start": {
2826 "column": 28, 2574 "column": 28,
2827 "line": 79 2575 "line": 75
2828 }
2829 },
2830 {
2831 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
2832 "end": {
2833 "column": 3,
2834 "line": 86
2835 },
2836 "file": "src/components/settings/services/EditServiceForm.js",
2837 "id": "settings.service.form.customUrlPremiumInfo",
2838 "start": {
2839 "column": 24,
2840 "line": 83
2841 }
2842 },
2843 {
2844 "defaultMessage": "!!!Upgrade your account",
2845 "end": {
2846 "column": 3,
2847 "line": 90
2848 },
2849 "file": "src/components/settings/services/EditServiceForm.js",
2850 "id": "settings.service.form.customUrlUpgradeAccount",
2851 "start": {
2852 "column": 27,
2853 "line": 87
2854 } 2576 }
2855 }, 2577 },
2856 { 2578 {
2857 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 2579 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
2858 "end": { 2580 "end": {
2859 "column": 3, 2581 "column": 3,
2860 "line": 94 2582 "line": 82
2861 }, 2583 },
2862 "file": "src/components/settings/services/EditServiceForm.js", 2584 "file": "src/components/settings/services/EditServiceForm.js",
2863 "id": "settings.service.form.indirectMessageInfo", 2585 "id": "settings.service.form.indirectMessageInfo",
2864 "start": { 2586 "start": {
2865 "column": 23, 2587 "column": 23,
2866 "line": 91 2588 "line": 79
2867 } 2589 }
2868 }, 2590 },
2869 { 2591 {
2870 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 2592 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
2871 "end": { 2593 "end": {
2872 "column": 3, 2594 "column": 3,
2873 "line": 98 2595 "line": 86
2874 }, 2596 },
2875 "file": "src/components/settings/services/EditServiceForm.js", 2597 "file": "src/components/settings/services/EditServiceForm.js",
2876 "id": "settings.service.form.isMutedInfo", 2598 "id": "settings.service.form.isMutedInfo",
2877 "start": { 2599 "start": {
2878 "column": 15, 2600 "column": 15,
2879 "line": 95 2601 "line": 83
2880 } 2602 }
2881 }, 2603 },
2882 { 2604 {
2883 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.", 2605 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
2884 "end": { 2606 "end": {
2885 "column": 3, 2607 "column": 3,
2886 "line": 102 2608 "line": 90
2887 }, 2609 },
2888 "file": "src/components/settings/services/EditServiceForm.js", 2610 "file": "src/components/settings/services/EditServiceForm.js",
2889 "id": "settings.service.form.isHibernatedEnabledInfo", 2611 "id": "settings.service.form.isHibernatedEnabledInfo",
2890 "start": { 2612 "start": {
2891 "column": 28, 2613 "column": 28,
2892 "line": 99 2614 "line": 87
2893 } 2615 }
2894 }, 2616 },
2895 { 2617 {
2896 "defaultMessage": "!!!Notifications", 2618 "defaultMessage": "!!!Notifications",
2897 "end": { 2619 "end": {
2898 "column": 3, 2620 "column": 3,
2899 "line": 106 2621 "line": 94
2900 }, 2622 },
2901 "file": "src/components/settings/services/EditServiceForm.js", 2623 "file": "src/components/settings/services/EditServiceForm.js",
2902 "id": "settings.service.form.headlineNotifications", 2624 "id": "settings.service.form.headlineNotifications",
2903 "start": { 2625 "start": {
2904 "column": 25, 2626 "column": 25,
2905 "line": 103 2627 "line": 91
2906 } 2628 }
2907 }, 2629 },
2908 { 2630 {
2909 "defaultMessage": "!!!Unread message badges", 2631 "defaultMessage": "!!!Unread message badges",
2910 "end": { 2632 "end": {
2911 "column": 3, 2633 "column": 3,
2912 "line": 110 2634 "line": 98
2913 }, 2635 },
2914 "file": "src/components/settings/services/EditServiceForm.js", 2636 "file": "src/components/settings/services/EditServiceForm.js",
2915 "id": "settings.service.form.headlineBadges", 2637 "id": "settings.service.form.headlineBadges",
2916 "start": { 2638 "start": {
2917 "column": 18, 2639 "column": 18,
2918 "line": 107 2640 "line": 95
2919 } 2641 }
2920 }, 2642 },
2921 { 2643 {
2922 "defaultMessage": "!!!General", 2644 "defaultMessage": "!!!General",
2923 "end": { 2645 "end": {
2924 "column": 3, 2646 "column": 3,
2925 "line": 114 2647 "line": 102
2926 }, 2648 },
2927 "file": "src/components/settings/services/EditServiceForm.js", 2649 "file": "src/components/settings/services/EditServiceForm.js",
2928 "id": "settings.service.form.headlineGeneral", 2650 "id": "settings.service.form.headlineGeneral",
2929 "start": { 2651 "start": {
2930 "column": 19, 2652 "column": 19,
2931 "line": 111 2653 "line": 99
2932 } 2654 }
2933 }, 2655 },
2934 { 2656 {
2935 "defaultMessage": "!!!Dark Reader Settings", 2657 "defaultMessage": "!!!Dark Reader Settings",
2936 "end": { 2658 "end": {
2937 "column": 3, 2659 "column": 3,
2938 "line": 118 2660 "line": 106
2939 }, 2661 },
2940 "file": "src/components/settings/services/EditServiceForm.js", 2662 "file": "src/components/settings/services/EditServiceForm.js",
2941 "id": "settings.service.form.headlineDarkReaderSettings", 2663 "id": "settings.service.form.headlineDarkReaderSettings",
2942 "start": { 2664 "start": {
2943 "column": 30, 2665 "column": 30,
2944 "line": 115 2666 "line": 103
2945 } 2667 }
2946 }, 2668 },
2947 { 2669 {
2948 "defaultMessage": "!!!Delete", 2670 "defaultMessage": "!!!Delete",
2949 "end": { 2671 "end": {
2950 "column": 3, 2672 "column": 3,
2951 "line": 122 2673 "line": 110
2952 }, 2674 },
2953 "file": "src/components/settings/services/EditServiceForm.js", 2675 "file": "src/components/settings/services/EditServiceForm.js",
2954 "id": "settings.service.form.iconDelete", 2676 "id": "settings.service.form.iconDelete",
2955 "start": { 2677 "start": {
2956 "column": 14, 2678 "column": 14,
2957 "line": 119 2679 "line": 107
2958 } 2680 }
2959 }, 2681 },
2960 { 2682 {
2961 "defaultMessage": "!!!Drop your image, or click here", 2683 "defaultMessage": "!!!Drop your image, or click here",
2962 "end": { 2684 "end": {
2963 "column": 3, 2685 "column": 3,
2964 "line": 126 2686 "line": 114
2965 }, 2687 },
2966 "file": "src/components/settings/services/EditServiceForm.js", 2688 "file": "src/components/settings/services/EditServiceForm.js",
2967 "id": "settings.service.form.iconUpload", 2689 "id": "settings.service.form.iconUpload",
2968 "start": { 2690 "start": {
2969 "column": 14, 2691 "column": 14,
2970 "line": 123 2692 "line": 111
2971 } 2693 }
2972 }, 2694 },
2973 { 2695 {
2974 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 2696 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
2975 "end": { 2697 "end": {
2976 "column": 3, 2698 "column": 3,
2977 "line": 130 2699 "line": 118
2978 }, 2700 },
2979 "file": "src/components/settings/services/EditServiceForm.js", 2701 "file": "src/components/settings/services/EditServiceForm.js",
2980 "id": "settings.service.form.proxy.headline", 2702 "id": "settings.service.form.proxy.headline",
2981 "start": { 2703 "start": {
2982 "column": 17, 2704 "column": 17,
2983 "line": 127 2705 "line": 115
2984 } 2706 }
2985 }, 2707 },
2986 { 2708 {
2987 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 2709 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
2988 "end": { 2710 "end": {
2989 "column": 3, 2711 "column": 3,
2990 "line": 134 2712 "line": 122
2991 }, 2713 },
2992 "file": "src/components/settings/services/EditServiceForm.js", 2714 "file": "src/components/settings/services/EditServiceForm.js",
2993 "id": "settings.service.form.proxy.restartInfo", 2715 "id": "settings.service.form.proxy.restartInfo",
2994 "start": { 2716 "start": {
2995 "column": 20, 2717 "column": 20,
2996 "line": 131 2718 "line": 119
2997 } 2719 }
2998 }, 2720 },
2999 { 2721 {
3000 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 2722 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
3001 "end": { 2723 "end": {
3002 "column": 3, 2724 "column": 3,
3003 "line": 138 2725 "line": 126
3004 }, 2726 },
3005 "file": "src/components/settings/services/EditServiceForm.js", 2727 "file": "src/components/settings/services/EditServiceForm.js",
3006 "id": "settings.service.form.proxy.info", 2728 "id": "settings.service.form.proxy.info",
3007 "start": { 2729 "start": {
3008 "column": 13, 2730 "column": 13,
3009 "line": 135 2731 "line": 123
3010 } 2732 }
3011 } 2733 }
3012 ], 2734 ],
@@ -3119,117 +2841,117 @@
3119 "defaultMessage": "!!!Your services", 2841 "defaultMessage": "!!!Your services",
3120 "end": { 2842 "end": {
3121 "column": 3, 2843 "column": 3,
3122 "line": 19 2844 "line": 18
3123 }, 2845 },
3124 "file": "src/components/settings/services/ServicesDashboard.js", 2846 "file": "src/components/settings/services/ServicesDashboard.js",
3125 "id": "settings.services.headline", 2847 "id": "settings.services.headline",
3126 "start": { 2848 "start": {
3127 "column": 12, 2849 "column": 12,
3128 "line": 16 2850 "line": 15
3129 } 2851 }
3130 }, 2852 },
3131 { 2853 {
3132 "defaultMessage": "!!!Search service", 2854 "defaultMessage": "!!!Search service",
3133 "end": { 2855 "end": {
3134 "column": 3, 2856 "column": 3,
3135 "line": 23 2857 "line": 22
3136 }, 2858 },
3137 "file": "src/components/settings/services/ServicesDashboard.js", 2859 "file": "src/components/settings/services/ServicesDashboard.js",
3138 "id": "settings.searchService", 2860 "id": "settings.searchService",
3139 "start": { 2861 "start": {
3140 "column": 17, 2862 "column": 17,
3141 "line": 20 2863 "line": 19
3142 } 2864 }
3143 }, 2865 },
3144 { 2866 {
3145 "defaultMessage": "!!!Start by adding a service.", 2867 "defaultMessage": "!!!Start by adding a service.",
3146 "end": { 2868 "end": {
3147 "column": 3, 2869 "column": 3,
3148 "line": 27 2870 "line": 26
3149 }, 2871 },
3150 "file": "src/components/settings/services/ServicesDashboard.js", 2872 "file": "src/components/settings/services/ServicesDashboard.js",
3151 "id": "settings.services.noServicesAdded", 2873 "id": "settings.services.noServicesAdded",
3152 "start": { 2874 "start": {
3153 "column": 19, 2875 "column": 19,
3154 "line": 24 2876 "line": 23
3155 } 2877 }
3156 }, 2878 },
3157 { 2879 {
3158 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 2880 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
3159 "end": { 2881 "end": {
3160 "column": 3, 2882 "column": 3,
3161 "line": 31 2883 "line": 30
3162 }, 2884 },
3163 "file": "src/components/settings/services/ServicesDashboard.js", 2885 "file": "src/components/settings/services/ServicesDashboard.js",
3164 "id": "settings.recipes.nothingFound", 2886 "id": "settings.recipes.nothingFound",
3165 "start": { 2887 "start": {
3166 "column": 18, 2888 "column": 18,
3167 "line": 28 2889 "line": 27
3168 } 2890 }
3169 }, 2891 },
3170 { 2892 {
3171 "defaultMessage": "!!!Discover services", 2893 "defaultMessage": "!!!Discover services",
3172 "end": { 2894 "end": {
3173 "column": 3, 2895 "column": 3,
3174 "line": 35 2896 "line": 34
3175 }, 2897 },
3176 "file": "src/components/settings/services/ServicesDashboard.js", 2898 "file": "src/components/settings/services/ServicesDashboard.js",
3177 "id": "settings.services.discoverServices", 2899 "id": "settings.services.discoverServices",
3178 "start": { 2900 "start": {
3179 "column": 20, 2901 "column": 20,
3180 "line": 32 2902 "line": 31
3181 } 2903 }
3182 }, 2904 },
3183 { 2905 {
3184 "defaultMessage": "!!!Could not load your services", 2906 "defaultMessage": "!!!Could not load your services",
3185 "end": { 2907 "end": {
3186 "column": 3, 2908 "column": 3,
3187 "line": 39 2909 "line": 38
3188 }, 2910 },
3189 "file": "src/components/settings/services/ServicesDashboard.js", 2911 "file": "src/components/settings/services/ServicesDashboard.js",
3190 "id": "settings.services.servicesRequestFailed", 2912 "id": "settings.services.servicesRequestFailed",
3191 "start": { 2913 "start": {
3192 "column": 25, 2914 "column": 25,
3193 "line": 36 2915 "line": 35
3194 } 2916 }
3195 }, 2917 },
3196 { 2918 {
3197 "defaultMessage": "!!!Try again", 2919 "defaultMessage": "!!!Try again",
3198 "end": { 2920 "end": {
3199 "column": 3, 2921 "column": 3,
3200 "line": 43 2922 "line": 42
3201 }, 2923 },
3202 "file": "src/components/settings/services/ServicesDashboard.js", 2924 "file": "src/components/settings/services/ServicesDashboard.js",
3203 "id": "settings.account.tryReloadServices", 2925 "id": "settings.account.tryReloadServices",
3204 "start": { 2926 "start": {
3205 "column": 21, 2927 "column": 21,
3206 "line": 40 2928 "line": 39
3207 } 2929 }
3208 }, 2930 },
3209 { 2931 {
3210 "defaultMessage": "!!!Your changes have been saved", 2932 "defaultMessage": "!!!Your changes have been saved",
3211 "end": { 2933 "end": {
3212 "column": 3, 2934 "column": 3,
3213 "line": 47 2935 "line": 46
3214 }, 2936 },
3215 "file": "src/components/settings/services/ServicesDashboard.js", 2937 "file": "src/components/settings/services/ServicesDashboard.js",
3216 "id": "settings.services.updatedInfo", 2938 "id": "settings.services.updatedInfo",
3217 "start": { 2939 "start": {
3218 "column": 15, 2940 "column": 15,
3219 "line": 44 2941 "line": 43
3220 } 2942 }
3221 }, 2943 },
3222 { 2944 {
3223 "defaultMessage": "!!!Service has been deleted", 2945 "defaultMessage": "!!!Service has been deleted",
3224 "end": { 2946 "end": {
3225 "column": 3, 2947 "column": 3,
3226 "line": 51 2948 "line": 50
3227 }, 2949 },
3228 "file": "src/components/settings/services/ServicesDashboard.js", 2950 "file": "src/components/settings/services/ServicesDashboard.js",
3229 "id": "settings.services.deletedInfo", 2951 "id": "settings.services.deletedInfo",
3230 "start": { 2952 "start": {
3231 "column": 15, 2953 "column": 15,
3232 "line": 48 2954 "line": 47
3233 } 2955 }
3234 } 2956 }
3235 ], 2957 ],
@@ -3241,416 +2963,416 @@
3241 "defaultMessage": "!!!Settings", 2963 "defaultMessage": "!!!Settings",
3242 "end": { 2964 "end": {
3243 "column": 3, 2965 "column": 3,
3244 "line": 27 2966 "line": 26
3245 }, 2967 },
3246 "file": "src/components/settings/settings/EditSettingsForm.js", 2968 "file": "src/components/settings/settings/EditSettingsForm.js",
3247 "id": "settings.app.headline", 2969 "id": "settings.app.headline",
3248 "start": { 2970 "start": {
3249 "column": 12, 2971 "column": 12,
3250 "line": 24 2972 "line": 23
3251 } 2973 }
3252 }, 2974 },
3253 { 2975 {
3254 "defaultMessage": "!!!General", 2976 "defaultMessage": "!!!General",
3255 "end": { 2977 "end": {
3256 "column": 3, 2978 "column": 3,
3257 "line": 31 2979 "line": 30
3258 }, 2980 },
3259 "file": "src/components/settings/settings/EditSettingsForm.js", 2981 "file": "src/components/settings/settings/EditSettingsForm.js",
3260 "id": "settings.app.headlineGeneral", 2982 "id": "settings.app.headlineGeneral",
3261 "start": { 2983 "start": {
3262 "column": 19, 2984 "column": 19,
3263 "line": 28 2985 "line": 27
3264 } 2986 }
3265 }, 2987 },
3266 { 2988 {
3267 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 2989 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.",
3268 "end": { 2990 "end": {
3269 "column": 3, 2991 "column": 3,
3270 "line": 35 2992 "line": 34
3271 }, 2993 },
3272 "file": "src/components/settings/settings/EditSettingsForm.js", 2994 "file": "src/components/settings/settings/EditSettingsForm.js",
3273 "id": "settings.app.sentryInfo", 2995 "id": "settings.app.sentryInfo",
3274 "start": { 2996 "start": {
3275 "column": 14, 2997 "column": 14,
3276 "line": 32 2998 "line": 31
3277 } 2999 }
3278 }, 3000 },
3279 { 3001 {
3280 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 3002 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
3281 "end": { 3003 "end": {
3282 "column": 3, 3004 "column": 3,
3283 "line": 39 3005 "line": 38
3284 }, 3006 },
3285 "file": "src/components/settings/settings/EditSettingsForm.js", 3007 "file": "src/components/settings/settings/EditSettingsForm.js",
3286 "id": "settings.app.hibernateInfo", 3008 "id": "settings.app.hibernateInfo",
3287 "start": { 3009 "start": {
3288 "column": 17, 3010 "column": 17,
3289 "line": 36 3011 "line": 35
3290 } 3012 }
3291 }, 3013 },
3292 { 3014 {
3293 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 3015 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
3294 "end": { 3016 "end": {
3295 "column": 3, 3017 "column": 3,
3296 "line": 43 3018 "line": 42
3297 }, 3019 },
3298 "file": "src/components/settings/settings/EditSettingsForm.js", 3020 "file": "src/components/settings/settings/EditSettingsForm.js",
3299 "id": "settings.app.inactivityLockInfo", 3021 "id": "settings.app.inactivityLockInfo",
3300 "start": { 3022 "start": {
3301 "column": 22, 3023 "column": 22,
3302 "line": 40 3024 "line": 39
3303 } 3025 }
3304 }, 3026 },
3305 { 3027 {
3306 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 3028 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
3307 "end": { 3029 "end": {
3308 "column": 3, 3030 "column": 3,
3309 "line": 47 3031 "line": 46
3310 }, 3032 },
3311 "file": "src/components/settings/settings/EditSettingsForm.js", 3033 "file": "src/components/settings/settings/EditSettingsForm.js",
3312 "id": "settings.app.todoServerInfo", 3034 "id": "settings.app.todoServerInfo",
3313 "start": { 3035 "start": {
3314 "column": 18, 3036 "column": 18,
3315 "line": 44 3037 "line": 43
3316 } 3038 }
3317 }, 3039 },
3318 { 3040 {
3319 "defaultMessage": "!!!Password", 3041 "defaultMessage": "!!!Password",
3320 "end": { 3042 "end": {
3321 "column": 3, 3043 "column": 3,
3322 "line": 51 3044 "line": 50
3323 }, 3045 },
3324 "file": "src/components/settings/settings/EditSettingsForm.js", 3046 "file": "src/components/settings/settings/EditSettingsForm.js",
3325 "id": "settings.app.lockedPassword", 3047 "id": "settings.app.lockedPassword",
3326 "start": { 3048 "start": {
3327 "column": 18, 3049 "column": 18,
3328 "line": 48 3050 "line": 47
3329 } 3051 }
3330 }, 3052 },
3331 { 3053 {
3332 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 3054 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
3333 "end": { 3055 "end": {
3334 "column": 3, 3056 "column": 3,
3335 "line": 55 3057 "line": 54
3336 }, 3058 },
3337 "file": "src/components/settings/settings/EditSettingsForm.js", 3059 "file": "src/components/settings/settings/EditSettingsForm.js",
3338 "id": "settings.app.lockedPasswordInfo", 3060 "id": "settings.app.lockedPasswordInfo",
3339 "start": { 3061 "start": {
3340 "column": 22, 3062 "column": 22,
3341 "line": 52 3063 "line": 51
3342 } 3064 }
3343 }, 3065 },
3344 { 3066 {
3345 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 3067 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.",
3346 "end": { 3068 "end": {
3347 "column": 3, 3069 "column": 3,
3348 "line": 59 3070 "line": 58
3349 }, 3071 },
3350 "file": "src/components/settings/settings/EditSettingsForm.js", 3072 "file": "src/components/settings/settings/EditSettingsForm.js",
3351 "id": "settings.app.lockInfo", 3073 "id": "settings.app.lockInfo",
3352 "start": { 3074 "start": {
3353 "column": 12, 3075 "column": 12,
3354 "line": 56 3076 "line": 55
3355 } 3077 }
3356 }, 3078 },
3357 { 3079 {
3358 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 3080 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
3359 "end": { 3081 "end": {
3360 "column": 3, 3082 "column": 3,
3361 "line": 63 3083 "line": 62
3362 }, 3084 },
3363 "file": "src/components/settings/settings/EditSettingsForm.js", 3085 "file": "src/components/settings/settings/EditSettingsForm.js",
3364 "id": "settings.app.scheduledDNDTimeInfo", 3086 "id": "settings.app.scheduledDNDTimeInfo",
3365 "start": { 3087 "start": {
3366 "column": 24, 3088 "column": 24,
3367 "line": 60 3089 "line": 59
3368 } 3090 }
3369 }, 3091 },
3370 { 3092 {
3371 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 3093 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
3372 "end": { 3094 "end": {
3373 "column": 3, 3095 "column": 3,
3374 "line": 67 3096 "line": 66
3375 }, 3097 },
3376 "file": "src/components/settings/settings/EditSettingsForm.js", 3098 "file": "src/components/settings/settings/EditSettingsForm.js",
3377 "id": "settings.app.scheduledDNDInfo", 3099 "id": "settings.app.scheduledDNDInfo",
3378 "start": { 3100 "start": {
3379 "column": 20, 3101 "column": 20,
3380 "line": 64 3102 "line": 63
3381 } 3103 }
3382 }, 3104 },
3383 { 3105 {
3384 "defaultMessage": "!!!Language", 3106 "defaultMessage": "!!!Language",
3385 "end": { 3107 "end": {
3386 "column": 3, 3108 "column": 3,
3387 "line": 71 3109 "line": 70
3388 }, 3110 },
3389 "file": "src/components/settings/settings/EditSettingsForm.js", 3111 "file": "src/components/settings/settings/EditSettingsForm.js",
3390 "id": "settings.app.headlineLanguage", 3112 "id": "settings.app.headlineLanguage",
3391 "start": { 3113 "start": {
3392 "column": 20, 3114 "column": 20,
3393 "line": 68 3115 "line": 67
3394 } 3116 }
3395 }, 3117 },
3396 { 3118 {
3397 "defaultMessage": "!!!Updates", 3119 "defaultMessage": "!!!Updates",
3398 "end": { 3120 "end": {
3399 "column": 3, 3121 "column": 3,
3400 "line": 75 3122 "line": 74
3401 }, 3123 },
3402 "file": "src/components/settings/settings/EditSettingsForm.js", 3124 "file": "src/components/settings/settings/EditSettingsForm.js",
3403 "id": "settings.app.headlineUpdates", 3125 "id": "settings.app.headlineUpdates",
3404 "start": { 3126 "start": {
3405 "column": 19, 3127 "column": 19,
3406 "line": 72 3128 "line": 71
3407 } 3129 }
3408 }, 3130 },
3409 { 3131 {
3410 "defaultMessage": "!!!Appearance", 3132 "defaultMessage": "!!!Appearance",
3411 "end": { 3133 "end": {
3412 "column": 3, 3134 "column": 3,
3413 "line": 79 3135 "line": 78
3414 }, 3136 },
3415 "file": "src/components/settings/settings/EditSettingsForm.js", 3137 "file": "src/components/settings/settings/EditSettingsForm.js",
3416 "id": "settings.app.headlineAppearance", 3138 "id": "settings.app.headlineAppearance",
3417 "start": { 3139 "start": {
3418 "column": 22, 3140 "column": 22,
3419 "line": 76 3141 "line": 75
3420 } 3142 }
3421 }, 3143 },
3422 { 3144 {
3423 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 3145 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
3424 "end": { 3146 "end": {
3425 "column": 3, 3147 "column": 3,
3426 "line": 83 3148 "line": 82
3427 }, 3149 },
3428 "file": "src/components/settings/settings/EditSettingsForm.js", 3150 "file": "src/components/settings/settings/EditSettingsForm.js",
3429 "id": "settings.app.universalDarkModeInfo", 3151 "id": "settings.app.universalDarkModeInfo",
3430 "start": { 3152 "start": {
3431 "column": 25, 3153 "column": 25,
3432 "line": 80 3154 "line": 79
3433 } 3155 }
3434 }, 3156 },
3435 { 3157 {
3436 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 3158 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
3437 "end": { 3159 "end": {
3438 "column": 3, 3160 "column": 3,
3439 "line": 87 3161 "line": 86
3440 }, 3162 },
3441 "file": "src/components/settings/settings/EditSettingsForm.js", 3163 "file": "src/components/settings/settings/EditSettingsForm.js",
3442 "id": "settings.app.accentColorInfo", 3164 "id": "settings.app.accentColorInfo",
3443 "start": { 3165 "start": {
3444 "column": 19, 3166 "column": 19,
3445 "line": 84 3167 "line": 83
3446 } 3168 }
3447 }, 3169 },
3448 { 3170 {
3449 "defaultMessage": "!!!Privacy", 3171 "defaultMessage": "!!!Privacy",
3450 "end": { 3172 "end": {
3451 "column": 3, 3173 "column": 3,
3452 "line": 91 3174 "line": 90
3453 }, 3175 },
3454 "file": "src/components/settings/settings/EditSettingsForm.js", 3176 "file": "src/components/settings/settings/EditSettingsForm.js",
3455 "id": "settings.app.headlinePrivacy", 3177 "id": "settings.app.headlinePrivacy",
3456 "start": { 3178 "start": {
3457 "column": 19, 3179 "column": 19,
3458 "line": 88 3180 "line": 87
3459 } 3181 }
3460 }, 3182 },
3461 { 3183 {
3462 "defaultMessage": "!!!Advanced", 3184 "defaultMessage": "!!!Advanced",
3463 "end": { 3185 "end": {
3464 "column": 3, 3186 "column": 3,
3465 "line": 95 3187 "line": 94
3466 }, 3188 },
3467 "file": "src/components/settings/settings/EditSettingsForm.js", 3189 "file": "src/components/settings/settings/EditSettingsForm.js",
3468 "id": "settings.app.headlineAdvanced", 3190 "id": "settings.app.headlineAdvanced",
3469 "start": { 3191 "start": {
3470 "column": 20, 3192 "column": 20,
3471 "line": 92 3193 "line": 91
3472 } 3194 }
3473 }, 3195 },
3474 { 3196 {
3475 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 3197 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
3476 "end": { 3198 "end": {
3477 "column": 3, 3199 "column": 3,
3478 "line": 99 3200 "line": 98
3479 }, 3201 },
3480 "file": "src/components/settings/settings/EditSettingsForm.js", 3202 "file": "src/components/settings/settings/EditSettingsForm.js",
3481 "id": "settings.app.translationHelp", 3203 "id": "settings.app.translationHelp",
3482 "start": { 3204 "start": {
3483 "column": 19, 3205 "column": 19,
3484 "line": 96 3206 "line": 95
3485 } 3207 }
3486 }, 3208 },
3487 { 3209 {
3488 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 3210 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
3489 "end": { 3211 "end": {
3490 "column": 3, 3212 "column": 3,
3491 "line": 103 3213 "line": 102
3492 }, 3214 },
3493 "file": "src/components/settings/settings/EditSettingsForm.js", 3215 "file": "src/components/settings/settings/EditSettingsForm.js",
3494 "id": "settings.app.spellCheckerLanguageInfo", 3216 "id": "settings.app.spellCheckerLanguageInfo",
3495 "start": { 3217 "start": {
3496 "column": 28, 3218 "column": 28,
3497 "line": 100 3219 "line": 99
3498 } 3220 }
3499 }, 3221 },
3500 { 3222 {
3501 "defaultMessage": "!!!Cache", 3223 "defaultMessage": "!!!Cache",
3502 "end": { 3224 "end": {
3503 "column": 3, 3225 "column": 3,
3504 "line": 107 3226 "line": 106
3505 }, 3227 },
3506 "file": "src/components/settings/settings/EditSettingsForm.js", 3228 "file": "src/components/settings/settings/EditSettingsForm.js",
3507 "id": "settings.app.subheadlineCache", 3229 "id": "settings.app.subheadlineCache",
3508 "start": { 3230 "start": {
3509 "column": 20, 3231 "column": 20,
3510 "line": 104 3232 "line": 103
3511 } 3233 }
3512 }, 3234 },
3513 { 3235 {
3514 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 3236 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
3515 "end": { 3237 "end": {
3516 "column": 3, 3238 "column": 3,
3517 "line": 111 3239 "line": 110
3518 }, 3240 },
3519 "file": "src/components/settings/settings/EditSettingsForm.js", 3241 "file": "src/components/settings/settings/EditSettingsForm.js",
3520 "id": "settings.app.cacheInfo", 3242 "id": "settings.app.cacheInfo",
3521 "start": { 3243 "start": {
3522 "column": 13, 3244 "column": 13,
3523 "line": 108 3245 "line": 107
3524 } 3246 }
3525 }, 3247 },
3526 { 3248 {
3527 "defaultMessage": "!!!Couldn't clear all cache", 3249 "defaultMessage": "!!!Couldn't clear all cache",
3528 "end": { 3250 "end": {
3529 "column": 3, 3251 "column": 3,
3530 "line": 115 3252 "line": 114
3531 }, 3253 },
3532 "file": "src/components/settings/settings/EditSettingsForm.js", 3254 "file": "src/components/settings/settings/EditSettingsForm.js",
3533 "id": "settings.app.cacheNotCleared", 3255 "id": "settings.app.cacheNotCleared",
3534 "start": { 3256 "start": {
3535 "column": 19, 3257 "column": 19,
3536 "line": 112 3258 "line": 111
3537 } 3259 }
3538 }, 3260 },
3539 { 3261 {
3540 "defaultMessage": "!!!Clear cache", 3262 "defaultMessage": "!!!Clear cache",
3541 "end": { 3263 "end": {
3542 "column": 3, 3264 "column": 3,
3543 "line": 119 3265 "line": 118
3544 }, 3266 },
3545 "file": "src/components/settings/settings/EditSettingsForm.js", 3267 "file": "src/components/settings/settings/EditSettingsForm.js",
3546 "id": "settings.app.buttonClearAllCache", 3268 "id": "settings.app.buttonClearAllCache",
3547 "start": { 3269 "start": {
3548 "column": 23, 3270 "column": 23,
3549 "line": 116 3271 "line": 115
3550 } 3272 }
3551 }, 3273 },
3552 { 3274 {
3553 "defaultMessage": "!!!Check for updates", 3275 "defaultMessage": "!!!Check for updates",
3554 "end": { 3276 "end": {
3555 "column": 3, 3277 "column": 3,
3556 "line": 123 3278 "line": 122
3557 }, 3279 },
3558 "file": "src/components/settings/settings/EditSettingsForm.js", 3280 "file": "src/components/settings/settings/EditSettingsForm.js",
3559 "id": "settings.app.buttonSearchForUpdate", 3281 "id": "settings.app.buttonSearchForUpdate",
3560 "start": { 3282 "start": {
3561 "column": 25, 3283 "column": 25,
3562 "line": 120 3284 "line": 119
3563 } 3285 }
3564 }, 3286 },
3565 { 3287 {
3566 "defaultMessage": "!!!Restart & install update", 3288 "defaultMessage": "!!!Restart & install update",
3567 "end": { 3289 "end": {
3568 "column": 3, 3290 "column": 3,
3569 "line": 127 3291 "line": 126
3570 }, 3292 },
3571 "file": "src/components/settings/settings/EditSettingsForm.js", 3293 "file": "src/components/settings/settings/EditSettingsForm.js",
3572 "id": "settings.app.buttonInstallUpdate", 3294 "id": "settings.app.buttonInstallUpdate",
3573 "start": { 3295 "start": {
3574 "column": 23, 3296 "column": 23,
3575 "line": 124 3297 "line": 123
3576 } 3298 }
3577 }, 3299 },
3578 { 3300 {
3579 "defaultMessage": "!!!Is searching for update", 3301 "defaultMessage": "!!!Is searching for update",
3580 "end": { 3302 "end": {
3581 "column": 3, 3303 "column": 3,
3582 "line": 131 3304 "line": 130
3583 }, 3305 },
3584 "file": "src/components/settings/settings/EditSettingsForm.js", 3306 "file": "src/components/settings/settings/EditSettingsForm.js",
3585 "id": "settings.app.updateStatusSearching", 3307 "id": "settings.app.updateStatusSearching",
3586 "start": { 3308 "start": {
3587 "column": 25, 3309 "column": 25,
3588 "line": 128 3310 "line": 127
3589 } 3311 }
3590 }, 3312 },
3591 { 3313 {
3592 "defaultMessage": "!!!Update available, downloading...", 3314 "defaultMessage": "!!!Update available, downloading...",
3593 "end": { 3315 "end": {
3594 "column": 3, 3316 "column": 3,
3595 "line": 135 3317 "line": 134
3596 }, 3318 },
3597 "file": "src/components/settings/settings/EditSettingsForm.js", 3319 "file": "src/components/settings/settings/EditSettingsForm.js",
3598 "id": "settings.app.updateStatusAvailable", 3320 "id": "settings.app.updateStatusAvailable",
3599 "start": { 3321 "start": {
3600 "column": 25, 3322 "column": 25,
3601 "line": 132 3323 "line": 131
3602 } 3324 }
3603 }, 3325 },
3604 { 3326 {
3605 "defaultMessage": "!!!You are using the latest version of Ferdi", 3327 "defaultMessage": "!!!You are using the latest version of Ferdi",
3606 "end": { 3328 "end": {
3607 "column": 3, 3329 "column": 3,
3608 "line": 139 3330 "line": 138
3609 }, 3331 },
3610 "file": "src/components/settings/settings/EditSettingsForm.js", 3332 "file": "src/components/settings/settings/EditSettingsForm.js",
3611 "id": "settings.app.updateStatusUpToDate", 3333 "id": "settings.app.updateStatusUpToDate",
3612 "start": { 3334 "start": {
3613 "column": 24, 3335 "column": 24,
3614 "line": 136 3336 "line": 135
3615 } 3337 }
3616 }, 3338 },
3617 { 3339 {
3618 "defaultMessage": "!!!Current version:", 3340 "defaultMessage": "!!!Current version:",
3619 "end": { 3341 "end": {
3620 "column": 3, 3342 "column": 3,
3621 "line": 143 3343 "line": 142
3622 }, 3344 },
3623 "file": "src/components/settings/settings/EditSettingsForm.js", 3345 "file": "src/components/settings/settings/EditSettingsForm.js",
3624 "id": "settings.app.currentVersion", 3346 "id": "settings.app.currentVersion",
3625 "start": { 3347 "start": {
3626 "column": 18, 3348 "column": 18,
3627 "line": 140 3349 "line": 139
3628 } 3350 }
3629 }, 3351 },
3630 { 3352 {
3631 "defaultMessage": "!!!Changes require restart", 3353 "defaultMessage": "!!!Changes require restart",
3632 "end": { 3354 "end": {
3633 "column": 3, 3355 "column": 3,
3634 "line": 147 3356 "line": 146
3635 }, 3357 },
3636 "file": "src/components/settings/settings/EditSettingsForm.js", 3358 "file": "src/components/settings/settings/EditSettingsForm.js",
3637 "id": "settings.app.restartRequired", 3359 "id": "settings.app.restartRequired",
3638 "start": { 3360 "start": {
3639 "column": 22, 3361 "column": 22,
3640 "line": 144 3362 "line": 143
3641 } 3363 }
3642 }, 3364 },
3643 { 3365 {
3644 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 3366 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
3645 "end": { 3367 "end": {
3646 "column": 3, 3368 "column": 3,
3647 "line": 151 3369 "line": 150
3648 }, 3370 },
3649 "file": "src/components/settings/settings/EditSettingsForm.js", 3371 "file": "src/components/settings/settings/EditSettingsForm.js",
3650 "id": "settings.app.languageDisclaimer", 3372 "id": "settings.app.languageDisclaimer",
3651 "start": { 3373 "start": {
3652 "column": 22, 3374 "column": 22,
3653 "line": 148 3375 "line": 147
3654 } 3376 }
3655 } 3377 }
3656 ], 3378 ],
@@ -3880,104 +3602,91 @@
3880 "defaultMessage": "!!!Team", 3602 "defaultMessage": "!!!Team",
3881 "end": { 3603 "end": {
3882 "column": 3, 3604 "column": 3,
3883 "line": 21 3605 "line": 18
3884 }, 3606 },
3885 "file": "src/components/settings/team/TeamDashboard.js", 3607 "file": "src/components/settings/team/TeamDashboard.js",
3886 "id": "settings.team.headline", 3608 "id": "settings.team.headline",
3887 "start": { 3609 "start": {
3888 "column": 12, 3610 "column": 12,
3889 "line": 18 3611 "line": 15
3890 } 3612 }
3891 }, 3613 },
3892 { 3614 {
3893 "defaultMessage": "!!!Franz Team Management", 3615 "defaultMessage": "!!!Franz Team Management",
3894 "end": { 3616 "end": {
3895 "column": 3, 3617 "column": 3,
3896 "line": 25 3618 "line": 22
3897 }, 3619 },
3898 "file": "src/components/settings/team/TeamDashboard.js", 3620 "file": "src/components/settings/team/TeamDashboard.js",
3899 "id": "settings.team.contentHeadline", 3621 "id": "settings.team.contentHeadline",
3900 "start": { 3622 "start": {
3901 "column": 19, 3623 "column": 19,
3902 "line": 22 3624 "line": 19
3903 } 3625 }
3904 }, 3626 },
3905 { 3627 {
3906 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.", 3628 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.",
3907 "end": { 3629 "end": {
3908 "column": 3, 3630 "column": 3,
3909 "line": 29 3631 "line": 26
3910 }, 3632 },
3911 "file": "src/components/settings/team/TeamDashboard.js", 3633 "file": "src/components/settings/team/TeamDashboard.js",
3912 "id": "settings.team.intro", 3634 "id": "settings.team.intro",
3913 "start": { 3635 "start": {
3914 "column": 9, 3636 "column": 9,
3915 "line": 26 3637 "line": 23
3916 } 3638 }
3917 }, 3639 },
3918 { 3640 {
3919 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 3641 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
3920 "end": { 3642 "end": {
3921 "column": 3, 3643 "column": 3,
3922 "line": 33 3644 "line": 30
3923 }, 3645 },
3924 "file": "src/components/settings/team/TeamDashboard.js", 3646 "file": "src/components/settings/team/TeamDashboard.js",
3925 "id": "settings.team.copy", 3647 "id": "settings.team.copy",
3926 "start": { 3648 "start": {
3927 "column": 8, 3649 "column": 8,
3928 "line": 30 3650 "line": 27
3929 } 3651 }
3930 }, 3652 },
3931 { 3653 {
3932 "defaultMessage": "!!!Manage your Team on meetfranz.com", 3654 "defaultMessage": "!!!Manage your Team on meetfranz.com",
3933 "end": { 3655 "end": {
3934 "column": 3, 3656 "column": 3,
3935 "line": 37 3657 "line": 34
3936 }, 3658 },
3937 "file": "src/components/settings/team/TeamDashboard.js", 3659 "file": "src/components/settings/team/TeamDashboard.js",
3938 "id": "settings.team.manageAction", 3660 "id": "settings.team.manageAction",
3939 "start": { 3661 "start": {
3940 "column": 16, 3662 "column": 16,
3941 "line": 34 3663 "line": 31
3942 }
3943 },
3944 {
3945 "defaultMessage": "!!!Upgrade your Account",
3946 "end": {
3947 "column": 3,
3948 "line": 41
3949 },
3950 "file": "src/components/settings/team/TeamDashboard.js",
3951 "id": "settings.team.upgradeAction",
3952 "start": {
3953 "column": 17,
3954 "line": 38
3955 } 3664 }
3956 }, 3665 },
3957 { 3666 {
3958 "defaultMessage": "!!!Teams are unavailable", 3667 "defaultMessage": "!!!Teams are unavailable",
3959 "end": { 3668 "end": {
3960 "column": 3, 3669 "column": 3,
3961 "line": 45 3670 "line": 38
3962 }, 3671 },
3963 "file": "src/components/settings/team/TeamDashboard.js", 3672 "file": "src/components/settings/team/TeamDashboard.js",
3964 "id": "settings.team.teamsUnavailable", 3673 "id": "settings.team.teamsUnavailable",
3965 "start": { 3674 "start": {
3966 "column": 20, 3675 "column": 20,
3967 "line": 42 3676 "line": 35
3968 } 3677 }
3969 }, 3678 },
3970 { 3679 {
3971 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 3680 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
3972 "end": { 3681 "end": {
3973 "column": 3, 3682 "column": 3,
3974 "line": 49 3683 "line": 42
3975 }, 3684 },
3976 "file": "src/components/settings/team/TeamDashboard.js", 3685 "file": "src/components/settings/team/TeamDashboard.js",
3977 "id": "settings.team.teamsUnavailableInfo", 3686 "id": "settings.team.teamsUnavailableInfo",
3978 "start": { 3687 "start": {
3979 "column": 24, 3688 "column": 24,
3980 "line": 46 3689 "line": 39
3981 } 3690 }
3982 } 3691 }
3983 ], 3692 ],
@@ -4069,509 +3778,146 @@
4069 { 3778 {
4070 "descriptors": [ 3779 "descriptors": [
4071 { 3780 {
4072 "defaultMessage": "!!!Choose your plan",
4073 "end": {
4074 "column": 3,
4075 "line": 16
4076 },
4077 "file": "src/components/subscription/SubscriptionForm.js",
4078 "id": "subscription.cta.choosePlan",
4079 "start": {
4080 "column": 21,
4081 "line": 13
4082 }
4083 },
4084 {
4085 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
4086 "end": {
4087 "column": 3,
4088 "line": 20
4089 },
4090 "file": "src/components/subscription/SubscriptionForm.js",
4091 "id": "settings.account.headlineUpgradeAccount",
4092 "start": {
4093 "column": 18,
4094 "line": 17
4095 }
4096 },
4097 {
4098 "defaultMessage": "!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
4099 "end": {
4100 "column": 3,
4101 "line": 24
4102 },
4103 "file": "src/components/subscription/SubscriptionForm.js",
4104 "id": "subscription.teaser.intro",
4105 "start": {
4106 "column": 14,
4107 "line": 21
4108 }
4109 },
4110 {
4111 "defaultMessage": "!!!Paid Franz Plans include:",
4112 "end": {
4113 "column": 3,
4114 "line": 28
4115 },
4116 "file": "src/components/subscription/SubscriptionForm.js",
4117 "id": "subscription.teaser.includedFeatures",
4118 "start": {
4119 "column": 20,
4120 "line": 25
4121 }
4122 }
4123 ],
4124 "path": "src/components/subscription/SubscriptionForm.json"
4125 },
4126 {
4127 "descriptors": [
4128 {
4129 "defaultMessage": "!!!Cancel",
4130 "end": {
4131 "column": 3,
4132 "line": 14
4133 },
4134 "file": "src/components/subscription/SubscriptionPopup.js",
4135 "id": "subscriptionPopup.buttonCancel",
4136 "start": {
4137 "column": 16,
4138 "line": 11
4139 }
4140 },
4141 {
4142 "defaultMessage": "!!!Done",
4143 "end": {
4144 "column": 3,
4145 "line": 18
4146 },
4147 "file": "src/components/subscription/SubscriptionPopup.js",
4148 "id": "subscriptionPopup.buttonDone",
4149 "start": {
4150 "column": 14,
4151 "line": 15
4152 }
4153 }
4154 ],
4155 "path": "src/components/subscription/SubscriptionPopup.json"
4156 },
4157 {
4158 "descriptors": [
4159 {
4160 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
4161 "end": {
4162 "column": 3,
4163 "line": 17
4164 },
4165 "file": "src/components/subscription/TrialForm.js",
4166 "id": "subscription.cta.activateTrial",
4167 "start": {
4168 "column": 21,
4169 "line": 14
4170 }
4171 },
4172 {
4173 "defaultMessage": "!!!See all options",
4174 "end": {
4175 "column": 3,
4176 "line": 21
4177 },
4178 "file": "src/components/subscription/TrialForm.js",
4179 "id": "subscription.cta.allOptions",
4180 "start": {
4181 "column": 20,
4182 "line": 18
4183 }
4184 },
4185 {
4186 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
4187 "end": {
4188 "column": 3,
4189 "line": 25
4190 },
4191 "file": "src/components/subscription/TrialForm.js",
4192 "id": "settings.account.headlineTrialUpgrade",
4193 "start": {
4194 "column": 18,
4195 "line": 22
4196 }
4197 },
4198 {
4199 "defaultMessage": "!!!The Franz Professional Plan includes:",
4200 "end": {
4201 "column": 3,
4202 "line": 29
4203 },
4204 "file": "src/components/subscription/TrialForm.js",
4205 "id": "subscription.includedProFeatures",
4206 "start": {
4207 "column": 20,
4208 "line": 26
4209 }
4210 },
4211 {
4212 "defaultMessage": "!!!No strings attached",
4213 "end": {
4214 "column": 3,
4215 "line": 33
4216 },
4217 "file": "src/components/subscription/TrialForm.js",
4218 "id": "pricing.trial.terms.headline",
4219 "start": {
4220 "column": 29,
4221 "line": 30
4222 }
4223 },
4224 {
4225 "defaultMessage": "!!!No credit card required",
4226 "end": {
4227 "column": 3,
4228 "line": 37
4229 },
4230 "file": "src/components/subscription/TrialForm.js",
4231 "id": "pricing.trial.terms.noCreditCard",
4232 "start": {
4233 "column": 16,
4234 "line": 34
4235 }
4236 },
4237 {
4238 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
4239 "end": {
4240 "column": 3,
4241 "line": 41
4242 },
4243 "file": "src/components/subscription/TrialForm.js",
4244 "id": "pricing.trial.terms.automaticTrialEnd",
4245 "start": {
4246 "column": 21,
4247 "line": 38
4248 }
4249 }
4250 ],
4251 "path": "src/components/subscription/TrialForm.json"
4252 },
4253 {
4254 "descriptors": [
4255 {
4256 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
4257 "end": {
4258 "column": 3,
4259 "line": 14
4260 },
4261 "file": "src/components/TrialActivationInfoBar.js",
4262 "id": "infobar.trialActivated",
4263 "start": {
4264 "column": 11,
4265 "line": 11
4266 }
4267 }
4268 ],
4269 "path": "src/components/TrialActivationInfoBar.json"
4270 },
4271 {
4272 "descriptors": [
4273 {
4274 "defaultMessage": "!!!Get a Franz Supporter License",
4275 "end": {
4276 "column": 3,
4277 "line": 16
4278 },
4279 "file": "src/components/ui/ActivateTrialButton/index.js",
4280 "id": "feature.delayApp.upgrade.action",
4281 "start": {
4282 "column": 10,
4283 "line": 13
4284 }
4285 },
4286 {
4287 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
4288 "end": {
4289 "column": 3,
4290 "line": 20
4291 },
4292 "file": "src/components/ui/ActivateTrialButton/index.js",
4293 "id": "feature.delayApp.trial.action",
4294 "start": {
4295 "column": 15,
4296 "line": 17
4297 }
4298 },
4299 {
4300 "defaultMessage": "!!!Upgrade account",
4301 "end": {
4302 "column": 3,
4303 "line": 24
4304 },
4305 "file": "src/components/ui/ActivateTrialButton/index.js",
4306 "id": "feature.delayApp.upgrade.actionShort",
4307 "start": {
4308 "column": 15,
4309 "line": 21
4310 }
4311 },
4312 {
4313 "defaultMessage": "!!!Activate the free Franz Professional trial",
4314 "end": {
4315 "column": 3,
4316 "line": 28
4317 },
4318 "file": "src/components/ui/ActivateTrialButton/index.js",
4319 "id": "feature.delayApp.trial.actionShort",
4320 "start": {
4321 "column": 20,
4322 "line": 25
4323 }
4324 },
4325 {
4326 "defaultMessage": "!!!No strings attached",
4327 "end": {
4328 "column": 3,
4329 "line": 32
4330 },
4331 "file": "src/components/ui/ActivateTrialButton/index.js",
4332 "id": "pricing.trial.terms.headline",
4333 "start": {
4334 "column": 29,
4335 "line": 29
4336 }
4337 },
4338 {
4339 "defaultMessage": "!!!No credit card required",
4340 "end": {
4341 "column": 3,
4342 "line": 36
4343 },
4344 "file": "src/components/ui/ActivateTrialButton/index.js",
4345 "id": "pricing.trial.terms.noCreditCard",
4346 "start": {
4347 "column": 16,
4348 "line": 33
4349 }
4350 },
4351 {
4352 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
4353 "end": {
4354 "column": 3,
4355 "line": 40
4356 },
4357 "file": "src/components/ui/ActivateTrialButton/index.js",
4358 "id": "pricing.trial.terms.automaticTrialEnd",
4359 "start": {
4360 "column": 21,
4361 "line": 37
4362 }
4363 }
4364 ],
4365 "path": "src/components/ui/ActivateTrialButton/index.json"
4366 },
4367 {
4368 "descriptors": [
4369 {
4370 "defaultMessage": "!!!Choose from more than 70 Services", 3781 "defaultMessage": "!!!Choose from more than 70 Services",
4371 "end": { 3782 "end": {
4372 "column": 3, 3783 "column": 3,
4373 "line": 12 3784 "line": 11
4374 }, 3785 },
4375 "file": "src/components/ui/FeatureList.js", 3786 "file": "src/components/ui/FeatureList.js",
4376 "id": "pricing.features.recipes", 3787 "id": "pricing.features.recipes",
4377 "start": { 3788 "start": {
4378 "column": 20, 3789 "column": 20,
4379 "line": 9 3790 "line": 8
4380 } 3791 }
4381 }, 3792 },
4382 { 3793 {
4383 "defaultMessage": "!!!Account Synchronisation", 3794 "defaultMessage": "!!!Account Synchronisation",
4384 "end": { 3795 "end": {
4385 "column": 3, 3796 "column": 3,
4386 "line": 16 3797 "line": 15
4387 }, 3798 },
4388 "file": "src/components/ui/FeatureList.js", 3799 "file": "src/components/ui/FeatureList.js",
4389 "id": "pricing.features.accountSync", 3800 "id": "pricing.features.accountSync",
4390 "start": { 3801 "start": {
4391 "column": 15, 3802 "column": 15,
4392 "line": 13 3803 "line": 12
4393 } 3804 }
4394 }, 3805 },
4395 { 3806 {
4396 "defaultMessage": "!!!Desktop Notifications", 3807 "defaultMessage": "!!!Desktop Notifications",
4397 "end": { 3808 "end": {
4398 "column": 3, 3809 "column": 3,
4399 "line": 20 3810 "line": 19
4400 }, 3811 },
4401 "file": "src/components/ui/FeatureList.js", 3812 "file": "src/components/ui/FeatureList.js",
4402 "id": "pricing.features.desktopNotifications", 3813 "id": "pricing.features.desktopNotifications",
4403 "start": { 3814 "start": {
4404 "column": 24, 3815 "column": 24,
4405 "line": 17 3816 "line": 16
4406 } 3817 }
4407 }, 3818 },
4408 { 3819 {
4409 "defaultMessage": "!!!Add unlimited services", 3820 "defaultMessage": "!!!Add unlimited services",
4410 "end": { 3821 "end": {
4411 "column": 3, 3822 "column": 3,
4412 "line": 24 3823 "line": 23
4413 }, 3824 },
4414 "file": "src/components/ui/FeatureList.js", 3825 "file": "src/components/ui/FeatureList.js",
4415 "id": "pricing.features.unlimitedServices", 3826 "id": "pricing.features.unlimitedServices",
4416 "start": { 3827 "start": {
4417 "column": 21, 3828 "column": 21,
4418 "line": 21 3829 "line": 20
4419 }
4420 },
4421 {
4422 "defaultMessage": "!!!Add up to 3 services",
4423 "end": {
4424 "column": 3,
4425 "line": 28
4426 },
4427 "file": "src/components/ui/FeatureList.js",
4428 "id": "pricing.features.upToThreeServices",
4429 "start": {
4430 "column": 21,
4431 "line": 25
4432 }
4433 },
4434 {
4435 "defaultMessage": "!!!Add up to 6 services",
4436 "end": {
4437 "column": 3,
4438 "line": 32
4439 },
4440 "file": "src/components/ui/FeatureList.js",
4441 "id": "pricing.features.upToSixServices",
4442 "start": {
4443 "column": 19,
4444 "line": 29
4445 } 3830 }
4446 }, 3831 },
4447 { 3832 {
4448 "defaultMessage": "!!!Spellchecker support", 3833 "defaultMessage": "!!!Spellchecker support",
4449 "end": { 3834 "end": {
4450 "column": 3, 3835 "column": 3,
4451 "line": 36 3836 "line": 27
4452 }, 3837 },
4453 "file": "src/components/ui/FeatureList.js", 3838 "file": "src/components/ui/FeatureList.js",
4454 "id": "pricing.features.spellchecker", 3839 "id": "pricing.features.spellchecker",
4455 "start": { 3840 "start": {
4456 "column": 16, 3841 "column": 16,
4457 "line": 33 3842 "line": 24
4458 } 3843 }
4459 }, 3844 },
4460 { 3845 {
4461 "defaultMessage": "!!!Workspaces", 3846 "defaultMessage": "!!!Workspaces",
4462 "end": { 3847 "end": {
4463 "column": 3, 3848 "column": 3,
4464 "line": 40 3849 "line": 31
4465 }, 3850 },
4466 "file": "src/components/ui/FeatureList.js", 3851 "file": "src/components/ui/FeatureList.js",
4467 "id": "pricing.features.workspaces", 3852 "id": "pricing.features.workspaces",
4468 "start": { 3853 "start": {
4469 "column": 14, 3854 "column": 14,
4470 "line": 37 3855 "line": 28
4471 } 3856 }
4472 }, 3857 },
4473 { 3858 {
4474 "defaultMessage": "!!!Add Custom Websites", 3859 "defaultMessage": "!!!Add Custom Websites",
4475 "end": { 3860 "end": {
4476 "column": 3, 3861 "column": 3,
4477 "line": 44 3862 "line": 35
4478 }, 3863 },
4479 "file": "src/components/ui/FeatureList.js", 3864 "file": "src/components/ui/FeatureList.js",
4480 "id": "pricing.features.customWebsites", 3865 "id": "pricing.features.customWebsites",
4481 "start": { 3866 "start": {
4482 "column": 18, 3867 "column": 18,
4483 "line": 41 3868 "line": 32
4484 } 3869 }
4485 }, 3870 },
4486 { 3871 {
4487 "defaultMessage": "!!!On-premise & other Hosted Services", 3872 "defaultMessage": "!!!On-premise & other Hosted Services",
4488 "end": { 3873 "end": {
4489 "column": 3, 3874 "column": 3,
4490 "line": 48 3875 "line": 39
4491 }, 3876 },
4492 "file": "src/components/ui/FeatureList.js", 3877 "file": "src/components/ui/FeatureList.js",
4493 "id": "pricing.features.onPremise", 3878 "id": "pricing.features.onPremise",
4494 "start": { 3879 "start": {
4495 "column": 13, 3880 "column": 13,
4496 "line": 45 3881 "line": 36
4497 } 3882 }
4498 }, 3883 },
4499 { 3884 {
4500 "defaultMessage": "!!!Install 3rd party services", 3885 "defaultMessage": "!!!Install 3rd party services",
4501 "end": { 3886 "end": {
4502 "column": 3, 3887 "column": 3,
4503 "line": 52 3888 "line": 43
4504 }, 3889 },
4505 "file": "src/components/ui/FeatureList.js", 3890 "file": "src/components/ui/FeatureList.js",
4506 "id": "pricing.features.thirdPartyServices", 3891 "id": "pricing.features.thirdPartyServices",
4507 "start": { 3892 "start": {
4508 "column": 22, 3893 "column": 22,
4509 "line": 49 3894 "line": 40
4510 } 3895 }
4511 }, 3896 },
4512 { 3897 {
4513 "defaultMessage": "!!!Service Proxies", 3898 "defaultMessage": "!!!Service Proxies",
4514 "end": { 3899 "end": {
4515 "column": 3, 3900 "column": 3,
4516 "line": 56 3901 "line": 47
4517 }, 3902 },
4518 "file": "src/components/ui/FeatureList.js", 3903 "file": "src/components/ui/FeatureList.js",
4519 "id": "pricing.features.serviceProxies", 3904 "id": "pricing.features.serviceProxies",
4520 "start": { 3905 "start": {
4521 "column": 18, 3906 "column": 18,
4522 "line": 53 3907 "line": 44
4523 } 3908 }
4524 }, 3909 },
4525 { 3910 {
4526 "defaultMessage": "!!!Team Management", 3911 "defaultMessage": "!!!Team Management",
4527 "end": { 3912 "end": {
4528 "column": 3, 3913 "column": 3,
4529 "line": 60 3914 "line": 51
4530 }, 3915 },
4531 "file": "src/components/ui/FeatureList.js", 3916 "file": "src/components/ui/FeatureList.js",
4532 "id": "pricing.features.teamManagement", 3917 "id": "pricing.features.teamManagement",
4533 "start": { 3918 "start": {
4534 "column": 18, 3919 "column": 18,
4535 "line": 57 3920 "line": 48
4536 }
4537 },
4538 {
4539 "defaultMessage": "!!!No Waiting Screens",
4540 "end": {
4541 "column": 3,
4542 "line": 64
4543 },
4544 "file": "src/components/ui/FeatureList.js",
4545 "id": "pricing.features.appDelays",
4546 "start": {
4547 "column": 13,
4548 "line": 61
4549 }
4550 },
4551 {
4552 "defaultMessage": "!!!Forever ad-free",
4553 "end": {
4554 "column": 3,
4555 "line": 68
4556 },
4557 "file": "src/components/ui/FeatureList.js",
4558 "id": "pricing.features.adFree",
4559 "start": {
4560 "column": 10,
4561 "line": 65
4562 }
4563 },
4564 {
4565 "defaultMessage": "!!!Occasional Waiting Screens",
4566 "end": {
4567 "column": 3,
4568 "line": 72
4569 },
4570 "file": "src/components/ui/FeatureList.js",
4571 "id": "pricing.features.appDelaysEnabled",
4572 "start": {
4573 "column": 19,
4574 "line": 69
4575 } 3921 }
4576 } 3922 }
4577 ], 3923 ],
@@ -4634,42 +3980,6 @@
4634 { 3980 {
4635 "descriptors": [ 3981 "descriptors": [
4636 { 3982 {
4637 "defaultMessage": "!!!Upgrade account",
4638 "end": {
4639 "column": 3,
4640 "line": 19
4641 },
4642 "file": "src/components/ui/PremiumFeatureContainer/index.js",
4643 "id": "premiumFeature.button.upgradeAccount",
4644 "start": {
4645 "column": 10,
4646 "line": 16
4647 }
4648 }
4649 ],
4650 "path": "src/components/ui/PremiumFeatureContainer/index.json"
4651 },
4652 {
4653 "descriptors": [
4654 {
4655 "defaultMessage": "!!!Upgrade to Franz Professional",
4656 "end": {
4657 "column": 3,
4658 "line": 16
4659 },
4660 "file": "src/components/ui/UpgradeButton/index.js",
4661 "id": "global.upgradeButton.upgradeToPro",
4662 "start": {
4663 "column": 16,
4664 "line": 13
4665 }
4666 }
4667 ],
4668 "path": "src/components/ui/UpgradeButton/index.json"
4669 },
4670 {
4671 "descriptors": [
4672 {
4673 "defaultMessage": "!!!Loading {service}", 3983 "defaultMessage": "!!!Loading {service}",
4674 "end": { 3984 "end": {
4675 "column": 3, 3985 "column": 3,
@@ -4722,247 +4032,247 @@
4722 "defaultMessage": "!!!Name", 4032 "defaultMessage": "!!!Name",
4723 "end": { 4033 "end": {
4724 "column": 3, 4034 "column": 3,
4725 "line": 32 4035 "line": 31
4726 }, 4036 },
4727 "file": "src/containers/settings/EditServiceScreen.js", 4037 "file": "src/containers/settings/EditServiceScreen.js",
4728 "id": "settings.service.form.name", 4038 "id": "settings.service.form.name",
4729 "start": { 4039 "start": {
4730 "column": 8, 4040 "column": 8,
4731 "line": 29 4041 "line": 28
4732 } 4042 }
4733 }, 4043 },
4734 { 4044 {
4735 "defaultMessage": "!!!Enable service", 4045 "defaultMessage": "!!!Enable service",
4736 "end": { 4046 "end": {
4737 "column": 3, 4047 "column": 3,
4738 "line": 36 4048 "line": 35
4739 }, 4049 },
4740 "file": "src/containers/settings/EditServiceScreen.js", 4050 "file": "src/containers/settings/EditServiceScreen.js",
4741 "id": "settings.service.form.enableService", 4051 "id": "settings.service.form.enableService",
4742 "start": { 4052 "start": {
4743 "column": 17, 4053 "column": 17,
4744 "line": 33 4054 "line": 32
4745 } 4055 }
4746 }, 4056 },
4747 { 4057 {
4748 "defaultMessage": "!!!Enable hibernation", 4058 "defaultMessage": "!!!Enable hibernation",
4749 "end": { 4059 "end": {
4750 "column": 3, 4060 "column": 3,
4751 "line": 40 4061 "line": 39
4752 }, 4062 },
4753 "file": "src/containers/settings/EditServiceScreen.js", 4063 "file": "src/containers/settings/EditServiceScreen.js",
4754 "id": "settings.service.form.enableHibernation", 4064 "id": "settings.service.form.enableHibernation",
4755 "start": { 4065 "start": {
4756 "column": 21, 4066 "column": 21,
4757 "line": 37 4067 "line": 36
4758 } 4068 }
4759 }, 4069 },
4760 { 4070 {
4761 "defaultMessage": "!!!Enable Notifications", 4071 "defaultMessage": "!!!Enable Notifications",
4762 "end": { 4072 "end": {
4763 "column": 3, 4073 "column": 3,
4764 "line": 44 4074 "line": 43
4765 }, 4075 },
4766 "file": "src/containers/settings/EditServiceScreen.js", 4076 "file": "src/containers/settings/EditServiceScreen.js",
4767 "id": "settings.service.form.enableNotification", 4077 "id": "settings.service.form.enableNotification",
4768 "start": { 4078 "start": {
4769 "column": 22, 4079 "column": 22,
4770 "line": 41 4080 "line": 40
4771 } 4081 }
4772 }, 4082 },
4773 { 4083 {
4774 "defaultMessage": "!!!Show unread message badges", 4084 "defaultMessage": "!!!Show unread message badges",
4775 "end": { 4085 "end": {
4776 "column": 3, 4086 "column": 3,
4777 "line": 48 4087 "line": 47
4778 }, 4088 },
4779 "file": "src/containers/settings/EditServiceScreen.js", 4089 "file": "src/containers/settings/EditServiceScreen.js",
4780 "id": "settings.service.form.enableBadge", 4090 "id": "settings.service.form.enableBadge",
4781 "start": { 4091 "start": {
4782 "column": 15, 4092 "column": 15,
4783 "line": 45 4093 "line": 44
4784 } 4094 }
4785 }, 4095 },
4786 { 4096 {
4787 "defaultMessage": "!!!Enable audio", 4097 "defaultMessage": "!!!Enable audio",
4788 "end": { 4098 "end": {
4789 "column": 3, 4099 "column": 3,
4790 "line": 52 4100 "line": 51
4791 }, 4101 },
4792 "file": "src/containers/settings/EditServiceScreen.js", 4102 "file": "src/containers/settings/EditServiceScreen.js",
4793 "id": "settings.service.form.enableAudio", 4103 "id": "settings.service.form.enableAudio",
4794 "start": { 4104 "start": {
4795 "column": 15, 4105 "column": 15,
4796 "line": 49 4106 "line": 48
4797 } 4107 }
4798 }, 4108 },
4799 { 4109 {
4800 "defaultMessage": "!!!Team", 4110 "defaultMessage": "!!!Team",
4801 "end": { 4111 "end": {
4802 "column": 3, 4112 "column": 3,
4803 "line": 56 4113 "line": 55
4804 }, 4114 },
4805 "file": "src/containers/settings/EditServiceScreen.js", 4115 "file": "src/containers/settings/EditServiceScreen.js",
4806 "id": "settings.service.form.team", 4116 "id": "settings.service.form.team",
4807 "start": { 4117 "start": {
4808 "column": 8, 4118 "column": 8,
4809 "line": 53 4119 "line": 52
4810 } 4120 }
4811 }, 4121 },
4812 { 4122 {
4813 "defaultMessage": "!!!Service URL", 4123 "defaultMessage": "!!!Service URL",
4814 "end": { 4124 "end": {
4815 "column": 3, 4125 "column": 3,
4816 "line": 60 4126 "line": 59
4817 }, 4127 },
4818 "file": "src/containers/settings/EditServiceScreen.js", 4128 "file": "src/containers/settings/EditServiceScreen.js",
4819 "id": "settings.service.form.customUrl", 4129 "id": "settings.service.form.customUrl",
4820 "start": { 4130 "start": {
4821 "column": 13, 4131 "column": 13,
4822 "line": 57 4132 "line": 56
4823 } 4133 }
4824 }, 4134 },
4825 { 4135 {
4826 "defaultMessage": "!!!Show message badge for all new messages", 4136 "defaultMessage": "!!!Show message badge for all new messages",
4827 "end": { 4137 "end": {
4828 "column": 3, 4138 "column": 3,
4829 "line": 64 4139 "line": 63
4830 }, 4140 },
4831 "file": "src/containers/settings/EditServiceScreen.js", 4141 "file": "src/containers/settings/EditServiceScreen.js",
4832 "id": "settings.service.form.indirectMessages", 4142 "id": "settings.service.form.indirectMessages",
4833 "start": { 4143 "start": {
4834 "column": 20, 4144 "column": 20,
4835 "line": 61 4145 "line": 60
4836 } 4146 }
4837 }, 4147 },
4838 { 4148 {
4839 "defaultMessage": "!!!Custom icon", 4149 "defaultMessage": "!!!Custom icon",
4840 "end": { 4150 "end": {
4841 "column": 3, 4151 "column": 3,
4842 "line": 68 4152 "line": 67
4843 }, 4153 },
4844 "file": "src/containers/settings/EditServiceScreen.js", 4154 "file": "src/containers/settings/EditServiceScreen.js",
4845 "id": "settings.service.form.icon", 4155 "id": "settings.service.form.icon",
4846 "start": { 4156 "start": {
4847 "column": 8, 4157 "column": 8,
4848 "line": 65 4158 "line": 64
4849 } 4159 }
4850 }, 4160 },
4851 { 4161 {
4852 "defaultMessage": "!!!Enable Dark Mode", 4162 "defaultMessage": "!!!Enable Dark Mode",
4853 "end": { 4163 "end": {
4854 "column": 3, 4164 "column": 3,
4855 "line": 72 4165 "line": 71
4856 }, 4166 },
4857 "file": "src/containers/settings/EditServiceScreen.js", 4167 "file": "src/containers/settings/EditServiceScreen.js",
4858 "id": "settings.service.form.enableDarkMode", 4168 "id": "settings.service.form.enableDarkMode",
4859 "start": { 4169 "start": {
4860 "column": 18, 4170 "column": 18,
4861 "line": 69 4171 "line": 68
4862 } 4172 }
4863 }, 4173 },
4864 { 4174 {
4865 "defaultMessage": "!!!Dark Reader Brightness", 4175 "defaultMessage": "!!!Dark Reader Brightness",
4866 "end": { 4176 "end": {
4867 "column": 3, 4177 "column": 3,
4868 "line": 76 4178 "line": 75
4869 }, 4179 },
4870 "file": "src/containers/settings/EditServiceScreen.js", 4180 "file": "src/containers/settings/EditServiceScreen.js",
4871 "id": "settings.service.form.darkReaderBrightness", 4181 "id": "settings.service.form.darkReaderBrightness",
4872 "start": { 4182 "start": {
4873 "column": 24, 4183 "column": 24,
4874 "line": 73 4184 "line": 72
4875 } 4185 }
4876 }, 4186 },
4877 { 4187 {
4878 "defaultMessage": "!!!Dark Reader Contrast", 4188 "defaultMessage": "!!!Dark Reader Contrast",
4879 "end": { 4189 "end": {
4880 "column": 3, 4190 "column": 3,
4881 "line": 80 4191 "line": 79
4882 }, 4192 },
4883 "file": "src/containers/settings/EditServiceScreen.js", 4193 "file": "src/containers/settings/EditServiceScreen.js",
4884 "id": "settings.service.form.darkReaderContrast", 4194 "id": "settings.service.form.darkReaderContrast",
4885 "start": { 4195 "start": {
4886 "column": 22, 4196 "column": 22,
4887 "line": 77 4197 "line": 76
4888 } 4198 }
4889 }, 4199 },
4890 { 4200 {
4891 "defaultMessage": "!!!Dark Reader Sepia", 4201 "defaultMessage": "!!!Dark Reader Sepia",
4892 "end": { 4202 "end": {
4893 "column": 3, 4203 "column": 3,
4894 "line": 84 4204 "line": 83
4895 }, 4205 },
4896 "file": "src/containers/settings/EditServiceScreen.js", 4206 "file": "src/containers/settings/EditServiceScreen.js",
4897 "id": "settings.service.form.darkReaderSepia", 4207 "id": "settings.service.form.darkReaderSepia",
4898 "start": { 4208 "start": {
4899 "column": 19, 4209 "column": 19,
4900 "line": 81 4210 "line": 80
4901 } 4211 }
4902 }, 4212 },
4903 { 4213 {
4904 "defaultMessage": "!!!Use Proxy", 4214 "defaultMessage": "!!!Use Proxy",
4905 "end": { 4215 "end": {
4906 "column": 3, 4216 "column": 3,
4907 "line": 88 4217 "line": 87
4908 }, 4218 },
4909 "file": "src/containers/settings/EditServiceScreen.js", 4219 "file": "src/containers/settings/EditServiceScreen.js",
4910 "id": "settings.service.form.proxy.isEnabled", 4220 "id": "settings.service.form.proxy.isEnabled",
4911 "start": { 4221 "start": {
4912 "column": 15, 4222 "column": 15,
4913 "line": 85 4223 "line": 84
4914 } 4224 }
4915 }, 4225 },
4916 { 4226 {
4917 "defaultMessage": "!!!Proxy Host/IP", 4227 "defaultMessage": "!!!Proxy Host/IP",
4918 "end": { 4228 "end": {
4919 "column": 3, 4229 "column": 3,
4920 "line": 92 4230 "line": 91
4921 }, 4231 },
4922 "file": "src/containers/settings/EditServiceScreen.js", 4232 "file": "src/containers/settings/EditServiceScreen.js",
4923 "id": "settings.service.form.proxy.host", 4233 "id": "settings.service.form.proxy.host",
4924 "start": { 4234 "start": {
4925 "column": 13, 4235 "column": 13,
4926 "line": 89 4236 "line": 88
4927 } 4237 }
4928 }, 4238 },
4929 { 4239 {
4930 "defaultMessage": "!!!Port", 4240 "defaultMessage": "!!!Port",
4931 "end": { 4241 "end": {
4932 "column": 3, 4242 "column": 3,
4933 "line": 96 4243 "line": 95
4934 }, 4244 },
4935 "file": "src/containers/settings/EditServiceScreen.js", 4245 "file": "src/containers/settings/EditServiceScreen.js",
4936 "id": "settings.service.form.proxy.port", 4246 "id": "settings.service.form.proxy.port",
4937 "start": { 4247 "start": {
4938 "column": 13, 4248 "column": 13,
4939 "line": 93 4249 "line": 92
4940 } 4250 }
4941 }, 4251 },
4942 { 4252 {
4943 "defaultMessage": "!!!User", 4253 "defaultMessage": "!!!User",
4944 "end": { 4254 "end": {
4945 "column": 3, 4255 "column": 3,
4946 "line": 100 4256 "line": 99
4947 }, 4257 },
4948 "file": "src/containers/settings/EditServiceScreen.js", 4258 "file": "src/containers/settings/EditServiceScreen.js",
4949 "id": "settings.service.form.proxy.user", 4259 "id": "settings.service.form.proxy.user",
4950 "start": { 4260 "start": {
4951 "column": 13, 4261 "column": 13,
4952 "line": 97 4262 "line": 96
4953 } 4263 }
4954 }, 4264 },
4955 { 4265 {
4956 "defaultMessage": "!!!Password", 4266 "defaultMessage": "!!!Password",
4957 "end": { 4267 "end": {
4958 "column": 3, 4268 "column": 3,
4959 "line": 104 4269 "line": 103
4960 }, 4270 },
4961 "file": "src/containers/settings/EditServiceScreen.js", 4271 "file": "src/containers/settings/EditServiceScreen.js",
4962 "id": "settings.service.form.proxy.password", 4272 "id": "settings.service.form.proxy.password",
4963 "start": { 4273 "start": {
4964 "column": 17, 4274 "column": 17,
4965 "line": 101 4275 "line": 100
4966 } 4276 }
4967 } 4277 }
4968 ], 4278 ],
@@ -4974,585 +4284,585 @@
4974 "defaultMessage": "!!!Launch Ferdi on start", 4284 "defaultMessage": "!!!Launch Ferdi on start",
4975 "end": { 4285 "end": {
4976 "column": 3, 4286 "column": 3,
4977 "line": 34 4287 "line": 33
4978 }, 4288 },
4979 "file": "src/containers/settings/EditSettingsScreen.js", 4289 "file": "src/containers/settings/EditSettingsScreen.js",
4980 "id": "settings.app.form.autoLaunchOnStart", 4290 "id": "settings.app.form.autoLaunchOnStart",
4981 "start": { 4291 "start": {
4982 "column": 21, 4292 "column": 21,
4983 "line": 31 4293 "line": 30
4984 } 4294 }
4985 }, 4295 },
4986 { 4296 {
4987 "defaultMessage": "!!!Open in background", 4297 "defaultMessage": "!!!Open in background",
4988 "end": { 4298 "end": {
4989 "column": 3, 4299 "column": 3,
4990 "line": 38 4300 "line": 37
4991 }, 4301 },
4992 "file": "src/containers/settings/EditSettingsScreen.js", 4302 "file": "src/containers/settings/EditSettingsScreen.js",
4993 "id": "settings.app.form.autoLaunchInBackground", 4303 "id": "settings.app.form.autoLaunchInBackground",
4994 "start": { 4304 "start": {
4995 "column": 26, 4305 "column": 26,
4996 "line": 35 4306 "line": 34
4997 } 4307 }
4998 }, 4308 },
4999 { 4309 {
5000 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 4310 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
5001 "end": { 4311 "end": {
5002 "column": 3, 4312 "column": 3,
5003 "line": 42 4313 "line": 41
5004 }, 4314 },
5005 "file": "src/containers/settings/EditSettingsScreen.js", 4315 "file": "src/containers/settings/EditSettingsScreen.js",
5006 "id": "settings.app.form.runInBackground", 4316 "id": "settings.app.form.runInBackground",
5007 "start": { 4317 "start": {
5008 "column": 19, 4318 "column": 19,
5009 "line": 39 4319 "line": 38
5010 } 4320 }
5011 }, 4321 },
5012 { 4322 {
5013 "defaultMessage": "!!!Start minimized", 4323 "defaultMessage": "!!!Start minimized",
5014 "end": { 4324 "end": {
5015 "column": 3, 4325 "column": 3,
5016 "line": 46 4326 "line": 45
5017 }, 4327 },
5018 "file": "src/containers/settings/EditSettingsScreen.js", 4328 "file": "src/containers/settings/EditSettingsScreen.js",
5019 "id": "settings.app.form.startMinimized", 4329 "id": "settings.app.form.startMinimized",
5020 "start": { 4330 "start": {
5021 "column": 18, 4331 "column": 18,
5022 "line": 43 4332 "line": 42
5023 } 4333 }
5024 }, 4334 },
5025 { 4335 {
5026 "defaultMessage": "!!!Always show Ferdi in System Tray", 4336 "defaultMessage": "!!!Always show Ferdi in System Tray",
5027 "end": { 4337 "end": {
5028 "column": 3, 4338 "column": 3,
5029 "line": 50 4339 "line": 49
5030 }, 4340 },
5031 "file": "src/containers/settings/EditSettingsScreen.js", 4341 "file": "src/containers/settings/EditSettingsScreen.js",
5032 "id": "settings.app.form.enableSystemTray", 4342 "id": "settings.app.form.enableSystemTray",
5033 "start": { 4343 "start": {
5034 "column": 20, 4344 "column": 20,
5035 "line": 47 4345 "line": 46
5036 } 4346 }
5037 }, 4347 },
5038 { 4348 {
5039 "defaultMessage": "!!!Always show Ferdi in Menu Bar", 4349 "defaultMessage": "!!!Always show Ferdi in Menu Bar",
5040 "end": { 4350 "end": {
5041 "column": 3, 4351 "column": 3,
5042 "line": 54 4352 "line": 53
5043 }, 4353 },
5044 "file": "src/containers/settings/EditSettingsScreen.js", 4354 "file": "src/containers/settings/EditSettingsScreen.js",
5045 "id": "settings.app.form.enableMenuBar", 4355 "id": "settings.app.form.enableMenuBar",
5046 "start": { 4356 "start": {
5047 "column": 17, 4357 "column": 17,
5048 "line": 51 4358 "line": 50
5049 } 4359 }
5050 }, 4360 },
5051 { 4361 {
5052 "defaultMessage": "!!!Reload Ferdi after system resume", 4362 "defaultMessage": "!!!Reload Ferdi after system resume",
5053 "end": { 4363 "end": {
5054 "column": 3, 4364 "column": 3,
5055 "line": 58 4365 "line": 57
5056 }, 4366 },
5057 "file": "src/containers/settings/EditSettingsScreen.js", 4367 "file": "src/containers/settings/EditSettingsScreen.js",
5058 "id": "settings.app.form.reloadAfterResume", 4368 "id": "settings.app.form.reloadAfterResume",
5059 "start": { 4369 "start": {
5060 "column": 21, 4370 "column": 21,
5061 "line": 55 4371 "line": 54
5062 } 4372 }
5063 }, 4373 },
5064 { 4374 {
5065 "defaultMessage": "!!!Minimize Ferdi to system tray", 4375 "defaultMessage": "!!!Minimize Ferdi to system tray",
5066 "end": { 4376 "end": {
5067 "column": 3, 4377 "column": 3,
5068 "line": 62 4378 "line": 61
5069 }, 4379 },
5070 "file": "src/containers/settings/EditSettingsScreen.js", 4380 "file": "src/containers/settings/EditSettingsScreen.js",
5071 "id": "settings.app.form.minimizeToSystemTray", 4381 "id": "settings.app.form.minimizeToSystemTray",
5072 "start": { 4382 "start": {
5073 "column": 24, 4383 "column": 24,
5074 "line": 59 4384 "line": 58
5075 } 4385 }
5076 }, 4386 },
5077 { 4387 {
5078 "defaultMessage": "!!!Close Ferdi to system tray", 4388 "defaultMessage": "!!!Close Ferdi to system tray",
5079 "end": { 4389 "end": {
5080 "column": 3, 4390 "column": 3,
5081 "line": 66 4391 "line": 65
5082 }, 4392 },
5083 "file": "src/containers/settings/EditSettingsScreen.js", 4393 "file": "src/containers/settings/EditSettingsScreen.js",
5084 "id": "settings.app.form.closeToSystemTray", 4394 "id": "settings.app.form.closeToSystemTray",
5085 "start": { 4395 "start": {
5086 "column": 21, 4396 "column": 21,
5087 "line": 63 4397 "line": 62
5088 } 4398 }
5089 }, 4399 },
5090 { 4400 {
5091 "defaultMessage": "!!!Don't show message content in notifications", 4401 "defaultMessage": "!!!Don't show message content in notifications",
5092 "end": { 4402 "end": {
5093 "column": 3, 4403 "column": 3,
5094 "line": 70 4404 "line": 69
5095 }, 4405 },
5096 "file": "src/containers/settings/EditSettingsScreen.js", 4406 "file": "src/containers/settings/EditSettingsScreen.js",
5097 "id": "settings.app.form.privateNotifications", 4407 "id": "settings.app.form.privateNotifications",
5098 "start": { 4408 "start": {
5099 "column": 24, 4409 "column": 24,
5100 "line": 67 4410 "line": 66
5101 } 4411 }
5102 }, 4412 },
5103 { 4413 {
5104 "defaultMessage": "!!!Don't show notifications for clipboard events", 4414 "defaultMessage": "!!!Don't show notifications for clipboard events",
5105 "end": { 4415 "end": {
5106 "column": 3, 4416 "column": 3,
5107 "line": 74 4417 "line": 73
5108 }, 4418 },
5109 "file": "src/containers/settings/EditSettingsScreen.js", 4419 "file": "src/containers/settings/EditSettingsScreen.js",
5110 "id": "settings.app.form.clipboardNotifications", 4420 "id": "settings.app.form.clipboardNotifications",
5111 "start": { 4421 "start": {
5112 "column": 26, 4422 "column": 26,
5113 "line": 71 4423 "line": 70
5114 } 4424 }
5115 }, 4425 },
5116 { 4426 {
5117 "defaultMessage": "!!!Notify TaskBar/Dock on new message", 4427 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
5118 "end": { 4428 "end": {
5119 "column": 3, 4429 "column": 3,
5120 "line": 78 4430 "line": 77
5121 }, 4431 },
5122 "file": "src/containers/settings/EditSettingsScreen.js", 4432 "file": "src/containers/settings/EditSettingsScreen.js",
5123 "id": "settings.app.form.notifyTaskBarOnMessage", 4433 "id": "settings.app.form.notifyTaskBarOnMessage",
5124 "start": { 4434 "start": {
5125 "column": 26, 4435 "column": 26,
5126 "line": 75 4436 "line": 74
5127 } 4437 }
5128 }, 4438 },
5129 { 4439 {
5130 "defaultMessage": "!!!Navigation bar behaviour", 4440 "defaultMessage": "!!!Navigation bar behaviour",
5131 "end": { 4441 "end": {
5132 "column": 3, 4442 "column": 3,
5133 "line": 82 4443 "line": 81
5134 }, 4444 },
5135 "file": "src/containers/settings/EditSettingsScreen.js", 4445 "file": "src/containers/settings/EditSettingsScreen.js",
5136 "id": "settings.app.form.navigationBarBehaviour", 4446 "id": "settings.app.form.navigationBarBehaviour",
5137 "start": { 4447 "start": {
5138 "column": 26, 4448 "column": 26,
5139 "line": 79 4449 "line": 78
5140 } 4450 }
5141 }, 4451 },
5142 { 4452 {
5143 "defaultMessage": "!!!Search engine", 4453 "defaultMessage": "!!!Search engine",
5144 "end": { 4454 "end": {
5145 "column": 3, 4455 "column": 3,
5146 "line": 86 4456 "line": 85
5147 }, 4457 },
5148 "file": "src/containers/settings/EditSettingsScreen.js", 4458 "file": "src/containers/settings/EditSettingsScreen.js",
5149 "id": "settings.app.form.searchEngine", 4459 "id": "settings.app.form.searchEngine",
5150 "start": { 4460 "start": {
5151 "column": 16, 4461 "column": 16,
5152 "line": 83 4462 "line": 82
5153 } 4463 }
5154 }, 4464 },
5155 { 4465 {
5156 "defaultMessage": "!!!Send telemetry data", 4466 "defaultMessage": "!!!Send telemetry data",
5157 "end": { 4467 "end": {
5158 "column": 3, 4468 "column": 3,
5159 "line": 90 4469 "line": 89
5160 }, 4470 },
5161 "file": "src/containers/settings/EditSettingsScreen.js", 4471 "file": "src/containers/settings/EditSettingsScreen.js",
5162 "id": "settings.app.form.sentry", 4472 "id": "settings.app.form.sentry",
5163 "start": { 4473 "start": {
5164 "column": 10, 4474 "column": 10,
5165 "line": 87 4475 "line": 86
5166 } 4476 }
5167 }, 4477 },
5168 { 4478 {
5169 "defaultMessage": "!!!Enable service hibernation", 4479 "defaultMessage": "!!!Enable service hibernation",
5170 "end": { 4480 "end": {
5171 "column": 3, 4481 "column": 3,
5172 "line": 94 4482 "line": 93
5173 }, 4483 },
5174 "file": "src/containers/settings/EditSettingsScreen.js", 4484 "file": "src/containers/settings/EditSettingsScreen.js",
5175 "id": "settings.app.form.hibernate", 4485 "id": "settings.app.form.hibernate",
5176 "start": { 4486 "start": {
5177 "column": 13, 4487 "column": 13,
5178 "line": 91 4488 "line": 90
5179 } 4489 }
5180 }, 4490 },
5181 { 4491 {
5182 "defaultMessage": "!!!Keep services in hibernation on startup", 4492 "defaultMessage": "!!!Keep services in hibernation on startup",
5183 "end": { 4493 "end": {
5184 "column": 3, 4494 "column": 3,
5185 "line": 98 4495 "line": 97
5186 }, 4496 },
5187 "file": "src/containers/settings/EditSettingsScreen.js", 4497 "file": "src/containers/settings/EditSettingsScreen.js",
5188 "id": "settings.app.form.hibernateOnStartup", 4498 "id": "settings.app.form.hibernateOnStartup",
5189 "start": { 4499 "start": {
5190 "column": 22, 4500 "column": 22,
5191 "line": 95 4501 "line": 94
5192 } 4502 }
5193 }, 4503 },
5194 { 4504 {
5195 "defaultMessage": "!!!Hibernation strategy", 4505 "defaultMessage": "!!!Hibernation strategy",
5196 "end": { 4506 "end": {
5197 "column": 3, 4507 "column": 3,
5198 "line": 102 4508 "line": 101
5199 }, 4509 },
5200 "file": "src/containers/settings/EditSettingsScreen.js", 4510 "file": "src/containers/settings/EditSettingsScreen.js",
5201 "id": "settings.app.form.hibernationStrategy", 4511 "id": "settings.app.form.hibernationStrategy",
5202 "start": { 4512 "start": {
5203 "column": 23, 4513 "column": 23,
5204 "line": 99 4514 "line": 98
5205 } 4515 }
5206 }, 4516 },
5207 { 4517 {
5208 "defaultMessage": "!!!Todo Server", 4518 "defaultMessage": "!!!Todo Server",
5209 "end": { 4519 "end": {
5210 "column": 3, 4520 "column": 3,
5211 "line": 106 4521 "line": 105
5212 }, 4522 },
5213 "file": "src/containers/settings/EditSettingsScreen.js", 4523 "file": "src/containers/settings/EditSettingsScreen.js",
5214 "id": "settings.app.form.predefinedTodoServer", 4524 "id": "settings.app.form.predefinedTodoServer",
5215 "start": { 4525 "start": {
5216 "column": 24, 4526 "column": 24,
5217 "line": 103 4527 "line": 102
5218 } 4528 }
5219 }, 4529 },
5220 { 4530 {
5221 "defaultMessage": "!!!Custom TodoServer", 4531 "defaultMessage": "!!!Custom TodoServer",
5222 "end": { 4532 "end": {
5223 "column": 3, 4533 "column": 3,
5224 "line": 110 4534 "line": 109
5225 }, 4535 },
5226 "file": "src/containers/settings/EditSettingsScreen.js", 4536 "file": "src/containers/settings/EditSettingsScreen.js",
5227 "id": "settings.app.form.customTodoServer", 4537 "id": "settings.app.form.customTodoServer",
5228 "start": { 4538 "start": {
5229 "column": 20, 4539 "column": 20,
5230 "line": 107 4540 "line": 106
5231 } 4541 }
5232 }, 4542 },
5233 { 4543 {
5234 "defaultMessage": "!!!Enable Password Lock", 4544 "defaultMessage": "!!!Enable Password Lock",
5235 "end": { 4545 "end": {
5236 "column": 3, 4546 "column": 3,
5237 "line": 114 4547 "line": 113
5238 }, 4548 },
5239 "file": "src/containers/settings/EditSettingsScreen.js", 4549 "file": "src/containers/settings/EditSettingsScreen.js",
5240 "id": "settings.app.form.enableLock", 4550 "id": "settings.app.form.enableLock",
5241 "start": { 4551 "start": {
5242 "column": 14, 4552 "column": 14,
5243 "line": 111 4553 "line": 110
5244 } 4554 }
5245 }, 4555 },
5246 { 4556 {
5247 "defaultMessage": "!!!Password", 4557 "defaultMessage": "!!!Password",
5248 "end": { 4558 "end": {
5249 "column": 3, 4559 "column": 3,
5250 "line": 118 4560 "line": 117
5251 }, 4561 },
5252 "file": "src/containers/settings/EditSettingsScreen.js", 4562 "file": "src/containers/settings/EditSettingsScreen.js",
5253 "id": "settings.app.form.lockPassword", 4563 "id": "settings.app.form.lockPassword",
5254 "start": { 4564 "start": {
5255 "column": 16, 4565 "column": 16,
5256 "line": 115 4566 "line": 114
5257 } 4567 }
5258 }, 4568 },
5259 { 4569 {
5260 "defaultMessage": "!!!Allow using Touch ID to unlock", 4570 "defaultMessage": "!!!Allow using Touch ID to unlock",
5261 "end": { 4571 "end": {
5262 "column": 3, 4572 "column": 3,
5263 "line": 122 4573 "line": 121
5264 }, 4574 },
5265 "file": "src/containers/settings/EditSettingsScreen.js", 4575 "file": "src/containers/settings/EditSettingsScreen.js",
5266 "id": "settings.app.form.useTouchIdToUnlock", 4576 "id": "settings.app.form.useTouchIdToUnlock",
5267 "start": { 4577 "start": {
5268 "column": 22, 4578 "column": 22,
5269 "line": 119 4579 "line": 118
5270 } 4580 }
5271 }, 4581 },
5272 { 4582 {
5273 "defaultMessage": "!!!Lock after inactivity", 4583 "defaultMessage": "!!!Lock after inactivity",
5274 "end": { 4584 "end": {
5275 "column": 3, 4585 "column": 3,
5276 "line": 126 4586 "line": 125
5277 }, 4587 },
5278 "file": "src/containers/settings/EditSettingsScreen.js", 4588 "file": "src/containers/settings/EditSettingsScreen.js",
5279 "id": "settings.app.form.inactivityLock", 4589 "id": "settings.app.form.inactivityLock",
5280 "start": { 4590 "start": {
5281 "column": 18, 4591 "column": 18,
5282 "line": 123 4592 "line": 122
5283 } 4593 }
5284 }, 4594 },
5285 { 4595 {
5286 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 4596 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
5287 "end": { 4597 "end": {
5288 "column": 3, 4598 "column": 3,
5289 "line": 130 4599 "line": 129
5290 }, 4600 },
5291 "file": "src/containers/settings/EditSettingsScreen.js", 4601 "file": "src/containers/settings/EditSettingsScreen.js",
5292 "id": "settings.app.form.scheduledDNDEnabled", 4602 "id": "settings.app.form.scheduledDNDEnabled",
5293 "start": { 4603 "start": {
5294 "column": 23, 4604 "column": 23,
5295 "line": 127 4605 "line": 126
5296 } 4606 }
5297 }, 4607 },
5298 { 4608 {
5299 "defaultMessage": "!!!From", 4609 "defaultMessage": "!!!From",
5300 "end": { 4610 "end": {
5301 "column": 3, 4611 "column": 3,
5302 "line": 134 4612 "line": 133
5303 }, 4613 },
5304 "file": "src/containers/settings/EditSettingsScreen.js", 4614 "file": "src/containers/settings/EditSettingsScreen.js",
5305 "id": "settings.app.form.scheduledDNDStart", 4615 "id": "settings.app.form.scheduledDNDStart",
5306 "start": { 4616 "start": {
5307 "column": 21, 4617 "column": 21,
5308 "line": 131 4618 "line": 130
5309 } 4619 }
5310 }, 4620 },
5311 { 4621 {
5312 "defaultMessage": "!!!To", 4622 "defaultMessage": "!!!To",
5313 "end": { 4623 "end": {
5314 "column": 3, 4624 "column": 3,
5315 "line": 138 4625 "line": 137
5316 }, 4626 },
5317 "file": "src/containers/settings/EditSettingsScreen.js", 4627 "file": "src/containers/settings/EditSettingsScreen.js",
5318 "id": "settings.app.form.scheduledDNDEnd", 4628 "id": "settings.app.form.scheduledDNDEnd",
5319 "start": { 4629 "start": {
5320 "column": 19, 4630 "column": 19,
5321 "line": 135 4631 "line": 134
5322 } 4632 }
5323 }, 4633 },
5324 { 4634 {
5325 "defaultMessage": "!!!Language", 4635 "defaultMessage": "!!!Language",
5326 "end": { 4636 "end": {
5327 "column": 3, 4637 "column": 3,
5328 "line": 142 4638 "line": 141
5329 }, 4639 },
5330 "file": "src/containers/settings/EditSettingsScreen.js", 4640 "file": "src/containers/settings/EditSettingsScreen.js",
5331 "id": "settings.app.form.language", 4641 "id": "settings.app.form.language",
5332 "start": { 4642 "start": {
5333 "column": 12, 4643 "column": 12,
5334 "line": 139 4644 "line": 138
5335 } 4645 }
5336 }, 4646 },
5337 { 4647 {
5338 "defaultMessage": "!!!Dark Mode", 4648 "defaultMessage": "!!!Dark Mode",
5339 "end": { 4649 "end": {
5340 "column": 3, 4650 "column": 3,
5341 "line": 146 4651 "line": 145
5342 }, 4652 },
5343 "file": "src/containers/settings/EditSettingsScreen.js", 4653 "file": "src/containers/settings/EditSettingsScreen.js",
5344 "id": "settings.app.form.darkMode", 4654 "id": "settings.app.form.darkMode",
5345 "start": { 4655 "start": {
5346 "column": 12, 4656 "column": 12,
5347 "line": 143 4657 "line": 142
5348 } 4658 }
5349 }, 4659 },
5350 { 4660 {
5351 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 4661 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
5352 "end": { 4662 "end": {
5353 "column": 3, 4663 "column": 3,
5354 "line": 150 4664 "line": 149
5355 }, 4665 },
5356 "file": "src/containers/settings/EditSettingsScreen.js", 4666 "file": "src/containers/settings/EditSettingsScreen.js",
5357 "id": "settings.app.form.adaptableDarkMode", 4667 "id": "settings.app.form.adaptableDarkMode",
5358 "start": { 4668 "start": {
5359 "column": 21, 4669 "column": 21,
5360 "line": 147 4670 "line": 146
5361 } 4671 }
5362 }, 4672 },
5363 { 4673 {
5364 "defaultMessage": "!!!Enable universal Dark Mode", 4674 "defaultMessage": "!!!Enable universal Dark Mode",
5365 "end": { 4675 "end": {
5366 "column": 3, 4676 "column": 3,
5367 "line": 154 4677 "line": 153
5368 }, 4678 },
5369 "file": "src/containers/settings/EditSettingsScreen.js", 4679 "file": "src/containers/settings/EditSettingsScreen.js",
5370 "id": "settings.app.form.universalDarkMode", 4680 "id": "settings.app.form.universalDarkMode",
5371 "start": { 4681 "start": {
5372 "column": 21, 4682 "column": 21,
5373 "line": 151 4683 "line": 150
5374 } 4684 }
5375 }, 4685 },
5376 { 4686 {
5377 "defaultMessage": "!!!Sidebar width", 4687 "defaultMessage": "!!!Sidebar width",
5378 "end": { 4688 "end": {
5379 "column": 3, 4689 "column": 3,
5380 "line": 158 4690 "line": 157
5381 }, 4691 },
5382 "file": "src/containers/settings/EditSettingsScreen.js", 4692 "file": "src/containers/settings/EditSettingsScreen.js",
5383 "id": "settings.app.form.serviceRibbonWidth", 4693 "id": "settings.app.form.serviceRibbonWidth",
5384 "start": { 4694 "start": {
5385 "column": 22, 4695 "column": 22,
5386 "line": 155 4696 "line": 154
5387 } 4697 }
5388 }, 4698 },
5389 { 4699 {
5390 "defaultMessage": "!!!Service icon size", 4700 "defaultMessage": "!!!Service icon size",
5391 "end": { 4701 "end": {
5392 "column": 3, 4702 "column": 3,
5393 "line": 162 4703 "line": 161
5394 }, 4704 },
5395 "file": "src/containers/settings/EditSettingsScreen.js", 4705 "file": "src/containers/settings/EditSettingsScreen.js",
5396 "id": "settings.app.form.iconSize", 4706 "id": "settings.app.form.iconSize",
5397 "start": { 4707 "start": {
5398 "column": 12, 4708 "column": 12,
5399 "line": 159 4709 "line": 158
5400 } 4710 }
5401 }, 4711 },
5402 { 4712 {
5403 "defaultMessage": "!!!Use vertical style", 4713 "defaultMessage": "!!!Use vertical style",
5404 "end": { 4714 "end": {
5405 "column": 3, 4715 "column": 3,
5406 "line": 166 4716 "line": 165
5407 }, 4717 },
5408 "file": "src/containers/settings/EditSettingsScreen.js", 4718 "file": "src/containers/settings/EditSettingsScreen.js",
5409 "id": "settings.app.form.useVerticalStyle", 4719 "id": "settings.app.form.useVerticalStyle",
5410 "start": { 4720 "start": {
5411 "column": 20, 4721 "column": 20,
5412 "line": 163 4722 "line": 162
5413 } 4723 }
5414 }, 4724 },
5415 { 4725 {
5416 "defaultMessage": "!!!Always show workspace drawer", 4726 "defaultMessage": "!!!Always show workspace drawer",
5417 "end": { 4727 "end": {
5418 "column": 3, 4728 "column": 3,
5419 "line": 170 4729 "line": 169
5420 }, 4730 },
5421 "file": "src/containers/settings/EditSettingsScreen.js", 4731 "file": "src/containers/settings/EditSettingsScreen.js",
5422 "id": "settings.app.form.alwaysShowWorkspaces", 4732 "id": "settings.app.form.alwaysShowWorkspaces",
5423 "start": { 4733 "start": {
5424 "column": 24, 4734 "column": 24,
5425 "line": 167 4735 "line": 166
5426 } 4736 }
5427 }, 4737 },
5428 { 4738 {
5429 "defaultMessage": "!!!Accent color", 4739 "defaultMessage": "!!!Accent color",
5430 "end": { 4740 "end": {
5431 "column": 3, 4741 "column": 3,
5432 "line": 174 4742 "line": 173
5433 }, 4743 },
5434 "file": "src/containers/settings/EditSettingsScreen.js", 4744 "file": "src/containers/settings/EditSettingsScreen.js",
5435 "id": "settings.app.form.accentColor", 4745 "id": "settings.app.form.accentColor",
5436 "start": { 4746 "start": {
5437 "column": 15, 4747 "column": 15,
5438 "line": 171 4748 "line": 170
5439 } 4749 }
5440 }, 4750 },
5441 { 4751 {
5442 "defaultMessage": "!!!Display disabled services tabs", 4752 "defaultMessage": "!!!Display disabled services tabs",
5443 "end": { 4753 "end": {
5444 "column": 3, 4754 "column": 3,
5445 "line": 178 4755 "line": 177
5446 }, 4756 },
5447 "file": "src/containers/settings/EditSettingsScreen.js", 4757 "file": "src/containers/settings/EditSettingsScreen.js",
5448 "id": "settings.app.form.showDisabledServices", 4758 "id": "settings.app.form.showDisabledServices",
5449 "start": { 4759 "start": {
5450 "column": 24, 4760 "column": 24,
5451 "line": 175 4761 "line": 174
5452 } 4762 }
5453 }, 4763 },
5454 { 4764 {
5455 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 4765 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
5456 "end": { 4766 "end": {
5457 "column": 3, 4767 "column": 3,
5458 "line": 182 4768 "line": 181
5459 }, 4769 },
5460 "file": "src/containers/settings/EditSettingsScreen.js", 4770 "file": "src/containers/settings/EditSettingsScreen.js",
5461 "id": "settings.app.form.showMessagesBadgesWhenMuted", 4771 "id": "settings.app.form.showMessagesBadgesWhenMuted",
5462 "start": { 4772 "start": {
5463 "column": 29, 4773 "column": 29,
5464 "line": 179 4774 "line": 178
5465 } 4775 }
5466 }, 4776 },
5467 { 4777 {
5468 "defaultMessage": "!!!Show draggable area on window", 4778 "defaultMessage": "!!!Show draggable area on window",
5469 "end": { 4779 "end": {
5470 "column": 3, 4780 "column": 3,
5471 "line": 186 4781 "line": 185
5472 }, 4782 },
5473 "file": "src/containers/settings/EditSettingsScreen.js", 4783 "file": "src/containers/settings/EditSettingsScreen.js",
5474 "id": "settings.app.form.showDragArea", 4784 "id": "settings.app.form.showDragArea",
5475 "start": { 4785 "start": {
5476 "column": 16, 4786 "column": 16,
5477 "line": 183 4787 "line": 182
5478 } 4788 }
5479 }, 4789 },
5480 { 4790 {
5481 "defaultMessage": "!!!Enable spell checking", 4791 "defaultMessage": "!!!Enable spell checking",
5482 "end": { 4792 "end": {
5483 "column": 3, 4793 "column": 3,
5484 "line": 190 4794 "line": 189
5485 }, 4795 },
5486 "file": "src/containers/settings/EditSettingsScreen.js", 4796 "file": "src/containers/settings/EditSettingsScreen.js",
5487 "id": "settings.app.form.enableSpellchecking", 4797 "id": "settings.app.form.enableSpellchecking",
5488 "start": { 4798 "start": {
5489 "column": 23, 4799 "column": 23,
5490 "line": 187 4800 "line": 186
5491 } 4801 }
5492 }, 4802 },
5493 { 4803 {
5494 "defaultMessage": "!!!Enable GPU Acceleration", 4804 "defaultMessage": "!!!Enable GPU Acceleration",
5495 "end": { 4805 "end": {
5496 "column": 3, 4806 "column": 3,
5497 "line": 194 4807 "line": 193
5498 }, 4808 },
5499 "file": "src/containers/settings/EditSettingsScreen.js", 4809 "file": "src/containers/settings/EditSettingsScreen.js",
5500 "id": "settings.app.form.enableGPUAcceleration", 4810 "id": "settings.app.form.enableGPUAcceleration",
5501 "start": { 4811 "start": {
5502 "column": 25, 4812 "column": 25,
5503 "line": 191 4813 "line": 190
5504 } 4814 }
5505 }, 4815 },
5506 { 4816 {
5507 "defaultMessage": "!!!Include beta versions", 4817 "defaultMessage": "!!!Include beta versions",
5508 "end": { 4818 "end": {
5509 "column": 3, 4819 "column": 3,
5510 "line": 198 4820 "line": 197
5511 }, 4821 },
5512 "file": "src/containers/settings/EditSettingsScreen.js", 4822 "file": "src/containers/settings/EditSettingsScreen.js",
5513 "id": "settings.app.form.beta", 4823 "id": "settings.app.form.beta",
5514 "start": { 4824 "start": {
5515 "column": 8, 4825 "column": 8,
5516 "line": 195 4826 "line": 194
5517 } 4827 }
5518 }, 4828 },
5519 { 4829 {
5520 "defaultMessage": "!!!Enable updates", 4830 "defaultMessage": "!!!Enable updates",
5521 "end": { 4831 "end": {
5522 "column": 3, 4832 "column": 3,
5523 "line": 202 4833 "line": 201
5524 }, 4834 },
5525 "file": "src/containers/settings/EditSettingsScreen.js", 4835 "file": "src/containers/settings/EditSettingsScreen.js",
5526 "id": "settings.app.form.automaticUpdates", 4836 "id": "settings.app.form.automaticUpdates",
5527 "start": { 4837 "start": {
5528 "column": 20, 4838 "column": 20,
5529 "line": 199 4839 "line": 198
5530 } 4840 }
5531 }, 4841 },
5532 { 4842 {
5533 "defaultMessage": "!!!Enable Franz Todos", 4843 "defaultMessage": "!!!Enable Franz Todos",
5534 "end": { 4844 "end": {
5535 "column": 3, 4845 "column": 3,
5536 "line": 206 4846 "line": 205
5537 }, 4847 },
5538 "file": "src/containers/settings/EditSettingsScreen.js", 4848 "file": "src/containers/settings/EditSettingsScreen.js",
5539 "id": "settings.app.form.enableTodos", 4849 "id": "settings.app.form.enableTodos",
5540 "start": { 4850 "start": {
5541 "column": 15, 4851 "column": 15,
5542 "line": 203 4852 "line": 202
5543 } 4853 }
5544 }, 4854 },
5545 { 4855 {
5546 "defaultMessage": "!!!Keep all workspaces loaded", 4856 "defaultMessage": "!!!Keep all workspaces loaded",
5547 "end": { 4857 "end": {
5548 "column": 3, 4858 "column": 3,
5549 "line": 210 4859 "line": 209
5550 }, 4860 },
5551 "file": "src/containers/settings/EditSettingsScreen.js", 4861 "file": "src/containers/settings/EditSettingsScreen.js",
5552 "id": "settings.app.form.keepAllWorkspacesLoaded", 4862 "id": "settings.app.form.keepAllWorkspacesLoaded",
5553 "start": { 4863 "start": {
5554 "column": 27, 4864 "column": 27,
5555 "line": 207 4865 "line": 206
5556 } 4866 }
5557 } 4867 }
5558 ], 4868 ],
@@ -5719,76 +5029,6 @@
5719 { 5029 {
5720 "descriptors": [ 5030 "descriptors": [
5721 { 5031 {
5722 "defaultMessage": "!!!Please purchase license to skip waiting",
5723 "end": {
5724 "column": 3,
5725 "line": 19
5726 },
5727 "file": "src/features/delayApp/Component.js",
5728 "id": "feature.delayApp.headline",
5729 "start": {
5730 "column": 12,
5731 "line": 16
5732 }
5733 },
5734 {
5735 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
5736 "end": {
5737 "column": 3,
5738 "line": 23
5739 },
5740 "file": "src/features/delayApp/Component.js",
5741 "id": "feature.delayApp.trial.headline",
5742 "start": {
5743 "column": 17,
5744 "line": 20
5745 }
5746 },
5747 {
5748 "defaultMessage": "!!!Upgrade Franz",
5749 "end": {
5750 "column": 3,
5751 "line": 27
5752 },
5753 "file": "src/features/delayApp/Component.js",
5754 "id": "feature.delayApp.upgrade.action",
5755 "start": {
5756 "column": 10,
5757 "line": 24
5758 }
5759 },
5760 {
5761 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
5762 "end": {
5763 "column": 3,
5764 "line": 31
5765 },
5766 "file": "src/features/delayApp/Component.js",
5767 "id": "feature.delayApp.trial.action",
5768 "start": {
5769 "column": 15,
5770 "line": 28
5771 }
5772 },
5773 {
5774 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
5775 "end": {
5776 "column": 3,
5777 "line": 35
5778 },
5779 "file": "src/features/delayApp/Component.js",
5780 "id": "feature.delayApp.text",
5781 "start": {
5782 "column": 8,
5783 "line": 32
5784 }
5785 }
5786 ],
5787 "path": "src/features/delayApp/Component.json"
5788 },
5789 {
5790 "descriptors": [
5791 {
5792 "defaultMessage": "!!!Nightly Builds", 5032 "defaultMessage": "!!!Nightly Builds",
5793 "end": { 5033 "end": {
5794 "column": 3, 5034 "column": 3,
@@ -5846,299 +5086,6 @@
5846 { 5086 {
5847 "descriptors": [ 5087 "descriptors": [
5848 { 5088 {
5849 "defaultMessage": "!!!per month",
5850 "end": {
5851 "column": 3,
5852 "line": 18
5853 },
5854 "file": "src/features/planSelection/components/PlanItem.js",
5855 "id": "subscription.interval.perMonth",
5856 "start": {
5857 "column": 12,
5858 "line": 15
5859 }
5860 },
5861 {
5862 "defaultMessage": "!!!per month & user",
5863 "end": {
5864 "column": 3,
5865 "line": 22
5866 },
5867 "file": "src/features/planSelection/components/PlanItem.js",
5868 "id": "subscription.interval.perMonthPerUser",
5869 "start": {
5870 "column": 19,
5871 "line": 19
5872 }
5873 },
5874 {
5875 "defaultMessage": "!!!Best value",
5876 "end": {
5877 "column": 3,
5878 "line": 26
5879 },
5880 "file": "src/features/planSelection/components/PlanItem.js",
5881 "id": "subscription.bestValue",
5882 "start": {
5883 "column": 13,
5884 "line": 23
5885 }
5886 }
5887 ],
5888 "path": "src/features/planSelection/components/PlanItem.json"
5889 },
5890 {
5891 "descriptors": [
5892 {
5893 "defaultMessage": "!!!Are you ready to choose, {name}",
5894 "end": {
5895 "column": 3,
5896 "line": 20
5897 },
5898 "file": "src/features/planSelection/components/PlanSelection.js",
5899 "id": "feature.planSelection.fullscreen.welcome",
5900 "start": {
5901 "column": 11,
5902 "line": 17
5903 }
5904 },
5905 {
5906 "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
5907 "end": {
5908 "column": 3,
5909 "line": 24
5910 },
5911 "file": "src/features/planSelection/components/PlanSelection.js",
5912 "id": "feature.planSelection.fullscreen.subheadline",
5913 "start": {
5914 "column": 15,
5915 "line": 21
5916 }
5917 },
5918 {
5919 "defaultMessage": "!!!Basic functionality",
5920 "end": {
5921 "column": 3,
5922 "line": 28
5923 },
5924 "file": "src/features/planSelection/components/PlanSelection.js",
5925 "id": "feature.planSelection.free.text",
5926 "start": {
5927 "column": 12,
5928 "line": 25
5929 }
5930 },
5931 {
5932 "defaultMessage": "!!!More services, no waiting - ideal for personal use.",
5933 "end": {
5934 "column": 3,
5935 "line": 32
5936 },
5937 "file": "src/features/planSelection/components/PlanSelection.js",
5938 "id": "feature.planSelection.personal.text",
5939 "start": {
5940 "column": 16,
5941 "line": 29
5942 }
5943 },
5944 {
5945 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.",
5946 "end": {
5947 "column": 3,
5948 "line": 36
5949 },
5950 "file": "src/features/planSelection/components/PlanSelection.js",
5951 "id": "feature.planSelection.pro.text",
5952 "start": {
5953 "column": 20,
5954 "line": 33
5955 }
5956 },
5957 {
5958 "defaultMessage": "!!!Stay on Free",
5959 "end": {
5960 "column": 3,
5961 "line": 40
5962 },
5963 "file": "src/features/planSelection/components/PlanSelection.js",
5964 "id": "feature.planSelection.cta.stayOnFree",
5965 "start": {
5966 "column": 17,
5967 "line": 37
5968 }
5969 },
5970 {
5971 "defaultMessage": "!!!Downgrade to Free",
5972 "end": {
5973 "column": 3,
5974 "line": 44
5975 },
5976 "file": "src/features/planSelection/components/PlanSelection.js",
5977 "id": "feature.planSelection.cta.ctaDowngradeFree",
5978 "start": {
5979 "column": 20,
5980 "line": 41
5981 }
5982 },
5983 {
5984 "defaultMessage": "!!!Start my free 14-days Trial",
5985 "end": {
5986 "column": 3,
5987 "line": 48
5988 },
5989 "file": "src/features/planSelection/components/PlanSelection.js",
5990 "id": "feature.planSelection.cta.trial",
5991 "start": {
5992 "column": 15,
5993 "line": 45
5994 }
5995 },
5996 {
5997 "defaultMessage": "!!!Choose Personal",
5998 "end": {
5999 "column": 3,
6000 "line": 52
6001 },
6002 "file": "src/features/planSelection/components/PlanSelection.js",
6003 "id": "feature.planSelection.cta.upgradePersonal",
6004 "start": {
6005 "column": 23,
6006 "line": 49
6007 }
6008 },
6009 {
6010 "defaultMessage": "!!!Choose Professional",
6011 "end": {
6012 "column": 3,
6013 "line": 56
6014 },
6015 "file": "src/features/planSelection/components/PlanSelection.js",
6016 "id": "feature.planSelection.cta.upgradePro",
6017 "start": {
6018 "column": 18,
6019 "line": 53
6020 }
6021 },
6022 {
6023 "defaultMessage": "!!!Complete comparison of all plans",
6024 "end": {
6025 "column": 3,
6026 "line": 60
6027 },
6028 "file": "src/features/planSelection/components/PlanSelection.js",
6029 "id": "feature.planSelection.fullFeatureList",
6030 "start": {
6031 "column": 19,
6032 "line": 57
6033 }
6034 },
6035 {
6036 "defaultMessage": "!!!All prices based on yearly payment",
6037 "end": {
6038 "column": 3,
6039 "line": 64
6040 },
6041 "file": "src/features/planSelection/components/PlanSelection.js",
6042 "id": "feature.planSelection.pricesBasedOnAnnualPayment",
6043 "start": {
6044 "column": 30,
6045 "line": 61
6046 }
6047 }
6048 ],
6049 "path": "src/features/planSelection/components/PlanSelection.json"
6050 },
6051 {
6052 "descriptors": [
6053 {
6054 "defaultMessage": "!!!per {interval}",
6055 "end": {
6056 "column": 3,
6057 "line": 19
6058 },
6059 "file": "src/features/planSelection/components/PlanTeaser.js",
6060 "id": "subscription.interval.per",
6061 "start": {
6062 "column": 7,
6063 "line": 16
6064 }
6065 },
6066 {
6067 "defaultMessage": "!!!Upgrade Account",
6068 "end": {
6069 "column": 3,
6070 "line": 23
6071 },
6072 "file": "src/features/planSelection/components/PlanTeaser.js",
6073 "id": "subscription.planItem.upgradeAccount",
6074 "start": {
6075 "column": 7,
6076 "line": 20
6077 }
6078 }
6079 ],
6080 "path": "src/features/planSelection/components/PlanTeaser.json"
6081 },
6082 {
6083 "descriptors": [
6084 {
6085 "defaultMessage": "!!!Downgrade your Franz Plan",
6086 "end": {
6087 "column": 3,
6088 "line": 18
6089 },
6090 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6091 "id": "feature.planSelection.fullscreen.dialog.title",
6092 "start": {
6093 "column": 15,
6094 "line": 15
6095 }
6096 },
6097 {
6098 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
6099 "end": {
6100 "column": 3,
6101 "line": 22
6102 },
6103 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6104 "id": "feature.planSelection.fullscreen.dialog.message",
6105 "start": {
6106 "column": 17,
6107 "line": 19
6108 }
6109 },
6110 {
6111 "defaultMessage": "!!!Downgrade to Free",
6112 "end": {
6113 "column": 3,
6114 "line": 26
6115 },
6116 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6117 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade",
6118 "start": {
6119 "column": 22,
6120 "line": 23
6121 }
6122 },
6123 {
6124 "defaultMessage": "!!!Choose Personal",
6125 "end": {
6126 "column": 3,
6127 "line": 30
6128 },
6129 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6130 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade",
6131 "start": {
6132 "column": 20,
6133 "line": 27
6134 }
6135 }
6136 ],
6137 "path": "src/features/planSelection/containers/PlanSelectionScreen.json"
6138 },
6139 {
6140 "descriptors": [
6141 {
6142 "defaultMessage": "!!!Publish debug information", 5089 "defaultMessage": "!!!Publish debug information",
6143 "end": { 5090 "end": {
6144 "column": 3, 5091 "column": 3,
@@ -6349,55 +5296,6 @@
6349 { 5296 {
6350 "descriptors": [ 5297 "descriptors": [
6351 { 5298 {
6352 "defaultMessage": "!!!Changes in Franz {version}",
6353 "end": {
6354 "column": 3,
6355 "line": 23
6356 },
6357 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
6358 "id": "feature.announcements.changelog.headline",
6359 "start": {
6360 "column": 12,
6361 "line": 20
6362 }
6363 }
6364 ],
6365 "path": "src/features/serviceLimit/components/AnnouncementScreen.json"
6366 },
6367 {
6368 "descriptors": [
6369 {
6370 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
6371 "end": {
6372 "column": 3,
6373 "line": 12
6374 },
6375 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6376 "id": "feature.serviceLimit.limitReached",
6377 "start": {
6378 "column": 16,
6379 "line": 9
6380 }
6381 },
6382 {
6383 "defaultMessage": "!!!Upgrade account",
6384 "end": {
6385 "column": 3,
6386 "line": 16
6387 },
6388 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6389 "id": "premiumFeature.button.upgradeAccount",
6390 "start": {
6391 "column": 10,
6392 "line": 13
6393 }
6394 }
6395 ],
6396 "path": "src/features/serviceLimit/components/LimitReachedInfobox.json"
6397 },
6398 {
6399 "descriptors": [
6400 {
6401 "defaultMessage": "!!!Ferdi is better together!", 5299 "defaultMessage": "!!!Ferdi is better together!",
6402 "end": { 5300 "end": {
6403 "column": 3, 5301 "column": 3,
@@ -6463,7 +5361,7 @@
6463 } 5361 }
6464 }, 5362 },
6465 { 5363 {
6466 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 5364 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
6467 "end": { 5365 "end": {
6468 "column": 3, 5366 "column": 3,
6469 "line": 40 5367 "line": 40
@@ -6476,7 +5374,7 @@
6476 } 5374 }
6477 }, 5375 },
6478 { 5376 {
6479 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 5377 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
6480 "end": { 5378 "end": {
6481 "column": 3, 5379 "column": 3,
6482 "line": 44 5380 "line": 44
@@ -6538,107 +5436,6 @@
6538 { 5436 {
6539 "descriptors": [ 5437 "descriptors": [
6540 { 5438 {
6541 "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.",
6542 "end": {
6543 "column": 3,
6544 "line": 16
6545 },
6546 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6547 "id": "feature.trialStatusBar.restTime",
6548 "start": {
6549 "column": 12,
6550 "line": 13
6551 }
6552 },
6553 {
6554 "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.",
6555 "end": {
6556 "column": 3,
6557 "line": 20
6558 },
6559 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6560 "id": "feature.trialStatusBar.expired",
6561 "start": {
6562 "column": 11,
6563 "line": 17
6564 }
6565 },
6566 {
6567 "defaultMessage": "!!!Upgrade now",
6568 "end": {
6569 "column": 3,
6570 "line": 24
6571 },
6572 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6573 "id": "feature.trialStatusBar.cta",
6574 "start": {
6575 "column": 7,
6576 "line": 21
6577 }
6578 }
6579 ],
6580 "path": "src/features/trialStatusBar/components/TrialStatusBar.json"
6581 },
6582 {
6583 "descriptors": [
6584 {
6585 "defaultMessage": "!!!Downgrade your Franz Plan",
6586 "end": {
6587 "column": 3,
6588 "line": 19
6589 },
6590 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6591 "id": "feature.trialStatusBar.fullscreen.dialog.title",
6592 "start": {
6593 "column": 15,
6594 "line": 16
6595 }
6596 },
6597 {
6598 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
6599 "end": {
6600 "column": 3,
6601 "line": 23
6602 },
6603 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6604 "id": "feature.trialStatusBar.fullscreen.dialog.message",
6605 "start": {
6606 "column": 17,
6607 "line": 20
6608 }
6609 },
6610 {
6611 "defaultMessage": "!!!Downgrade to Free",
6612 "end": {
6613 "column": 3,
6614 "line": 27
6615 },
6616 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6617 "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade",
6618 "start": {
6619 "column": 22,
6620 "line": 24
6621 }
6622 },
6623 {
6624 "defaultMessage": "!!!Choose Personal",
6625 "end": {
6626 "column": 3,
6627 "line": 31
6628 },
6629 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6630 "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade",
6631 "start": {
6632 "column": 20,
6633 "line": 28
6634 }
6635 }
6636 ],
6637 "path": "src/features/trialStatusBar/containers/TrialStatusBarScreen.json"
6638 },
6639 {
6640 "descriptors": [
6641 {
6642 "defaultMessage": "!!!Home", 5439 "defaultMessage": "!!!Home",
6643 "end": { 5440 "end": {
6644 "column": 3, 5441 "column": 3,
@@ -6865,104 +5662,78 @@
6865 "defaultMessage": "!!!Workspaces", 5662 "defaultMessage": "!!!Workspaces",
6866 "end": { 5663 "end": {
6867 "column": 3, 5664 "column": 3,
6868 "line": 19 5665 "line": 18
6869 }, 5666 },
6870 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5667 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6871 "id": "workspaceDrawer.headline", 5668 "id": "workspaceDrawer.headline",
6872 "start": { 5669 "start": {
6873 "column": 12, 5670 "column": 12,
6874 "line": 16 5671 "line": 15
6875 } 5672 }
6876 }, 5673 },
6877 { 5674 {
6878 "defaultMessage": "!!!All services", 5675 "defaultMessage": "!!!All services",
6879 "end": { 5676 "end": {
6880 "column": 3, 5677 "column": 3,
6881 "line": 23 5678 "line": 22
6882 }, 5679 },
6883 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5680 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6884 "id": "workspaceDrawer.allServices", 5681 "id": "workspaceDrawer.allServices",
6885 "start": { 5682 "start": {
6886 "column": 15, 5683 "column": 15,
6887 "line": 20 5684 "line": 19
6888 } 5685 }
6889 }, 5686 },
6890 { 5687 {
6891 "defaultMessage": "!!!Workspaces settings", 5688 "defaultMessage": "!!!Workspaces settings",
6892 "end": { 5689 "end": {
6893 "column": 3, 5690 "column": 3,
6894 "line": 27 5691 "line": 26
6895 }, 5692 },
6896 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5693 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6897 "id": "workspaceDrawer.workspacesSettingsTooltip", 5694 "id": "workspaceDrawer.workspacesSettingsTooltip",
6898 "start": { 5695 "start": {
6899 "column": 29, 5696 "column": 29,
6900 "line": 24 5697 "line": 23
6901 } 5698 }
6902 }, 5699 },
6903 { 5700 {
6904 "defaultMessage": "!!!Info about workspace feature", 5701 "defaultMessage": "!!!Info about workspace feature",
6905 "end": { 5702 "end": {
6906 "column": 3, 5703 "column": 3,
6907 "line": 31 5704 "line": 30
6908 }, 5705 },
6909 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5706 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6910 "id": "workspaceDrawer.workspaceFeatureInfo", 5707 "id": "workspaceDrawer.workspaceFeatureInfo",
6911 "start": { 5708 "start": {
6912 "column": 24, 5709 "column": 24,
6913 "line": 28 5710 "line": 27
6914 }
6915 },
6916 {
6917 "defaultMessage": "!!!Create your first workspace",
6918 "end": {
6919 "column": 3,
6920 "line": 35
6921 },
6922 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6923 "id": "workspaceDrawer.premiumCtaButtonLabel",
6924 "start": {
6925 "column": 25,
6926 "line": 32
6927 }
6928 },
6929 {
6930 "defaultMessage": "!!!Reactivate premium account",
6931 "end": {
6932 "column": 3,
6933 "line": 39
6934 },
6935 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6936 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
6937 "start": {
6938 "column": 28,
6939 "line": 36
6940 } 5711 }
6941 }, 5712 },
6942 { 5713 {
6943 "defaultMessage": "!!!add new workspace", 5714 "defaultMessage": "!!!add new workspace",
6944 "end": { 5715 "end": {
6945 "column": 3, 5716 "column": 3,
6946 "line": 43 5717 "line": 34
6947 }, 5718 },
6948 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5719 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6949 "id": "workspaceDrawer.addNewWorkspaceLabel", 5720 "id": "workspaceDrawer.addNewWorkspaceLabel",
6950 "start": { 5721 "start": {
6951 "column": 24, 5722 "column": 24,
6952 "line": 40 5723 "line": 31
6953 } 5724 }
6954 }, 5725 },
6955 { 5726 {
6956 "defaultMessage": "!!!Premium feature", 5727 "defaultMessage": "!!!Premium feature",
6957 "end": { 5728 "end": {
6958 "column": 3, 5729 "column": 3,
6959 "line": 47 5730 "line": 38
6960 }, 5731 },
6961 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5732 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6962 "id": "workspaceDrawer.proFeatureBadge", 5733 "id": "workspaceDrawer.proFeatureBadge",
6963 "start": { 5734 "start": {
6964 "column": 23, 5735 "column": 23,
6965 "line": 44 5736 "line": 35
6966 } 5737 }
6967 } 5738 }
6968 ], 5739 ],
@@ -7005,104 +5776,104 @@
7005 "defaultMessage": "!!!Your workspaces", 5776 "defaultMessage": "!!!Your workspaces",
7006 "end": { 5777 "end": {
7007 "column": 3, 5778 "column": 3,
7008 "line": 23 5779 "line": 20
7009 }, 5780 },
7010 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5781 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7011 "id": "settings.workspaces.headline", 5782 "id": "settings.workspaces.headline",
7012 "start": { 5783 "start": {
7013 "column": 12, 5784 "column": 12,
7014 "line": 20 5785 "line": 17
7015 } 5786 }
7016 }, 5787 },
7017 { 5788 {
7018 "defaultMessage": "!!!You haven't created any workspaces yet.", 5789 "defaultMessage": "!!!You haven't created any workspaces yet.",
7019 "end": { 5790 "end": {
7020 "column": 3, 5791 "column": 3,
7021 "line": 27 5792 "line": 24
7022 }, 5793 },
7023 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5794 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7024 "id": "settings.workspaces.noWorkspacesAdded", 5795 "id": "settings.workspaces.noWorkspacesAdded",
7025 "start": { 5796 "start": {
7026 "column": 19, 5797 "column": 19,
7027 "line": 24 5798 "line": 21
7028 } 5799 }
7029 }, 5800 },
7030 { 5801 {
7031 "defaultMessage": "!!!Could not load your workspaces", 5802 "defaultMessage": "!!!Could not load your workspaces",
7032 "end": { 5803 "end": {
7033 "column": 3, 5804 "column": 3,
7034 "line": 31 5805 "line": 28
7035 }, 5806 },
7036 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5807 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7037 "id": "settings.workspaces.workspacesRequestFailed", 5808 "id": "settings.workspaces.workspacesRequestFailed",
7038 "start": { 5809 "start": {
7039 "column": 27, 5810 "column": 27,
7040 "line": 28 5811 "line": 25
7041 } 5812 }
7042 }, 5813 },
7043 { 5814 {
7044 "defaultMessage": "!!!Try again", 5815 "defaultMessage": "!!!Try again",
7045 "end": { 5816 "end": {
7046 "column": 3, 5817 "column": 3,
7047 "line": 35 5818 "line": 32
7048 }, 5819 },
7049 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5820 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7050 "id": "settings.workspaces.tryReloadWorkspaces", 5821 "id": "settings.workspaces.tryReloadWorkspaces",
7051 "start": { 5822 "start": {
7052 "column": 23, 5823 "column": 23,
7053 "line": 32 5824 "line": 29
7054 } 5825 }
7055 }, 5826 },
7056 { 5827 {
7057 "defaultMessage": "!!!Your changes have been saved", 5828 "defaultMessage": "!!!Your changes have been saved",
7058 "end": { 5829 "end": {
7059 "column": 3, 5830 "column": 3,
7060 "line": 39 5831 "line": 36
7061 }, 5832 },
7062 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5833 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7063 "id": "settings.workspaces.updatedInfo", 5834 "id": "settings.workspaces.updatedInfo",
7064 "start": { 5835 "start": {
7065 "column": 15, 5836 "column": 15,
7066 "line": 36 5837 "line": 33
7067 } 5838 }
7068 }, 5839 },
7069 { 5840 {
7070 "defaultMessage": "!!!Workspace has been deleted", 5841 "defaultMessage": "!!!Workspace has been deleted",
7071 "end": { 5842 "end": {
7072 "column": 3, 5843 "column": 3,
7073 "line": 43 5844 "line": 40
7074 }, 5845 },
7075 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5846 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7076 "id": "settings.workspaces.deletedInfo", 5847 "id": "settings.workspaces.deletedInfo",
7077 "start": { 5848 "start": {
7078 "column": 15, 5849 "column": 15,
7079 "line": 40 5850 "line": 37
7080 } 5851 }
7081 }, 5852 },
7082 { 5853 {
7083 "defaultMessage": "!!!Info about workspace feature", 5854 "defaultMessage": "!!!Info about workspace feature",
7084 "end": { 5855 "end": {
7085 "column": 3, 5856 "column": 3,
7086 "line": 47 5857 "line": 44
7087 }, 5858 },
7088 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5859 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7089 "id": "settings.workspaces.workspaceFeatureInfo", 5860 "id": "settings.workspaces.workspaceFeatureInfo",
7090 "start": { 5861 "start": {
7091 "column": 24, 5862 "column": 24,
7092 "line": 44 5863 "line": 41
7093 } 5864 }
7094 }, 5865 },
7095 { 5866 {
7096 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 5867 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces",
7097 "end": { 5868 "end": {
7098 "column": 3, 5869 "column": 3,
7099 "line": 51 5870 "line": 48
7100 }, 5871 },
7101 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5872 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7102 "id": "settings.workspaces.workspaceFeatureHeadline", 5873 "id": "settings.workspaces.workspaceFeatureHeadline",
7103 "start": { 5874 "start": {
7104 "column": 28, 5875 "column": 28,
7105 "line": 48 5876 "line": 45
7106 } 5877 }
7107 } 5878 }
7108 ], 5879 ],
@@ -7129,146 +5900,6 @@
7129 { 5900 {
7130 "descriptors": [ 5901 "descriptors": [
7131 { 5902 {
7132 "defaultMessage": "!!!Professional",
7133 "end": {
7134 "column": 3,
7135 "line": 8
7136 },
7137 "file": "src/helpers/plan-helpers.js",
7138 "id": "pricing.plan.pro",
7139 "start": {
7140 "column": 15,
7141 "line": 5
7142 }
7143 },
7144 {
7145 "defaultMessage": "!!!Personal",
7146 "end": {
7147 "column": 3,
7148 "line": 12
7149 },
7150 "file": "src/helpers/plan-helpers.js",
7151 "id": "pricing.plan.personal",
7152 "start": {
7153 "column": 20,
7154 "line": 9
7155 }
7156 },
7157 {
7158 "defaultMessage": "!!!Free",
7159 "end": {
7160 "column": 3,
7161 "line": 16
7162 },
7163 "file": "src/helpers/plan-helpers.js",
7164 "id": "pricing.plan.free",
7165 "start": {
7166 "column": 16,
7167 "line": 13
7168 }
7169 },
7170 {
7171 "defaultMessage": "!!!Premium",
7172 "end": {
7173 "column": 3,
7174 "line": 20
7175 },
7176 "file": "src/helpers/plan-helpers.js",
7177 "id": "pricing.plan.legacy",
7178 "start": {
7179 "column": 18,
7180 "line": 17
7181 }
7182 }
7183 ],
7184 "path": "src/helpers/plan-helpers.json"
7185 },
7186 {
7187 "descriptors": [
7188 {
7189 "defaultMessage": "!!!Franz Professional Yearly",
7190 "end": {
7191 "column": 3,
7192 "line": 8
7193 },
7194 "file": "src/helpers/pricing-helpers.js",
7195 "id": "pricing.plan.pro-yearly",
7196 "start": {
7197 "column": 22,
7198 "line": 5
7199 }
7200 },
7201 {
7202 "defaultMessage": "!!!Franz Professional Monthly",
7203 "end": {
7204 "column": 3,
7205 "line": 12
7206 },
7207 "file": "src/helpers/pricing-helpers.js",
7208 "id": "pricing.plan.pro-monthly",
7209 "start": {
7210 "column": 23,
7211 "line": 9
7212 }
7213 },
7214 {
7215 "defaultMessage": "!!!Franz Personal Yearly",
7216 "end": {
7217 "column": 3,
7218 "line": 16
7219 },
7220 "file": "src/helpers/pricing-helpers.js",
7221 "id": "pricing.plan.personal-yearly",
7222 "start": {
7223 "column": 27,
7224 "line": 13
7225 }
7226 },
7227 {
7228 "defaultMessage": "!!!Franz Personal Monthly",
7229 "end": {
7230 "column": 3,
7231 "line": 20
7232 },
7233 "file": "src/helpers/pricing-helpers.js",
7234 "id": "pricing.plan.personal-monthly",
7235 "start": {
7236 "column": 28,
7237 "line": 17
7238 }
7239 },
7240 {
7241 "defaultMessage": "!!!Franz Free",
7242 "end": {
7243 "column": 3,
7244 "line": 24
7245 },
7246 "file": "src/helpers/pricing-helpers.js",
7247 "id": "pricing.plan.free",
7248 "start": {
7249 "column": 16,
7250 "line": 21
7251 }
7252 },
7253 {
7254 "defaultMessage": "!!!Franz Premium",
7255 "end": {
7256 "column": 3,
7257 "line": 28
7258 },
7259 "file": "src/helpers/pricing-helpers.js",
7260 "id": "pricing.plan.legacy",
7261 "start": {
7262 "column": 18,
7263 "line": 25
7264 }
7265 }
7266 ],
7267 "path": "src/helpers/pricing-helpers.json"
7268 },
7269 {
7270 "descriptors": [
7271 {
7272 "defaultMessage": "!!!Field is required", 5903 "defaultMessage": "!!!Field is required",
7273 "end": { 5904 "end": {
7274 "column": 3, 5905 "column": 3,
@@ -7441,19 +6072,6 @@
7441 "column": 17, 6072 "column": 17,
7442 "line": 32 6073 "line": 32
7443 } 6074 }
7444 },
7445 {
7446 "defaultMessage": "!!!Franz Professional Required",
7447 "end": {
7448 "column": 3,
7449 "line": 39
7450 },
7451 "file": "src/i18n/globalMessages.js",
7452 "id": "global.franzProRequired",
7453 "start": {
7454 "column": 15,
7455 "line": 36
7456 }
7457 } 6075 }
7458 ], 6076 ],
7459 "path": "src/i18n/globalMessages.json" 6077 "path": "src/i18n/globalMessages.json"
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index b2a6f5d2d..d77b90b24 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Ωχ όχι! Ο Ferdi έχασε την επικοινωνία με το", 12 "connectionLostBanner.message": "Ωχ όχι! Ο Ferdi έχασε την επικοινωνία με το",
13 "feature.announcements.changelog.headline": "Αλλαγές σχετικά με το Ferdi", 13 "feature.announcements.changelog.headline": "Αλλαγές σχετικά με το Ferdi",
14 "feature.debugger.title": "Εγγραφή πληροφοριών εντοπισμού σφαλμάτων", 14 "feature.debugger.title": "Εγγραφή πληροφοριών εντοπισμού σφαλμάτων",
15 "feature.delayApp.headline": "Παρακαλούμε αγοράστε μία άδεια Ferdi για να παραλείψετε την αναμονή",
16 "feature.delayApp.text": "Ferdi θα συνεχίσει σε {seconds} δευτερόλεπτα.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Αγοράστε μία άδεια Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Αναβαθμίστε τον λογαριασμό σας ",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Ακύρωση", 16 "feature.nightlyBuilds.cancel": "Ακύρωση",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index ab2be014b..003fee163 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -60,21 +36,12 @@
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!", 36 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.", 37 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account", 38 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "feature.trialStatusBar.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 39 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 40 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 41 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 42 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 43 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 44 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 45 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 46 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 47 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +55,6 @@
88 "infobar.hide": "Hide", 55 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 56 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 57 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 58 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 59 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 60 "invite.email.label": "Email address",
@@ -194,11 +160,7 @@
194 "password.noUser": "No user with that email address was found", 160 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 161 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 162 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 163 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 164 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 165 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 166 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +170,7 @@
208 "pricing.features.teamManagement": "Team Management", 170 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 171 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 172 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 173 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 174 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 175 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 176 "service.crashHandler.headline": "Oh no!",
@@ -255,8 +194,6 @@
255 "services.serverless": "Use Ferdi without an Account", 194 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 195 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 196 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 197 "settings.account.accountUnavailable": "Account is unavailable",
261 "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.", 198 "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.",
262 "settings.account.buttonSave": "Update profile", 199 "settings.account.buttonSave": "Update profile",
@@ -270,17 +207,11 @@
270 "settings.account.headlinePassword": "Change password", 207 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 208 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription", 209 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download", 210 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription", 211 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 212 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 213 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 214 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 215 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 216 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 217 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -391,8 +322,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 322 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 323 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 324 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 325 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 326 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 327 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -466,7 +395,6 @@
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 395 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 396 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 397 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 398 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 399 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 400 "settings.user.form.accountType.label": "Account type",
@@ -516,19 +444,6 @@
516 "signup.link.login": "Already have an account, sign in?", 444 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 445 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 446 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 447 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 448 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 449 "tabs.item.disableAudio": "Disable audio",
@@ -556,9 +471,7 @@
556 "workspaceDrawer.headline": "Workspaces", 471 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 472 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 473 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature", 474 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 475 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 476 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 477 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 6959a3a78..9226eedf2 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.", 12 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.",
13 "feature.announcements.changelog.headline": "Cambios en Ferdi {version}", 13 "feature.announcements.changelog.headline": "Cambios en Ferdi {version}",
14 "feature.debugger.title": "Publica la información de depuración", 14 "feature.debugger.title": "Publica la información de depuración",
15 "feature.delayApp.headline": "Por favor compra una Licencia de Soporte de Ferdi para evitar la espera",
16 "feature.delayApp.text": "Ferdi continuará en {seconds} segundos.",
17 "feature.delayApp.trial.action": "Si! Quiero probar Ferdi Profesional por 14 días, gratis!",
18 "feature.delayApp.trial.actionShort": "Activar el período de prueba de Ferdi Profesional",
19 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.",
20 "feature.delayApp.upgrade.action": "Consigue una Licencia de Soporte de Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Consigue una mejora para tu cuenta",
22 "feature.nightlyBuilds.activate": "Activar", 15 "feature.nightlyBuilds.activate": "Activar",
23 "feature.nightlyBuilds.cancel": "Cancelar", 16 "feature.nightlyBuilds.cancel": "Cancelar",
24 "feature.nightlyBuilds.info": "Las \"Nightly builds\" son versiones altamente experimentales de Ferdi que pueden contener características sin pulir o sin completar. Estas versiones son utilizadas principalmente por los desarrolladores para probar sus nuevas características desarrolladas y cómo se comportarán en la versión final. Si no sabe lo que está haciendo, le sugerimos que no active las estas versiones.", 17 "feature.nightlyBuilds.info": "Las \"Nightly builds\" son versiones altamente experimentales de Ferdi que pueden contener características sin pulir o sin completar. Estas versiones son utilizadas principalmente por los desarrolladores para probar sus nuevas características desarrolladas y cómo se comportarán en la versión final. Si no sabe lo que está haciendo, le sugerimos que no active las estas versiones.",
diff --git a/src/i18n/locales/et.json b/src/i18n/locales/et.json
index 6709db455..386fffd29 100644
--- a/src/i18n/locales/et.json
+++ b/src/i18n/locales/et.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "Mis juhtus?", 5 "connectionLostBanner.informationLink": "Mis juhtus?",
6 "connectionLostBanner.message": "Oh ei! Ferdi kaotas ühenduse {name} teenusega.", 6 "connectionLostBanner.message": "Oh ei! Ferdi kaotas ühenduse {name} teenusega.",
7 "feature.announcements.changelog.headline": "Ferdi {versiooni} uuendused", 7 "feature.announcements.changelog.headline": "Ferdi {versiooni} uuendused",
8 "feature.delayApp.headline": "Uuendage oma Ferdi'i tellimust, et ootamine vahele jätta",
9 "feature.delayApp.text": "Ferdi jätkab {seconds} sekundi pärast.",
10 "feature.delayApp.trial.action": "Jah, ma tahan Ferdi Professionali tasuta 14-päevast proovitellimust",
11 "feature.delayApp.trial.actionShort": "Aktiveerige tasuta Ferdi Professionali proovitellimus",
12 "feature.delayApp.trial.headline": "Hankige tasuta Ferdi Professionali 14-päevane proovitellimus ja saate ootamise vahele jätta",
13 "feature.delayApp.upgrade.action": "Uuendage Ferdi'it",
14 "feature.delayApp.upgrade.actionShort": "Uuendage oma kontot",
15 "feature.planSelection.cta.ctaDowngradeFree": "Minge tagasi tasuta tellimusele", 8 "feature.planSelection.cta.ctaDowngradeFree": "Minge tagasi tasuta tellimusele",
16 "feature.planSelection.cta.stayOnFree": "Jää tasuta tellimuse juurde", 9 "feature.planSelection.cta.stayOnFree": "Jää tasuta tellimuse juurde",
17 "feature.planSelection.cta.trial": "Alustage minu tasuta 14-päevast proovitellimust", 10 "feature.planSelection.cta.trial": "Alustage minu tasuta 14-päevast proovitellimust",
diff --git a/src/i18n/locales/fa.json b/src/i18n/locales/fa.json
index a57caeb47..f7d62e9ed 100644
--- a/src/i18n/locales/fa.json
+++ b/src/i18n/locales/fa.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "تغییرات فرَنز {version}", 7 "feature.announcements.changelog.headline": "تغییرات فرَنز {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "فرَنز بعد از {seconds} ثانیه ادامه میده.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "ارتقای حساب",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 8 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free", 9 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 10 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
diff --git a/src/i18n/locales/fi.json b/src/i18n/locales/fi.json
index 5b74d709b..10d75c6a8 100644
--- a/src/i18n/locales/fi.json
+++ b/src/i18n/locales/fi.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Voi ei! Ferdi menetti yhteyden {name}.", 12 "connectionLostBanner.message": "Voi ei! Ferdi menetti yhteyden {name}.",
13 "feature.announcements.changelog.headline": "Muutoksia Ferdissä {version}", 13 "feature.announcements.changelog.headline": "Muutoksia Ferdissä {version}",
14 "feature.debugger.title": "Julkaise virheraportti", 14 "feature.debugger.title": "Julkaise virheraportti",
15 "feature.delayApp.headline": "Ole hyvä ja osta Ferdin Tukijalisenssi, jotta vältyt odottamiselta",
16 "feature.delayApp.text": "Ferdi jatkaa {seconds} sekunnin kuluttua.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Hanki Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Päivitä tili",
22 "feature.nightlyBuilds.activate": "Aktivoi", 15 "feature.nightlyBuilds.activate": "Aktivoi",
23 "feature.nightlyBuilds.cancel": "Peruuta", 16 "feature.nightlyBuilds.cancel": "Peruuta",
24 "feature.nightlyBuilds.info": "Uusimmat versiot ovat Ferdin kokeellisia versioita, jotka voivat sisältää viimeistelemättömiä tai keskeneräisiä ominaisuuksia. Näitä uusimpia versioita käyttävät pääasiassa kehittäjät testaamaan uusia ominaisuuksia ja miten ne toimivat lopullisessa versiossa. Jos et tiedä mitä olet tekemässä, suosittelemme ettet aktivoi uusimpia versioita.", 17 "feature.nightlyBuilds.info": "Uusimmat versiot ovat Ferdin kokeellisia versioita, jotka voivat sisältää viimeistelemättömiä tai keskeneräisiä ominaisuuksia. Näitä uusimpia versioita käyttävät pääasiassa kehittäjät testaamaan uusia ominaisuuksia ja miten ne toimivat lopullisessa versiossa. Jos et tiedä mitä olet tekemässä, suosittelemme ettet aktivoi uusimpia versioita.",
diff --git a/src/i18n/locales/fil.json b/src/i18n/locales/fil.json
index 5588d982d..348ed9382 100644
--- a/src/i18n/locales/fil.json
+++ b/src/i18n/locales/fil.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 8 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free", 9 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 10 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index e3d3051ec..7e5840bdb 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.", 12 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.",
13 "feature.announcements.changelog.headline": "Les nouveaux changements dans Ferdi {version}", 13 "feature.announcements.changelog.headline": "Les nouveaux changements dans Ferdi {version}",
14 "feature.debugger.title": "Publier les informations de débogage", 14 "feature.debugger.title": "Publier les informations de débogage",
15 "feature.delayApp.headline": "Achetez la licence Ferdi pour ne plus avoir de temps d'attente",
16 "feature.delayApp.text": "Ferdi s'ouvrira dans {seconds} secondes.",
17 "feature.delayApp.trial.action": "Oui, je veux les 14 jours d'essai gratuits de Ferdi Professionnel",
18 "feature.delayApp.trial.actionShort": "Activer l'essai gratuit de Ferdi Professionnel",
19 "feature.delayApp.trial.headline": "Prendre l'essai gratuit de 14 jours de Ferdi Professionnel et esquiver la ligne",
20 "feature.delayApp.upgrade.action": "Acheter une license Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Mettre à niveau le compte",
22 "feature.nightlyBuilds.activate": "Activer", 15 "feature.nightlyBuilds.activate": "Activer",
23 "feature.nightlyBuilds.cancel": "Annuler", 16 "feature.nightlyBuilds.cancel": "Annuler",
24 "feature.nightlyBuilds.info": "Les versions de développement sont des versions expérimentales de Ferdi qui peuvent contenir des fonctionnalités non optimisées ou incomplètes. Ces versions de développement sont principalement utilisés par les développeurs pour tester leurs nouvelles fonctionnalités et leurs performances. Si vous ne savez pas ce que vous faites, nous vous suggérons de ne pas activer les versions de développement.", 17 "feature.nightlyBuilds.info": "Les versions de développement sont des versions expérimentales de Ferdi qui peuvent contenir des fonctionnalités non optimisées ou incomplètes. Ces versions de développement sont principalement utilisés par les développeurs pour tester leurs nouvelles fonctionnalités et leurs performances. Si vous ne savez pas ce que vous faites, nous vous suggérons de ne pas activer les versions de développement.",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 7c93c8a63..7c1915ca3 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cealaigh", 16 "feature.nightlyBuilds.cancel": "Cealaigh",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json
index 08879783a..67d9ceaf0 100644
--- a/src/i18n/locales/he.json
+++ b/src/i18n/locales/he.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "הו לא! פרדי איבד את החיבור ל {name}.", 12 "connectionLostBanner.message": "הו לא! פרדי איבד את החיבור ל {name}.",
13 "feature.announcements.changelog.headline": "שינויים בגרסת פרדי מספר {version}", 13 "feature.announcements.changelog.headline": "שינויים בגרסת פרדי מספר {version}",
14 "feature.debugger.title": "פרסם את פרטי ניפוי השגיאות", 14 "feature.debugger.title": "פרסם את פרטי ניפוי השגיאות",
15 "feature.delayApp.headline": "אנא קנה את גרסת התומכים כדי לדלג על ההמתנה",
16 "feature.delayApp.text": "פרדי ימשיך בעוד {seconds} שניות.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "קבל רישיון תומכים של פרדי",
21 "feature.delayApp.upgrade.actionShort": "שדרג חשבון",
22 "feature.nightlyBuilds.activate": "הפעל", 15 "feature.nightlyBuilds.activate": "הפעל",
23 "feature.nightlyBuilds.cancel": "בטל", 16 "feature.nightlyBuilds.cancel": "בטל",
24 "feature.nightlyBuilds.info": "גרסאות נייטלי הם גרסאות נסיוניות ביותר של פרדי, העשויות להכיל פיצ'רים בלתי גמורים. גרסאות אלה מיועדות בעיקר לשימוש מפתחים על מנת לנסות את הפיצ'רים החדשים הנמצאים בפיתוח - לפני הכנסתם לגרסה הסופית. אם אתה לא יודע מה אתה עושה, אנו ממליצים שלא תפעיל את האופציה הזאת.", 17 "feature.nightlyBuilds.info": "גרסאות נייטלי הם גרסאות נסיוניות ביותר של פרדי, העשויות להכיל פיצ'רים בלתי גמורים. גרסאות אלה מיועדות בעיקר לשימוש מפתחים על מנת לנסות את הפיצ'רים החדשים הנמצאים בפיתוח - לפני הכנסתם לגרסה הסופית. אם אתה לא יודע מה אתה עושה, אנו ממליצים שלא תפעיל את האופציה הזאת.",
diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json
index 2372494e5..333871fbd 100644
--- a/src/i18n/locales/hi.json
+++ b/src/i18n/locales/hi.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "फ्रांज़ के संस्करण {version} में बदलाव:", 7 "feature.announcements.changelog.headline": "फ्रांज़ के संस्करण {version} में बदलाव:",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "फ्रांज़ {seconds} सेकंड में जारी रहेगा।",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "खाते का उन्नयन करें",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 8 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free", 9 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 10 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 2e7d6f61c..5ca0e84e4 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Oh no! Ferdi ha perso la connessione con {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perso la connessione con {name}.",
13 "feature.announcements.changelog.headline": "Modifiche in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Modifiche in Ferdi {version}",
14 "feature.debugger.title": "Pubblica informazioni di debug", 14 "feature.debugger.title": "Pubblica informazioni di debug",
15 "feature.delayApp.headline": "Per favore, compra una Licenza Supporter di Ferdi per saltare l'attesa",
16 "feature.delayApp.text": "Ferdi continuerà tra {seconds} secondi.",
17 "feature.delayApp.trial.action": "Sì, voglio la prova gratuita di 14 giorni di Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Attiva la prova gratuita di Ferdi Professional",
19 "feature.delayApp.trial.headline": "Ottieni la prova gratuita per 14 giorni di Ferdi Professional e salta la coda",
20 "feature.delayApp.upgrade.action": "Ricevi una Licenza Supporter di Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Effettua l'upgrade del tuo account",
22 "feature.nightlyBuilds.activate": "Attivato", 15 "feature.nightlyBuilds.activate": "Attivato",
23 "feature.nightlyBuilds.cancel": "Annulla", 16 "feature.nightlyBuilds.cancel": "Annulla",
24 "feature.nightlyBuilds.info": "Le 'Nightly Builds' sono versioni sperimentali di Ferdi che possono contenere funzionalità incomplete o non perfettamente funzionanti. Queste versioni sono principalmente usate dagli sviluppatori per effettuare dei test sulle nuove caratteristiche e verificare come si integrano nella versione finale di Ferdi. Se non sei sicuro di quello che stai facendo, ti consigliamo di non attivare le 'Nightly Builds'.", 17 "feature.nightlyBuilds.info": "Le 'Nightly Builds' sono versioni sperimentali di Ferdi che possono contenere funzionalità incomplete o non perfettamente funzionanti. Queste versioni sono principalmente usate dagli sviluppatori per effettuare dei test sulle nuove caratteristiche e verificare come si integrano nella versione finale di Ferdi. Se non sei sicuro di quello che stai facendo, ti consigliamo di non attivare le 'Nightly Builds'.",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 0aeac2891..4efb26d5e 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "{name}への接続が切断されました。", 12 "connectionLostBanner.message": "{name}への接続が切断されました。",
13 "feature.announcements.changelog.headline": "Ferdi {version}の変更点", 13 "feature.announcements.changelog.headline": "Ferdi {version}の変更点",
14 "feature.debugger.title": "デバッグ情報の記録", 14 "feature.debugger.title": "デバッグ情報の記録",
15 "feature.delayApp.headline": "Ferdiをすぐに起動するには、Ferdi サポーターライセンスを購入してください。",
16 "feature.delayApp.text": "Ferdiは{seconds}秒後に起動します。",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Ferdiサポーターライセンスを購入する",
21 "feature.delayApp.upgrade.actionShort": "アカウントをアップグレード",
22 "feature.nightlyBuilds.activate": "有効化", 15 "feature.nightlyBuilds.activate": "有効化",
23 "feature.nightlyBuilds.cancel": "キャンセル", 16 "feature.nightlyBuilds.cancel": "キャンセル",
24 "feature.nightlyBuilds.info": "Nightlyビルドは未検証や未完成の機能が含まれる非常に実験的なバージョンです。このバージョンは、主に新機能のテストや最新ビルドでの検証を行う開発者が使用するものです。これを理解していない方は、Nightlyビルドを有効化しないことをおすすめします。", 17 "feature.nightlyBuilds.info": "Nightlyビルドは未検証や未完成の機能が含まれる非常に実験的なバージョンです。このバージョンは、主に新機能のテストや最新ビルドでの検証を行う開発者が使用するものです。これを理解していない方は、Nightlyビルドを有効化しないことをおすすめします。",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 70305c358..dcecd8581 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "გაუქმება", 16 "feature.nightlyBuilds.cancel": "გაუქმება",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
diff --git a/src/i18n/locales/kk.json b/src/i18n/locales/kk.json
index 09bb10fb2..77873d921 100644
--- a/src/i18n/locales/kk.json
+++ b/src/i18n/locales/kk.json
@@ -5,13 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 8 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free", 9 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 10 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json
index af6171e3d..4f3cbcef3 100644
--- a/src/i18n/locales/ko.json
+++ b/src/i18n/locales/ko.json
@@ -12,13 +12,6 @@
12 "connectionLostBanner.message": "오 저런! Ferdi가 {name} 과 연결이 끊겼습니다.", 12 "connectionLostBanner.message": "오 저런! Ferdi가 {name} 과 연결이 끊겼습니다.",
13 "feature.announcements.changelog.headline": "Ferdi {version} 변경점", 13 "feature.announcements.changelog.headline": "Ferdi {version} 변경점",
14 "feature.debugger.title": "디버깅 정보 공개", 14 "feature.debugger.title": "디버깅 정보 공개",
15 "feature.delayApp.headline": "Ferdi Supporter License를 구매하여 대기시간을 스킵하세요.",
16 "feature.delayApp.text": "Ferdi가 {seconds} 초 안에 재개합니다.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Ferdi Supporter License 얻기",
21 "feature.delayApp.upgrade.actionShort": "계정 업그레이드",
22 "feature.nightlyBuilds.activate": "활성화", 15 "feature.nightlyBuilds.activate": "활성화",
23 "feature.nightlyBuilds.cancel": "취소", 16 "feature.nightlyBuilds.cancel": "취소",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 07c6df438..7235f04b9 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh não! O Ferdi perdeu a ligação com {name}.", 12 "connectionLostBanner.message": "Oh não! O Ferdi perdeu a ligação com {name}.",
13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}", 13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}",
14 "feature.debugger.title": "Publicar informações de depuração", 14 "feature.debugger.title": "Publicar informações de depuração",
15 "feature.delayApp.headline": "Por favor, adquira uma licença de apoiante Ferdi para não ficar à espera",
16 "feature.delayApp.text": "Ferdi continuará em {seconds} segundos.",
17 "feature.delayApp.trial.action": "Sim, eu quero o período de testes gratuito de 14 dias do Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Ativar período de testes gratuito do Ferdi Professional",
19 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.",
20 "feature.delayApp.upgrade.action": "Adquira uma licença de suporte Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Faça upgrade da conta",
22 "feature.nightlyBuilds.activate": "Activar", 15 "feature.nightlyBuilds.activate": "Activar",
23 "feature.nightlyBuilds.cancel": "Cancelar", 16 "feature.nightlyBuilds.cancel": "Cancelar",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Despromover para Gratuito",
27 "feature.planSelection.cta.stayOnFree": "Continuar em Gratuito",
28 "feature.planSelection.cta.trial": "Iniciar meu teste grátis de 14 dias",
29 "feature.planSelection.cta.upgradePersonal": "Escolha Pessoal",
30 "feature.planSelection.cta.upgradePro": "Escolha Profissional",
31 "feature.planSelection.free.text": "Funcionalidade básica",
32 "feature.planSelection.fullFeatureList": "Comparação completa de todos os planos",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Despromover para Gratuito",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Escolha Pessoal",
35 "feature.planSelection.fullscreen.dialog.message": "Você está prestes a fazer a despromoção para nossa conta gratuita. Você tem certeza? Clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.",
36 "feature.planSelection.fullscreen.dialog.title": "Despromover o seu Plano Ferdi",
37 "feature.planSelection.fullscreen.subheadline": "Agora tem de fazer uma escolha. O Ferdi trabalha melhor em nossos planos pessoais e profissionais. Por favor, compare estes planos e escolha o que melhor se adapta a si.",
38 "feature.planSelection.fullscreen.welcome": "Está prestes a escolher, {name}",
39 "feature.planSelection.personal.text": "Mais serviços, sem espera - ideal para uso pessoal.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "Todos os preços são baseados no pagamento anual",
41 "feature.planSelection.pro.text": "Serviços ilimitados e recursos profissionais para si - e para a sua equipa.",
42 "feature.publishDebugInfo.error": "Houve um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou visualize a consola para mais informações.", 19 "feature.publishDebugInfo.error": "Houve um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou visualize a consola para mais informações.",
43 "feature.publishDebugInfo.info": "Publicar as suas informações de depuração ajuda-nos a encontrar problemas e erros no Ferdi. Ao publicar as suas informações de depuração, aceita a política de privacidade e termos de serviço do depurador Ferdi", 20 "feature.publishDebugInfo.info": "Publicar as suas informações de depuração ajuda-nos a encontrar problemas e erros no Ferdi. Ao publicar as suas informações de depuração, aceita a política de privacidade e termos de serviço do depurador Ferdi",
44 "feature.publishDebugInfo.privacy": "Política de Privacidade", 21 "feature.publishDebugInfo.privacy": "Política de Privacidade",
diff --git a/src/i18n/locales/ro.json b/src/i18n/locales/ro.json
index b210f3316..bb1005426 100644
--- a/src/i18n/locales/ro.json
+++ b/src/i18n/locales/ro.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nu! Ferdi a pierdut conexiunea cu {name}.", 12 "connectionLostBanner.message": "Oh nu! Ferdi a pierdut conexiunea cu {name}.",
13 "feature.announcements.changelog.headline": "Modificări în Ferdi {version}", 13 "feature.announcements.changelog.headline": "Modificări în Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activare", 15 "feature.nightlyBuilds.activate": "Activare",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Politică de confidențialitate", 21 "feature.publishDebugInfo.privacy": "Politică de confidențialitate",
diff --git a/src/i18n/messages/src/components/TrialActivationInfoBar.json b/src/i18n/messages/src/components/TrialActivationInfoBar.json
deleted file mode 100644
index 65dd964a6..000000000
--- a/src/i18n/messages/src/components/TrialActivationInfoBar.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "infobar.trialActivated",
4 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
5 "file": "src/components/TrialActivationInfoBar.js",
6 "start": {
7 "line": 11,
8 "column": 11
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json
deleted file mode 100644
index b5b7d72a8..000000000
--- a/src/i18n/messages/src/components/auth/Pricing.json
+++ /dev/null
@@ -1,171 +0,0 @@
1[
2 {
3 "id": "pricing.trial.headline.pro",
4 "defaultMessage": "!!!Hi {name}, welcome to Franz",
5 "file": "src/components/auth/Pricing.js",
6 "start": {
7 "line": 14,
8 "column": 12
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.trial.intro.specialTreat",
17 "defaultMessage": "!!!We have a special treat for you.",
18 "file": "src/components/auth/Pricing.js",
19 "start": {
20 "line": 18,
21 "column": 16
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
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": 22,
34 "column": 10
35 },
36 "end": {
37 "line": 25,
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": 26,
47 "column": 18
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/auth/Pricing.js",
58 "start": {
59 "line": 30,
60 "column": 29
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/auth/Pricing.js",
71 "start": {
72 "line": 34,
73 "column": 16
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/auth/Pricing.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "pricing.trial.terms.trialWorth",
95 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
96 "file": "src/components/auth/Pricing.js",
97 "start": {
98 "line": 42,
99 "column": 14
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "pricing.trial.error",
108 "defaultMessage": "!!!Sorry, we could not activate your trial!",
109 "file": "src/components/auth/Pricing.js",
110 "start": {
111 "line": 46,
112 "column": 19
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 },
119 {
120 "id": "pricing.trial.cta.accept",
121 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
122 "file": "src/components/auth/Pricing.js",
123 "start": {
124 "line": 50,
125 "column": 13
126 },
127 "end": {
128 "line": 53,
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": 54,
138 "column": 12
139 },
140 "end": {
141 "line": 57,
142 "column": 3
143 }
144 },
145 {
146 "id": "pricing.trial.cta.skip",
147 "defaultMessage": "!!!Continue to Ferdi",
148 "file": "src/components/auth/Pricing.js",
149 "start": {
150 "line": 58,
151 "column": 11
152 },
153 "end": {
154 "line": 61,
155 "column": 3
156 }
157 },
158 {
159 "id": "pricing.trial.features.headline",
160 "defaultMessage": "!!!Franz Professional includes:",
161 "file": "src/components/auth/Pricing.js",
162 "start": {
163 "line": 62,
164 "column": 20
165 },
166 "end": {
167 "line": 65,
168 "column": 3
169 }
170 }
171] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 554758f82..d14c30077 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 32, 7 "line": 29,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 35, 11 "line": 32,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 36, 20 "line": 33,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 39, 24 "line": 36,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
31 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
32 "start": { 32 "start": {
33 "line": 40, 33 "line": 37,
34 "column": 26 34 "column": 26
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 43, 37 "line": 40,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
44 "file": "src/components/layout/AppLayout.js", 44 "file": "src/components/layout/AppLayout.js",
45 "start": { 45 "start": {
46 "line": 44, 46 "line": 41,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 47, 50 "line": 44,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
index f0bb087d6..f5b75fc25 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": 17, 7 "line": 14,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 20, 11 "line": 17,
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": 21, 20 "line": 18,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 24, 24 "line": 21,
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": 25, 33 "line": 22,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 28, 37 "line": 25,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,50 +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": 29, 46 "line": 26,
47 "column": 33 47 "column": 33
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 32, 50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.account.upgradeToPro.label",
56 "defaultMessage": "!!!Upgrade to Franz Professional",
57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": {
59 "line": 33,
60 "column": 23
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.account.accountType.basic",
69 "defaultMessage": "!!!Basic Account",
70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": {
72 "line": 37,
73 "column": 20
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.account.accountType.premium",
82 "defaultMessage": "!!!Premium Supporter Account",
83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": {
85 "line": 41,
86 "column": 22
87 },
88 "end": {
89 "line": 44,
90 "column": 3 51 "column": 3
91 } 52 }
92 }, 53 },
@@ -95,11 +56,11 @@
95 "defaultMessage": "!!!Edit Account", 56 "defaultMessage": "!!!Edit Account",
96 "file": "src/components/settings/account/AccountDashboard.js", 57 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": { 58 "start": {
98 "line": 45, 59 "line": 30,
99 "column": 21 60 "column": 21
100 }, 61 },
101 "end": { 62 "end": {
102 "line": 48, 63 "line": 33,
103 "column": 3 64 "column": 3
104 } 65 }
105 }, 66 },
@@ -108,11 +69,11 @@
108 "defaultMessage": "!!Invoices", 69 "defaultMessage": "!!Invoices",
109 "file": "src/components/settings/account/AccountDashboard.js", 70 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": { 71 "start": {
111 "line": 49, 72 "line": 34,
112 "column": 18 73 "column": 18
113 }, 74 },
114 "end": { 75 "end": {
115 "line": 52, 76 "line": 37,
116 "column": 3 77 "column": 3
117 } 78 }
118 }, 79 },
@@ -121,11 +82,11 @@
121 "defaultMessage": "!!!Download", 82 "defaultMessage": "!!!Download",
122 "file": "src/components/settings/account/AccountDashboard.js", 83 "file": "src/components/settings/account/AccountDashboard.js",
123 "start": { 84 "start": {
124 "line": 53, 85 "line": 38,
125 "column": 19 86 "column": 19
126 }, 87 },
127 "end": { 88 "end": {
128 "line": 56, 89 "line": 41,
129 "column": 3 90 "column": 3
130 } 91 }
131 }, 92 },
@@ -134,11 +95,11 @@
134 "defaultMessage": "!!!Could not load user information", 95 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js", 96 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": { 97 "start": {
137 "line": 57, 98 "line": 42,
138 "column": 25 99 "column": 25
139 }, 100 },
140 "end": { 101 "end": {
141 "line": 60, 102 "line": 45,
142 "column": 3 103 "column": 3
143 } 104 }
144 }, 105 },
@@ -147,11 +108,11 @@
147 "defaultMessage": "!!!Try again", 108 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js", 109 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": { 110 "start": {
150 "line": 61, 111 "line": 46,
151 "column": 28 112 "column": 28
152 }, 113 },
153 "end": { 114 "end": {
154 "line": 64, 115 "line": 49,
155 "column": 3 116 "column": 3
156 } 117 }
157 }, 118 },
@@ -160,11 +121,11 @@
160 "defaultMessage": "!!!Delete account", 121 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js", 122 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": { 123 "start": {
163 "line": 65, 124 "line": 50,
164 "column": 17 125 "column": 17
165 }, 126 },
166 "end": { 127 "end": {
167 "line": 68, 128 "line": 53,
168 "column": 3 129 "column": 3
169 } 130 }
170 }, 131 },
@@ -173,11 +134,11 @@
173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 134 "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", 135 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": { 136 "start": {
176 "line": 69, 137 "line": 54,
177 "column": 14 138 "column": 14
178 }, 139 },
179 "end": { 140 "end": {
180 "line": 73, 141 "line": 58,
181 "column": 3 142 "column": 3
182 } 143 }
183 }, 144 },
@@ -186,24 +147,11 @@
186 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 147 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
187 "file": "src/components/settings/account/AccountDashboard.js", 148 "file": "src/components/settings/account/AccountDashboard.js",
188 "start": { 149 "start": {
189 "line": 74, 150 "line": 59,
190 "column": 19 151 "column": 19
191 }, 152 },
192 "end": { 153 "end": {
193 "line": 78, 154 "line": 63,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.account.trial",
199 "defaultMessage": "!!!Free Trial",
200 "file": "src/components/settings/account/AccountDashboard.js",
201 "start": {
202 "line": 79,
203 "column": 9
204 },
205 "end": {
206 "line": 82,
207 "column": 3 155 "column": 3
208 } 156 }
209 }, 157 },
@@ -212,37 +160,11 @@
212 "defaultMessage": "!!!Your Franz License:", 160 "defaultMessage": "!!!Your Franz License:",
213 "file": "src/components/settings/account/AccountDashboard.js", 161 "file": "src/components/settings/account/AccountDashboard.js",
214 "start": { 162 "start": {
215 "line": 83, 163 "line": 64,
216 "column": 15
217 },
218 "end": {
219 "line": 86,
220 "column": 3
221 }
222 },
223 {
224 "id": "settings.account.trialEndsIn",
225 "defaultMessage": "!!!Your free trial ends in {duration}.",
226 "file": "src/components/settings/account/AccountDashboard.js",
227 "start": {
228 "line": 87,
229 "column": 15 164 "column": 15
230 }, 165 },
231 "end": { 166 "end": {
232 "line": 90, 167 "line": 67,
233 "column": 3
234 }
235 },
236 {
237 "id": "settings.account.trialUpdateBillingInfo",
238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
239 "file": "src/components/settings/account/AccountDashboard.js",
240 "start": {
241 "line": 91,
242 "column": 33
243 },
244 "end": {
245 "line": 95,
246 "column": 3 168 "column": 3
247 } 169 }
248 }, 170 },
@@ -251,11 +173,11 @@
251 "defaultMessage": "Account is unavailable", 173 "defaultMessage": "Account is unavailable",
252 "file": "src/components/settings/account/AccountDashboard.js", 174 "file": "src/components/settings/account/AccountDashboard.js",
253 "start": { 175 "start": {
254 "line": 96, 176 "line": 68,
255 "column": 22 177 "column": 22
256 }, 178 },
257 "end": { 179 "end": {
258 "line": 99, 180 "line": 71,
259 "column": 3 181 "column": 3
260 } 182 }
261 }, 183 },
@@ -264,11 +186,11 @@
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.", 186 "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", 187 "file": "src/components/settings/account/AccountDashboard.js",
266 "start": { 188 "start": {
267 "line": 100, 189 "line": 72,
268 "column": 26 190 "column": 26
269 }, 191 },
270 "end": { 192 "end": {
271 "line": 103, 193 "line": 75,
272 "column": 3 194 "column": 3
273 } 195 }
274 } 196 }
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
index d7906fa7d..705b7cee3 100644
--- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available services", 4 "defaultMessage": "!!!Available services",
5 "file": "src/components/settings/navigation/SettingsNavigation.js", 5 "file": "src/components/settings/navigation/SettingsNavigation.js",
6 "start": { 6 "start": {
7 "line": 17, 7 "line": 15,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 20, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Your services", 17 "defaultMessage": "!!!Your services",
18 "file": "src/components/settings/navigation/SettingsNavigation.js", 18 "file": "src/components/settings/navigation/SettingsNavigation.js",
19 "start": { 19 "start": {
20 "line": 21, 20 "line": 19,
21 "column": 16 21 "column": 16
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 24, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Your workspaces", 30 "defaultMessage": "!!!Your workspaces",
31 "file": "src/components/settings/navigation/SettingsNavigation.js", 31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": { 32 "start": {
33 "line": 25, 33 "line": 23,
34 "column": 18 34 "column": 18
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 28, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Account", 43 "defaultMessage": "!!!Account",
44 "file": "src/components/settings/navigation/SettingsNavigation.js", 44 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": { 45 "start": {
46 "line": 29, 46 "line": 27,
47 "column": 11 47 "column": 11
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 32, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Manage Team", 56 "defaultMessage": "!!!Manage Team",
57 "file": "src/components/settings/navigation/SettingsNavigation.js", 57 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": { 58 "start": {
59 "line": 33, 59 "line": 31,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 36, 63 "line": 34,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Settings", 69 "defaultMessage": "!!!Settings",
70 "file": "src/components/settings/navigation/SettingsNavigation.js", 70 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": { 71 "start": {
72 "line": 37, 72 "line": 35,
73 "column": 12 73 "column": 12
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 40, 76 "line": 38,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!About Ferdi", 82 "defaultMessage": "!!!About Ferdi",
83 "file": "src/components/settings/navigation/SettingsNavigation.js", 83 "file": "src/components/settings/navigation/SettingsNavigation.js",
84 "start": { 84 "start": {
85 "line": 41, 85 "line": 39,
86 "column": 16 86 "column": 16
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 44, 89 "line": 42,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Logout", 95 "defaultMessage": "!!!Logout",
96 "file": "src/components/settings/navigation/SettingsNavigation.js", 96 "file": "src/components/settings/navigation/SettingsNavigation.js",
97 "start": { 97 "start": {
98 "line": 45, 98 "line": 43,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 48, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
index bbb55c7a0..ce7bb2c9d 100644
--- a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
+++ b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available Services", 4 "defaultMessage": "!!!Available Services",
5 "file": "src/components/settings/recipes/RecipesDashboard.js", 5 "file": "src/components/settings/recipes/RecipesDashboard.js",
6 "start": { 6 "start": {
7 "line": 21, 7 "line": 19,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 24, 11 "line": 22,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/recipes/RecipesDashboard.js", 18 "file": "src/components/settings/recipes/RecipesDashboard.js",
19 "start": { 19 "start": {
20 "line": 25, 20 "line": 23,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 28, 24 "line": 26,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Most popular", 30 "defaultMessage": "!!!Most popular",
31 "file": "src/components/settings/recipes/RecipesDashboard.js", 31 "file": "src/components/settings/recipes/RecipesDashboard.js",
32 "start": { 32 "start": {
33 "line": 29, 33 "line": 27,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 32, 37 "line": 30,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!All services", 43 "defaultMessage": "!!!All services",
44 "file": "src/components/settings/recipes/RecipesDashboard.js", 44 "file": "src/components/settings/recipes/RecipesDashboard.js",
45 "start": { 45 "start": {
46 "line": 33, 46 "line": 31,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 36, 50 "line": 34,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Custom Services", 56 "defaultMessage": "!!!Custom Services",
57 "file": "src/components/settings/recipes/RecipesDashboard.js", 57 "file": "src/components/settings/recipes/RecipesDashboard.js",
58 "start": { 58 "start": {
59 "line": 37, 59 "line": 35,
60 "column": 17 60 "column": 17
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 40, 63 "line": 38,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 69 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
70 "file": "src/components/settings/recipes/RecipesDashboard.js", 70 "file": "src/components/settings/recipes/RecipesDashboard.js",
71 "start": { 71 "start": {
72 "line": 41, 72 "line": 39,
73 "column": 16 73 "column": 16
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 44, 76 "line": 42,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Service successfully added", 82 "defaultMessage": "!!!Service successfully added",
83 "file": "src/components/settings/recipes/RecipesDashboard.js", 83 "file": "src/components/settings/recipes/RecipesDashboard.js",
84 "start": { 84 "start": {
85 "line": 45, 85 "line": 43,
86 "column": 31 86 "column": 31
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 48, 89 "line": 46,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Missing a service?", 95 "defaultMessage": "!!!Missing a service?",
96 "file": "src/components/settings/recipes/RecipesDashboard.js", 96 "file": "src/components/settings/recipes/RecipesDashboard.js",
97 "start": { 97 "start": {
98 "line": 49, 98 "line": 47,
99 "column": 18 99 "column": 18
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 52, 102 "line": 50,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:", 108 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
109 "file": "src/components/settings/recipes/RecipesDashboard.js", 109 "file": "src/components/settings/recipes/RecipesDashboard.js",
110 "start": { 110 "start": {
111 "line": 53, 111 "line": 51,
112 "column": 21 112 "column": 21
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 56, 115 "line": 54,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Open directory", 121 "defaultMessage": "!!!Open directory",
122 "file": "src/components/settings/recipes/RecipesDashboard.js", 122 "file": "src/components/settings/recipes/RecipesDashboard.js",
123 "start": { 123 "start": {
124 "line": 57, 124 "line": 55,
125 "column": 14 125 "column": 14
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 60, 128 "line": 58,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Developer Documentation", 134 "defaultMessage": "!!!Developer Documentation",
135 "file": "src/components/settings/recipes/RecipesDashboard.js", 135 "file": "src/components/settings/recipes/RecipesDashboard.js",
136 "start": { 136 "start": {
137 "line": 61, 137 "line": 59,
138 "column": 15 138 "column": 15
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 64, 141 "line": 62,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Custom 3rd Party Recipes", 147 "defaultMessage": "!!!Custom 3rd Party Recipes",
148 "file": "src/components/settings/recipes/RecipesDashboard.js", 148 "file": "src/components/settings/recipes/RecipesDashboard.js",
149 "start": { 149 "start": {
150 "line": 65, 150 "line": 63,
151 "column": 25 151 "column": 25
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 68, 154 "line": 66,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Community 3rd Party Recipes", 160 "defaultMessage": "!!!Community 3rd Party Recipes",
161 "file": "src/components/settings/recipes/RecipesDashboard.js", 161 "file": "src/components/settings/recipes/RecipesDashboard.js",
162 "start": { 162 "start": {
163 "line": 69, 163 "line": 67,
164 "column": 28 164 "column": 28
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 72, 167 "line": 70,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Your Development Service Recipes", 173 "defaultMessage": "!!!Your Development Service Recipes",
174 "file": "src/components/settings/recipes/RecipesDashboard.js", 174 "file": "src/components/settings/recipes/RecipesDashboard.js",
175 "start": { 175 "start": {
176 "line": 73, 176 "line": 71,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 76, 180 "line": 74,
181 "column": 3 181 "column": 3
182 } 182 }
183 } 183 }
diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
index 0aee52148..d7830f198 100644
--- a/src/i18n/messages/src/components/settings/services/EditServiceForm.json
+++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Save service", 4 "defaultMessage": "!!!Save service",
5 "file": "src/components/settings/services/EditServiceForm.js", 5 "file": "src/components/settings/services/EditServiceForm.js",
6 "start": { 6 "start": {
7 "line": 27, 7 "line": 23,
8 "column": 15 8 "column": 15
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 30, 11 "line": 26,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Delete Service", 17 "defaultMessage": "!!!Delete Service",
18 "file": "src/components/settings/services/EditServiceForm.js", 18 "file": "src/components/settings/services/EditServiceForm.js",
19 "start": { 19 "start": {
20 "line": 31, 20 "line": 27,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 34, 24 "line": 30,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Open darkmode.css", 30 "defaultMessage": "!!!Open darkmode.css",
31 "file": "src/components/settings/services/EditServiceForm.js", 31 "file": "src/components/settings/services/EditServiceForm.js",
32 "start": { 32 "start": {
33 "line": 35, 33 "line": 31,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 38, 37 "line": 34,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Open user.css", 43 "defaultMessage": "!!!Open user.css",
44 "file": "src/components/settings/services/EditServiceForm.js", 44 "file": "src/components/settings/services/EditServiceForm.js",
45 "start": { 45 "start": {
46 "line": 39, 46 "line": 35,
47 "column": 15 47 "column": 15
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 42, 50 "line": 38,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Open user.js", 56 "defaultMessage": "!!!Open user.js",
57 "file": "src/components/settings/services/EditServiceForm.js", 57 "file": "src/components/settings/services/EditServiceForm.js",
58 "start": { 58 "start": {
59 "line": 43, 59 "line": 39,
60 "column": 14 60 "column": 14
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 46, 63 "line": 42,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
70 "file": "src/components/settings/services/EditServiceForm.js", 70 "file": "src/components/settings/services/EditServiceForm.js",
71 "start": { 71 "start": {
72 "line": 47, 72 "line": 43,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 50, 76 "line": 46,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Available services", 82 "defaultMessage": "!!!Available services",
83 "file": "src/components/settings/services/EditServiceForm.js", 83 "file": "src/components/settings/services/EditServiceForm.js",
84 "start": { 84 "start": {
85 "line": 51, 85 "line": 47,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 54, 89 "line": 50,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your services", 95 "defaultMessage": "!!!Your services",
96 "file": "src/components/settings/services/EditServiceForm.js", 96 "file": "src/components/settings/services/EditServiceForm.js",
97 "start": { 97 "start": {
98 "line": 55, 98 "line": 51,
99 "column": 16 99 "column": 16
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 58, 102 "line": 54,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Add {name}", 108 "defaultMessage": "!!!Add {name}",
109 "file": "src/components/settings/services/EditServiceForm.js", 109 "file": "src/components/settings/services/EditServiceForm.js",
110 "start": { 110 "start": {
111 "line": 59, 111 "line": 55,
112 "column": 22 112 "column": 22
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 62, 115 "line": 58,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Edit {name}", 121 "defaultMessage": "!!!Edit {name}",
122 "file": "src/components/settings/services/EditServiceForm.js", 122 "file": "src/components/settings/services/EditServiceForm.js",
123 "start": { 123 "start": {
124 "line": 63, 124 "line": 59,
125 "column": 23 125 "column": 23
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 66, 128 "line": 62,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Hosted", 134 "defaultMessage": "!!!Hosted",
135 "file": "src/components/settings/services/EditServiceForm.js", 135 "file": "src/components/settings/services/EditServiceForm.js",
136 "start": { 136 "start": {
137 "line": 67, 137 "line": 63,
138 "column": 13 138 "column": 13
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 70, 141 "line": 66,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Self hosted ⭐️", 147 "defaultMessage": "!!!Self hosted ⭐️",
148 "file": "src/components/settings/services/EditServiceForm.js", 148 "file": "src/components/settings/services/EditServiceForm.js",
149 "start": { 149 "start": {
150 "line": 71, 150 "line": 67,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 74, 154 "line": 70,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Use the hosted {name} service.", 160 "defaultMessage": "!!!Use the hosted {name} service.",
161 "file": "src/components/settings/services/EditServiceForm.js", 161 "file": "src/components/settings/services/EditServiceForm.js",
162 "start": { 162 "start": {
163 "line": 75, 163 "line": 71,
164 "column": 20 164 "column": 20
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 78, 167 "line": 74,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,37 +173,11 @@
173 "defaultMessage": "!!!Could not validate custom {name} server.", 173 "defaultMessage": "!!!Could not validate custom {name} server.",
174 "file": "src/components/settings/services/EditServiceForm.js", 174 "file": "src/components/settings/services/EditServiceForm.js",
175 "start": { 175 "start": {
176 "line": 79, 176 "line": 75,
177 "column": 28 177 "column": 28
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 82, 180 "line": 78,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.service.form.customUrlPremiumInfo",
186 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
187 "file": "src/components/settings/services/EditServiceForm.js",
188 "start": {
189 "line": 83,
190 "column": 24
191 },
192 "end": {
193 "line": 86,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.service.form.customUrlUpgradeAccount",
199 "defaultMessage": "!!!Upgrade your account",
200 "file": "src/components/settings/services/EditServiceForm.js",
201 "start": {
202 "line": 87,
203 "column": 27
204 },
205 "end": {
206 "line": 90,
207 "column": 3 181 "column": 3
208 } 182 }
209 }, 183 },
@@ -212,11 +186,11 @@
212 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 186 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
213 "file": "src/components/settings/services/EditServiceForm.js", 187 "file": "src/components/settings/services/EditServiceForm.js",
214 "start": { 188 "start": {
215 "line": 91, 189 "line": 79,
216 "column": 23 190 "column": 23
217 }, 191 },
218 "end": { 192 "end": {
219 "line": 94, 193 "line": 82,
220 "column": 3 194 "column": 3
221 } 195 }
222 }, 196 },
@@ -225,11 +199,11 @@
225 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 199 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
226 "file": "src/components/settings/services/EditServiceForm.js", 200 "file": "src/components/settings/services/EditServiceForm.js",
227 "start": { 201 "start": {
228 "line": 95, 202 "line": 83,
229 "column": 15 203 "column": 15
230 }, 204 },
231 "end": { 205 "end": {
232 "line": 98, 206 "line": 86,
233 "column": 3 207 "column": 3
234 } 208 }
235 }, 209 },
@@ -238,11 +212,11 @@
238 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.", 212 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
239 "file": "src/components/settings/services/EditServiceForm.js", 213 "file": "src/components/settings/services/EditServiceForm.js",
240 "start": { 214 "start": {
241 "line": 99, 215 "line": 87,
242 "column": 28 216 "column": 28
243 }, 217 },
244 "end": { 218 "end": {
245 "line": 102, 219 "line": 90,
246 "column": 3 220 "column": 3
247 } 221 }
248 }, 222 },
@@ -251,11 +225,11 @@
251 "defaultMessage": "!!!Notifications", 225 "defaultMessage": "!!!Notifications",
252 "file": "src/components/settings/services/EditServiceForm.js", 226 "file": "src/components/settings/services/EditServiceForm.js",
253 "start": { 227 "start": {
254 "line": 103, 228 "line": 91,
255 "column": 25 229 "column": 25
256 }, 230 },
257 "end": { 231 "end": {
258 "line": 106, 232 "line": 94,
259 "column": 3 233 "column": 3
260 } 234 }
261 }, 235 },
@@ -264,11 +238,11 @@
264 "defaultMessage": "!!!Unread message badges", 238 "defaultMessage": "!!!Unread message badges",
265 "file": "src/components/settings/services/EditServiceForm.js", 239 "file": "src/components/settings/services/EditServiceForm.js",
266 "start": { 240 "start": {
267 "line": 107, 241 "line": 95,
268 "column": 18 242 "column": 18
269 }, 243 },
270 "end": { 244 "end": {
271 "line": 110, 245 "line": 98,
272 "column": 3 246 "column": 3
273 } 247 }
274 }, 248 },
@@ -277,11 +251,11 @@
277 "defaultMessage": "!!!General", 251 "defaultMessage": "!!!General",
278 "file": "src/components/settings/services/EditServiceForm.js", 252 "file": "src/components/settings/services/EditServiceForm.js",
279 "start": { 253 "start": {
280 "line": 111, 254 "line": 99,
281 "column": 19 255 "column": 19
282 }, 256 },
283 "end": { 257 "end": {
284 "line": 114, 258 "line": 102,
285 "column": 3 259 "column": 3
286 } 260 }
287 }, 261 },
@@ -290,11 +264,11 @@
290 "defaultMessage": "!!!Dark Reader Settings", 264 "defaultMessage": "!!!Dark Reader Settings",
291 "file": "src/components/settings/services/EditServiceForm.js", 265 "file": "src/components/settings/services/EditServiceForm.js",
292 "start": { 266 "start": {
293 "line": 115, 267 "line": 103,
294 "column": 30 268 "column": 30
295 }, 269 },
296 "end": { 270 "end": {
297 "line": 118, 271 "line": 106,
298 "column": 3 272 "column": 3
299 } 273 }
300 }, 274 },
@@ -303,11 +277,11 @@
303 "defaultMessage": "!!!Delete", 277 "defaultMessage": "!!!Delete",
304 "file": "src/components/settings/services/EditServiceForm.js", 278 "file": "src/components/settings/services/EditServiceForm.js",
305 "start": { 279 "start": {
306 "line": 119, 280 "line": 107,
307 "column": 14 281 "column": 14
308 }, 282 },
309 "end": { 283 "end": {
310 "line": 122, 284 "line": 110,
311 "column": 3 285 "column": 3
312 } 286 }
313 }, 287 },
@@ -316,11 +290,11 @@
316 "defaultMessage": "!!!Drop your image, or click here", 290 "defaultMessage": "!!!Drop your image, or click here",
317 "file": "src/components/settings/services/EditServiceForm.js", 291 "file": "src/components/settings/services/EditServiceForm.js",
318 "start": { 292 "start": {
319 "line": 123, 293 "line": 111,
320 "column": 14 294 "column": 14
321 }, 295 },
322 "end": { 296 "end": {
323 "line": 126, 297 "line": 114,
324 "column": 3 298 "column": 3
325 } 299 }
326 }, 300 },
@@ -329,11 +303,11 @@
329 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 303 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
330 "file": "src/components/settings/services/EditServiceForm.js", 304 "file": "src/components/settings/services/EditServiceForm.js",
331 "start": { 305 "start": {
332 "line": 127, 306 "line": 115,
333 "column": 17 307 "column": 17
334 }, 308 },
335 "end": { 309 "end": {
336 "line": 130, 310 "line": 118,
337 "column": 3 311 "column": 3
338 } 312 }
339 }, 313 },
@@ -342,11 +316,11 @@
342 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 316 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
343 "file": "src/components/settings/services/EditServiceForm.js", 317 "file": "src/components/settings/services/EditServiceForm.js",
344 "start": { 318 "start": {
345 "line": 131, 319 "line": 119,
346 "column": 20 320 "column": 20
347 }, 321 },
348 "end": { 322 "end": {
349 "line": 134, 323 "line": 122,
350 "column": 3 324 "column": 3
351 } 325 }
352 }, 326 },
@@ -355,11 +329,11 @@
355 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 329 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
356 "file": "src/components/settings/services/EditServiceForm.js", 330 "file": "src/components/settings/services/EditServiceForm.js",
357 "start": { 331 "start": {
358 "line": 135, 332 "line": 123,
359 "column": 13 333 "column": 13
360 }, 334 },
361 "end": { 335 "end": {
362 "line": 138, 336 "line": 126,
363 "column": 3 337 "column": 3
364 } 338 }
365 } 339 }
diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
index fed05111e..7e7c5d67e 100644
--- a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
+++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services", 4 "defaultMessage": "!!!Your services",
5 "file": "src/components/settings/services/ServicesDashboard.js", 5 "file": "src/components/settings/services/ServicesDashboard.js",
6 "start": { 6 "start": {
7 "line": 16, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 19, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/services/ServicesDashboard.js", 18 "file": "src/components/settings/services/ServicesDashboard.js",
19 "start": { 19 "start": {
20 "line": 20, 20 "line": 19,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 23, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Start by adding a service.", 30 "defaultMessage": "!!!Start by adding a service.",
31 "file": "src/components/settings/services/ServicesDashboard.js", 31 "file": "src/components/settings/services/ServicesDashboard.js",
32 "start": { 32 "start": {
33 "line": 24, 33 "line": 23,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 27, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 43 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
44 "file": "src/components/settings/services/ServicesDashboard.js", 44 "file": "src/components/settings/services/ServicesDashboard.js",
45 "start": { 45 "start": {
46 "line": 28, 46 "line": 27,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 31, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Discover services", 56 "defaultMessage": "!!!Discover services",
57 "file": "src/components/settings/services/ServicesDashboard.js", 57 "file": "src/components/settings/services/ServicesDashboard.js",
58 "start": { 58 "start": {
59 "line": 32, 59 "line": 31,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 35, 63 "line": 34,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Could not load your services", 69 "defaultMessage": "!!!Could not load your services",
70 "file": "src/components/settings/services/ServicesDashboard.js", 70 "file": "src/components/settings/services/ServicesDashboard.js",
71 "start": { 71 "start": {
72 "line": 36, 72 "line": 35,
73 "column": 25 73 "column": 25
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 39, 76 "line": 38,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Try again", 82 "defaultMessage": "!!!Try again",
83 "file": "src/components/settings/services/ServicesDashboard.js", 83 "file": "src/components/settings/services/ServicesDashboard.js",
84 "start": { 84 "start": {
85 "line": 40, 85 "line": 39,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 43, 89 "line": 42,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your changes have been saved", 95 "defaultMessage": "!!!Your changes have been saved",
96 "file": "src/components/settings/services/ServicesDashboard.js", 96 "file": "src/components/settings/services/ServicesDashboard.js",
97 "start": { 97 "start": {
98 "line": 44, 98 "line": 43,
99 "column": 15 99 "column": 15
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 47, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Service has been deleted", 108 "defaultMessage": "!!!Service has been deleted",
109 "file": "src/components/settings/services/ServicesDashboard.js", 109 "file": "src/components/settings/services/ServicesDashboard.js",
110 "start": { 110 "start": {
111 "line": 48, 111 "line": 47,
112 "column": 15 112 "column": 15
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 51, 115 "line": 50,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
index a1e8c714e..c96a1de22 100644
--- a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
+++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/settings/settings/EditSettingsForm.js", 5 "file": "src/components/settings/settings/EditSettingsForm.js",
6 "start": { 6 "start": {
7 "line": 24, 7 "line": 23,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 27, 11 "line": 26,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!General", 17 "defaultMessage": "!!!General",
18 "file": "src/components/settings/settings/EditSettingsForm.js", 18 "file": "src/components/settings/settings/EditSettingsForm.js",
19 "start": { 19 "start": {
20 "line": 28, 20 "line": 27,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 31, 24 "line": 30,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 30 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.",
31 "file": "src/components/settings/settings/EditSettingsForm.js", 31 "file": "src/components/settings/settings/EditSettingsForm.js",
32 "start": { 32 "start": {
33 "line": 32, 33 "line": 31,
34 "column": 14 34 "column": 14
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 35, 37 "line": 34,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 43 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
44 "file": "src/components/settings/settings/EditSettingsForm.js", 44 "file": "src/components/settings/settings/EditSettingsForm.js",
45 "start": { 45 "start": {
46 "line": 36, 46 "line": 35,
47 "column": 17 47 "column": 17
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 39, 50 "line": 38,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 56 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
57 "file": "src/components/settings/settings/EditSettingsForm.js", 57 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": { 58 "start": {
59 "line": 40, 59 "line": 39,
60 "column": 22 60 "column": 22
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 43, 63 "line": 42,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
70 "file": "src/components/settings/settings/EditSettingsForm.js", 70 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": { 71 "start": {
72 "line": 44, 72 "line": 43,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 47, 76 "line": 46,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Password", 82 "defaultMessage": "!!!Password",
83 "file": "src/components/settings/settings/EditSettingsForm.js", 83 "file": "src/components/settings/settings/EditSettingsForm.js",
84 "start": { 84 "start": {
85 "line": 48, 85 "line": 47,
86 "column": 18 86 "column": 18
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 51, 89 "line": 50,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
96 "file": "src/components/settings/settings/EditSettingsForm.js", 96 "file": "src/components/settings/settings/EditSettingsForm.js",
97 "start": { 97 "start": {
98 "line": 52, 98 "line": 51,
99 "column": 22 99 "column": 22
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 55, 102 "line": 54,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 108 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.",
109 "file": "src/components/settings/settings/EditSettingsForm.js", 109 "file": "src/components/settings/settings/EditSettingsForm.js",
110 "start": { 110 "start": {
111 "line": 56, 111 "line": 55,
112 "column": 12 112 "column": 12
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 59, 115 "line": 58,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 121 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
122 "file": "src/components/settings/settings/EditSettingsForm.js", 122 "file": "src/components/settings/settings/EditSettingsForm.js",
123 "start": { 123 "start": {
124 "line": 60, 124 "line": 59,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 63, 128 "line": 62,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
135 "file": "src/components/settings/settings/EditSettingsForm.js", 135 "file": "src/components/settings/settings/EditSettingsForm.js",
136 "start": { 136 "start": {
137 "line": 64, 137 "line": 63,
138 "column": 20 138 "column": 20
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 67, 141 "line": 66,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Language", 147 "defaultMessage": "!!!Language",
148 "file": "src/components/settings/settings/EditSettingsForm.js", 148 "file": "src/components/settings/settings/EditSettingsForm.js",
149 "start": { 149 "start": {
150 "line": 68, 150 "line": 67,
151 "column": 20 151 "column": 20
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 71, 154 "line": 70,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Updates", 160 "defaultMessage": "!!!Updates",
161 "file": "src/components/settings/settings/EditSettingsForm.js", 161 "file": "src/components/settings/settings/EditSettingsForm.js",
162 "start": { 162 "start": {
163 "line": 72, 163 "line": 71,
164 "column": 19 164 "column": 19
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 75, 167 "line": 74,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Appearance", 173 "defaultMessage": "!!!Appearance",
174 "file": "src/components/settings/settings/EditSettingsForm.js", 174 "file": "src/components/settings/settings/EditSettingsForm.js",
175 "start": { 175 "start": {
176 "line": 76, 176 "line": 75,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 79, 180 "line": 78,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
187 "file": "src/components/settings/settings/EditSettingsForm.js", 187 "file": "src/components/settings/settings/EditSettingsForm.js",
188 "start": { 188 "start": {
189 "line": 80, 189 "line": 79,
190 "column": 25 190 "column": 25
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 83, 193 "line": 82,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
200 "file": "src/components/settings/settings/EditSettingsForm.js", 200 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": { 201 "start": {
202 "line": 84, 202 "line": 83,
203 "column": 19 203 "column": 19
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 87, 206 "line": 86,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Privacy", 212 "defaultMessage": "!!!Privacy",
213 "file": "src/components/settings/settings/EditSettingsForm.js", 213 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": { 214 "start": {
215 "line": 88, 215 "line": 87,
216 "column": 19 216 "column": 19
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 91, 219 "line": 90,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Advanced", 225 "defaultMessage": "!!!Advanced",
226 "file": "src/components/settings/settings/EditSettingsForm.js", 226 "file": "src/components/settings/settings/EditSettingsForm.js",
227 "start": { 227 "start": {
228 "line": 92, 228 "line": 91,
229 "column": 20 229 "column": 20
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 95, 232 "line": 94,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 238 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
239 "file": "src/components/settings/settings/EditSettingsForm.js", 239 "file": "src/components/settings/settings/EditSettingsForm.js",
240 "start": { 240 "start": {
241 "line": 96, 241 "line": 95,
242 "column": 19 242 "column": 19
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 99, 245 "line": 98,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 251 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
252 "file": "src/components/settings/settings/EditSettingsForm.js", 252 "file": "src/components/settings/settings/EditSettingsForm.js",
253 "start": { 253 "start": {
254 "line": 100, 254 "line": 99,
255 "column": 28 255 "column": 28
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 103, 258 "line": 102,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Cache", 264 "defaultMessage": "!!!Cache",
265 "file": "src/components/settings/settings/EditSettingsForm.js", 265 "file": "src/components/settings/settings/EditSettingsForm.js",
266 "start": { 266 "start": {
267 "line": 104, 267 "line": 103,
268 "column": 20 268 "column": 20
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 107, 271 "line": 106,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 277 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
278 "file": "src/components/settings/settings/EditSettingsForm.js", 278 "file": "src/components/settings/settings/EditSettingsForm.js",
279 "start": { 279 "start": {
280 "line": 108, 280 "line": 107,
281 "column": 13 281 "column": 13
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 111, 284 "line": 110,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Couldn't clear all cache", 290 "defaultMessage": "!!!Couldn't clear all cache",
291 "file": "src/components/settings/settings/EditSettingsForm.js", 291 "file": "src/components/settings/settings/EditSettingsForm.js",
292 "start": { 292 "start": {
293 "line": 112, 293 "line": 111,
294 "column": 19 294 "column": 19
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 115, 297 "line": 114,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Clear cache", 303 "defaultMessage": "!!!Clear cache",
304 "file": "src/components/settings/settings/EditSettingsForm.js", 304 "file": "src/components/settings/settings/EditSettingsForm.js",
305 "start": { 305 "start": {
306 "line": 116, 306 "line": 115,
307 "column": 23 307 "column": 23
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 119, 310 "line": 118,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Check for updates", 316 "defaultMessage": "!!!Check for updates",
317 "file": "src/components/settings/settings/EditSettingsForm.js", 317 "file": "src/components/settings/settings/EditSettingsForm.js",
318 "start": { 318 "start": {
319 "line": 120, 319 "line": 119,
320 "column": 25 320 "column": 25
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 123, 323 "line": 122,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Restart & install update", 329 "defaultMessage": "!!!Restart & install update",
330 "file": "src/components/settings/settings/EditSettingsForm.js", 330 "file": "src/components/settings/settings/EditSettingsForm.js",
331 "start": { 331 "start": {
332 "line": 124, 332 "line": 123,
333 "column": 23 333 "column": 23
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 127, 336 "line": 126,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Is searching for update", 342 "defaultMessage": "!!!Is searching for update",
343 "file": "src/components/settings/settings/EditSettingsForm.js", 343 "file": "src/components/settings/settings/EditSettingsForm.js",
344 "start": { 344 "start": {
345 "line": 128, 345 "line": 127,
346 "column": 25 346 "column": 25
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 131, 349 "line": 130,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Update available, downloading...", 355 "defaultMessage": "!!!Update available, downloading...",
356 "file": "src/components/settings/settings/EditSettingsForm.js", 356 "file": "src/components/settings/settings/EditSettingsForm.js",
357 "start": { 357 "start": {
358 "line": 132, 358 "line": 131,
359 "column": 25 359 "column": 25
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 135, 362 "line": 134,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!You are using the latest version of Ferdi", 368 "defaultMessage": "!!!You are using the latest version of Ferdi",
369 "file": "src/components/settings/settings/EditSettingsForm.js", 369 "file": "src/components/settings/settings/EditSettingsForm.js",
370 "start": { 370 "start": {
371 "line": 136, 371 "line": 135,
372 "column": 24 372 "column": 24
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 139, 375 "line": 138,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Current version:", 381 "defaultMessage": "!!!Current version:",
382 "file": "src/components/settings/settings/EditSettingsForm.js", 382 "file": "src/components/settings/settings/EditSettingsForm.js",
383 "start": { 383 "start": {
384 "line": 140, 384 "line": 139,
385 "column": 18 385 "column": 18
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 143, 388 "line": 142,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Changes require restart", 394 "defaultMessage": "!!!Changes require restart",
395 "file": "src/components/settings/settings/EditSettingsForm.js", 395 "file": "src/components/settings/settings/EditSettingsForm.js",
396 "start": { 396 "start": {
397 "line": 144, 397 "line": 143,
398 "column": 22 398 "column": 22
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 147, 401 "line": 146,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 407 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
408 "file": "src/components/settings/settings/EditSettingsForm.js", 408 "file": "src/components/settings/settings/EditSettingsForm.js",
409 "start": { 409 "start": {
410 "line": 148, 410 "line": 147,
411 "column": 22 411 "column": 22
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 151, 414 "line": 150,
415 "column": 3 415 "column": 3
416 } 416 }
417 } 417 }
diff --git a/src/i18n/messages/src/components/settings/team/TeamDashboard.json b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
index 0a3b818a7..ac42ad98a 100644
--- a/src/i18n/messages/src/components/settings/team/TeamDashboard.json
+++ b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Team", 4 "defaultMessage": "!!!Team",
5 "file": "src/components/settings/team/TeamDashboard.js", 5 "file": "src/components/settings/team/TeamDashboard.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Franz Team Management", 17 "defaultMessage": "!!!Franz Team Management",
18 "file": "src/components/settings/team/TeamDashboard.js", 18 "file": "src/components/settings/team/TeamDashboard.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 19,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.", 30 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.",
31 "file": "src/components/settings/team/TeamDashboard.js", 31 "file": "src/components/settings/team/TeamDashboard.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 23,
34 "column": 9 34 "column": 9
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 43 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
44 "file": "src/components/settings/team/TeamDashboard.js", 44 "file": "src/components/settings/team/TeamDashboard.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 27,
47 "column": 8 47 "column": 8
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,24 +56,11 @@
56 "defaultMessage": "!!!Manage your Team on meetfranz.com", 56 "defaultMessage": "!!!Manage your Team on meetfranz.com",
57 "file": "src/components/settings/team/TeamDashboard.js", 57 "file": "src/components/settings/team/TeamDashboard.js",
58 "start": { 58 "start": {
59 "line": 34, 59 "line": 31,
60 "column": 16 60 "column": 16
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 37, 63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.team.upgradeAction",
69 "defaultMessage": "!!!Upgrade your Account",
70 "file": "src/components/settings/team/TeamDashboard.js",
71 "start": {
72 "line": 38,
73 "column": 17
74 },
75 "end": {
76 "line": 41,
77 "column": 3 64 "column": 3
78 } 65 }
79 }, 66 },
@@ -82,11 +69,11 @@
82 "defaultMessage": "!!!Teams are unavailable", 69 "defaultMessage": "!!!Teams are unavailable",
83 "file": "src/components/settings/team/TeamDashboard.js", 70 "file": "src/components/settings/team/TeamDashboard.js",
84 "start": { 71 "start": {
85 "line": 42, 72 "line": 35,
86 "column": 20 73 "column": 20
87 }, 74 },
88 "end": { 75 "end": {
89 "line": 45, 76 "line": 38,
90 "column": 3 77 "column": 3
91 } 78 }
92 }, 79 },
@@ -95,11 +82,11 @@
95 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 82 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
96 "file": "src/components/settings/team/TeamDashboard.js", 83 "file": "src/components/settings/team/TeamDashboard.js",
97 "start": { 84 "start": {
98 "line": 46, 85 "line": 39,
99 "column": 24 86 "column": 24
100 }, 87 },
101 "end": { 88 "end": {
102 "line": 49, 89 "line": 42,
103 "column": 3 90 "column": 3
104 } 91 }
105 } 92 }
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
deleted file mode 100644
index 6d235254e..000000000
--- a/src/i18n/messages/src/components/subscription/SubscriptionForm.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "subscription.cta.choosePlan",
4 "defaultMessage": "!!!Choose your plan",
5 "file": "src/components/subscription/SubscriptionForm.js",
6 "start": {
7 "line": 13,
8 "column": 21
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.account.headlineUpgradeAccount",
17 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
18 "file": "src/components/subscription/SubscriptionForm.js",
19 "start": {
20 "line": 17,
21 "column": 18
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.teaser.intro",
30 "defaultMessage": "!!!Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!",
31 "file": "src/components/subscription/SubscriptionForm.js",
32 "start": {
33 "line": 21,
34 "column": 14
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.teaser.includedFeatures",
43 "defaultMessage": "!!!Paid Franz Plans include:",
44 "file": "src/components/subscription/SubscriptionForm.js",
45 "start": {
46 "line": 25,
47 "column": 20
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
deleted file mode 100644
index c06da7531..000000000
--- a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "subscriptionPopup.buttonCancel",
4 "defaultMessage": "!!!Cancel",
5 "file": "src/components/subscription/SubscriptionPopup.js",
6 "start": {
7 "line": 11,
8 "column": 16
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscriptionPopup.buttonDone",
17 "defaultMessage": "!!!Done",
18 "file": "src/components/subscription/SubscriptionPopup.js",
19 "start": {
20 "line": 15,
21 "column": 14
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/subscription/TrialForm.json b/src/i18n/messages/src/components/subscription/TrialForm.json
deleted file mode 100644
index 8b387ba36..000000000
--- a/src/i18n/messages/src/components/subscription/TrialForm.json
+++ /dev/null
@@ -1,93 +0,0 @@
1[
2 {
3 "id": "subscription.cta.activateTrial",
4 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
5 "file": "src/components/subscription/TrialForm.js",
6 "start": {
7 "line": 14,
8 "column": 21
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.cta.allOptions",
17 "defaultMessage": "!!!See all options",
18 "file": "src/components/subscription/TrialForm.js",
19 "start": {
20 "line": 18,
21 "column": 20
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineTrialUpgrade",
30 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
31 "file": "src/components/subscription/TrialForm.js",
32 "start": {
33 "line": 22,
34 "column": 18
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.includedProFeatures",
43 "defaultMessage": "!!!The Franz Professional Plan includes:",
44 "file": "src/components/subscription/TrialForm.js",
45 "start": {
46 "line": 26,
47 "column": 20
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/subscription/TrialForm.js",
58 "start": {
59 "line": 30,
60 "column": 29
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/subscription/TrialForm.js",
71 "start": {
72 "line": 34,
73 "column": 16
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/subscription/TrialForm.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json b/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
deleted file mode 100644
index fd969da78..000000000
--- a/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
+++ /dev/null
@@ -1,93 +0,0 @@
1[
2 {
3 "id": "feature.delayApp.upgrade.action",
4 "defaultMessage": "!!!Get a Franz Supporter License",
5 "file": "src/components/ui/ActivateTrialButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 10
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.trial.action",
17 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
18 "file": "src/components/ui/ActivateTrialButton/index.js",
19 "start": {
20 "line": 17,
21 "column": 15
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.actionShort",
30 "defaultMessage": "!!!Upgrade account",
31 "file": "src/components/ui/ActivateTrialButton/index.js",
32 "start": {
33 "line": 21,
34 "column": 15
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.actionShort",
43 "defaultMessage": "!!!Activate the free Franz Professional trial",
44 "file": "src/components/ui/ActivateTrialButton/index.js",
45 "start": {
46 "line": 25,
47 "column": 20
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/ui/ActivateTrialButton/index.js",
58 "start": {
59 "line": 29,
60 "column": 29
61 },
62 "end": {
63 "line": 32,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/ui/ActivateTrialButton/index.js",
71 "start": {
72 "line": 33,
73 "column": 16
74 },
75 "end": {
76 "line": 36,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/ui/ActivateTrialButton/index.js",
84 "start": {
85 "line": 37,
86 "column": 21
87 },
88 "end": {
89 "line": 40,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/FeatureList.json b/src/i18n/messages/src/components/ui/FeatureList.json
index 8d1dc4360..eb4bc483b 100644
--- a/src/i18n/messages/src/components/ui/FeatureList.json
+++ b/src/i18n/messages/src/components/ui/FeatureList.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Choose from more than 70 Services", 4 "defaultMessage": "!!!Choose from more than 70 Services",
5 "file": "src/components/ui/FeatureList.js", 5 "file": "src/components/ui/FeatureList.js",
6 "start": { 6 "start": {
7 "line": 9, 7 "line": 8,
8 "column": 20 8 "column": 20
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 12, 11 "line": 11,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Account Synchronisation", 17 "defaultMessage": "!!!Account Synchronisation",
18 "file": "src/components/ui/FeatureList.js", 18 "file": "src/components/ui/FeatureList.js",
19 "start": { 19 "start": {
20 "line": 13, 20 "line": 12,
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 16, 24 "line": 15,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Desktop Notifications", 30 "defaultMessage": "!!!Desktop Notifications",
31 "file": "src/components/ui/FeatureList.js", 31 "file": "src/components/ui/FeatureList.js",
32 "start": { 32 "start": {
33 "line": 17, 33 "line": 16,
34 "column": 24 34 "column": 24
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 20, 37 "line": 19,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,37 +43,11 @@
43 "defaultMessage": "!!!Add unlimited services", 43 "defaultMessage": "!!!Add unlimited services",
44 "file": "src/components/ui/FeatureList.js", 44 "file": "src/components/ui/FeatureList.js",
45 "start": { 45 "start": {
46 "line": 21, 46 "line": 20,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 24, 50 "line": 23,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.features.upToThreeServices",
56 "defaultMessage": "!!!Add up to 3 services",
57 "file": "src/components/ui/FeatureList.js",
58 "start": {
59 "line": 25,
60 "column": 21
61 },
62 "end": {
63 "line": 28,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.features.upToSixServices",
69 "defaultMessage": "!!!Add up to 6 services",
70 "file": "src/components/ui/FeatureList.js",
71 "start": {
72 "line": 29,
73 "column": 19
74 },
75 "end": {
76 "line": 32,
77 "column": 3 51 "column": 3
78 } 52 }
79 }, 53 },
@@ -82,11 +56,11 @@
82 "defaultMessage": "!!!Spellchecker support", 56 "defaultMessage": "!!!Spellchecker support",
83 "file": "src/components/ui/FeatureList.js", 57 "file": "src/components/ui/FeatureList.js",
84 "start": { 58 "start": {
85 "line": 33, 59 "line": 24,
86 "column": 16 60 "column": 16
87 }, 61 },
88 "end": { 62 "end": {
89 "line": 36, 63 "line": 27,
90 "column": 3 64 "column": 3
91 } 65 }
92 }, 66 },
@@ -95,11 +69,11 @@
95 "defaultMessage": "!!!Workspaces", 69 "defaultMessage": "!!!Workspaces",
96 "file": "src/components/ui/FeatureList.js", 70 "file": "src/components/ui/FeatureList.js",
97 "start": { 71 "start": {
98 "line": 37, 72 "line": 28,
99 "column": 14 73 "column": 14
100 }, 74 },
101 "end": { 75 "end": {
102 "line": 40, 76 "line": 31,
103 "column": 3 77 "column": 3
104 } 78 }
105 }, 79 },
@@ -108,11 +82,11 @@
108 "defaultMessage": "!!!Add Custom Websites", 82 "defaultMessage": "!!!Add Custom Websites",
109 "file": "src/components/ui/FeatureList.js", 83 "file": "src/components/ui/FeatureList.js",
110 "start": { 84 "start": {
111 "line": 41, 85 "line": 32,
112 "column": 18 86 "column": 18
113 }, 87 },
114 "end": { 88 "end": {
115 "line": 44, 89 "line": 35,
116 "column": 3 90 "column": 3
117 } 91 }
118 }, 92 },
@@ -121,11 +95,11 @@
121 "defaultMessage": "!!!On-premise & other Hosted Services", 95 "defaultMessage": "!!!On-premise & other Hosted Services",
122 "file": "src/components/ui/FeatureList.js", 96 "file": "src/components/ui/FeatureList.js",
123 "start": { 97 "start": {
124 "line": 45, 98 "line": 36,
125 "column": 13 99 "column": 13
126 }, 100 },
127 "end": { 101 "end": {
128 "line": 48, 102 "line": 39,
129 "column": 3 103 "column": 3
130 } 104 }
131 }, 105 },
@@ -134,11 +108,11 @@
134 "defaultMessage": "!!!Install 3rd party services", 108 "defaultMessage": "!!!Install 3rd party services",
135 "file": "src/components/ui/FeatureList.js", 109 "file": "src/components/ui/FeatureList.js",
136 "start": { 110 "start": {
137 "line": 49, 111 "line": 40,
138 "column": 22 112 "column": 22
139 }, 113 },
140 "end": { 114 "end": {
141 "line": 52, 115 "line": 43,
142 "column": 3 116 "column": 3
143 } 117 }
144 }, 118 },
@@ -147,11 +121,11 @@
147 "defaultMessage": "!!!Service Proxies", 121 "defaultMessage": "!!!Service Proxies",
148 "file": "src/components/ui/FeatureList.js", 122 "file": "src/components/ui/FeatureList.js",
149 "start": { 123 "start": {
150 "line": 53, 124 "line": 44,
151 "column": 18 125 "column": 18
152 }, 126 },
153 "end": { 127 "end": {
154 "line": 56, 128 "line": 47,
155 "column": 3 129 "column": 3
156 } 130 }
157 }, 131 },
@@ -160,50 +134,11 @@
160 "defaultMessage": "!!!Team Management", 134 "defaultMessage": "!!!Team Management",
161 "file": "src/components/ui/FeatureList.js", 135 "file": "src/components/ui/FeatureList.js",
162 "start": { 136 "start": {
163 "line": 57, 137 "line": 48,
164 "column": 18 138 "column": 18
165 }, 139 },
166 "end": { 140 "end": {
167 "line": 60, 141 "line": 51,
168 "column": 3
169 }
170 },
171 {
172 "id": "pricing.features.appDelays",
173 "defaultMessage": "!!!No Waiting Screens",
174 "file": "src/components/ui/FeatureList.js",
175 "start": {
176 "line": 61,
177 "column": 13
178 },
179 "end": {
180 "line": 64,
181 "column": 3
182 }
183 },
184 {
185 "id": "pricing.features.adFree",
186 "defaultMessage": "!!!Forever ad-free",
187 "file": "src/components/ui/FeatureList.js",
188 "start": {
189 "line": 65,
190 "column": 10
191 },
192 "end": {
193 "line": 68,
194 "column": 3
195 }
196 },
197 {
198 "id": "pricing.features.appDelaysEnabled",
199 "defaultMessage": "!!!Occasional Waiting Screens",
200 "file": "src/components/ui/FeatureList.js",
201 "start": {
202 "line": 69,
203 "column": 19
204 },
205 "end": {
206 "line": 72,
207 "column": 3 142 "column": 3
208 } 143 }
209 } 144 }
diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
deleted file mode 100644
index 0cde4cee5..000000000
--- a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "premiumFeature.button.upgradeAccount",
4 "defaultMessage": "!!!Upgrade account",
5 "file": "src/components/ui/PremiumFeatureContainer/index.js",
6 "start": {
7 "line": 16,
8 "column": 10
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/UpgradeButton/index.json b/src/i18n/messages/src/components/ui/UpgradeButton/index.json
deleted file mode 100644
index 28e44cb66..000000000
--- a/src/i18n/messages/src/components/ui/UpgradeButton/index.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "global.upgradeButton.upgradeToPro",
4 "defaultMessage": "!!!Upgrade to Franz Professional",
5 "file": "src/components/ui/UpgradeButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 16
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
index ad97781c4..6744a9ff3 100644
--- a/src/i18n/messages/src/containers/settings/EditServiceScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Name", 4 "defaultMessage": "!!!Name",
5 "file": "src/containers/settings/EditServiceScreen.js", 5 "file": "src/containers/settings/EditServiceScreen.js",
6 "start": { 6 "start": {
7 "line": 29, 7 "line": 28,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 32, 11 "line": 31,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Enable service", 17 "defaultMessage": "!!!Enable service",
18 "file": "src/containers/settings/EditServiceScreen.js", 18 "file": "src/containers/settings/EditServiceScreen.js",
19 "start": { 19 "start": {
20 "line": 33, 20 "line": 32,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 36, 24 "line": 35,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Enable hibernation", 30 "defaultMessage": "!!!Enable hibernation",
31 "file": "src/containers/settings/EditServiceScreen.js", 31 "file": "src/containers/settings/EditServiceScreen.js",
32 "start": { 32 "start": {
33 "line": 37, 33 "line": 36,
34 "column": 21 34 "column": 21
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 40, 37 "line": 39,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Enable Notifications", 43 "defaultMessage": "!!!Enable Notifications",
44 "file": "src/containers/settings/EditServiceScreen.js", 44 "file": "src/containers/settings/EditServiceScreen.js",
45 "start": { 45 "start": {
46 "line": 41, 46 "line": 40,
47 "column": 22 47 "column": 22
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 44, 50 "line": 43,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Show unread message badges", 56 "defaultMessage": "!!!Show unread message badges",
57 "file": "src/containers/settings/EditServiceScreen.js", 57 "file": "src/containers/settings/EditServiceScreen.js",
58 "start": { 58 "start": {
59 "line": 45, 59 "line": 44,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 48, 63 "line": 47,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Enable audio", 69 "defaultMessage": "!!!Enable audio",
70 "file": "src/containers/settings/EditServiceScreen.js", 70 "file": "src/containers/settings/EditServiceScreen.js",
71 "start": { 71 "start": {
72 "line": 49, 72 "line": 48,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 52, 76 "line": 51,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Team", 82 "defaultMessage": "!!!Team",
83 "file": "src/containers/settings/EditServiceScreen.js", 83 "file": "src/containers/settings/EditServiceScreen.js",
84 "start": { 84 "start": {
85 "line": 53, 85 "line": 52,
86 "column": 8 86 "column": 8
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 56, 89 "line": 55,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Service URL", 95 "defaultMessage": "!!!Service URL",
96 "file": "src/containers/settings/EditServiceScreen.js", 96 "file": "src/containers/settings/EditServiceScreen.js",
97 "start": { 97 "start": {
98 "line": 57, 98 "line": 56,
99 "column": 13 99 "column": 13
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 60, 102 "line": 59,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Show message badge for all new messages", 108 "defaultMessage": "!!!Show message badge for all new messages",
109 "file": "src/containers/settings/EditServiceScreen.js", 109 "file": "src/containers/settings/EditServiceScreen.js",
110 "start": { 110 "start": {
111 "line": 61, 111 "line": 60,
112 "column": 20 112 "column": 20
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 64, 115 "line": 63,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Custom icon", 121 "defaultMessage": "!!!Custom icon",
122 "file": "src/containers/settings/EditServiceScreen.js", 122 "file": "src/containers/settings/EditServiceScreen.js",
123 "start": { 123 "start": {
124 "line": 65, 124 "line": 64,
125 "column": 8 125 "column": 8
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 68, 128 "line": 67,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Enable Dark Mode", 134 "defaultMessage": "!!!Enable Dark Mode",
135 "file": "src/containers/settings/EditServiceScreen.js", 135 "file": "src/containers/settings/EditServiceScreen.js",
136 "start": { 136 "start": {
137 "line": 69, 137 "line": 68,
138 "column": 18 138 "column": 18
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 72, 141 "line": 71,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Dark Reader Brightness", 147 "defaultMessage": "!!!Dark Reader Brightness",
148 "file": "src/containers/settings/EditServiceScreen.js", 148 "file": "src/containers/settings/EditServiceScreen.js",
149 "start": { 149 "start": {
150 "line": 73, 150 "line": 72,
151 "column": 24 151 "column": 24
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 76, 154 "line": 75,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Dark Reader Contrast", 160 "defaultMessage": "!!!Dark Reader Contrast",
161 "file": "src/containers/settings/EditServiceScreen.js", 161 "file": "src/containers/settings/EditServiceScreen.js",
162 "start": { 162 "start": {
163 "line": 77, 163 "line": 76,
164 "column": 22 164 "column": 22
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 80, 167 "line": 79,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Dark Reader Sepia", 173 "defaultMessage": "!!!Dark Reader Sepia",
174 "file": "src/containers/settings/EditServiceScreen.js", 174 "file": "src/containers/settings/EditServiceScreen.js",
175 "start": { 175 "start": {
176 "line": 81, 176 "line": 80,
177 "column": 19 177 "column": 19
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 84, 180 "line": 83,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Use Proxy", 186 "defaultMessage": "!!!Use Proxy",
187 "file": "src/containers/settings/EditServiceScreen.js", 187 "file": "src/containers/settings/EditServiceScreen.js",
188 "start": { 188 "start": {
189 "line": 85, 189 "line": 84,
190 "column": 15 190 "column": 15
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 88, 193 "line": 87,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Proxy Host/IP", 199 "defaultMessage": "!!!Proxy Host/IP",
200 "file": "src/containers/settings/EditServiceScreen.js", 200 "file": "src/containers/settings/EditServiceScreen.js",
201 "start": { 201 "start": {
202 "line": 89, 202 "line": 88,
203 "column": 13 203 "column": 13
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 92, 206 "line": 91,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Port", 212 "defaultMessage": "!!!Port",
213 "file": "src/containers/settings/EditServiceScreen.js", 213 "file": "src/containers/settings/EditServiceScreen.js",
214 "start": { 214 "start": {
215 "line": 93, 215 "line": 92,
216 "column": 13 216 "column": 13
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 96, 219 "line": 95,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!User", 225 "defaultMessage": "!!!User",
226 "file": "src/containers/settings/EditServiceScreen.js", 226 "file": "src/containers/settings/EditServiceScreen.js",
227 "start": { 227 "start": {
228 "line": 97, 228 "line": 96,
229 "column": 13 229 "column": 13
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 100, 232 "line": 99,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Password", 238 "defaultMessage": "!!!Password",
239 "file": "src/containers/settings/EditServiceScreen.js", 239 "file": "src/containers/settings/EditServiceScreen.js",
240 "start": { 240 "start": {
241 "line": 101, 241 "line": 100,
242 "column": 17 242 "column": 17
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 104, 245 "line": 103,
246 "column": 3 246 "column": 3
247 } 247 }
248 } 248 }
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index cd5462b59..5c15933e4 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Launch Ferdi on start", 4 "defaultMessage": "!!!Launch Ferdi on start",
5 "file": "src/containers/settings/EditSettingsScreen.js", 5 "file": "src/containers/settings/EditSettingsScreen.js",
6 "start": { 6 "start": {
7 "line": 31, 7 "line": 30,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 34, 11 "line": 33,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Open in background", 17 "defaultMessage": "!!!Open in background",
18 "file": "src/containers/settings/EditSettingsScreen.js", 18 "file": "src/containers/settings/EditSettingsScreen.js",
19 "start": { 19 "start": {
20 "line": 35, 20 "line": 34,
21 "column": 26 21 "column": 26
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 38, 24 "line": 37,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 30 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
31 "file": "src/containers/settings/EditSettingsScreen.js", 31 "file": "src/containers/settings/EditSettingsScreen.js",
32 "start": { 32 "start": {
33 "line": 39, 33 "line": 38,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 42, 37 "line": 41,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Start minimized", 43 "defaultMessage": "!!!Start minimized",
44 "file": "src/containers/settings/EditSettingsScreen.js", 44 "file": "src/containers/settings/EditSettingsScreen.js",
45 "start": { 45 "start": {
46 "line": 43, 46 "line": 42,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 46, 50 "line": 45,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Always show Ferdi in System Tray", 56 "defaultMessage": "!!!Always show Ferdi in System Tray",
57 "file": "src/containers/settings/EditSettingsScreen.js", 57 "file": "src/containers/settings/EditSettingsScreen.js",
58 "start": { 58 "start": {
59 "line": 47, 59 "line": 46,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 50, 63 "line": 49,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Always show Ferdi in Menu Bar", 69 "defaultMessage": "!!!Always show Ferdi in Menu Bar",
70 "file": "src/containers/settings/EditSettingsScreen.js", 70 "file": "src/containers/settings/EditSettingsScreen.js",
71 "start": { 71 "start": {
72 "line": 51, 72 "line": 50,
73 "column": 17 73 "column": 17
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 54, 76 "line": 53,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Reload Ferdi after system resume", 82 "defaultMessage": "!!!Reload Ferdi after system resume",
83 "file": "src/containers/settings/EditSettingsScreen.js", 83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": { 84 "start": {
85 "line": 55, 85 "line": 54,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 58, 89 "line": 57,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Minimize Ferdi to system tray", 95 "defaultMessage": "!!!Minimize Ferdi to system tray",
96 "file": "src/containers/settings/EditSettingsScreen.js", 96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": { 97 "start": {
98 "line": 59, 98 "line": 58,
99 "column": 24 99 "column": 24
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 62, 102 "line": 61,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Close Ferdi to system tray", 108 "defaultMessage": "!!!Close Ferdi to system tray",
109 "file": "src/containers/settings/EditSettingsScreen.js", 109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 110 "start": {
111 "line": 63, 111 "line": 62,
112 "column": 21 112 "column": 21
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 66, 115 "line": 65,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Don't show message content in notifications", 121 "defaultMessage": "!!!Don't show message content in notifications",
122 "file": "src/containers/settings/EditSettingsScreen.js", 122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 123 "start": {
124 "line": 67, 124 "line": 66,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 70, 128 "line": 69,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Don't show notifications for clipboard events", 134 "defaultMessage": "!!!Don't show notifications for clipboard events",
135 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 136 "start": {
137 "line": 71, 137 "line": 70,
138 "column": 26 138 "column": 26
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 74, 141 "line": 73,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Notify TaskBar/Dock on new message", 147 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
148 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 149 "start": {
150 "line": 75, 150 "line": 74,
151 "column": 26 151 "column": 26
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 78, 154 "line": 77,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Navigation bar behaviour", 160 "defaultMessage": "!!!Navigation bar behaviour",
161 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 162 "start": {
163 "line": 79, 163 "line": 78,
164 "column": 26 164 "column": 26
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 82, 167 "line": 81,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Search engine", 173 "defaultMessage": "!!!Search engine",
174 "file": "src/containers/settings/EditSettingsScreen.js", 174 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": { 175 "start": {
176 "line": 83, 176 "line": 82,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 86, 180 "line": 85,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Send telemetry data", 186 "defaultMessage": "!!!Send telemetry data",
187 "file": "src/containers/settings/EditSettingsScreen.js", 187 "file": "src/containers/settings/EditSettingsScreen.js",
188 "start": { 188 "start": {
189 "line": 87, 189 "line": 86,
190 "column": 10 190 "column": 10
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 90, 193 "line": 89,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Enable service hibernation", 199 "defaultMessage": "!!!Enable service hibernation",
200 "file": "src/containers/settings/EditSettingsScreen.js", 200 "file": "src/containers/settings/EditSettingsScreen.js",
201 "start": { 201 "start": {
202 "line": 91, 202 "line": 90,
203 "column": 13 203 "column": 13
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 94, 206 "line": 93,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Keep services in hibernation on startup", 212 "defaultMessage": "!!!Keep services in hibernation on startup",
213 "file": "src/containers/settings/EditSettingsScreen.js", 213 "file": "src/containers/settings/EditSettingsScreen.js",
214 "start": { 214 "start": {
215 "line": 95, 215 "line": 94,
216 "column": 22 216 "column": 22
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 98, 219 "line": 97,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Hibernation strategy", 225 "defaultMessage": "!!!Hibernation strategy",
226 "file": "src/containers/settings/EditSettingsScreen.js", 226 "file": "src/containers/settings/EditSettingsScreen.js",
227 "start": { 227 "start": {
228 "line": 99, 228 "line": 98,
229 "column": 23 229 "column": 23
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 102, 232 "line": 101,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Todo Server", 238 "defaultMessage": "!!!Todo Server",
239 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
240 "start": { 240 "start": {
241 "line": 103, 241 "line": 102,
242 "column": 24 242 "column": 24
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 106, 245 "line": 105,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Custom TodoServer", 251 "defaultMessage": "!!!Custom TodoServer",
252 "file": "src/containers/settings/EditSettingsScreen.js", 252 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": { 253 "start": {
254 "line": 107, 254 "line": 106,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 110, 258 "line": 109,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Enable Password Lock", 264 "defaultMessage": "!!!Enable Password Lock",
265 "file": "src/containers/settings/EditSettingsScreen.js", 265 "file": "src/containers/settings/EditSettingsScreen.js",
266 "start": { 266 "start": {
267 "line": 111, 267 "line": 110,
268 "column": 14 268 "column": 14
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 114, 271 "line": 113,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Password", 277 "defaultMessage": "!!!Password",
278 "file": "src/containers/settings/EditSettingsScreen.js", 278 "file": "src/containers/settings/EditSettingsScreen.js",
279 "start": { 279 "start": {
280 "line": 115, 280 "line": 114,
281 "column": 16 281 "column": 16
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 118, 284 "line": 117,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Allow using Touch ID to unlock", 290 "defaultMessage": "!!!Allow using Touch ID to unlock",
291 "file": "src/containers/settings/EditSettingsScreen.js", 291 "file": "src/containers/settings/EditSettingsScreen.js",
292 "start": { 292 "start": {
293 "line": 119, 293 "line": 118,
294 "column": 22 294 "column": 22
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 122, 297 "line": 121,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Lock after inactivity", 303 "defaultMessage": "!!!Lock after inactivity",
304 "file": "src/containers/settings/EditSettingsScreen.js", 304 "file": "src/containers/settings/EditSettingsScreen.js",
305 "start": { 305 "start": {
306 "line": 123, 306 "line": 122,
307 "column": 18 307 "column": 18
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 126, 310 "line": 125,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 316 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
317 "file": "src/containers/settings/EditSettingsScreen.js", 317 "file": "src/containers/settings/EditSettingsScreen.js",
318 "start": { 318 "start": {
319 "line": 127, 319 "line": 126,
320 "column": 23 320 "column": 23
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 130, 323 "line": 129,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!From", 329 "defaultMessage": "!!!From",
330 "file": "src/containers/settings/EditSettingsScreen.js", 330 "file": "src/containers/settings/EditSettingsScreen.js",
331 "start": { 331 "start": {
332 "line": 131, 332 "line": 130,
333 "column": 21 333 "column": 21
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 134, 336 "line": 133,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!To", 342 "defaultMessage": "!!!To",
343 "file": "src/containers/settings/EditSettingsScreen.js", 343 "file": "src/containers/settings/EditSettingsScreen.js",
344 "start": { 344 "start": {
345 "line": 135, 345 "line": 134,
346 "column": 19 346 "column": 19
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 138, 349 "line": 137,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Language", 355 "defaultMessage": "!!!Language",
356 "file": "src/containers/settings/EditSettingsScreen.js", 356 "file": "src/containers/settings/EditSettingsScreen.js",
357 "start": { 357 "start": {
358 "line": 139, 358 "line": 138,
359 "column": 12 359 "column": 12
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 142, 362 "line": 141,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Dark Mode", 368 "defaultMessage": "!!!Dark Mode",
369 "file": "src/containers/settings/EditSettingsScreen.js", 369 "file": "src/containers/settings/EditSettingsScreen.js",
370 "start": { 370 "start": {
371 "line": 143, 371 "line": 142,
372 "column": 12 372 "column": 12
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 146, 375 "line": 145,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 381 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
382 "file": "src/containers/settings/EditSettingsScreen.js", 382 "file": "src/containers/settings/EditSettingsScreen.js",
383 "start": { 383 "start": {
384 "line": 147, 384 "line": 146,
385 "column": 21 385 "column": 21
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 150, 388 "line": 149,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Enable universal Dark Mode", 394 "defaultMessage": "!!!Enable universal Dark Mode",
395 "file": "src/containers/settings/EditSettingsScreen.js", 395 "file": "src/containers/settings/EditSettingsScreen.js",
396 "start": { 396 "start": {
397 "line": 151, 397 "line": 150,
398 "column": 21 398 "column": 21
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 154, 401 "line": 153,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Sidebar width", 407 "defaultMessage": "!!!Sidebar width",
408 "file": "src/containers/settings/EditSettingsScreen.js", 408 "file": "src/containers/settings/EditSettingsScreen.js",
409 "start": { 409 "start": {
410 "line": 155, 410 "line": 154,
411 "column": 22 411 "column": 22
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 158, 414 "line": 157,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!Service icon size", 420 "defaultMessage": "!!!Service icon size",
421 "file": "src/containers/settings/EditSettingsScreen.js", 421 "file": "src/containers/settings/EditSettingsScreen.js",
422 "start": { 422 "start": {
423 "line": 159, 423 "line": 158,
424 "column": 12 424 "column": 12
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 162, 427 "line": 161,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Use vertical style", 433 "defaultMessage": "!!!Use vertical style",
434 "file": "src/containers/settings/EditSettingsScreen.js", 434 "file": "src/containers/settings/EditSettingsScreen.js",
435 "start": { 435 "start": {
436 "line": 163, 436 "line": 162,
437 "column": 20 437 "column": 20
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 166, 440 "line": 165,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Always show workspace drawer", 446 "defaultMessage": "!!!Always show workspace drawer",
447 "file": "src/containers/settings/EditSettingsScreen.js", 447 "file": "src/containers/settings/EditSettingsScreen.js",
448 "start": { 448 "start": {
449 "line": 167, 449 "line": 166,
450 "column": 24 450 "column": 24
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 170, 453 "line": 169,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Accent color", 459 "defaultMessage": "!!!Accent color",
460 "file": "src/containers/settings/EditSettingsScreen.js", 460 "file": "src/containers/settings/EditSettingsScreen.js",
461 "start": { 461 "start": {
462 "line": 171, 462 "line": 170,
463 "column": 15 463 "column": 15
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 174, 466 "line": 173,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!Display disabled services tabs", 472 "defaultMessage": "!!!Display disabled services tabs",
473 "file": "src/containers/settings/EditSettingsScreen.js", 473 "file": "src/containers/settings/EditSettingsScreen.js",
474 "start": { 474 "start": {
475 "line": 175, 475 "line": 174,
476 "column": 24 476 "column": 24
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 178, 479 "line": 177,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 485 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
486 "file": "src/containers/settings/EditSettingsScreen.js", 486 "file": "src/containers/settings/EditSettingsScreen.js",
487 "start": { 487 "start": {
488 "line": 179, 488 "line": 178,
489 "column": 29 489 "column": 29
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 182, 492 "line": 181,
493 "column": 3 493 "column": 3
494 } 494 }
495 }, 495 },
@@ -498,11 +498,11 @@
498 "defaultMessage": "!!!Show draggable area on window", 498 "defaultMessage": "!!!Show draggable area on window",
499 "file": "src/containers/settings/EditSettingsScreen.js", 499 "file": "src/containers/settings/EditSettingsScreen.js",
500 "start": { 500 "start": {
501 "line": 183, 501 "line": 182,
502 "column": 16 502 "column": 16
503 }, 503 },
504 "end": { 504 "end": {
505 "line": 186, 505 "line": 185,
506 "column": 3 506 "column": 3
507 } 507 }
508 }, 508 },
@@ -511,11 +511,11 @@
511 "defaultMessage": "!!!Enable spell checking", 511 "defaultMessage": "!!!Enable spell checking",
512 "file": "src/containers/settings/EditSettingsScreen.js", 512 "file": "src/containers/settings/EditSettingsScreen.js",
513 "start": { 513 "start": {
514 "line": 187, 514 "line": 186,
515 "column": 23 515 "column": 23
516 }, 516 },
517 "end": { 517 "end": {
518 "line": 190, 518 "line": 189,
519 "column": 3 519 "column": 3
520 } 520 }
521 }, 521 },
@@ -524,11 +524,11 @@
524 "defaultMessage": "!!!Enable GPU Acceleration", 524 "defaultMessage": "!!!Enable GPU Acceleration",
525 "file": "src/containers/settings/EditSettingsScreen.js", 525 "file": "src/containers/settings/EditSettingsScreen.js",
526 "start": { 526 "start": {
527 "line": 191, 527 "line": 190,
528 "column": 25 528 "column": 25
529 }, 529 },
530 "end": { 530 "end": {
531 "line": 194, 531 "line": 193,
532 "column": 3 532 "column": 3
533 } 533 }
534 }, 534 },
@@ -537,11 +537,11 @@
537 "defaultMessage": "!!!Include beta versions", 537 "defaultMessage": "!!!Include beta versions",
538 "file": "src/containers/settings/EditSettingsScreen.js", 538 "file": "src/containers/settings/EditSettingsScreen.js",
539 "start": { 539 "start": {
540 "line": 195, 540 "line": 194,
541 "column": 8 541 "column": 8
542 }, 542 },
543 "end": { 543 "end": {
544 "line": 198, 544 "line": 197,
545 "column": 3 545 "column": 3
546 } 546 }
547 }, 547 },
@@ -550,11 +550,11 @@
550 "defaultMessage": "!!!Enable updates", 550 "defaultMessage": "!!!Enable updates",
551 "file": "src/containers/settings/EditSettingsScreen.js", 551 "file": "src/containers/settings/EditSettingsScreen.js",
552 "start": { 552 "start": {
553 "line": 199, 553 "line": 198,
554 "column": 20 554 "column": 20
555 }, 555 },
556 "end": { 556 "end": {
557 "line": 202, 557 "line": 201,
558 "column": 3 558 "column": 3
559 } 559 }
560 }, 560 },
@@ -563,11 +563,11 @@
563 "defaultMessage": "!!!Enable Franz Todos", 563 "defaultMessage": "!!!Enable Franz Todos",
564 "file": "src/containers/settings/EditSettingsScreen.js", 564 "file": "src/containers/settings/EditSettingsScreen.js",
565 "start": { 565 "start": {
566 "line": 203, 566 "line": 202,
567 "column": 15 567 "column": 15
568 }, 568 },
569 "end": { 569 "end": {
570 "line": 206, 570 "line": 205,
571 "column": 3 571 "column": 3
572 } 572 }
573 }, 573 },
@@ -576,11 +576,11 @@
576 "defaultMessage": "!!!Keep all workspaces loaded", 576 "defaultMessage": "!!!Keep all workspaces loaded",
577 "file": "src/containers/settings/EditSettingsScreen.js", 577 "file": "src/containers/settings/EditSettingsScreen.js",
578 "start": { 578 "start": {
579 "line": 207, 579 "line": 206,
580 "column": 27 580 "column": 27
581 }, 581 },
582 "end": { 582 "end": {
583 "line": 210, 583 "line": 209,
584 "column": 3 584 "column": 3
585 } 585 }
586 } 586 }
diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json
deleted file mode 100644
index 7ec0e69a0..000000000
--- a/src/i18n/messages/src/features/delayApp/Component.json
+++ /dev/null
@@ -1,67 +0,0 @@
1[
2 {
3 "id": "feature.delayApp.headline",
4 "defaultMessage": "!!!Please purchase license to skip waiting",
5 "file": "src/features/delayApp/Component.js",
6 "start": {
7 "line": 16,
8 "column": 12
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.trial.headline",
17 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
18 "file": "src/features/delayApp/Component.js",
19 "start": {
20 "line": 20,
21 "column": 17
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.action",
30 "defaultMessage": "!!!Upgrade Franz",
31 "file": "src/features/delayApp/Component.js",
32 "start": {
33 "line": 24,
34 "column": 10
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.action",
43 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
44 "file": "src/features/delayApp/Component.js",
45 "start": {
46 "line": 28,
47 "column": 15
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.delayApp.text",
56 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
57 "file": "src/features/delayApp/Component.js",
58 "start": {
59 "line": 32,
60 "column": 8
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/planSelection/components/PlanItem.json b/src/i18n/messages/src/features/planSelection/components/PlanItem.json
deleted file mode 100644
index 5a94f32ee..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanItem.json
+++ /dev/null
@@ -1,41 +0,0 @@
1[
2 {
3 "id": "subscription.interval.perMonth",
4 "defaultMessage": "!!!per month",
5 "file": "src/features/planSelection/components/PlanItem.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.interval.perMonthPerUser",
17 "defaultMessage": "!!!per month & user",
18 "file": "src/features/planSelection/components/PlanItem.js",
19 "start": {
20 "line": 19,
21 "column": 19
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.bestValue",
30 "defaultMessage": "!!!Best value",
31 "file": "src/features/planSelection/components/PlanItem.js",
32 "start": {
33 "line": 23,
34 "column": 13
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json
deleted file mode 100644
index ed354146e..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json
+++ /dev/null
@@ -1,158 +0,0 @@
1[
2 {
3 "id": "feature.planSelection.fullscreen.welcome",
4 "defaultMessage": "!!!Are you ready to choose, {name}",
5 "file": "src/features/planSelection/components/PlanSelection.js",
6 "start": {
7 "line": 17,
8 "column": 11
9 },
10 "end": {
11 "line": 20,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.planSelection.fullscreen.subheadline",
17 "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
18 "file": "src/features/planSelection/components/PlanSelection.js",
19 "start": {
20 "line": 21,
21 "column": 15
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.planSelection.free.text",
30 "defaultMessage": "!!!Basic functionality",
31 "file": "src/features/planSelection/components/PlanSelection.js",
32 "start": {
33 "line": 25,
34 "column": 12
35 },
36 "end": {
37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.planSelection.personal.text",
43 "defaultMessage": "!!!More services, no waiting - ideal for personal use.",
44 "file": "src/features/planSelection/components/PlanSelection.js",
45 "start": {
46 "line": 29,
47 "column": 16
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.planSelection.pro.text",
56 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.",
57 "file": "src/features/planSelection/components/PlanSelection.js",
58 "start": {
59 "line": 33,
60 "column": 20
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "feature.planSelection.cta.stayOnFree",
69 "defaultMessage": "!!!Stay on Free",
70 "file": "src/features/planSelection/components/PlanSelection.js",
71 "start": {
72 "line": 37,
73 "column": 17
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "feature.planSelection.cta.ctaDowngradeFree",
82 "defaultMessage": "!!!Downgrade to Free",
83 "file": "src/features/planSelection/components/PlanSelection.js",
84 "start": {
85 "line": 41,
86 "column": 20
87 },
88 "end": {
89 "line": 44,
90 "column": 3
91 }
92 },
93 {
94 "id": "feature.planSelection.cta.trial",
95 "defaultMessage": "!!!Start my free 14-days Trial",
96 "file": "src/features/planSelection/components/PlanSelection.js",
97 "start": {
98 "line": 45,
99 "column": 15
100 },
101 "end": {
102 "line": 48,
103 "column": 3
104 }
105 },
106 {
107 "id": "feature.planSelection.cta.upgradePersonal",
108 "defaultMessage": "!!!Choose Personal",
109 "file": "src/features/planSelection/components/PlanSelection.js",
110 "start": {
111 "line": 49,
112 "column": 23
113 },
114 "end": {
115 "line": 52,
116 "column": 3
117 }
118 },
119 {
120 "id": "feature.planSelection.cta.upgradePro",
121 "defaultMessage": "!!!Choose Professional",
122 "file": "src/features/planSelection/components/PlanSelection.js",
123 "start": {
124 "line": 53,
125 "column": 18
126 },
127 "end": {
128 "line": 56,
129 "column": 3
130 }
131 },
132 {
133 "id": "feature.planSelection.fullFeatureList",
134 "defaultMessage": "!!!Complete comparison of all plans",
135 "file": "src/features/planSelection/components/PlanSelection.js",
136 "start": {
137 "line": 57,
138 "column": 19
139 },
140 "end": {
141 "line": 60,
142 "column": 3
143 }
144 },
145 {
146 "id": "feature.planSelection.pricesBasedOnAnnualPayment",
147 "defaultMessage": "!!!All prices based on yearly payment",
148 "file": "src/features/planSelection/components/PlanSelection.js",
149 "start": {
150 "line": 61,
151 "column": 30
152 },
153 "end": {
154 "line": 64,
155 "column": 3
156 }
157 }
158] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json b/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json
deleted file mode 100644
index 015304a2e..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "subscription.interval.per",
4 "defaultMessage": "!!!per {interval}",
5 "file": "src/features/planSelection/components/PlanTeaser.js",
6 "start": {
7 "line": 16,
8 "column": 7
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.planItem.upgradeAccount",
17 "defaultMessage": "!!!Upgrade Account",
18 "file": "src/features/planSelection/components/PlanTeaser.js",
19 "start": {
20 "line": 20,
21 "column": 7
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json b/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json
deleted file mode 100644
index 40e08c233..000000000
--- a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "feature.planSelection.fullscreen.dialog.title",
4 "defaultMessage": "!!!Downgrade your Franz Plan",
5 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6 "start": {
7 "line": 15,
8 "column": 15
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.planSelection.fullscreen.dialog.message",
17 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
18 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
19 "start": {
20 "line": 19,
21 "column": 17
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade",
30 "defaultMessage": "!!!Downgrade to Free",
31 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
32 "start": {
33 "line": 23,
34 "column": 22
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade",
43 "defaultMessage": "!!!Choose Personal",
44 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
45 "start": {
46 "line": 27,
47 "column": 20
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json b/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
deleted file mode 100644
index e6e3cef99..000000000
--- a/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "feature.announcements.changelog.headline",
4 "defaultMessage": "!!!Changes in Franz {version}",
5 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
6 "start": {
7 "line": 20,
8 "column": 12
9 },
10 "end": {
11 "line": 23,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json b/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
deleted file mode 100644
index e35ad8dd8..000000000
--- a/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "feature.serviceLimit.limitReached",
4 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
5 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6 "start": {
7 "line": 9,
8 "column": 16
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "premiumFeature.button.upgradeAccount",
17 "defaultMessage": "!!!Upgrade account",
18 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
19 "start": {
20 "line": 13,
21 "column": 10
22 },
23 "end": {
24 "line": 16,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json
index 402865ec5..428bd5fbc 100644
--- a/src/i18n/messages/src/features/shareFranz/Component.json
+++ b/src/i18n/messages/src/features/shareFranz/Component.json
@@ -66,7 +66,7 @@
66 }, 66 },
67 { 67 {
68 "id": "feature.shareFranz.shareText.email", 68 "id": "feature.shareFranz.shareText.email",
69 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 69 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
70 "file": "src/features/shareFranz/Component.js", 70 "file": "src/features/shareFranz/Component.js",
71 "start": { 71 "start": {
72 "line": 37, 72 "line": 37,
@@ -79,7 +79,7 @@
79 }, 79 },
80 { 80 {
81 "id": "feature.shareFranz.shareText.twitter", 81 "id": "feature.shareFranz.shareText.twitter",
82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 82 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
83 "file": "src/features/shareFranz/Component.js", 83 "file": "src/features/shareFranz/Component.js",
84 "start": { 84 "start": {
85 "line": 41, 85 "line": 41,
diff --git a/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json b/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json
deleted file mode 100644
index bf211a016..000000000
--- a/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json
+++ /dev/null
@@ -1,41 +0,0 @@
1[
2 {
3 "id": "feature.trialStatusBar.restTime",
4 "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.",
5 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6 "start": {
7 "line": 13,
8 "column": 12
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.trialStatusBar.expired",
17 "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.",
18 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
19 "start": {
20 "line": 17,
21 "column": 11
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.trialStatusBar.cta",
30 "defaultMessage": "!!!Upgrade now",
31 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
32 "start": {
33 "line": 21,
34 "column": 7
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json b/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json
deleted file mode 100644
index 306cd0fee..000000000
--- a/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "feature.trialStatusBar.fullscreen.dialog.title",
4 "defaultMessage": "!!!Downgrade your Franz Plan",
5 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6 "start": {
7 "line": 16,
8 "column": 15
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.trialStatusBar.fullscreen.dialog.message",
17 "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.",
18 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
19 "start": {
20 "line": 20,
21 "column": 17
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade",
30 "defaultMessage": "!!!Downgrade to Free",
31 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
32 "start": {
33 "line": 24,
34 "column": 22
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade",
43 "defaultMessage": "!!!Choose Personal",
44 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
45 "start": {
46 "line": 28,
47 "column": 20
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
index 9f0935620..0c7ff2bc8 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Workspaces", 4 "defaultMessage": "!!!Workspaces",
5 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6 "start": { 6 "start": {
7 "line": 16, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 19, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!All services", 17 "defaultMessage": "!!!All services",
18 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 18 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
19 "start": { 19 "start": {
20 "line": 20, 20 "line": 19,
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 23, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Workspaces settings", 30 "defaultMessage": "!!!Workspaces settings",
31 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 31 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
32 "start": { 32 "start": {
33 "line": 24, 33 "line": 23,
34 "column": 29 34 "column": 29
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 27, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,37 +43,11 @@
43 "defaultMessage": "!!!Info about workspace feature", 43 "defaultMessage": "!!!Info about workspace feature",
44 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 44 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
45 "start": { 45 "start": {
46 "line": 28, 46 "line": 27,
47 "column": 24 47 "column": 24
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 31, 50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "workspaceDrawer.premiumCtaButtonLabel",
56 "defaultMessage": "!!!Create your first workspace",
57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
58 "start": {
59 "line": 32,
60 "column": 25
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
69 "defaultMessage": "!!!Reactivate premium account",
70 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
71 "start": {
72 "line": 36,
73 "column": 28
74 },
75 "end": {
76 "line": 39,
77 "column": 3 51 "column": 3
78 } 52 }
79 }, 53 },
@@ -82,11 +56,11 @@
82 "defaultMessage": "!!!add new workspace", 56 "defaultMessage": "!!!add new workspace",
83 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
84 "start": { 58 "start": {
85 "line": 40, 59 "line": 31,
86 "column": 24 60 "column": 24
87 }, 61 },
88 "end": { 62 "end": {
89 "line": 43, 63 "line": 34,
90 "column": 3 64 "column": 3
91 } 65 }
92 }, 66 },
@@ -95,11 +69,11 @@
95 "defaultMessage": "!!!Premium feature", 69 "defaultMessage": "!!!Premium feature",
96 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 70 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
97 "start": { 71 "start": {
98 "line": 44, 72 "line": 35,
99 "column": 23 73 "column": 23
100 }, 74 },
101 "end": { 75 "end": {
102 "line": 47, 76 "line": 38,
103 "column": 3 77 "column": 3
104 } 78 }
105 } 79 }
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
index d67bc492d..39c9c30fb 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your workspaces", 4 "defaultMessage": "!!!Your workspaces",
5 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
6 "start": { 6 "start": {
7 "line": 20, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 23, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!You haven't created any workspaces yet.", 17 "defaultMessage": "!!!You haven't created any workspaces yet.",
18 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 18 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
19 "start": { 19 "start": {
20 "line": 24, 20 "line": 21,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 27, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load your workspaces", 30 "defaultMessage": "!!!Could not load your workspaces",
31 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 31 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
32 "start": { 32 "start": {
33 "line": 28, 33 "line": 25,
34 "column": 27 34 "column": 27
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 31, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Try again", 43 "defaultMessage": "!!!Try again",
44 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 44 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
45 "start": { 45 "start": {
46 "line": 32, 46 "line": 29,
47 "column": 23 47 "column": 23
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 35, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Your changes have been saved", 56 "defaultMessage": "!!!Your changes have been saved",
57 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 57 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
58 "start": { 58 "start": {
59 "line": 36, 59 "line": 33,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 39, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Workspace has been deleted", 69 "defaultMessage": "!!!Workspace has been deleted",
70 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 70 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
71 "start": { 71 "start": {
72 "line": 40, 72 "line": 37,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 43, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Info about workspace feature", 82 "defaultMessage": "!!!Info about workspace feature",
83 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 83 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
84 "start": { 84 "start": {
85 "line": 44, 85 "line": 41,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 47, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces",
96 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 96 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
97 "start": { 97 "start": {
98 "line": 48, 98 "line": 45,
99 "column": 28 99 "column": 28
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 51, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/helpers/plan-helpers.json b/src/i18n/messages/src/helpers/plan-helpers.json
deleted file mode 100644
index 3f3e7e85d..000000000
--- a/src/i18n/messages/src/helpers/plan-helpers.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "pricing.plan.pro",
4 "defaultMessage": "!!!Professional",
5 "file": "src/helpers/plan-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 15
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.personal",
17 "defaultMessage": "!!!Personal",
18 "file": "src/helpers/plan-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 20
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.free",
30 "defaultMessage": "!!!Free",
31 "file": "src/helpers/plan-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 16
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.legacy",
43 "defaultMessage": "!!!Premium",
44 "file": "src/helpers/plan-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 18
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/helpers/pricing-helpers.json b/src/i18n/messages/src/helpers/pricing-helpers.json
deleted file mode 100644
index 4030a3e3b..000000000
--- a/src/i18n/messages/src/helpers/pricing-helpers.json
+++ /dev/null
@@ -1,80 +0,0 @@
1[
2 {
3 "id": "pricing.plan.pro-yearly",
4 "defaultMessage": "!!!Franz Professional Yearly",
5 "file": "src/helpers/pricing-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 22
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.pro-monthly",
17 "defaultMessage": "!!!Franz Professional Monthly",
18 "file": "src/helpers/pricing-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 23
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.personal-yearly",
30 "defaultMessage": "!!!Franz Personal Yearly",
31 "file": "src/helpers/pricing-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 27
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.personal-monthly",
43 "defaultMessage": "!!!Franz Personal Monthly",
44 "file": "src/helpers/pricing-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 28
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.plan.free",
56 "defaultMessage": "!!!Franz Free",
57 "file": "src/helpers/pricing-helpers.js",
58 "start": {
59 "line": 21,
60 "column": 16
61 },
62 "end": {
63 "line": 24,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.plan.legacy",
69 "defaultMessage": "!!!Franz Premium",
70 "file": "src/helpers/pricing-helpers.js",
71 "start": {
72 "line": 25,
73 "column": 18
74 },
75 "end": {
76 "line": 28,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json
index 5778a3389..ed2bfa092 100644
--- a/src/i18n/messages/src/i18n/globalMessages.json
+++ b/src/i18n/messages/src/i18n/globalMessages.json
@@ -102,18 +102,5 @@
102 "line": 35, 102 "line": 35,
103 "column": 3 103 "column": 3
104 } 104 }
105 },
106 {
107 "id": "global.franzProRequired",
108 "defaultMessage": "!!!Franz Professional Required",
109 "file": "src/i18n/globalMessages.js",
110 "start": {
111 "line": 36,
112 "column": 15
113 },
114 "end": {
115 "line": 39,
116 "column": 3
117 }
118 } 105 }
119] \ No newline at end of file 106] \ No newline at end of file
diff --git a/src/internal-server b/src/internal-server
Subproject 2e15f753b79491df2cad5e436e00c8cf44faf5c Subproject 4c0a563108e7dc38daae45ccb6c80c3e2683266
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index c60536f0c..756b256fb 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -831,8 +831,8 @@ export default class FranzMenu {
831 // need to clone object so we don't modify computed (cached) object 831 // need to clone object so we don't modify computed (cached) object
832 const serviceTpl = Object.assign([], this.serviceTpl()); 832 const serviceTpl = Object.assign([], this.serviceTpl());
833 833
834 // Don't initialize when window.franz is undefined or when we are on a payment window route 834 // Don't initialize when window.ferdi is undefined
835 if (window.ferdi === undefined || this.stores.router.location.pathname.startsWith('/payment/')) { 835 if (window.ferdi === undefined) {
836 console.log('skipping menu init'); 836 console.log('skipping menu init');
837 return; 837 return;
838 } 838 }
@@ -1219,17 +1219,15 @@ export default class FranzMenu {
1219 }); 1219 });
1220 1220
1221 // Workspace items 1221 // Workspace items
1222 if (this.stores.user.isPremium) { 1222 workspaces.forEach((workspace, i) => menu.push({
1223 workspaces.forEach((workspace, i) => menu.push({ 1223 label: workspace.name,
1224 label: workspace.name, 1224 accelerator: i < 9 ? `${cmdKey}+Alt+${i + 1}` : null,
1225 accelerator: i < 9 ? `${cmdKey}+Alt+${i + 1}` : null, 1225 type: 'radio',
1226 type: 'radio', 1226 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false,
1227 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false, 1227 click: () => {
1228 click: () => { 1228 workspaceActions.activate({ workspace });
1229 workspaceActions.activate({ workspace }); 1229 },
1230 }, 1230 }));
1231 }));
1232 }
1233 1231
1234 return menu; 1232 return menu;
1235 } 1233 }
diff --git a/src/lib/TouchBar.js b/src/lib/TouchBar.js
index 781cd0895..3397afdb2 100644
--- a/src/lib/TouchBar.js
+++ b/src/lib/TouchBar.js
@@ -23,10 +23,6 @@ export default class FranzTouchBar {
23 _build() { 23 _build() {
24 const currentWindow = getCurrentWindow(); 24 const currentWindow = getCurrentWindow();
25 25
26 if (this.stores.router.location.pathname.startsWith('/payment/')) {
27 return;
28 }
29
30 if (this.stores.user.isLoggedIn) { 26 if (this.stores.user.isLoggedIn) {
31 const { TouchBarButton, TouchBarSpacer } = TouchBar; 27 const { TouchBarButton, TouchBarSpacer } = TouchBar;
32 28
diff --git a/src/models/Plan.js b/src/models/Plan.js
deleted file mode 100644
index 3dedf0d5e..000000000
--- a/src/models/Plan.js
+++ /dev/null
@@ -1,17 +0,0 @@
1// @flow
2
3export default class Plan {
4 month = {
5 id: '',
6 price: 0,
7 }
8
9 year = {
10 id: '',
11 price: 0,
12 }
13
14 constructor(data) {
15 Object.assign(this, data);
16 }
17}
diff --git a/src/models/Service.js b/src/models/Service.js
index 5656295da..397950787 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -10,11 +10,6 @@ import UserAgent from './UserAgent';
10 10
11const debug = require('debug')('Ferdi:Service'); 11const debug = require('debug')('Ferdi:Service');
12 12
13export const RESTRICTION_TYPES = {
14 SERVICE_LIMIT: 0,
15 CUSTOM_URL: 1,
16};
17
18export default class Service { 13export default class Service {
19 id = ''; 14 id = '';
20 15
diff --git a/src/models/User.js b/src/models/User.js
index 74a39926b..d864dde0c 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -24,8 +24,6 @@ export default class User {
24 24
25 @observable hadSubscription = false; 25 @observable hadSubscription = false;
26 26
27 @observable isPremium = true;
28
29 @observable beta = false; 27 @observable beta = false;
30 28
31 @observable donor = {}; 29 @observable donor = {};
@@ -49,7 +47,6 @@ export default class User {
49 this.lastname = data.lastname || this.lastname; 47 this.lastname = data.lastname || this.lastname;
50 this.organization = data.organization || this.organization; 48 this.organization = data.organization || this.organization;
51 this.accountType = data.accountType || this.accountType; 49 this.accountType = data.accountType || this.accountType;
52 this.isPremium = true;
53 this.beta = data.beta || this.beta; 50 this.beta = data.beta || this.beta;
54 this.donor = data.donor || this.donor; 51 this.donor = data.donor || this.donor;
55 this.isDonor = data.isDonor || this.isDonor; 52 this.isDonor = data.isDonor || this.isDonor;
diff --git a/src/routes.js b/src/routes.js
index 5017ed837..d67ccee13 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -23,11 +23,9 @@ import PasswordScreen from './containers/auth/PasswordScreen';
23import ChangeServerScreen from './containers/auth/ChangeServerScreen'; 23import ChangeServerScreen from './containers/auth/ChangeServerScreen';
24import SignupScreen from './containers/auth/SignupScreen'; 24import SignupScreen from './containers/auth/SignupScreen';
25import ImportScreen from './containers/auth/ImportScreen'; 25import ImportScreen from './containers/auth/ImportScreen';
26import PricingScreen from './containers/auth/PricingScreen';
27import SetupAssistentScreen from './containers/auth/SetupAssistantScreen'; 26import SetupAssistentScreen from './containers/auth/SetupAssistantScreen';
28import InviteScreen from './containers/auth/InviteScreen'; 27import InviteScreen from './containers/auth/InviteScreen';
29import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; 28import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
30import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
31import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; 29import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
32import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; 30import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
33import { WORKSPACES_ROUTES } from './features/workspaces/constants'; 31import { WORKSPACES_ROUTES } from './features/workspaces/constants';
@@ -79,7 +77,6 @@ export default @inject('stores', 'actions') @observer class Routes extends Compo
79 <Route path="/auth/signup"> 77 <Route path="/auth/signup">
80 <IndexRedirect to="/auth/signup/form" /> 78 <IndexRedirect to="/auth/signup/form" />
81 <Route path="/auth/signup/form" component={SignupScreen} /> 79 <Route path="/auth/signup/form" component={SignupScreen} />
82 <Route path="/auth/signup/pricing" component={PricingScreen} />
83 <Route path="/auth/signup/import" component={ImportScreen} /> 80 <Route path="/auth/signup/import" component={ImportScreen} />
84 <Route path="/auth/signup/setup" component={SetupAssistentScreen} /> 81 <Route path="/auth/signup/setup" component={SetupAssistentScreen} />
85 <Route path="/auth/signup/invite" component={InviteScreen} /> 82 <Route path="/auth/signup/invite" component={InviteScreen} />
@@ -87,7 +84,6 @@ export default @inject('stores', 'actions') @observer class Routes extends Compo
87 <Route path="/auth/password" component={PasswordScreen} /> 84 <Route path="/auth/password" component={PasswordScreen} />
88 <Route path="/auth/logout" component={LoginScreen} /> 85 <Route path="/auth/logout" component={LoginScreen} />
89 </Route> 86 </Route>
90 <Route path="/payment/:url" component={SubscriptionPopupScreen} />
91 <Route path="*" component={AppLayoutContainer} /> 87 <Route path="*" component={AppLayoutContainer} />
92 </Router> 88 </Router>
93 ); 89 );
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 2fee9bdda..ac623c258 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -1,15 +1,12 @@
1import { 1import {
2 computed, 2 computed,
3 observable, 3 observable,
4 reaction,
5 runInAction, 4 runInAction,
6} from 'mobx'; 5} from 'mobx';
7 6
8import Store from './lib/Store'; 7import Store from './lib/Store';
9import CachedRequest from './lib/CachedRequest'; 8import CachedRequest from './lib/CachedRequest';
10 9
11import delayApp from '../features/delayApp';
12import spellchecker from '../features/spellchecker';
13import serviceProxy from '../features/serviceProxy'; 10import serviceProxy from '../features/serviceProxy';
14import basicAuth from '../features/basicAuth'; 11import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces'; 12import workspaces from '../features/workspaces';
@@ -19,12 +16,9 @@ import publishDebugInfo from '../features/publishDebugInfo';
19import shareFranz from '../features/shareFranz'; 16import shareFranz from '../features/shareFranz';
20import announcements from '../features/announcements'; 17import announcements from '../features/announcements';
21import settingsWS from '../features/settingsWS'; 18import settingsWS from '../features/settingsWS';
22import serviceLimit from '../features/serviceLimit';
23import communityRecipes from '../features/communityRecipes'; 19import communityRecipes from '../features/communityRecipes';
24import todos from '../features/todos'; 20import todos from '../features/todos';
25import appearance from '../features/appearance'; 21import appearance from '../features/appearance';
26import planSelection from '../features/planSelection';
27import trialStatusBar from '../features/trialStatusBar';
28 22
29import { DEFAULT_FEATURES_CONFIG } from '../config'; 23import { DEFAULT_FEATURES_CONFIG } from '../config';
30 24
@@ -43,13 +37,6 @@ export default class FeaturesStore extends Store {
43 37
44 await this.featuresRequest._promise; 38 await this.featuresRequest._promise;
45 setTimeout(this._setupFeatures.bind(this), 1); 39 setTimeout(this._setupFeatures.bind(this), 1);
46
47 // single key reaction
48 reaction(() => this.stores.user.data.isPremium, () => {
49 if (this.stores.user.isLoggedIn) {
50 this.featuresRequest.invalidate({ immediately: true });
51 }
52 });
53 } 40 }
54 41
55 @computed get anonymousFeatures() { 42 @computed get anonymousFeatures() {
@@ -80,8 +67,6 @@ export default class FeaturesStore extends Store {
80 } 67 }
81 68
82 _setupFeatures() { 69 _setupFeatures() {
83 delayApp(this.stores, this.actions);
84 spellchecker(this.stores, this.actions);
85 serviceProxy(this.stores, this.actions); 70 serviceProxy(this.stores, this.actions);
86 basicAuth(this.stores, this.actions); 71 basicAuth(this.stores, this.actions);
87 workspaces(this.stores, this.actions); 72 workspaces(this.stores, this.actions);
@@ -91,11 +76,8 @@ export default class FeaturesStore extends Store {
91 shareFranz(this.stores, this.actions); 76 shareFranz(this.stores, this.actions);
92 announcements(this.stores, this.actions); 77 announcements(this.stores, this.actions);
93 settingsWS(this.stores, this.actions); 78 settingsWS(this.stores, this.actions);
94 serviceLimit(this.stores, this.actions);
95 communityRecipes(this.stores, this.actions); 79 communityRecipes(this.stores, this.actions);
96 todos(this.stores, this.actions); 80 todos(this.stores, this.actions);
97 appearance(this.stores, this.actions); 81 appearance(this.stores, this.actions);
98 planSelection(this.stores, this.actions);
99 trialStatusBar(this.stores, this.actions);
100 } 82 }
101} 83}
diff --git a/src/stores/PaymentStore.js b/src/stores/PaymentStore.js
deleted file mode 100644
index 05bb5b3d0..000000000
--- a/src/stores/PaymentStore.js
+++ /dev/null
@@ -1,68 +0,0 @@
1import { action, observable, computed } from 'mobx';
2import { BrowserWindow, getCurrentWindow } from '@electron/remote';
3
4import Store from './lib/Store';
5import CachedRequest from './lib/CachedRequest';
6import Request from './lib/Request';
7
8export default class PaymentStore extends Store {
9 @observable plansRequest = new CachedRequest(this.api.payment, 'plans');
10
11 @observable createHostedPageRequest = new Request(this.api.payment, 'getHostedPage');
12
13 constructor(...args) {
14 super(...args);
15
16 this.actions.payment.createHostedPage.listen(this._createHostedPage.bind(this));
17 this.actions.payment.upgradeAccount.listen(this._upgradeAccount.bind(this));
18 }
19
20 @computed get plan() {
21 if (this.plansRequest.isError) {
22 return {};
23 }
24 return this.plansRequest.execute().result || {};
25 }
26
27 @action _createHostedPage({ planId }) {
28 const request = this.createHostedPageRequest.execute(planId);
29
30 return request;
31 }
32
33 @action _upgradeAccount({ planId, onCloseWindow = () => null }) {
34 let hostedPageURL = this.stores.features.features.subscribeURL;
35
36 const parsedUrl = new URL(hostedPageURL);
37 const params = new URLSearchParams(parsedUrl.search.slice(1));
38
39 params.set('plan', planId);
40
41 hostedPageURL = this.stores.user.getAuthURL(`${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`);
42
43 const win = new BrowserWindow({
44 parent: getCurrentWindow(),
45 modal: true,
46 title: '🔒 Upgrade Your Franz Account',
47 width: 800,
48 height: window.innerHeight - 100,
49 maxWidth: 800,
50 minWidth: 600,
51 autoHideMenuBar: true,
52 webPreferences: {
53 nodeIntegration: true,
54 webviewTag: true,
55 enableRemoteModule: true,
56 contextIsolation: false,
57 },
58 });
59 win.loadURL(`file://${__dirname}/../index.html#/payment/${encodeURIComponent(hostedPageURL)}`);
60
61 win.on('closed', () => {
62 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
63 this.stores.features.featuresRequest.invalidate({ immediately: true });
64
65 onCloseWindow();
66 });
67 }
68}
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 9b69cb7c6..9521f8493 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -18,8 +18,6 @@ import { matchRoute } from '../helpers/routing-helpers';
18import { isInTimeframe } from '../helpers/schedule-helpers'; 18import { isInTimeframe } from '../helpers/schedule-helpers';
19import { getRecipeDirectory, getDevRecipeDirectory } from '../helpers/recipe-helpers'; 19import { getRecipeDirectory, getDevRecipeDirectory } from '../helpers/recipe-helpers';
20import { workspaceStore } from '../features/workspaces'; 20import { workspaceStore } from '../features/workspaces';
21import { serviceLimitStore } from '../features/serviceLimit';
22import { RESTRICTION_TYPES } from '../models/Service';
23import { KEEP_WS_LOADED_USID } from '../config'; 21import { KEEP_WS_LOADED_USID } from '../config';
24import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 22import { SPELLCHECKER_LOCALES } from '../i18n/languages';
25 23
@@ -94,7 +92,6 @@ export default class ServicesStore extends Store {
94 this._saveActiveService.bind(this), 92 this._saveActiveService.bind(this),
95 this._logoutReaction.bind(this), 93 this._logoutReaction.bind(this),
96 this._handleMuteSettings.bind(this), 94 this._handleMuteSettings.bind(this),
97 this._restrictServiceAccess.bind(this),
98 this._checkForActiveService.bind(this), 95 this._checkForActiveService.bind(this),
99 ]); 96 ]);
100 97
@@ -297,8 +294,6 @@ export default class ServicesStore extends Store {
297 async _createService({ 294 async _createService({
298 recipeId, serviceData, redirect = true, skipCleanup = false, 295 recipeId, serviceData, redirect = true, skipCleanup = false,
299 }) { 296 }) {
300 if (serviceLimitStore.userHasReachedServiceLimit) return;
301
302 if (!this.stores.recipes.isInstalled(recipeId)) { 297 if (!this.stores.recipes.isInstalled(recipeId)) {
303 debug(`Recipe "${recipeId}" is not installed, installing recipe`); 298 debug(`Recipe "${recipeId}" is not installed, installing recipe`);
304 await this.stores.recipes._install({ recipeId }); 299 await this.stores.recipes._install({ recipeId });
@@ -961,35 +956,6 @@ export default class ServicesStore extends Store {
961 return serviceData; 956 return serviceData;
962 } 957 }
963 958
964 _restrictServiceAccess() {
965 const { features } = this.stores.features;
966 const { userHasReachedServiceLimit, serviceLimit } = this.stores.serviceLimit;
967
968 this.all.map((service, index) => {
969 if (userHasReachedServiceLimit) {
970 service.isServiceAccessRestricted = index >= serviceLimit;
971
972 if (service.isServiceAccessRestricted) {
973 service.restrictionType = RESTRICTION_TYPES.SERVICE_LIMIT;
974
975 debug('Restricting access to server due to service limit');
976 }
977 }
978
979 if (service.isUsingCustomUrl) {
980 service.isServiceAccessRestricted = !features.isCustomUrlIncludedInCurrentPlan;
981
982 if (service.isServiceAccessRestricted) {
983 service.restrictionType = RESTRICTION_TYPES.CUSTOM_URL;
984
985 debug('Restricting access to server due to custom url');
986 }
987 }
988
989 return service;
990 });
991 }
992
993 _checkForActiveService() { 959 _checkForActiveService() {
994 if (!this.stores.router.location || this.stores.router.location.pathname.includes('auth/signup')) { 960 if (!this.stores.router.location || this.stores.router.location.pathname.includes('auth/signup')) {
995 return; 961 return;
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 7947e5a27..8a525c2ef 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -2,16 +2,13 @@ import { observable, computed, action } from 'mobx';
2import moment from 'moment'; 2import moment from 'moment';
3import jwt from 'jsonwebtoken'; 3import jwt from 'jsonwebtoken';
4import localStorage from 'mobx-localstorage'; 4import localStorage from 'mobx-localstorage';
5import ms from 'ms';
6import { session } from '@electron/remote'; 5import { session } from '@electron/remote';
7 6
8import { isDevMode } from '../environment'; 7import { isDevMode } from '../environment';
9import Store from './lib/Store'; 8import Store from './lib/Store';
10import Request from './lib/Request'; 9import Request from './lib/Request';
11import CachedRequest from './lib/CachedRequest'; 10import CachedRequest from './lib/CachedRequest';
12import { sleep } from '../helpers/async-helpers'; 11import { TODOS_PARTITION_ID } from '../config';
13import { getPlan } from '../helpers/plan-helpers';
14import { PLANS, TODOS_PARTITION_ID } from '../config';
15 12
16const debug = require('debug')('Ferdi:UserStore'); 13const debug = require('debug')('Ferdi:UserStore');
17 14
@@ -27,8 +24,6 @@ export default class UserStore extends Store {
27 24
28 SIGNUP_ROUTE = `${this.BASE_ROUTE}/signup`; 25 SIGNUP_ROUTE = `${this.BASE_ROUTE}/signup`;
29 26
30 PRICING_ROUTE = `${this.BASE_ROUTE}/signup/pricing`;
31
32 SETUP_ROUTE = `${this.BASE_ROUTE}/signup/setup`; 27 SETUP_ROUTE = `${this.BASE_ROUTE}/signup/setup`;
33 28
34 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`; 29 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`;
@@ -45,8 +40,6 @@ export default class UserStore extends Store {
45 40
46 @observable passwordRequest = new Request(this.api.user, 'password'); 41 @observable passwordRequest = new Request(this.api.user, 'password');
47 42
48 @observable activateTrialRequest = new Request(this.api.user, 'activateTrial');
49
50 @observable inviteRequest = new Request(this.api.user, 'invite'); 43 @observable inviteRequest = new Request(this.api.user, 'invite');
51 44
52 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo'); 45 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo');
@@ -71,8 +64,6 @@ export default class UserStore extends Store {
71 64
72 @observable hasCompletedSignup = false; 65 @observable hasCompletedSignup = false;
73 66
74 @observable hasActivatedTrial = false;
75
76 @observable userData = {}; 67 @observable userData = {};
77 68
78 @observable actionStatus = []; 69 @observable actionStatus = [];
@@ -93,7 +84,6 @@ export default class UserStore extends Store {
93 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this)); 84 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this));
94 this.actions.user.logout.listen(this._logout.bind(this)); 85 this.actions.user.logout.listen(this._logout.bind(this));
95 this.actions.user.signup.listen(this._signup.bind(this)); 86 this.actions.user.signup.listen(this._signup.bind(this));
96 this.actions.user.activateTrial.listen(this._activateTrial.bind(this));
97 this.actions.user.invite.listen(this._invite.bind(this)); 87 this.actions.user.invite.listen(this._invite.bind(this));
98 this.actions.user.update.listen(this._update.bind(this)); 88 this.actions.user.update.listen(this._update.bind(this));
99 this.actions.user.resetStatus.listen(this._resetStatus.bind(this)); 89 this.actions.user.resetStatus.listen(this._resetStatus.bind(this));
@@ -104,7 +94,6 @@ export default class UserStore extends Store {
104 this.registerReactions([ 94 this.registerReactions([
105 this._requireAuthenticatedUser.bind(this), 95 this._requireAuthenticatedUser.bind(this),
106 this._getUserData.bind(this), 96 this._getUserData.bind(this),
107 this._resetTrialActivationState.bind(this),
108 ]); 97 ]);
109 } 98 }
110 99
@@ -126,10 +115,6 @@ export default class UserStore extends Store {
126 return this.SIGNUP_ROUTE; 115 return this.SIGNUP_ROUTE;
127 } 116 }
128 117
129 get pricingRoute() {
130 return this.PRICING_ROUTE;
131 }
132
133 get setupRoute() { 118 get setupRoute() {
134 return this.SETUP_ROUTE; 119 return this.SETUP_ROUTE;
135 } 120 }
@@ -172,31 +157,6 @@ export default class UserStore extends Store {
172 return this.data.team || null; 157 return this.data.team || null;
173 } 158 }
174 159
175 @computed get isPremium() {
176 return true;
177 }
178
179 @computed get isPremiumOverride() {
180 return ((!this.team || !this.team.plan) && this.isPremium) || (this.team && this.team.state === 'expired' && this.isPremium);
181 }
182
183 @computed get isPersonal() {
184 if (!this.team || !this.team.plan) return false;
185 const plan = getPlan(this.team.plan);
186
187 return plan === PLANS.PERSONAL;
188 }
189
190 @computed get isPro() {
191 return true;
192 // if (this.isPremiumOverride) return true;
193
194 // if (!this.team || (!this.team.plan || this.team.state === 'expired')) return false;
195 // const plan = getPlan(this.team.plan);
196
197 // return plan === PLANS.PRO || plan === PLANS.LEGACY;
198 }
199
200 @computed get legacyServices() { 160 @computed get legacyServices() {
201 return this.getLegacyServicesRequest.execute() || {}; 161 return this.getLegacyServicesRequest.execute() || {};
202 } 162 }
@@ -244,21 +204,6 @@ export default class UserStore extends Store {
244 this.actionStatus = request.result.status || []; 204 this.actionStatus = request.result.status || [];
245 } 205 }
246 206
247 @action async _activateTrial({ planId }) {
248 debug('activate trial', planId);
249
250 this.activateTrialRequest.execute({
251 plan: planId,
252 });
253
254 await this.activateTrialRequest._promise;
255
256 this.hasActivatedTrial = true;
257
258 this.stores.features.featuresRequest.invalidate({ immediately: true });
259 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
260 }
261
262 @action async _invite({ invites }) { 207 @action async _invite({ invites }) {
263 const data = invites.filter(invite => invite.email !== ''); 208 const data = invites.filter(invite => invite.email !== '');
264 209
@@ -386,14 +331,6 @@ export default class UserStore extends Store {
386 } 331 }
387 } 332 }
388 333
389 async _resetTrialActivationState() {
390 if (this.hasActivatedTrial) {
391 await sleep(ms('12s'));
392
393 this.hasActivatedTrial = false;
394 }
395 }
396
397 // Helpers 334 // Helpers
398 _parseToken(authToken) { 335 _parseToken(authToken) {
399 try { 336 try {
diff --git a/src/stores/index.js b/src/stores/index.js
index 4eeef7982..b6e481e8a 100644
--- a/src/stores/index.js
+++ b/src/stores/index.js
@@ -6,16 +6,13 @@ import ServicesStore from './ServicesStore';
6import RecipesStore from './RecipesStore'; 6import RecipesStore from './RecipesStore';
7import RecipePreviewsStore from './RecipePreviewsStore'; 7import RecipePreviewsStore from './RecipePreviewsStore';
8import UIStore from './UIStore'; 8import UIStore from './UIStore';
9import PaymentStore from './PaymentStore';
10import NewsStore from './NewsStore'; 9import NewsStore from './NewsStore';
11import RequestStore from './RequestStore'; 10import RequestStore from './RequestStore';
12import GlobalErrorStore from './GlobalErrorStore'; 11import GlobalErrorStore from './GlobalErrorStore';
13import { workspaceStore } from '../features/workspaces'; 12import { workspaceStore } from '../features/workspaces';
14import { announcementsStore } from '../features/announcements'; 13import { announcementsStore } from '../features/announcements';
15import { serviceLimitStore } from '../features/serviceLimit';
16import { communityRecipesStore } from '../features/communityRecipes'; 14import { communityRecipesStore } from '../features/communityRecipes';
17import { todosStore } from '../features/todos'; 15import { todosStore } from '../features/todos';
18import { planSelectionStore } from '../features/planSelection';
19 16
20export default (api, actions, router) => { 17export default (api, actions, router) => {
21 const stores = {}; 18 const stores = {};
@@ -29,16 +26,13 @@ export default (api, actions, router) => {
29 recipes: new RecipesStore(stores, api, actions), 26 recipes: new RecipesStore(stores, api, actions),
30 recipePreviews: new RecipePreviewsStore(stores, api, actions), 27 recipePreviews: new RecipePreviewsStore(stores, api, actions),
31 ui: new UIStore(stores, api, actions), 28 ui: new UIStore(stores, api, actions),
32 payment: new PaymentStore(stores, api, actions),
33 news: new NewsStore(stores, api, actions), 29 news: new NewsStore(stores, api, actions),
34 requests: new RequestStore(stores, api, actions), 30 requests: new RequestStore(stores, api, actions),
35 globalError: new GlobalErrorStore(stores, api, actions), 31 globalError: new GlobalErrorStore(stores, api, actions),
36 workspaces: workspaceStore, 32 workspaces: workspaceStore,
37 announcements: announcementsStore, 33 announcements: announcementsStore,
38 serviceLimit: serviceLimitStore,
39 communityRecipes: communityRecipesStore, 34 communityRecipes: communityRecipesStore,
40 todos: todosStore, 35 todos: todosStore,
41 planSelection: planSelectionStore,
42 }); 36 });
43 // Initialize all stores 37 // Initialize all stores
44 Object.keys(stores).forEach((name) => { 38 Object.keys(stores).forEach((name) => {
diff --git a/src/styles/badge.scss b/src/styles/badge.scss
index 69879de31..1f58b8089 100644
--- a/src/styles/badge.scss
+++ b/src/styles/badge.scss
@@ -5,8 +5,7 @@
5 border-radius: $theme-border-radius-small; 5 border-radius: $theme-border-radius-small;
6 color: $dark-theme-gray-lightest; 6 color: $dark-theme-gray-lightest;
7 7
8 &.badge--primary, 8 &.badge--primary {
9 &.badge--premium {
10 background: $theme-brand-primary; 9 background: $theme-brand-primary;
11 color: $dark-theme-gray-lightest; 10 color: $dark-theme-gray-lightest;
12 } 11 }
@@ -21,8 +20,7 @@
21 padding: 5px 10px; 20 padding: 5px 10px;
22 letter-spacing: 0; 21 letter-spacing: 0;
23 22
24 &.badge--primary, 23 &.badge--primary {
25 &.badge--premium {
26 background: $theme-brand-primary; 24 background: $theme-brand-primary;
27 color: #FFF; 25 color: #FFF;
28 } 26 }
diff --git a/src/styles/main.scss b/src/styles/main.scss
index c57dc6fcd..6909d2051 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -25,8 +25,6 @@ $mdi-font-path: '../node_modules/mdi/fonts';
25@import './animations.scss'; 25@import './animations.scss';
26@import './infobox.scss'; 26@import './infobox.scss';
27@import './badge.scss'; 27@import './badge.scss';
28@import './subscription.scss';
29@import './subscription-popup.scss';
30@import './content-tabs.scss'; 28@import './content-tabs.scss';
31@import './invite.scss'; 29@import './invite.scss';
32@import './title-bar.scss'; 30@import './title-bar.scss';
@@ -40,4 +38,4 @@ $mdi-font-path: '../node_modules/mdi/fonts';
40@import './searchInput.scss'; 38@import './searchInput.scss';
41@import './select.scss'; 39@import './select.scss';
42@import './image-upload.scss'; 40@import './image-upload.scss';
43@import './slider.scss'; \ No newline at end of file 41@import './slider.scss';
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index a25759f48..5d4e81a4f 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -57,12 +57,6 @@
57 .account__box { background: $dark-theme-gray-darker; } 57 .account__box { background: $dark-theme-gray-darker; }
58 } 58 }
59 59
60 .premium-info {
61 background: $dark-theme-gray-darker;
62 border-width: 2px;
63 border-style: solid;
64 border-color: $theme-brand-primary;
65 }
66 .legal { color: $theme-gray-light; } 60 .legal { color: $theme-gray-light; }
67 } 61 }
68 62
@@ -378,16 +372,6 @@
378 .badge { margin-left: 10px; } 372 .badge { margin-left: 10px; }
379 } 373 }
380 374
381 .badge--premium {
382 margin-left: 1px;
383 position: relative;
384 top: -3px;
385 padding-top: 4px;
386 color: #FFF;
387 border-radius: 3px;
388 }
389
390
391 .manage-user-links { 375 .manage-user-links {
392 margin-top: 20px; 376 margin-top: 20px;
393 display: flex; 377 display: flex;
@@ -428,13 +412,7 @@
428 img { width: 40px; } 412 img { width: 40px; }
429 } 413 }
430 414
431 .premium-info { 415 .content-tabs {
432 background: lighten($theme-brand-primary, 40%);
433 border-radius: $theme-border-radius;
434 padding: 20px;
435 }
436
437 .content-tabs .premium-info {
438 background: none; 416 background: none;
439 padding: 0; 417 padding: 0;
440 } 418 }
diff --git a/src/styles/subscription-popup.scss b/src/styles/subscription-popup.scss
deleted file mode 100644
index 14e05e65d..000000000
--- a/src/styles/subscription-popup.scss
+++ /dev/null
@@ -1,18 +0,0 @@
1.subscription-popup {
2 height: 100%;
3
4 &__content { height: calc(100% - 60px); }
5 &__webview {
6 height: 100%;
7 background: #FFF;
8 }
9
10 &__toolbar {
11 background: $theme-gray-lightest;
12 border-top: 1px solid $theme-gray-lighter;
13 display: flex;
14 height: 60px;
15 justify-content: space-between;
16 padding: 10px;
17 }
18}
diff --git a/src/styles/subscription.scss b/src/styles/subscription.scss
deleted file mode 100644
index 70fb41cde..000000000
--- a/src/styles/subscription.scss
+++ /dev/null
@@ -1,49 +0,0 @@
1.subscription {
2 .subscription__premium-features {
3 margin: 10px 0;
4
5 li {
6 align-items: center;
7 display: flex;
8 height: 30px;
9
10 &:before {
11 content: "👍";
12 margin-right: 10px;
13 }
14
15 .badge { margin-left: 10px; }
16 }
17 }
18
19 .subscription__premium-info { margin: 15px 0 25px; }
20}
21
22.paymentTiers .franz-form__radio-wrapper {
23 flex-flow: wrap;
24
25 .franz-form__radio {
26 flex: initial;
27 margin-right: 2%;
28 width: 32%;
29
30 &:nth-child(3) { margin-right: 0; }
31
32 &:nth-child(4) {
33 margin-right: 0;
34 margin-top: 2%;
35 width: 100%;
36 }
37 }
38}
39
40.settings .paymentTiers .franz-form__radio-wrapper .franz-form__radio {
41 width: 49%;
42
43 &:nth-child(2) { margin-right: 0; }
44
45 &:nth-child(3) {
46 margin-top: 2%;
47 width: 100%;
48 }
49}