aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Travis CI <travis@Traviss-Mac.local>2020-10-05 16:13:56 +0000
committerLibravatar Travis CI <travis@Traviss-Mac.local>2020-10-05 16:13:56 +0000
commit0ed17b8494b0a67938e5605f723d1ec1bb55738f (patch)
tree51af89af37bca3e60c53f0eccad9c0ff82ca08bf
parentEcho 'Building...' before hanging build command for visibility [skip ci] (diff)
parentImproved onboarding flow and settings empty states (#996) (diff)
downloadferdium-app-0ed17b8494b0a67938e5605f723d1ec1bb55738f.tar.gz
ferdium-app-0ed17b8494b0a67938e5605f723d1ec1bb55738f.tar.zst
ferdium-app-0ed17b8494b0a67938e5605f723d1ec1bb55738f.zip
Merge remote-tracking branch 'source/develop' into HEAD
-rw-r--r--.all-contributorsrc9
-rw-r--r--README.md3
m---------recipes0
-rw-r--r--src/components/layout/AppLayout.js2
-rw-r--r--src/components/services/content/Services.js2
-rw-r--r--src/components/settings/recipes/RecipesDashboard.js18
-rw-r--r--src/components/settings/services/ServicesDashboard.js6
-rw-r--r--src/components/settings/settings/EditSettingsForm.js12
-rw-r--r--src/components/ui/ToggleRaw.js74
-rw-r--r--src/config.js1
-rw-r--r--src/containers/settings/EditSettingsScreen.js1
-rw-r--r--src/containers/settings/RecipesScreen.js3
-rw-r--r--src/electron/ipc-api/autoUpdate.js9
-rw-r--r--src/features/nightlyBuilds/Component.js141
-rw-r--r--src/features/nightlyBuilds/index.js45
-rw-r--r--src/features/workspaces/components/EditWorkspaceForm.js2
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js2
-rw-r--r--src/i18n/locales/defaultMessages.json261
-rw-r--r--src/i18n/locales/en-US.json10
-rw-r--r--src/i18n/locales/whitelist_en-US.json3
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json16
-rw-r--r--src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json58
-rw-r--r--src/i18n/messages/src/components/settings/services/ServicesDashboard.json2
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json124
-rw-r--r--src/i18n/messages/src/features/nightlyBuilds/Component.json54
-rw-r--r--src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json2
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json2
m---------src/internal-server0
-rw-r--r--src/stores/FeaturesStore.js2
-rw-r--r--src/styles/features.scss (renamed from src/styles/quick-switch.scss)2
-rw-r--r--src/styles/main.scss2
-rw-r--r--src/styles/settings.scss4
32 files changed, 651 insertions, 221 deletions
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 34b808b06..f62e6bffa 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -758,6 +758,15 @@
758 "contributions": [ 758 "contributions": [
759 "code" 759 "code"
760 ] 760 ]
761 },
762 {
763 "login": "tofran",
764 "name": "Francisco Marques",
765 "avatar_url": "https://avatars2.githubusercontent.com/u/5692603?v=4",
766 "profile": "https://tofran.com",
767 "contributions": [
768 "code"
769 ]
761 } 770 }
762 ], 771 ],
763 "contributorsPerLine": 6, 772 "contributorsPerLine": 6,
diff --git a/README.md b/README.md
index 60f086f67..f1993153a 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
14<p align="center"> 14<p align="center">
15<img alt="GitHub Releases" src="https://img.shields.io/github/downloads/getferdi/ferdi/latest/total?label=Downloads&logo=iCloud&logoColor=%23FFFFFF"> 15<img alt="GitHub Releases" src="https://img.shields.io/github/downloads/getferdi/ferdi/latest/total?label=Downloads&logo=iCloud&logoColor=%23FFFFFF">
16<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> 16<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
17<a href='#contributors-'><img src='https://img.shields.io/badge/contributors-76-default.svg?logo=github' alt='Contributors'/></a> 17<a href='#contributors-'><img src='https://img.shields.io/badge/contributors-77-default.svg?logo=github' alt='Contributors'/></a>
18<!-- ALL-CONTRIBUTORS-BADGE:END --> 18<!-- ALL-CONTRIBUTORS-BADGE:END -->
19<a href="#backers-via-opencollective"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective"></a> 19<a href="#backers-via-opencollective"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective"></a>
20<a href="#sponsors-via-opencollective"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective"></a> 20<a href="#sponsors-via-opencollective"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective"></a>
@@ -422,6 +422,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
422 <td align="center"><a href="https://hohner.dev"><img src="https://avatars0.githubusercontent.com/u/649895?v=4" width="40px;" alt=""/><br /><sub><b>Jan Hohner</b></sub></a><br /><a href="#userTesting-janhohner" title="User Testing">📓</a></td> 422 <td align="center"><a href="https://hohner.dev"><img src="https://avatars0.githubusercontent.com/u/649895?v=4" width="40px;" alt=""/><br /><sub><b>Jan Hohner</b></sub></a><br /><a href="#userTesting-janhohner" title="User Testing">📓</a></td>
423 <td align="center"><a href="https://marussy.com"><img src="https://avatars1.githubusercontent.com/u/38888?v=4" width="40px;" alt=""/><br /><sub><b>Kristóf Marussy</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=kris7t" title="Code">💻</a></td> 423 <td align="center"><a href="https://marussy.com"><img src="https://avatars1.githubusercontent.com/u/38888?v=4" width="40px;" alt=""/><br /><sub><b>Kristóf Marussy</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=kris7t" title="Code">💻</a></td>
424 <td align="center"><a href="https://cl.linkedin.com/in/juanvalentinmoraruiz"><img src="https://avatars0.githubusercontent.com/u/4575267?v=4" width="40px;" alt=""/><br /><sub><b>Juan Mora</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=raicerk" title="Code">💻</a></td> 424 <td align="center"><a href="https://cl.linkedin.com/in/juanvalentinmoraruiz"><img src="https://avatars0.githubusercontent.com/u/4575267?v=4" width="40px;" alt=""/><br /><sub><b>Juan Mora</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=raicerk" title="Code">💻</a></td>
425 <td align="center"><a href="https://tofran.com"><img src="https://avatars2.githubusercontent.com/u/5692603?v=4" width="40px;" alt=""/><br /><sub><b>Francisco Marques</b></sub></a><br /><a href="https://github.com/getferdi/ferdi/commits?author=tofran" title="Code">💻</a></td>
425 </tr> 426 </tr>
426</table> 427</table>
427 428
diff --git a/recipes b/recipes
Subproject 0d9ca8fe7a47325adc975e3ff42906da13f8ed0 Subproject 5c2f5bdb4edca04d8466c94091c232655ba089f
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 3b732e602..a60270a6f 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -9,6 +9,7 @@ import InfoBar from '../ui/InfoBar';
9import { Component as BasicAuth } from '../../features/basicAuth'; 9import { Component as BasicAuth } from '../../features/basicAuth';
10import { Component as ShareFranz } from '../../features/shareFranz'; 10import { Component as ShareFranz } from '../../features/shareFranz';
11import { Component as QuickSwitch } from '../../features/quickSwitch'; 11import { Component as QuickSwitch } from '../../features/quickSwitch';
12import { Component as NightlyBuilds } from '../../features/nightlyBuilds';
12import { Component as PublishDebugInfo } from '../../features/publishDebugInfo'; 13import { Component as PublishDebugInfo } from '../../features/publishDebugInfo';
13import ErrorBoundary from '../util/ErrorBoundary'; 14import ErrorBoundary from '../util/ErrorBoundary';
14 15
@@ -197,6 +198,7 @@ class AppLayout extends Component {
197 <BasicAuth /> 198 <BasicAuth />
198 <ShareFranz /> 199 <ShareFranz />
199 <QuickSwitch /> 200 <QuickSwitch />
201 <NightlyBuilds />
200 <PublishDebugInfo /> 202 <PublishDebugInfo />
201 {services} 203 {services}
202 {children} 204 {children}
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index 80f17d8f2..da2ee0b9e 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -149,7 +149,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
149 timeout={300} 149 timeout={300}
150 transitionName="slideUp" 150 transitionName="slideUp"
151 > 151 >
152 <Link to={isLoggedIn ? '/settings/services' : '/auth/welcome'} className="button"> 152 <Link to={isLoggedIn ? '/settings/recipes' : '/auth/welcome'} className="button">
153 { isLoggedIn ? intl.formatMessage(messages.getStarted) : 'Login' } 153 { isLoggedIn ? intl.formatMessage(messages.getStarted) : 'Login' }
154 </Link> 154 </Link>
155 {!isLoggedIn && ( 155 {!isLoggedIn && (
diff --git a/src/components/settings/recipes/RecipesDashboard.js b/src/components/settings/recipes/RecipesDashboard.js
index d08e6cbc2..90e89ffa9 100644
--- a/src/components/settings/recipes/RecipesDashboard.js
+++ b/src/components/settings/recipes/RecipesDashboard.js
@@ -15,6 +15,7 @@ import Appear from '../../ui/effects/Appear';
15import { FRANZ_SERVICE_REQUEST } from '../../../config'; 15import { FRANZ_SERVICE_REQUEST } from '../../../config';
16import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox'; 16import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
17import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 17import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
18import RecipePreview from '../../../models/RecipePreview';
18 19
19const messages = defineMessages({ 20const messages = defineMessages({
20 headline: { 21 headline: {
@@ -39,7 +40,7 @@ const messages = defineMessages({
39 }, 40 },
40 nothingFound: { 41 nothingFound: {
41 id: 'settings.recipes.nothingFound', 42 id: 'settings.recipes.nothingFound',
42 defaultMessage: '!!!Sorry, but no service matched your search term.', 43 defaultMessage: '!!!Sorry, but no service matched your search term - but you can still probably add it using the "Custom Website" option:',
43 }, 44 },
44 servicesSuccessfulAddedInfo: { 45 servicesSuccessfulAddedInfo: {
45 id: 'settings.recipes.servicesSuccessfulAddedInfo', 46 id: 'settings.recipes.servicesSuccessfulAddedInfo',
@@ -106,6 +107,7 @@ const styles = {
106export default @injectSheet(styles) @observer class RecipesDashboard extends Component { 107export default @injectSheet(styles) @observer class RecipesDashboard extends Component {
107 static propTypes = { 108 static propTypes = {
108 recipes: MobxPropTypes.arrayOrObservableArray.isRequired, 109 recipes: MobxPropTypes.arrayOrObservableArray.isRequired,
110 customWebsiteRecipe: PropTypes.instanceOf(RecipePreview).isRequired,
109 isLoading: PropTypes.bool.isRequired, 111 isLoading: PropTypes.bool.isRequired,
110 hasLoadedRecipes: PropTypes.bool.isRequired, 112 hasLoadedRecipes: PropTypes.bool.isRequired,
111 showAddServiceInterface: PropTypes.func.isRequired, 113 showAddServiceInterface: PropTypes.func.isRequired,
@@ -133,6 +135,7 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
133 render() { 135 render() {
134 const { 136 const {
135 recipes, 137 recipes,
138 customWebsiteRecipe,
136 isLoading, 139 isLoading,
137 hasLoadedRecipes, 140 hasLoadedRecipes,
138 showAddServiceInterface, 141 showAddServiceInterface,
@@ -256,12 +259,19 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
256 )} 259 )}
257 <div className="recipes__list"> 260 <div className="recipes__list">
258 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && ( 261 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && (
259 <p className="align-middle settings__empty-state"> 262 <div className="align-middle settings__empty-state">
260 <span className="emoji"> 263 <span className="emoji">
261 <img src="./assets/images/emoji/dontknow.png" alt="" /> 264 <img src="./assets/images/emoji/dontknow.png" alt="" />
262 </span> 265 </span>
263 {intl.formatMessage(messages.nothingFound)} 266
264 </p> 267 <p className="settings__empty-state-text">{intl.formatMessage(messages.nothingFound)}</p>
268
269 <RecipeItem
270 key={customWebsiteRecipe.id}
271 recipe={customWebsiteRecipe}
272 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })}
273 />
274 </div>
265 )} 275 )}
266 {communityRecipes.map(recipe => ( 276 {communityRecipes.map(recipe => (
267 <RecipeItem 277 <RecipeItem
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index 826dbb176..d88be74a4 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -23,7 +23,7 @@ const messages = defineMessages({
23 }, 23 },
24 noServicesAdded: { 24 noServicesAdded: {
25 id: 'settings.services.noServicesAdded', 25 id: 'settings.services.noServicesAdded',
26 defaultMessage: '!!!You haven\'t added any services yet.', 26 defaultMessage: '!!!Start by adding a service.',
27 }, 27 },
28 noServiceFound: { 28 noServiceFound: {
29 id: 'settings.recipes.nothingFound', 29 id: 'settings.recipes.nothingFound',
@@ -95,7 +95,7 @@ export default @observer class ServicesDashboard extends Component {
95 </div> 95 </div>
96 <LimitReachedInfobox /> 96 <LimitReachedInfobox />
97 <div className="settings__body"> 97 <div className="settings__body">
98 {!isLoading && ( 98 {services.length !== 0 && !isLoading && (
99 <SearchInput 99 <SearchInput
100 placeholder={intl.formatMessage(messages.searchService)} 100 placeholder={intl.formatMessage(messages.searchService)}
101 onChange={needle => filterServices({ needle })} 101 onChange={needle => filterServices({ needle })}
@@ -143,7 +143,7 @@ export default @observer class ServicesDashboard extends Component {
143 <div className="align-middle settings__empty-state"> 143 <div className="align-middle settings__empty-state">
144 <p className="settings__empty-text"> 144 <p className="settings__empty-text">
145 <span className="emoji"> 145 <span className="emoji">
146 <img src="./assets/images/emoji/sad.png" alt="" /> 146 <img src="./assets/images/emoji/star.png" alt="" />
147 </span> 147 </span>
148 {intl.formatMessage(messages.noServicesAdded)} 148 {intl.formatMessage(messages.noServicesAdded)}
149 </p> 149 </p>
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 031203308..b6698b8e2 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -7,6 +7,7 @@ import { defineMessages, intlShape } from 'react-intl';
7import Form from '../../../lib/Form'; 7import Form from '../../../lib/Form';
8import Button from '../../ui/Button'; 8import Button from '../../ui/Button';
9import Toggle from '../../ui/Toggle'; 9import Toggle from '../../ui/Toggle';
10import ToggleRaw from '../../ui/ToggleRaw';
10import Select from '../../ui/Select'; 11import Select from '../../ui/Select';
11import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer'; 12import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
12import Input from '../../ui/Input'; 13import Input from '../../ui/Input';
@@ -170,6 +171,7 @@ export default @observer class EditSettingsForm extends Component {
170 hibernationEnabled: PropTypes.bool.isRequired, 171 hibernationEnabled: PropTypes.bool.isRequired,
171 isDarkmodeEnabled: PropTypes.bool.isRequired, 172 isDarkmodeEnabled: PropTypes.bool.isRequired,
172 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired, 173 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired,
174 isNightlyEnabled: PropTypes.bool.isRequired,
173 openProcessManager: PropTypes.func.isRequired, 175 openProcessManager: PropTypes.func.isRequired,
174 }; 176 };
175 177
@@ -224,6 +226,7 @@ export default @observer class EditSettingsForm extends Component {
224 isDarkmodeEnabled, 226 isDarkmodeEnabled,
225 openProcessManager, 227 openProcessManager,
226 isTodosActivated, 228 isTodosActivated,
229 isNightlyEnabled,
227 } = this.props; 230 } = this.props;
228 const { intl } = this.context; 231 const { intl } = this.context;
229 232
@@ -593,6 +596,15 @@ export default @observer class EditSettingsForm extends Component {
593 {automaticUpdates && ( 596 {automaticUpdates && (
594 <div> 597 <div>
595 <Toggle field={form.$('beta')} /> 598 <Toggle field={form.$('beta')} />
599 <ToggleRaw
600 field={{
601 value: isNightlyEnabled,
602 id: 'nightly',
603 label: 'Include nightly versions',
604 name: 'Nightly builds',
605 }}
606 onChange={window.ferdi.features.nightlyBuilds.toggleFeature}
607 />
596 {updateIsReadyToInstall ? ( 608 {updateIsReadyToInstall ? (
597 <Button 609 <Button
598 label={intl.formatMessage(messages.buttonInstallUpdate)} 610 label={intl.formatMessage(messages.buttonInstallUpdate)}
diff --git a/src/components/ui/ToggleRaw.js b/src/components/ui/ToggleRaw.js
new file mode 100644
index 000000000..ee817356b
--- /dev/null
+++ b/src/components/ui/ToggleRaw.js
@@ -0,0 +1,74 @@
1/**
2 * "Raw" Toggle - for usage without a MobX Form element
3 */
4import React, { Component } from 'react';
5import PropTypes from 'prop-types';
6import { observer } from 'mobx-react';
7import classnames from 'classnames';
8
9export default @observer class ToggleRaw extends Component {
10 static propTypes = {
11 onChange: PropTypes.func.isRequired,
12 field: PropTypes.shape({
13 value: PropTypes.bool.isRequired,
14 id: PropTypes.string,
15 name: PropTypes.string,
16 label: PropTypes.string,
17 }).isRequired,
18 className: PropTypes.string,
19 showLabel: PropTypes.bool,
20 disabled: PropTypes.bool,
21 };
22
23 static defaultProps = {
24 className: '',
25 showLabel: true,
26 disabled: false,
27 };
28
29 onChange(e) {
30 const { onChange } = this.props;
31
32 onChange(e);
33 }
34
35 render() {
36 const {
37 field,
38 className,
39 showLabel,
40 disabled,
41 } = this.props;
42
43 return (
44 <div
45 className={classnames([
46 'franz-form__field',
47 'franz-form__toggle-wrapper',
48 'franz-form__toggle-disabled',
49 className,
50 ])}
51 >
52 <label
53 htmlFor={field.id}
54 className={classnames({
55 'franz-form__toggle': true,
56 'is-active': field.value,
57 })}
58 >
59 <div className="franz-form__toggle-button" />
60 <input
61 type="checkbox"
62 id={field.id}
63 name={field.name}
64 value={field.name}
65 checked={field.value}
66 onChange={e => (!disabled ? this.onChange(e) : null)}
67 />
68 </label>
69 {field.error && <div className={field.error}>{field.error}</div>}
70 {field.label && showLabel && <label className="franz-form__label" htmlFor={field.id}>{field.label}</label>}
71 </div>
72 );
73 }
74}
diff --git a/src/config.js b/src/config.js
index f9eecf375..c53ec7da9 100644
--- a/src/config.js
+++ b/src/config.js
@@ -130,6 +130,7 @@ export const DEFAULT_APP_SETTINGS = {
130 serviceRibbonWidth: 68, 130 serviceRibbonWidth: 68,
131 iconSize: iconSizeBias, 131 iconSize: iconSizeBias,
132 sentry: false, 132 sentry: false,
133 nightly: false,
133 navigationBarBehaviour: 'custom', 134 navigationBarBehaviour: 'custom',
134}; 135};
135 136
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index c6149fd9e..aa50bac68 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -586,6 +586,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
586 isAdaptableDarkModeEnabled={this.props.stores.settings.app.adaptableDarkMode} 586 isAdaptableDarkModeEnabled={this.props.stores.settings.app.adaptableDarkMode}
587 isTodosActivated={this.props.stores.todos.isFeatureEnabledByUser} 587 isTodosActivated={this.props.stores.todos.isFeatureEnabledByUser}
588 isUsingCustomTodoService={this.props.stores.todos.isUsingCustomTodoService} 588 isUsingCustomTodoService={this.props.stores.todos.isUsingCustomTodoService}
589 isNightlyEnabled={this.props.stores.settings.app.nightly}
589 openProcessManager={() => this.openProcessManager()} 590 openProcessManager={() => this.openProcessManager()}
590 /> 591 />
591 </ErrorBoundary> 592 </ErrorBoundary>
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index 60071b402..40e32ff37 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -139,6 +139,8 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
139 ), 139 ),
140 ]) : recipeFilter; 140 ]) : recipeFilter;
141 141
142 const customWebsiteRecipe = recipePreviews.all.find(service => service.id === 'franz-custom-website');
143
142 const isLoading = recipePreviews.featuredRecipePreviewsRequest.isExecuting 144 const isLoading = recipePreviews.featuredRecipePreviewsRequest.isExecuting
143 || recipePreviews.allRecipePreviewsRequest.isExecuting 145 || recipePreviews.allRecipePreviewsRequest.isExecuting
144 || recipes.installRecipeRequest.isExecuting 146 || recipes.installRecipeRequest.isExecuting
@@ -150,6 +152,7 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
150 <ErrorBoundary> 152 <ErrorBoundary>
151 <RecipesDashboard 153 <RecipesDashboard
152 recipes={allRecipes} 154 recipes={allRecipes}
155 customWebsiteRecipe={customWebsiteRecipe}
153 isLoading={isLoading} 156 isLoading={isLoading}
154 addedServiceCount={services.all.length} 157 addedServiceCount={services.all.length}
155 isPremium={user.data.isPremium} 158 isPremium={user.data.isPremium}
diff --git a/src/electron/ipc-api/autoUpdate.js b/src/electron/ipc-api/autoUpdate.js
index 8c4d908dc..a81bc918f 100644
--- a/src/electron/ipc-api/autoUpdate.js
+++ b/src/electron/ipc-api/autoUpdate.js
@@ -15,6 +15,15 @@ export default (params) => {
15 try { 15 try {
16 autoUpdater.autoInstallOnAppQuit = false; 16 autoUpdater.autoInstallOnAppQuit = false;
17 autoUpdater.allowPrerelease = Boolean(params.settings.app.get('beta')); 17 autoUpdater.allowPrerelease = Boolean(params.settings.app.get('beta'));
18
19 if (params.settings.app.get('nightly')) {
20 autoUpdater.setFeedURL({
21 provider: 'github',
22 repo: 'nightlies',
23 owner: 'getferdi',
24 });
25 }
26
18 if (args.action === 'check') { 27 if (args.action === 'check') {
19 autoUpdater.checkForUpdates(); 28 autoUpdater.checkForUpdates();
20 } else if (args.action === 'install') { 29 } else if (args.action === 'install') {
diff --git a/src/features/nightlyBuilds/Component.js b/src/features/nightlyBuilds/Component.js
new file mode 100644
index 000000000..b340a0a7e
--- /dev/null
+++ b/src/features/nightlyBuilds/Component.js
@@ -0,0 +1,141 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { H1 } from '@meetfranz/ui';
7
8import Modal from '../../components/ui/Modal';
9import Button from '../../components/ui/Button';
10import { state as ModalState } from '.';
11import SettingsStore from '../../stores/SettingsStore';
12
13const messages = defineMessages({
14 title: {
15 id: 'feature.nightlyBuilds.title',
16 defaultMessage: '!!!Nightly Builds',
17 },
18 info: {
19 id: 'feature.nightlyBuilds.info',
20 defaultMessage: '!!!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.',
21 },
22 activate: {
23 id: 'feature.nightlyBuilds.activate',
24 defaultMessage: '!!!Activate',
25 },
26 cancel: {
27 id: 'feature.nightlyBuilds.cancel',
28 defaultMessage: '!!!Cancel',
29 },
30});
31
32const styles = () => ({
33 info: {
34 paddingTop: 20,
35 paddingBottom: 20,
36 },
37 headline: {
38 fontSize: 20,
39 marginBottom: 20,
40 },
41 buttonContainer: {
42 display: 'flex',
43 },
44 button: {
45 width: '50%',
46 marginTop: 10,
47 cursor: 'pointer',
48 },
49 activateButton: {
50 marginRight: 10,
51 background: '#c45a5a !important',
52 color: '#ffffff !important',
53 },
54});
55
56export default @injectSheet(styles) @inject('stores', 'actions') @observer class nightlyBuildsModal extends Component {
57 static contextTypes = {
58 intl: intlShape,
59 };
60
61 close() {
62 ModalState.isModalVisible = false;
63
64 const { ui } = this.props.actions;
65 ui.openSettings({ path: 'app' });
66 }
67
68 activate() {
69 const { settings, user } = this.props.actions;
70
71 settings.update({
72 type: 'app',
73 data: {
74 nightly: true,
75 },
76 });
77 user.update({
78 userData: {
79 nightly: true,
80 },
81 });
82 this.close();
83 }
84
85 render() {
86 const { isModalVisible } = ModalState;
87
88 const {
89 classes,
90 } = this.props;
91
92 const { intl } = this.context;
93
94 return (
95 <Modal
96 isOpen={isModalVisible}
97 shouldCloseOnOverlayClick
98 close={this.close.bind(this)}
99 >
100 <H1 className={classes.headline}>
101 {intl.formatMessage(messages.title)}
102 </H1>
103
104 <p className={classes.info}>{intl.formatMessage(messages.info)}</p>
105
106 <div className={classes.buttonContainer}>
107 <Button
108 type="button"
109 label={intl.formatMessage(messages.activate)}
110 className={`${classes.button} ${classes.activateButton}`}
111 onClick={() => this.activate()}
112 />
113 <Button
114 type="button"
115 label={intl.formatMessage(messages.cancel)}
116 className={classes.button}
117 onClick={() => this.close()}
118 />
119 </div>
120 </Modal>
121 );
122 }
123}
124
125nightlyBuildsModal.wrappedComponent.propTypes = {
126 stores: PropTypes.shape({
127 settings: PropTypes.instanceOf(SettingsStore).isRequired,
128 }).isRequired,
129 actions: PropTypes.shape({
130 settings: PropTypes.shape({
131 update: PropTypes.func.isRequired,
132 }).isRequired,
133 user: PropTypes.shape({
134 update: PropTypes.func.isRequired,
135 }).isRequired,
136 ui: PropTypes.shape({
137 openSettings: PropTypes.func.isRequired,
138 }).isRequired,
139 }).isRequired,
140 classes: PropTypes.object.isRequired,
141};
diff --git a/src/features/nightlyBuilds/index.js b/src/features/nightlyBuilds/index.js
new file mode 100644
index 000000000..34fe37d4d
--- /dev/null
+++ b/src/features/nightlyBuilds/index.js
@@ -0,0 +1,45 @@
1import { observable } from 'mobx';
2
3export { default as Component } from './Component';
4
5const debug = require('debug')('Ferdi:feature:nightlyBuilds');
6
7const defaultState = {
8 isModalVisible: false,
9};
10
11export const state = observable(defaultState);
12
13export default function initialize() {
14 debug('Initialize nightlyBuilds feature');
15
16 function showModal() {
17 state.isModalVisible = true;
18 }
19
20 function toggleFeature() {
21 if (window.ferdi.stores.settings.app.nightly) {
22 window.ferdi.actions.settings.update({
23 type: 'app',
24 data: {
25 nightly: false,
26 },
27 });
28 window.ferdi.actions.user.update({
29 userData: {
30 nightly: false,
31 },
32 });
33 } else {
34 // We need to close the settings, otherwise the modal will be drawn under the settings window
35 window.ferdi.actions.ui.closeSettings();
36 showModal();
37 }
38 }
39
40 window.ferdi.features.nightlyBuilds = {
41 state,
42 showModal,
43 toggleFeature,
44 };
45}
diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js
index b3551a7b9..0f199ffb1 100644
--- a/src/features/workspaces/components/EditWorkspaceForm.js
+++ b/src/features/workspaces/components/EditWorkspaceForm.js
@@ -48,7 +48,7 @@ const messages = defineMessages({
48 }, 48 },
49 noServicesAdded: { 49 noServicesAdded: {
50 id: 'settings.services.noServicesAdded', 50 id: 'settings.services.noServicesAdded',
51 defaultMessage: '!!!You haven\'t added any services yet.', 51 defaultMessage: '!!!Start by adding a service.',
52 }, 52 },
53 discoverServices: { 53 discoverServices: {
54 id: 'settings.services.discoverServices', 54 id: 'settings.services.discoverServices',
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index b499e02a4..a90bb37e9 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -23,7 +23,7 @@ const messages = defineMessages({
23 }, 23 },
24 noServicesAdded: { 24 noServicesAdded: {
25 id: 'settings.workspaces.noWorkspacesAdded', 25 id: 'settings.workspaces.noWorkspacesAdded',
26 defaultMessage: '!!!You haven\'t added any workspaces yet.', 26 defaultMessage: '!!!You haven\'t created any workspaces yet.',
27 }, 27 },
28 workspacesRequestFailed: { 28 workspacesRequestFailed: {
29 id: 'settings.workspaces.workspacesRequestFailed', 29 id: 'settings.workspaces.workspacesRequestFailed',
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 58f37ebad..801f68cc0 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -1056,52 +1056,52 @@
1056 "defaultMessage": "!!!Your services have been updated.", 1056 "defaultMessage": "!!!Your services have been updated.",
1057 "end": { 1057 "end": {
1058 "column": 3, 1058 "column": 3,
1059 "line": 34 1059 "line": 35
1060 }, 1060 },
1061 "file": "src/components/layout/AppLayout.js", 1061 "file": "src/components/layout/AppLayout.js",
1062 "id": "infobar.servicesUpdated", 1062 "id": "infobar.servicesUpdated",
1063 "start": { 1063 "start": {
1064 "column": 19, 1064 "column": 19,
1065 "line": 31 1065 "line": 32
1066 } 1066 }
1067 }, 1067 },
1068 { 1068 {
1069 "defaultMessage": "!!!Reload services", 1069 "defaultMessage": "!!!Reload services",
1070 "end": { 1070 "end": {
1071 "column": 3, 1071 "column": 3,
1072 "line": 38 1072 "line": 39
1073 }, 1073 },
1074 "file": "src/components/layout/AppLayout.js", 1074 "file": "src/components/layout/AppLayout.js",
1075 "id": "infobar.buttonReloadServices", 1075 "id": "infobar.buttonReloadServices",
1076 "start": { 1076 "start": {
1077 "column": 24, 1077 "column": 24,
1078 "line": 35 1078 "line": 36
1079 } 1079 }
1080 }, 1080 },
1081 { 1081 {
1082 "defaultMessage": "!!!Could not load services and user information", 1082 "defaultMessage": "!!!Could not load services and user information",
1083 "end": { 1083 "end": {
1084 "column": 3, 1084 "column": 3,
1085 "line": 42 1085 "line": 43
1086 }, 1086 },
1087 "file": "src/components/layout/AppLayout.js", 1087 "file": "src/components/layout/AppLayout.js",
1088 "id": "infobar.requiredRequestsFailed", 1088 "id": "infobar.requiredRequestsFailed",
1089 "start": { 1089 "start": {
1090 "column": 26, 1090 "column": 26,
1091 "line": 39 1091 "line": 40
1092 } 1092 }
1093 }, 1093 },
1094 { 1094 {
1095 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 1095 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
1096 "end": { 1096 "end": {
1097 "column": 3, 1097 "column": 3,
1098 "line": 46 1098 "line": 47
1099 }, 1099 },
1100 "file": "src/components/layout/AppLayout.js", 1100 "file": "src/components/layout/AppLayout.js",
1101 "id": "infobar.authRequestFailed", 1101 "id": "infobar.authRequestFailed",
1102 "start": { 1102 "start": {
1103 "column": 21, 1103 "column": 21,
1104 "line": 43 1104 "line": 44
1105 } 1105 }
1106 } 1106 }
1107 ], 1107 ],
@@ -2296,182 +2296,182 @@
2296 "defaultMessage": "!!!Available Services", 2296 "defaultMessage": "!!!Available Services",
2297 "end": { 2297 "end": {
2298 "column": 3, 2298 "column": 3,
2299 "line": 23 2299 "line": 24
2300 }, 2300 },
2301 "file": "src/components/settings/recipes/RecipesDashboard.js", 2301 "file": "src/components/settings/recipes/RecipesDashboard.js",
2302 "id": "settings.recipes.headline", 2302 "id": "settings.recipes.headline",
2303 "start": { 2303 "start": {
2304 "column": 12, 2304 "column": 12,
2305 "line": 20 2305 "line": 21
2306 } 2306 }
2307 }, 2307 },
2308 { 2308 {
2309 "defaultMessage": "!!!Search service", 2309 "defaultMessage": "!!!Search service",
2310 "end": { 2310 "end": {
2311 "column": 3, 2311 "column": 3,
2312 "line": 27 2312 "line": 28
2313 }, 2313 },
2314 "file": "src/components/settings/recipes/RecipesDashboard.js", 2314 "file": "src/components/settings/recipes/RecipesDashboard.js",
2315 "id": "settings.searchService", 2315 "id": "settings.searchService",
2316 "start": { 2316 "start": {
2317 "column": 17, 2317 "column": 17,
2318 "line": 24 2318 "line": 25
2319 } 2319 }
2320 }, 2320 },
2321 { 2321 {
2322 "defaultMessage": "!!!Most popular", 2322 "defaultMessage": "!!!Most popular",
2323 "end": { 2323 "end": {
2324 "column": 3, 2324 "column": 3,
2325 "line": 31 2325 "line": 32
2326 }, 2326 },
2327 "file": "src/components/settings/recipes/RecipesDashboard.js", 2327 "file": "src/components/settings/recipes/RecipesDashboard.js",
2328 "id": "settings.recipes.mostPopular", 2328 "id": "settings.recipes.mostPopular",
2329 "start": { 2329 "start": {
2330 "column": 22, 2330 "column": 22,
2331 "line": 28 2331 "line": 29
2332 } 2332 }
2333 }, 2333 },
2334 { 2334 {
2335 "defaultMessage": "!!!All services", 2335 "defaultMessage": "!!!All services",
2336 "end": { 2336 "end": {
2337 "column": 3, 2337 "column": 3,
2338 "line": 35 2338 "line": 36
2339 }, 2339 },
2340 "file": "src/components/settings/recipes/RecipesDashboard.js", 2340 "file": "src/components/settings/recipes/RecipesDashboard.js",
2341 "id": "settings.recipes.all", 2341 "id": "settings.recipes.all",
2342 "start": { 2342 "start": {
2343 "column": 14, 2343 "column": 14,
2344 "line": 32 2344 "line": 33
2345 } 2345 }
2346 }, 2346 },
2347 { 2347 {
2348 "defaultMessage": "!!!Custom Services", 2348 "defaultMessage": "!!!Custom Services",
2349 "end": { 2349 "end": {
2350 "column": 3, 2350 "column": 3,
2351 "line": 39 2351 "line": 40
2352 }, 2352 },
2353 "file": "src/components/settings/recipes/RecipesDashboard.js", 2353 "file": "src/components/settings/recipes/RecipesDashboard.js",
2354 "id": "settings.recipes.custom", 2354 "id": "settings.recipes.custom",
2355 "start": { 2355 "start": {
2356 "column": 17, 2356 "column": 17,
2357 "line": 36 2357 "line": 37
2358 } 2358 }
2359 }, 2359 },
2360 { 2360 {
2361 "defaultMessage": "!!!Sorry, but no service matched your search term.", 2361 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option:",
2362 "end": { 2362 "end": {
2363 "column": 3, 2363 "column": 3,
2364 "line": 43 2364 "line": 44
2365 }, 2365 },
2366 "file": "src/components/settings/recipes/RecipesDashboard.js", 2366 "file": "src/components/settings/recipes/RecipesDashboard.js",
2367 "id": "settings.recipes.nothingFound", 2367 "id": "settings.recipes.nothingFound",
2368 "start": { 2368 "start": {
2369 "column": 16, 2369 "column": 16,
2370 "line": 40 2370 "line": 41
2371 } 2371 }
2372 }, 2372 },
2373 { 2373 {
2374 "defaultMessage": "!!!Service successfully added", 2374 "defaultMessage": "!!!Service successfully added",
2375 "end": { 2375 "end": {
2376 "column": 3, 2376 "column": 3,
2377 "line": 47 2377 "line": 48
2378 }, 2378 },
2379 "file": "src/components/settings/recipes/RecipesDashboard.js", 2379 "file": "src/components/settings/recipes/RecipesDashboard.js",
2380 "id": "settings.recipes.servicesSuccessfulAddedInfo", 2380 "id": "settings.recipes.servicesSuccessfulAddedInfo",
2381 "start": { 2381 "start": {
2382 "column": 31, 2382 "column": 31,
2383 "line": 44 2383 "line": 45
2384 } 2384 }
2385 }, 2385 },
2386 { 2386 {
2387 "defaultMessage": "!!!Missing a service?", 2387 "defaultMessage": "!!!Missing a service?",
2388 "end": { 2388 "end": {
2389 "column": 3, 2389 "column": 3,
2390 "line": 51 2390 "line": 52
2391 }, 2391 },
2392 "file": "src/components/settings/recipes/RecipesDashboard.js", 2392 "file": "src/components/settings/recipes/RecipesDashboard.js",
2393 "id": "settings.recipes.missingService", 2393 "id": "settings.recipes.missingService",
2394 "start": { 2394 "start": {
2395 "column": 18, 2395 "column": 18,
2396 "line": 48 2396 "line": 49
2397 } 2397 }
2398 }, 2398 },
2399 { 2399 {
2400 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:", 2400 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
2401 "end": { 2401 "end": {
2402 "column": 3, 2402 "column": 3,
2403 "line": 55 2403 "line": 56
2404 }, 2404 },
2405 "file": "src/components/settings/recipes/RecipesDashboard.js", 2405 "file": "src/components/settings/recipes/RecipesDashboard.js",
2406 "id": "settings.recipes.customService.intro", 2406 "id": "settings.recipes.customService.intro",
2407 "start": { 2407 "start": {
2408 "column": 21, 2408 "column": 21,
2409 "line": 52 2409 "line": 53
2410 } 2410 }
2411 }, 2411 },
2412 { 2412 {
2413 "defaultMessage": "!!!Open directory", 2413 "defaultMessage": "!!!Open directory",
2414 "end": { 2414 "end": {
2415 "column": 3, 2415 "column": 3,
2416 "line": 59 2416 "line": 60
2417 }, 2417 },
2418 "file": "src/components/settings/recipes/RecipesDashboard.js", 2418 "file": "src/components/settings/recipes/RecipesDashboard.js",
2419 "id": "settings.recipes.customService.openFolder", 2419 "id": "settings.recipes.customService.openFolder",
2420 "start": { 2420 "start": {
2421 "column": 14, 2421 "column": 14,
2422 "line": 56 2422 "line": 57
2423 } 2423 }
2424 }, 2424 },
2425 { 2425 {
2426 "defaultMessage": "!!!Developer Documentation", 2426 "defaultMessage": "!!!Developer Documentation",
2427 "end": { 2427 "end": {
2428 "column": 3, 2428 "column": 3,
2429 "line": 63 2429 "line": 64
2430 }, 2430 },
2431 "file": "src/components/settings/recipes/RecipesDashboard.js", 2431 "file": "src/components/settings/recipes/RecipesDashboard.js",
2432 "id": "settings.recipes.customService.openDevDocs", 2432 "id": "settings.recipes.customService.openDevDocs",
2433 "start": { 2433 "start": {
2434 "column": 15, 2434 "column": 15,
2435 "line": 60 2435 "line": 61
2436 } 2436 }
2437 }, 2437 },
2438 { 2438 {
2439 "defaultMessage": "!!!Custom 3rd Party Recipes", 2439 "defaultMessage": "!!!Custom 3rd Party Recipes",
2440 "end": { 2440 "end": {
2441 "column": 3, 2441 "column": 3,
2442 "line": 67 2442 "line": 68
2443 }, 2443 },
2444 "file": "src/components/settings/recipes/RecipesDashboard.js", 2444 "file": "src/components/settings/recipes/RecipesDashboard.js",
2445 "id": "settings.recipes.customService.headline.customRecipes", 2445 "id": "settings.recipes.customService.headline.customRecipes",
2446 "start": { 2446 "start": {
2447 "column": 25, 2447 "column": 25,
2448 "line": 64 2448 "line": 65
2449 } 2449 }
2450 }, 2450 },
2451 { 2451 {
2452 "defaultMessage": "!!!Community 3rd Party Recipes", 2452 "defaultMessage": "!!!Community 3rd Party Recipes",
2453 "end": { 2453 "end": {
2454 "column": 3, 2454 "column": 3,
2455 "line": 71 2455 "line": 72
2456 }, 2456 },
2457 "file": "src/components/settings/recipes/RecipesDashboard.js", 2457 "file": "src/components/settings/recipes/RecipesDashboard.js",
2458 "id": "settings.recipes.customService.headline.communityRecipes", 2458 "id": "settings.recipes.customService.headline.communityRecipes",
2459 "start": { 2459 "start": {
2460 "column": 28, 2460 "column": 28,
2461 "line": 68 2461 "line": 69
2462 } 2462 }
2463 }, 2463 },
2464 { 2464 {
2465 "defaultMessage": "!!!Your Development Service Recipes", 2465 "defaultMessage": "!!!Your Development Service Recipes",
2466 "end": { 2466 "end": {
2467 "column": 3, 2467 "column": 3,
2468 "line": 75 2468 "line": 76
2469 }, 2469 },
2470 "file": "src/components/settings/recipes/RecipesDashboard.js", 2470 "file": "src/components/settings/recipes/RecipesDashboard.js",
2471 "id": "settings.recipes.customService.headline.devRecipes", 2471 "id": "settings.recipes.customService.headline.devRecipes",
2472 "start": { 2472 "start": {
2473 "column": 22, 2473 "column": 22,
2474 "line": 72 2474 "line": 73
2475 } 2475 }
2476 } 2476 }
2477 ], 2477 ],
@@ -2976,7 +2976,7 @@
2976 } 2976 }
2977 }, 2977 },
2978 { 2978 {
2979 "defaultMessage": "!!!You haven't added any services yet.", 2979 "defaultMessage": "!!!Start by adding a service.",
2980 "end": { 2980 "end": {
2981 "column": 3, 2981 "column": 3,
2982 "line": 27 2982 "line": 27
@@ -3075,403 +3075,403 @@
3075 "defaultMessage": "!!!Settings", 3075 "defaultMessage": "!!!Settings",
3076 "end": { 3076 "end": {
3077 "column": 3, 3077 "column": 3,
3078 "line": 25 3078 "line": 26
3079 }, 3079 },
3080 "file": "src/components/settings/settings/EditSettingsForm.js", 3080 "file": "src/components/settings/settings/EditSettingsForm.js",
3081 "id": "settings.app.headline", 3081 "id": "settings.app.headline",
3082 "start": { 3082 "start": {
3083 "column": 12, 3083 "column": 12,
3084 "line": 22 3084 "line": 23
3085 } 3085 }
3086 }, 3086 },
3087 { 3087 {
3088 "defaultMessage": "!!!General", 3088 "defaultMessage": "!!!General",
3089 "end": { 3089 "end": {
3090 "column": 3, 3090 "column": 3,
3091 "line": 29 3091 "line": 30
3092 }, 3092 },
3093 "file": "src/components/settings/settings/EditSettingsForm.js", 3093 "file": "src/components/settings/settings/EditSettingsForm.js",
3094 "id": "settings.app.headlineGeneral", 3094 "id": "settings.app.headlineGeneral",
3095 "start": { 3095 "start": {
3096 "column": 19, 3096 "column": 19,
3097 "line": 26 3097 "line": 27
3098 } 3098 }
3099 }, 3099 },
3100 { 3100 {
3101 "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.", 3101 "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.",
3102 "end": { 3102 "end": {
3103 "column": 3, 3103 "column": 3,
3104 "line": 33 3104 "line": 34
3105 }, 3105 },
3106 "file": "src/components/settings/settings/EditSettingsForm.js", 3106 "file": "src/components/settings/settings/EditSettingsForm.js",
3107 "id": "settings.app.sentryInfo", 3107 "id": "settings.app.sentryInfo",
3108 "start": { 3108 "start": {
3109 "column": 14, 3109 "column": 14,
3110 "line": 30 3110 "line": 31
3111 } 3111 }
3112 }, 3112 },
3113 { 3113 {
3114 "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.", 3114 "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.",
3115 "end": { 3115 "end": {
3116 "column": 3, 3116 "column": 3,
3117 "line": 37 3117 "line": 38
3118 }, 3118 },
3119 "file": "src/components/settings/settings/EditSettingsForm.js", 3119 "file": "src/components/settings/settings/EditSettingsForm.js",
3120 "id": "settings.app.hibernateInfo", 3120 "id": "settings.app.hibernateInfo",
3121 "start": { 3121 "start": {
3122 "column": 17, 3122 "column": 17,
3123 "line": 34 3123 "line": 35
3124 } 3124 }
3125 }, 3125 },
3126 { 3126 {
3127 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 3127 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
3128 "end": { 3128 "end": {
3129 "column": 3, 3129 "column": 3,
3130 "line": 41 3130 "line": 42
3131 }, 3131 },
3132 "file": "src/components/settings/settings/EditSettingsForm.js", 3132 "file": "src/components/settings/settings/EditSettingsForm.js",
3133 "id": "settings.app.inactivityLockInfo", 3133 "id": "settings.app.inactivityLockInfo",
3134 "start": { 3134 "start": {
3135 "column": 22, 3135 "column": 22,
3136 "line": 38 3136 "line": 39
3137 } 3137 }
3138 }, 3138 },
3139 { 3139 {
3140 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 3140 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
3141 "end": { 3141 "end": {
3142 "column": 3, 3142 "column": 3,
3143 "line": 45 3143 "line": 46
3144 }, 3144 },
3145 "file": "src/components/settings/settings/EditSettingsForm.js", 3145 "file": "src/components/settings/settings/EditSettingsForm.js",
3146 "id": "settings.app.todoServerInfo", 3146 "id": "settings.app.todoServerInfo",
3147 "start": { 3147 "start": {
3148 "column": 18, 3148 "column": 18,
3149 "line": 42 3149 "line": 43
3150 } 3150 }
3151 }, 3151 },
3152 { 3152 {
3153 "defaultMessage": "!!!Password", 3153 "defaultMessage": "!!!Password",
3154 "end": { 3154 "end": {
3155 "column": 3, 3155 "column": 3,
3156 "line": 49 3156 "line": 50
3157 }, 3157 },
3158 "file": "src/components/settings/settings/EditSettingsForm.js", 3158 "file": "src/components/settings/settings/EditSettingsForm.js",
3159 "id": "settings.app.lockedPassword", 3159 "id": "settings.app.lockedPassword",
3160 "start": { 3160 "start": {
3161 "column": 18, 3161 "column": 18,
3162 "line": 46 3162 "line": 47
3163 } 3163 }
3164 }, 3164 },
3165 { 3165 {
3166 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 3166 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
3167 "end": { 3167 "end": {
3168 "column": 3, 3168 "column": 3,
3169 "line": 53 3169 "line": 54
3170 }, 3170 },
3171 "file": "src/components/settings/settings/EditSettingsForm.js", 3171 "file": "src/components/settings/settings/EditSettingsForm.js",
3172 "id": "settings.app.lockedPasswordInfo", 3172 "id": "settings.app.lockedPasswordInfo",
3173 "start": { 3173 "start": {
3174 "column": 22, 3174 "column": 22,
3175 "line": 50 3175 "line": 51
3176 } 3176 }
3177 }, 3177 },
3178 { 3178 {
3179 "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.", 3179 "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.",
3180 "end": { 3180 "end": {
3181 "column": 3, 3181 "column": 3,
3182 "line": 57 3182 "line": 58
3183 }, 3183 },
3184 "file": "src/components/settings/settings/EditSettingsForm.js", 3184 "file": "src/components/settings/settings/EditSettingsForm.js",
3185 "id": "settings.app.lockInfo", 3185 "id": "settings.app.lockInfo",
3186 "start": { 3186 "start": {
3187 "column": 12, 3187 "column": 12,
3188 "line": 54 3188 "line": 55
3189 } 3189 }
3190 }, 3190 },
3191 { 3191 {
3192 "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.", 3192 "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.",
3193 "end": { 3193 "end": {
3194 "column": 3, 3194 "column": 3,
3195 "line": 61 3195 "line": 62
3196 }, 3196 },
3197 "file": "src/components/settings/settings/EditSettingsForm.js", 3197 "file": "src/components/settings/settings/EditSettingsForm.js",
3198 "id": "settings.app.scheduledDNDTimeInfo", 3198 "id": "settings.app.scheduledDNDTimeInfo",
3199 "start": { 3199 "start": {
3200 "column": 24, 3200 "column": 24,
3201 "line": 58 3201 "line": 59
3202 } 3202 }
3203 }, 3203 },
3204 { 3204 {
3205 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 3205 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
3206 "end": { 3206 "end": {
3207 "column": 3, 3207 "column": 3,
3208 "line": 65 3208 "line": 66
3209 }, 3209 },
3210 "file": "src/components/settings/settings/EditSettingsForm.js", 3210 "file": "src/components/settings/settings/EditSettingsForm.js",
3211 "id": "settings.app.scheduledDNDInfo", 3211 "id": "settings.app.scheduledDNDInfo",
3212 "start": { 3212 "start": {
3213 "column": 20, 3213 "column": 20,
3214 "line": 62 3214 "line": 63
3215 } 3215 }
3216 }, 3216 },
3217 { 3217 {
3218 "defaultMessage": "!!!Language", 3218 "defaultMessage": "!!!Language",
3219 "end": { 3219 "end": {
3220 "column": 3, 3220 "column": 3,
3221 "line": 69 3221 "line": 70
3222 }, 3222 },
3223 "file": "src/components/settings/settings/EditSettingsForm.js", 3223 "file": "src/components/settings/settings/EditSettingsForm.js",
3224 "id": "settings.app.headlineLanguage", 3224 "id": "settings.app.headlineLanguage",
3225 "start": { 3225 "start": {
3226 "column": 20, 3226 "column": 20,
3227 "line": 66 3227 "line": 67
3228 } 3228 }
3229 }, 3229 },
3230 { 3230 {
3231 "defaultMessage": "!!!Updates", 3231 "defaultMessage": "!!!Updates",
3232 "end": { 3232 "end": {
3233 "column": 3, 3233 "column": 3,
3234 "line": 73 3234 "line": 74
3235 }, 3235 },
3236 "file": "src/components/settings/settings/EditSettingsForm.js", 3236 "file": "src/components/settings/settings/EditSettingsForm.js",
3237 "id": "settings.app.headlineUpdates", 3237 "id": "settings.app.headlineUpdates",
3238 "start": { 3238 "start": {
3239 "column": 19, 3239 "column": 19,
3240 "line": 70 3240 "line": 71
3241 } 3241 }
3242 }, 3242 },
3243 { 3243 {
3244 "defaultMessage": "!!!Appearance", 3244 "defaultMessage": "!!!Appearance",
3245 "end": { 3245 "end": {
3246 "column": 3, 3246 "column": 3,
3247 "line": 77 3247 "line": 78
3248 }, 3248 },
3249 "file": "src/components/settings/settings/EditSettingsForm.js", 3249 "file": "src/components/settings/settings/EditSettingsForm.js",
3250 "id": "settings.app.headlineAppearance", 3250 "id": "settings.app.headlineAppearance",
3251 "start": { 3251 "start": {
3252 "column": 22, 3252 "column": 22,
3253 "line": 74 3253 "line": 75
3254 } 3254 }
3255 }, 3255 },
3256 { 3256 {
3257 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 3257 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
3258 "end": { 3258 "end": {
3259 "column": 3, 3259 "column": 3,
3260 "line": 81 3260 "line": 82
3261 }, 3261 },
3262 "file": "src/components/settings/settings/EditSettingsForm.js", 3262 "file": "src/components/settings/settings/EditSettingsForm.js",
3263 "id": "settings.app.universalDarkModeInfo", 3263 "id": "settings.app.universalDarkModeInfo",
3264 "start": { 3264 "start": {
3265 "column": 25, 3265 "column": 25,
3266 "line": 78 3266 "line": 79
3267 } 3267 }
3268 }, 3268 },
3269 { 3269 {
3270 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)", 3270 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)",
3271 "end": { 3271 "end": {
3272 "column": 3, 3272 "column": 3,
3273 "line": 85 3273 "line": 86
3274 }, 3274 },
3275 "file": "src/components/settings/settings/EditSettingsForm.js", 3275 "file": "src/components/settings/settings/EditSettingsForm.js",
3276 "id": "settings.app.accentColorInfo", 3276 "id": "settings.app.accentColorInfo",
3277 "start": { 3277 "start": {
3278 "column": 19, 3278 "column": 19,
3279 "line": 82 3279 "line": 83
3280 } 3280 }
3281 }, 3281 },
3282 { 3282 {
3283 "defaultMessage": "!!!Advanced", 3283 "defaultMessage": "!!!Advanced",
3284 "end": { 3284 "end": {
3285 "column": 3, 3285 "column": 3,
3286 "line": 89 3286 "line": 90
3287 }, 3287 },
3288 "file": "src/components/settings/settings/EditSettingsForm.js", 3288 "file": "src/components/settings/settings/EditSettingsForm.js",
3289 "id": "settings.app.headlineAdvanced", 3289 "id": "settings.app.headlineAdvanced",
3290 "start": { 3290 "start": {
3291 "column": 20, 3291 "column": 20,
3292 "line": 86 3292 "line": 87
3293 } 3293 }
3294 }, 3294 },
3295 { 3295 {
3296 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 3296 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
3297 "end": { 3297 "end": {
3298 "column": 3, 3298 "column": 3,
3299 "line": 93 3299 "line": 94
3300 }, 3300 },
3301 "file": "src/components/settings/settings/EditSettingsForm.js", 3301 "file": "src/components/settings/settings/EditSettingsForm.js",
3302 "id": "settings.app.translationHelp", 3302 "id": "settings.app.translationHelp",
3303 "start": { 3303 "start": {
3304 "column": 19, 3304 "column": 19,
3305 "line": 90 3305 "line": 91
3306 } 3306 }
3307 }, 3307 },
3308 { 3308 {
3309 "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.", 3309 "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.",
3310 "end": { 3310 "end": {
3311 "column": 3, 3311 "column": 3,
3312 "line": 97 3312 "line": 98
3313 }, 3313 },
3314 "file": "src/components/settings/settings/EditSettingsForm.js", 3314 "file": "src/components/settings/settings/EditSettingsForm.js",
3315 "id": "settings.app.spellCheckerLanguageInfo", 3315 "id": "settings.app.spellCheckerLanguageInfo",
3316 "start": { 3316 "start": {
3317 "column": 28, 3317 "column": 28,
3318 "line": 94 3318 "line": 95
3319 } 3319 }
3320 }, 3320 },
3321 { 3321 {
3322 "defaultMessage": "!!!Cache", 3322 "defaultMessage": "!!!Cache",
3323 "end": { 3323 "end": {
3324 "column": 3, 3324 "column": 3,
3325 "line": 101 3325 "line": 102
3326 }, 3326 },
3327 "file": "src/components/settings/settings/EditSettingsForm.js", 3327 "file": "src/components/settings/settings/EditSettingsForm.js",
3328 "id": "settings.app.subheadlineCache", 3328 "id": "settings.app.subheadlineCache",
3329 "start": { 3329 "start": {
3330 "column": 20, 3330 "column": 20,
3331 "line": 98 3331 "line": 99
3332 } 3332 }
3333 }, 3333 },
3334 { 3334 {
3335 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 3335 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
3336 "end": { 3336 "end": {
3337 "column": 3, 3337 "column": 3,
3338 "line": 105 3338 "line": 106
3339 }, 3339 },
3340 "file": "src/components/settings/settings/EditSettingsForm.js", 3340 "file": "src/components/settings/settings/EditSettingsForm.js",
3341 "id": "settings.app.cacheInfo", 3341 "id": "settings.app.cacheInfo",
3342 "start": { 3342 "start": {
3343 "column": 13, 3343 "column": 13,
3344 "line": 102 3344 "line": 103
3345 } 3345 }
3346 }, 3346 },
3347 { 3347 {
3348 "defaultMessage": "!!!Couldn't clear all cache", 3348 "defaultMessage": "!!!Couldn't clear all cache",
3349 "end": { 3349 "end": {
3350 "column": 3, 3350 "column": 3,
3351 "line": 109 3351 "line": 110
3352 }, 3352 },
3353 "file": "src/components/settings/settings/EditSettingsForm.js", 3353 "file": "src/components/settings/settings/EditSettingsForm.js",
3354 "id": "settings.app.cacheNotCleared", 3354 "id": "settings.app.cacheNotCleared",
3355 "start": { 3355 "start": {
3356 "column": 19, 3356 "column": 19,
3357 "line": 106 3357 "line": 107
3358 } 3358 }
3359 }, 3359 },
3360 { 3360 {
3361 "defaultMessage": "!!!Clear cache", 3361 "defaultMessage": "!!!Clear cache",
3362 "end": { 3362 "end": {
3363 "column": 3, 3363 "column": 3,
3364 "line": 113 3364 "line": 114
3365 }, 3365 },
3366 "file": "src/components/settings/settings/EditSettingsForm.js", 3366 "file": "src/components/settings/settings/EditSettingsForm.js",
3367 "id": "settings.app.buttonClearAllCache", 3367 "id": "settings.app.buttonClearAllCache",
3368 "start": { 3368 "start": {
3369 "column": 23, 3369 "column": 23,
3370 "line": 110 3370 "line": 111
3371 } 3371 }
3372 }, 3372 },
3373 { 3373 {
3374 "defaultMessage": "!!!Check for updates", 3374 "defaultMessage": "!!!Check for updates",
3375 "end": { 3375 "end": {
3376 "column": 3, 3376 "column": 3,
3377 "line": 117 3377 "line": 118
3378 }, 3378 },
3379 "file": "src/components/settings/settings/EditSettingsForm.js", 3379 "file": "src/components/settings/settings/EditSettingsForm.js",
3380 "id": "settings.app.buttonSearchForUpdate", 3380 "id": "settings.app.buttonSearchForUpdate",
3381 "start": { 3381 "start": {
3382 "column": 25, 3382 "column": 25,
3383 "line": 114 3383 "line": 115
3384 } 3384 }
3385 }, 3385 },
3386 { 3386 {
3387 "defaultMessage": "!!!Restart & install update", 3387 "defaultMessage": "!!!Restart & install update",
3388 "end": { 3388 "end": {
3389 "column": 3, 3389 "column": 3,
3390 "line": 121 3390 "line": 122
3391 }, 3391 },
3392 "file": "src/components/settings/settings/EditSettingsForm.js", 3392 "file": "src/components/settings/settings/EditSettingsForm.js",
3393 "id": "settings.app.buttonInstallUpdate", 3393 "id": "settings.app.buttonInstallUpdate",
3394 "start": { 3394 "start": {
3395 "column": 23, 3395 "column": 23,
3396 "line": 118 3396 "line": 119
3397 } 3397 }
3398 }, 3398 },
3399 { 3399 {
3400 "defaultMessage": "!!!Is searching for update", 3400 "defaultMessage": "!!!Is searching for update",
3401 "end": { 3401 "end": {
3402 "column": 3, 3402 "column": 3,
3403 "line": 125 3403 "line": 126
3404 }, 3404 },
3405 "file": "src/components/settings/settings/EditSettingsForm.js", 3405 "file": "src/components/settings/settings/EditSettingsForm.js",
3406 "id": "settings.app.updateStatusSearching", 3406 "id": "settings.app.updateStatusSearching",
3407 "start": { 3407 "start": {
3408 "column": 25, 3408 "column": 25,
3409 "line": 122 3409 "line": 123
3410 } 3410 }
3411 }, 3411 },
3412 { 3412 {
3413 "defaultMessage": "!!!Update available, downloading...", 3413 "defaultMessage": "!!!Update available, downloading...",
3414 "end": { 3414 "end": {
3415 "column": 3, 3415 "column": 3,
3416 "line": 129 3416 "line": 130
3417 }, 3417 },
3418 "file": "src/components/settings/settings/EditSettingsForm.js", 3418 "file": "src/components/settings/settings/EditSettingsForm.js",
3419 "id": "settings.app.updateStatusAvailable", 3419 "id": "settings.app.updateStatusAvailable",
3420 "start": { 3420 "start": {
3421 "column": 25, 3421 "column": 25,
3422 "line": 126 3422 "line": 127
3423 } 3423 }
3424 }, 3424 },
3425 { 3425 {
3426 "defaultMessage": "!!!You are using the latest version of Ferdi", 3426 "defaultMessage": "!!!You are using the latest version of Ferdi",
3427 "end": { 3427 "end": {
3428 "column": 3, 3428 "column": 3,
3429 "line": 133 3429 "line": 134
3430 }, 3430 },
3431 "file": "src/components/settings/settings/EditSettingsForm.js", 3431 "file": "src/components/settings/settings/EditSettingsForm.js",
3432 "id": "settings.app.updateStatusUpToDate", 3432 "id": "settings.app.updateStatusUpToDate",
3433 "start": { 3433 "start": {
3434 "column": 24, 3434 "column": 24,
3435 "line": 130 3435 "line": 131
3436 } 3436 }
3437 }, 3437 },
3438 { 3438 {
3439 "defaultMessage": "!!!Current version:", 3439 "defaultMessage": "!!!Current version:",
3440 "end": { 3440 "end": {
3441 "column": 3, 3441 "column": 3,
3442 "line": 137 3442 "line": 138
3443 }, 3443 },
3444 "file": "src/components/settings/settings/EditSettingsForm.js", 3444 "file": "src/components/settings/settings/EditSettingsForm.js",
3445 "id": "settings.app.currentVersion", 3445 "id": "settings.app.currentVersion",
3446 "start": { 3446 "start": {
3447 "column": 18, 3447 "column": 18,
3448 "line": 134 3448 "line": 135
3449 } 3449 }
3450 }, 3450 },
3451 { 3451 {
3452 "defaultMessage": "!!!Changes require restart", 3452 "defaultMessage": "!!!Changes require restart",
3453 "end": { 3453 "end": {
3454 "column": 3, 3454 "column": 3,
3455 "line": 141 3455 "line": 142
3456 }, 3456 },
3457 "file": "src/components/settings/settings/EditSettingsForm.js", 3457 "file": "src/components/settings/settings/EditSettingsForm.js",
3458 "id": "settings.app.restartRequired", 3458 "id": "settings.app.restartRequired",
3459 "start": { 3459 "start": {
3460 "column": 29, 3460 "column": 29,
3461 "line": 138 3461 "line": 139
3462 } 3462 }
3463 }, 3463 },
3464 { 3464 {
3465 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 3465 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
3466 "end": { 3466 "end": {
3467 "column": 3, 3467 "column": 3,
3468 "line": 145 3468 "line": 146
3469 }, 3469 },
3470 "file": "src/components/settings/settings/EditSettingsForm.js", 3470 "file": "src/components/settings/settings/EditSettingsForm.js",
3471 "id": "settings.app.languageDisclaimer", 3471 "id": "settings.app.languageDisclaimer",
3472 "start": { 3472 "start": {
3473 "column": 22, 3473 "column": 22,
3474 "line": 142 3474 "line": 143
3475 } 3475 }
3476 } 3476 }
3477 ], 3477 ],
@@ -5317,6 +5317,63 @@
5317 { 5317 {
5318 "descriptors": [ 5318 "descriptors": [
5319 { 5319 {
5320 "defaultMessage": "!!!Nightly Builds",
5321 "end": {
5322 "column": 3,
5323 "line": 17
5324 },
5325 "file": "src/features/nightlyBuilds/Component.js",
5326 "id": "feature.nightlyBuilds.title",
5327 "start": {
5328 "column": 9,
5329 "line": 14
5330 }
5331 },
5332 {
5333 "defaultMessage": "!!!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.",
5334 "end": {
5335 "column": 3,
5336 "line": 21
5337 },
5338 "file": "src/features/nightlyBuilds/Component.js",
5339 "id": "feature.nightlyBuilds.info",
5340 "start": {
5341 "column": 8,
5342 "line": 18
5343 }
5344 },
5345 {
5346 "defaultMessage": "!!!Activate",
5347 "end": {
5348 "column": 3,
5349 "line": 25
5350 },
5351 "file": "src/features/nightlyBuilds/Component.js",
5352 "id": "feature.nightlyBuilds.activate",
5353 "start": {
5354 "column": 12,
5355 "line": 22
5356 }
5357 },
5358 {
5359 "defaultMessage": "!!!Cancel",
5360 "end": {
5361 "column": 3,
5362 "line": 29
5363 },
5364 "file": "src/features/nightlyBuilds/Component.js",
5365 "id": "feature.nightlyBuilds.cancel",
5366 "start": {
5367 "column": 10,
5368 "line": 26
5369 }
5370 }
5371 ],
5372 "path": "src/features/nightlyBuilds/Component.json"
5373 },
5374 {
5375 "descriptors": [
5376 {
5320 "defaultMessage": "!!!per month", 5377 "defaultMessage": "!!!per month",
5321 "end": { 5378 "end": {
5322 "column": 3, 5379 "column": 3,
@@ -6302,7 +6359,7 @@
6302 } 6359 }
6303 }, 6360 },
6304 { 6361 {
6305 "defaultMessage": "!!!You haven't added any services yet.", 6362 "defaultMessage": "!!!Start by adding a service.",
6306 "end": { 6363 "end": {
6307 "column": 3, 6364 "column": 3,
6308 "line": 52 6365 "line": 52
@@ -6486,7 +6543,7 @@
6486 } 6543 }
6487 }, 6544 },
6488 { 6545 {
6489 "defaultMessage": "!!!You haven't added any workspaces yet.", 6546 "defaultMessage": "!!!You haven't created any workspaces yet.",
6490 "end": { 6547 "end": {
6491 "column": 3, 6548 "column": 3,
6492 "line": 27 6549 "line": 27
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index fd5c0755b..553c30489 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -19,6 +19,10 @@
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line", 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", 20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account", 21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate",
23 "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.",
25 "feature.nightlyBuilds.title": "Nightly Builds",
22 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", 26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
23 "feature.planSelection.cta.stayOnFree": "Stay on Free", 27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
24 "feature.planSelection.cta.trial": "Start my free 14-days Trial", 28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
@@ -363,7 +367,7 @@
363 "settings.recipes.headline": "Available services", 367 "settings.recipes.headline": "Available services",
364 "settings.recipes.missingService": "Missing a service?", 368 "settings.recipes.missingService": "Missing a service?",
365 "settings.recipes.mostPopular": "Most popular", 369 "settings.recipes.mostPopular": "Most popular",
366 "settings.recipes.nothingFound": "Sorry, but no service matched your search term.", 370 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option:",
367 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 371 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
368 "settings.searchService": "Search service", 372 "settings.searchService": "Search service",
369 "settings.service.error.goBack": "Back to services", 373 "settings.service.error.goBack": "Back to services",
@@ -419,7 +423,7 @@
419 "settings.services.deletedInfo": "Service has been deleted", 423 "settings.services.deletedInfo": "Service has been deleted",
420 "settings.services.discoverServices": "Discover services", 424 "settings.services.discoverServices": "Discover services",
421 "settings.services.headline": "Your services", 425 "settings.services.headline": "Your services",
422 "settings.services.noServicesAdded": "You haven't added any services yet.", 426 "settings.services.noServicesAdded": "Start by adding a service.",
423 "settings.services.servicesRequestFailed": "Could not load your services", 427 "settings.services.servicesRequestFailed": "Could not load your services",
424 "settings.services.tooltip.isDisabled": "Service is disabled", 428 "settings.services.tooltip.isDisabled": "Service is disabled",
425 "settings.services.tooltip.isMuted": "All sounds are muted", 429 "settings.services.tooltip.isMuted": "All sounds are muted",
@@ -458,7 +462,7 @@
458 "settings.workspace.form.yourWorkspaces": "Your workspaces", 462 "settings.workspace.form.yourWorkspaces": "Your workspaces",
459 "settings.workspaces.deletedInfo": "Workspace has been deleted", 463 "settings.workspaces.deletedInfo": "Workspace has been deleted",
460 "settings.workspaces.headline": "Your workspaces", 464 "settings.workspaces.headline": "Your workspaces",
461 "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", 465 "settings.workspaces.noWorkspacesAdded": "You haven't created any workspaces yet.",
462 "settings.workspaces.tryReloadWorkspaces": "Try again", 466 "settings.workspaces.tryReloadWorkspaces": "Try again",
463 "settings.workspaces.updatedInfo": "Your changes have been saved", 467 "settings.workspaces.updatedInfo": "Your changes have been saved",
464 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces", 468 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces",
diff --git a/src/i18n/locales/whitelist_en-US.json b/src/i18n/locales/whitelist_en-US.json
index fe51488c7..32960f8ce 100644
--- a/src/i18n/locales/whitelist_en-US.json
+++ b/src/i18n/locales/whitelist_en-US.json
@@ -1 +1,2 @@
1[] 1[
2] \ 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 5a8e082f2..554758f82 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": 31, 7 "line": 32,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 34, 11 "line": 35,
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": 35, 20 "line": 36,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 38, 24 "line": 39,
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": 39, 33 "line": 40,
34 "column": 26 34 "column": 26
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 42, 37 "line": 43,
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": 43, 46 "line": 44,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 46, 50 "line": 47,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
index 1124f4d6a..e69bc427b 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": 20, 7 "line": 21,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 23, 11 "line": 24,
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": 24, 20 "line": 25,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 27, 24 "line": 28,
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": 28, 33 "line": 29,
34 "column": 22 34 "column": 22
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 31, 37 "line": 32,
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": 32, 46 "line": 33,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 35, 50 "line": 36,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,24 +56,24 @@
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": 36, 59 "line": 37,
60 "column": 17 60 "column": 17
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 39, 63 "line": 40,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
67 { 67 {
68 "id": "settings.recipes.nothingFound", 68 "id": "settings.recipes.nothingFound",
69 "defaultMessage": "!!!Sorry, but no service matched your search term.", 69 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option:",
70 "file": "src/components/settings/recipes/RecipesDashboard.js", 70 "file": "src/components/settings/recipes/RecipesDashboard.js",
71 "start": { 71 "start": {
72 "line": 40, 72 "line": 41,
73 "column": 16 73 "column": 16
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 43, 76 "line": 44,
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": 44, 85 "line": 45,
86 "column": 31 86 "column": 31
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 47, 89 "line": 48,
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": 48, 98 "line": 49,
99 "column": 18 99 "column": 18
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 51, 102 "line": 52,
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": 52, 111 "line": 53,
112 "column": 21 112 "column": 21
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 55, 115 "line": 56,
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": 56, 124 "line": 57,
125 "column": 14 125 "column": 14
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 59, 128 "line": 60,
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": 60, 137 "line": 61,
138 "column": 15 138 "column": 15
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 63, 141 "line": 64,
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": 64, 150 "line": 65,
151 "column": 25 151 "column": 25
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 67, 154 "line": 68,
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": 68, 163 "line": 69,
164 "column": 28 164 "column": 28
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 71, 167 "line": 72,
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": 72, 176 "line": 73,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 75, 180 "line": 76,
181 "column": 3 181 "column": 3
182 } 182 }
183 } 183 }
diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
index 140d17a8b..0335c4dd8 100644
--- a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
+++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
@@ -27,7 +27,7 @@
27 }, 27 },
28 { 28 {
29 "id": "settings.services.noServicesAdded", 29 "id": "settings.services.noServicesAdded",
30 "defaultMessage": "!!!You haven't added any services yet.", 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": 24,
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
index 373cd78f9..ccd006117 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": 22, 7 "line": 23,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 25, 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": 26, 20 "line": 27,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 29, 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": 30, 33 "line": 31,
34 "column": 14 34 "column": 14
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 33, 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": 34, 46 "line": 35,
47 "column": 17 47 "column": 17
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 37, 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": 38, 59 "line": 39,
60 "column": 22 60 "column": 22
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 41, 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": 42, 72 "line": 43,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 45, 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": 46, 85 "line": 47,
86 "column": 18 86 "column": 18
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 49, 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": 50, 98 "line": 51,
99 "column": 22 99 "column": 22
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 53, 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": 54, 111 "line": 55,
112 "column": 12 112 "column": 12
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 57, 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": 58, 124 "line": 59,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 61, 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": 62, 137 "line": 63,
138 "column": 20 138 "column": 20
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 65, 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": 66, 150 "line": 67,
151 "column": 20 151 "column": 20
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 69, 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": 70, 163 "line": 71,
164 "column": 19 164 "column": 19
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 73, 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": 74, 176 "line": 75,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 77, 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": 78, 189 "line": 79,
190 "column": 25 190 "column": 25
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 81, 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: #7367f0)", 199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: #7367f0)",
200 "file": "src/components/settings/settings/EditSettingsForm.js", 200 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": { 201 "start": {
202 "line": 82, 202 "line": 83,
203 "column": 19 203 "column": 19
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 85, 206 "line": 86,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Advanced", 212 "defaultMessage": "!!!Advanced",
213 "file": "src/components/settings/settings/EditSettingsForm.js", 213 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": { 214 "start": {
215 "line": 86, 215 "line": 87,
216 "column": 20 216 "column": 20
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 89, 219 "line": 90,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 225 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
226 "file": "src/components/settings/settings/EditSettingsForm.js", 226 "file": "src/components/settings/settings/EditSettingsForm.js",
227 "start": { 227 "start": {
228 "line": 90, 228 "line": 91,
229 "column": 19 229 "column": 19
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 93, 232 "line": 94,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "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.", 238 "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.",
239 "file": "src/components/settings/settings/EditSettingsForm.js", 239 "file": "src/components/settings/settings/EditSettingsForm.js",
240 "start": { 240 "start": {
241 "line": 94, 241 "line": 95,
242 "column": 28 242 "column": 28
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 97, 245 "line": 98,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Cache", 251 "defaultMessage": "!!!Cache",
252 "file": "src/components/settings/settings/EditSettingsForm.js", 252 "file": "src/components/settings/settings/EditSettingsForm.js",
253 "start": { 253 "start": {
254 "line": 98, 254 "line": 99,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 101, 258 "line": 102,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 264 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
265 "file": "src/components/settings/settings/EditSettingsForm.js", 265 "file": "src/components/settings/settings/EditSettingsForm.js",
266 "start": { 266 "start": {
267 "line": 102, 267 "line": 103,
268 "column": 13 268 "column": 13
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 105, 271 "line": 106,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Couldn't clear all cache", 277 "defaultMessage": "!!!Couldn't clear all cache",
278 "file": "src/components/settings/settings/EditSettingsForm.js", 278 "file": "src/components/settings/settings/EditSettingsForm.js",
279 "start": { 279 "start": {
280 "line": 106, 280 "line": 107,
281 "column": 19 281 "column": 19
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 109, 284 "line": 110,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Clear cache", 290 "defaultMessage": "!!!Clear cache",
291 "file": "src/components/settings/settings/EditSettingsForm.js", 291 "file": "src/components/settings/settings/EditSettingsForm.js",
292 "start": { 292 "start": {
293 "line": 110, 293 "line": 111,
294 "column": 23 294 "column": 23
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 113, 297 "line": 114,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Check for updates", 303 "defaultMessage": "!!!Check for updates",
304 "file": "src/components/settings/settings/EditSettingsForm.js", 304 "file": "src/components/settings/settings/EditSettingsForm.js",
305 "start": { 305 "start": {
306 "line": 114, 306 "line": 115,
307 "column": 25 307 "column": 25
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 117, 310 "line": 118,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Restart & install update", 316 "defaultMessage": "!!!Restart & install update",
317 "file": "src/components/settings/settings/EditSettingsForm.js", 317 "file": "src/components/settings/settings/EditSettingsForm.js",
318 "start": { 318 "start": {
319 "line": 118, 319 "line": 119,
320 "column": 23 320 "column": 23
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 121, 323 "line": 122,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Is searching for update", 329 "defaultMessage": "!!!Is searching for update",
330 "file": "src/components/settings/settings/EditSettingsForm.js", 330 "file": "src/components/settings/settings/EditSettingsForm.js",
331 "start": { 331 "start": {
332 "line": 122, 332 "line": 123,
333 "column": 25 333 "column": 25
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 125, 336 "line": 126,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Update available, downloading...", 342 "defaultMessage": "!!!Update available, downloading...",
343 "file": "src/components/settings/settings/EditSettingsForm.js", 343 "file": "src/components/settings/settings/EditSettingsForm.js",
344 "start": { 344 "start": {
345 "line": 126, 345 "line": 127,
346 "column": 25 346 "column": 25
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 129, 349 "line": 130,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!You are using the latest version of Ferdi", 355 "defaultMessage": "!!!You are using the latest version of Ferdi",
356 "file": "src/components/settings/settings/EditSettingsForm.js", 356 "file": "src/components/settings/settings/EditSettingsForm.js",
357 "start": { 357 "start": {
358 "line": 130, 358 "line": 131,
359 "column": 24 359 "column": 24
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 133, 362 "line": 134,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Current version:", 368 "defaultMessage": "!!!Current version:",
369 "file": "src/components/settings/settings/EditSettingsForm.js", 369 "file": "src/components/settings/settings/EditSettingsForm.js",
370 "start": { 370 "start": {
371 "line": 134, 371 "line": 135,
372 "column": 18 372 "column": 18
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 137, 375 "line": 138,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Changes require restart", 381 "defaultMessage": "!!!Changes require restart",
382 "file": "src/components/settings/settings/EditSettingsForm.js", 382 "file": "src/components/settings/settings/EditSettingsForm.js",
383 "start": { 383 "start": {
384 "line": 138, 384 "line": 139,
385 "column": 29 385 "column": 29
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 141, 388 "line": 142,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 394 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
395 "file": "src/components/settings/settings/EditSettingsForm.js", 395 "file": "src/components/settings/settings/EditSettingsForm.js",
396 "start": { 396 "start": {
397 "line": 142, 397 "line": 143,
398 "column": 22 398 "column": 22
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 145, 401 "line": 146,
402 "column": 3 402 "column": 3
403 } 403 }
404 } 404 }
diff --git a/src/i18n/messages/src/features/nightlyBuilds/Component.json b/src/i18n/messages/src/features/nightlyBuilds/Component.json
new file mode 100644
index 000000000..6b86ec29f
--- /dev/null
+++ b/src/i18n/messages/src/features/nightlyBuilds/Component.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "feature.nightlyBuilds.title",
4 "defaultMessage": "!!!Nightly Builds",
5 "file": "src/features/nightlyBuilds/Component.js",
6 "start": {
7 "line": 14,
8 "column": 9
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.nightlyBuilds.info",
17 "defaultMessage": "!!!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.",
18 "file": "src/features/nightlyBuilds/Component.js",
19 "start": {
20 "line": 18,
21 "column": 8
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.nightlyBuilds.activate",
30 "defaultMessage": "!!!Activate",
31 "file": "src/features/nightlyBuilds/Component.js",
32 "start": {
33 "line": 22,
34 "column": 12
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.nightlyBuilds.cancel",
43 "defaultMessage": "!!!Cancel",
44 "file": "src/features/nightlyBuilds/Component.js",
45 "start": {
46 "line": 26,
47 "column": 10
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
index 4b047eac1..053751c84 100644
--- a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
+++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
@@ -92,7 +92,7 @@
92 }, 92 },
93 { 93 {
94 "id": "settings.services.noServicesAdded", 94 "id": "settings.services.noServicesAdded",
95 "defaultMessage": "!!!You haven't added any services yet.", 95 "defaultMessage": "!!!Start by adding a service.",
96 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 96 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
97 "start": { 97 "start": {
98 "line": 49, 98 "line": 49,
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
index 87b8942ce..d67bc492d 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
@@ -14,7 +14,7 @@
14 }, 14 },
15 { 15 {
16 "id": "settings.workspaces.noWorkspacesAdded", 16 "id": "settings.workspaces.noWorkspacesAdded",
17 "defaultMessage": "!!!You haven't added 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": 24,
diff --git a/src/internal-server b/src/internal-server
Subproject ae1edff6d5139e5912a8f99dac8da274add7fd7 Subproject 95ae59926dbd88d55a5377be997558a9e112ab4
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 8a279bc8a..631d0318e 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -14,6 +14,7 @@ import serviceProxy from '../features/serviceProxy';
14import basicAuth from '../features/basicAuth'; 14import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces'; 15import workspaces from '../features/workspaces';
16import quickSwitch from '../features/quickSwitch'; 16import quickSwitch from '../features/quickSwitch';
17import nightlyBuilds from '../features/nightlyBuilds';
17import publishDebugInfo from '../features/publishDebugInfo'; 18import publishDebugInfo from '../features/publishDebugInfo';
18import shareFranz from '../features/shareFranz'; 19import shareFranz from '../features/shareFranz';
19import announcements from '../features/announcements'; 20import announcements from '../features/announcements';
@@ -85,6 +86,7 @@ export default class FeaturesStore extends Store {
85 basicAuth(this.stores, this.actions); 86 basicAuth(this.stores, this.actions);
86 workspaces(this.stores, this.actions); 87 workspaces(this.stores, this.actions);
87 quickSwitch(this.stores, this.actions); 88 quickSwitch(this.stores, this.actions);
89 nightlyBuilds(this.stores, this.actions);
88 publishDebugInfo(this.stores, this.actions); 90 publishDebugInfo(this.stores, this.actions);
89 shareFranz(this.stores, this.actions); 91 shareFranz(this.stores, this.actions);
90 announcements(this.stores, this.actions); 92 announcements(this.stores, this.actions);
diff --git a/src/styles/quick-switch.scss b/src/styles/features.scss
index 356123c4c..d2931f837 100644
--- a/src/styles/quick-switch.scss
+++ b/src/styles/features.scss
@@ -10,4 +10,4 @@
10 .active { 10 .active {
11 background: $theme-brand-primary; 11 background: $theme-brand-primary;
12 } 12 }
13} \ No newline at end of file 13}
diff --git a/src/styles/main.scss b/src/styles/main.scss
index ceec4a95e..c57dc6fcd 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -30,7 +30,7 @@ $mdi-font-path: '../node_modules/mdi/fonts';
30@import './content-tabs.scss'; 30@import './content-tabs.scss';
31@import './invite.scss'; 31@import './invite.scss';
32@import './title-bar.scss'; 32@import './title-bar.scss';
33@import './quick-switch.scss'; 33@import './features.scss';
34 34
35// form 35// form
36@import './input.scss'; 36@import './input.scss';
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index dab48ef0b..b908305de 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -330,6 +330,10 @@
330 text-align: center; 330 text-align: center;
331 width: 100%; 331 width: 100%;
332 332
333 .settings__empty-state-text {
334 margin-bottom: 1em;
335 }
336
333 a.button { margin-top: 40px; } 337 a.button { margin-top: 40px; }
334 } 338 }
335 339