aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/layout/AppLayout.js2
-rw-r--r--src/components/settings/settings/EditSettingsForm.js14
-rw-r--r--src/components/ui/ToggleRaw.js76
-rw-r--r--src/config.ts1
-rw-r--r--src/containers/settings/EditSettingsScreen.js3
-rw-r--r--src/electron/ipc-api/autoUpdate.ts8
-rw-r--r--src/features/nightlyBuilds/Component.js142
-rw-r--r--src/features/nightlyBuilds/index.ts41
-rw-r--r--src/features/nightlyBuilds/store.ts7
-rw-r--r--src/i18n/locales/en-US.json7
-rw-r--r--src/stores/FeaturesStore.js2
-rw-r--r--src/styles/features.scss2
12 files changed, 4 insertions, 301 deletions
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 084d93ecd..b47a6040d 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -10,7 +10,6 @@ import { mdiFlash, mdiPowerPlug } from '@mdi/js';
10import InfoBar from '../ui/InfoBar'; 10import InfoBar from '../ui/InfoBar';
11import { Component as BasicAuth } from '../../features/basicAuth'; 11import { Component as BasicAuth } from '../../features/basicAuth';
12import { Component as QuickSwitch } from '../../features/quickSwitch'; 12import { Component as QuickSwitch } from '../../features/quickSwitch';
13import { Component as NightlyBuilds } from '../../features/nightlyBuilds';
14import { Component as PublishDebugInfo } from '../../features/publishDebugInfo'; 13import { Component as PublishDebugInfo } from '../../features/publishDebugInfo';
15import ErrorBoundary from '../util/ErrorBoundary'; 14import ErrorBoundary from '../util/ErrorBoundary';
16 15
@@ -193,7 +192,6 @@ class AppLayout extends Component {
193 )} 192 )}
194 <BasicAuth /> 193 <BasicAuth />
195 <QuickSwitch /> 194 <QuickSwitch />
196 <NightlyBuilds />
197 <PublishDebugInfo /> 195 <PublishDebugInfo />
198 {services} 196 {services}
199 {children} 197 {children}
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index eab65f5e5..d17c804f0 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -9,7 +9,6 @@ import { mdiGithub, mdiOpenInNew } from '@mdi/js';
9import Form from '../../../lib/Form'; 9import Form from '../../../lib/Form';
10import Button from '../../ui/Button'; 10import Button from '../../ui/Button';
11import Toggle from '../../ui/Toggle'; 11import Toggle from '../../ui/Toggle';
12import ToggleRaw from '../../ui/ToggleRaw';
13import Select from '../../ui/Select'; 12import Select from '../../ui/Select';
14import Input from '../../ui/Input'; 13import Input from '../../ui/Input';
15import Infobox from '../../ui/Infobox'; 14import Infobox from '../../ui/Infobox';
@@ -203,7 +202,6 @@ class EditSettingsForm extends Component {
203 isDarkmodeEnabled: PropTypes.bool.isRequired, 202 isDarkmodeEnabled: PropTypes.bool.isRequired,
204 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired, 203 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired,
205 isSplitModeEnabled: PropTypes.bool.isRequired, 204 isSplitModeEnabled: PropTypes.bool.isRequired,
206 isNightlyEnabled: PropTypes.bool.isRequired,
207 hasAddedTodosAsService: PropTypes.bool.isRequired, 205 hasAddedTodosAsService: PropTypes.bool.isRequired,
208 isOnline: PropTypes.bool.isRequired, 206 isOnline: PropTypes.bool.isRequired,
209 }; 207 };
@@ -252,7 +250,6 @@ class EditSettingsForm extends Component {
252 isDarkmodeEnabled, 250 isDarkmodeEnabled,
253 isSplitModeEnabled, 251 isSplitModeEnabled,
254 isTodosActivated, 252 isTodosActivated,
255 isNightlyEnabled,
256 hasAddedTodosAsService, 253 hasAddedTodosAsService,
257 isOnline, 254 isOnline,
258 } = this.props; 255 } = this.props;
@@ -770,17 +767,6 @@ class EditSettingsForm extends Component {
770 {automaticUpdates && ( 767 {automaticUpdates && (
771 <div> 768 <div>
772 <Toggle field={form.$('beta')} /> 769 <Toggle field={form.$('beta')} />
773 <ToggleRaw
774 field={{
775 value: isNightlyEnabled,
776 id: 'nightly',
777 label: 'Include nightly versions',
778 name: 'Nightly builds',
779 }}
780 onChange={
781 window['ferdi'].features.nightlyBuilds.toggleFeature
782 }
783 />
784 {updateIsReadyToInstall ? ( 770 {updateIsReadyToInstall ? (
785 <Button 771 <Button
786 label={intl.formatMessage(messages.buttonInstallUpdate)} 772 label={intl.formatMessage(messages.buttonInstallUpdate)}
diff --git a/src/components/ui/ToggleRaw.js b/src/components/ui/ToggleRaw.js
deleted file mode 100644
index e482b97b4..000000000
--- a/src/components/ui/ToggleRaw.js
+++ /dev/null
@@ -1,76 +0,0 @@
1/**
2 * "Raw" Toggle - for usage without a MobX Form element
3 */
4import { Component } from 'react';
5import PropTypes from 'prop-types';
6import { observer } from 'mobx-react';
7import classnames from 'classnames';
8
9class 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 error: PropTypes.string,
18 }).isRequired,
19 className: PropTypes.string,
20 showLabel: PropTypes.bool,
21 disabled: PropTypes.bool,
22 };
23
24 static defaultProps = {
25 className: '',
26 showLabel: true,
27 disabled: false,
28 };
29
30 onChange(e) {
31 const { onChange } = this.props;
32
33 onChange(e);
34 }
35
36 render() {
37 const { field, className, showLabel, disabled } = this.props;
38
39 return (
40 <div
41 className={classnames([
42 'franz-form__field',
43 'franz-form__toggle-wrapper',
44 'franz-form__toggle-disabled',
45 className,
46 ])}
47 >
48 <label
49 htmlFor={field.id}
50 className={classnames({
51 'franz-form__toggle': true,
52 'is-active': field.value,
53 })}
54 >
55 <div className="franz-form__toggle-button" />
56 <input
57 type="checkbox"
58 id={field.id}
59 name={field.name}
60 value={field.name}
61 checked={field.value}
62 onChange={e => (!disabled ? this.onChange(e) : null)}
63 />
64 </label>
65 {field.error && <div className={field.error}>{field.error}</div>}
66 {field.label && showLabel && (
67 <label className="franz-form__label" htmlFor={field.id}>
68 {field.label}
69 </label>
70 )}
71 </div>
72 );
73 }
74}
75
76export default observer(ToggleRaw);
diff --git a/src/config.ts b/src/config.ts
index 9600cc088..2079d7cc0 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -226,7 +226,6 @@ export const DEFAULT_APP_SETTINGS = {
226 serviceRibbonWidth: 68, 226 serviceRibbonWidth: 68,
227 iconSize: iconSizeBias, 227 iconSize: iconSizeBias,
228 sentry: false, 228 sentry: false,
229 nightly: false,
230 navigationBarBehaviour: 'custom', 229 navigationBarBehaviour: 'custom',
231 searchEngine: SEARCH_ENGINE_DDG, 230 searchEngine: SEARCH_ENGINE_DDG,
232 useVerticalStyle: false, 231 useVerticalStyle: false,
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 3d215a0d7..78a0eac6f 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -229,7 +229,7 @@ const messages = defineMessages({
229 }, 229 },
230 beta: { 230 beta: {
231 id: 'settings.app.form.beta', 231 id: 'settings.app.form.beta',
232 defaultMessage: 'Include beta versions', 232 defaultMessage: 'Include pre-releases',
233 }, 233 },
234 automaticUpdates: { 234 automaticUpdates: {
235 id: 'settings.app.form.automaticUpdates', 235 id: 'settings.app.form.automaticUpdates',
@@ -743,7 +743,6 @@ class EditSettingsScreen extends Component {
743 isUsingCustomTodoService={ 743 isUsingCustomTodoService={
744 this.props.stores.todos.isUsingCustomTodoService 744 this.props.stores.todos.isUsingCustomTodoService
745 } 745 }
746 isNightlyEnabled={this.props.stores.settings.app.nightly}
747 hasAddedTodosAsService={services.isTodosServiceAdded} 746 hasAddedTodosAsService={services.isTodosServiceAdded}
748 isOnline={app.isOnline} 747 isOnline={app.isOnline}
749 /> 748 />
diff --git a/src/electron/ipc-api/autoUpdate.ts b/src/electron/ipc-api/autoUpdate.ts
index a41c1f6f4..aed87455e 100644
--- a/src/electron/ipc-api/autoUpdate.ts
+++ b/src/electron/ipc-api/autoUpdate.ts
@@ -18,14 +18,6 @@ export default (params: { mainWindow: BrowserWindow; settings: any }) => {
18 autoUpdater.allowPrerelease = Boolean( 18 autoUpdater.allowPrerelease = Boolean(
19 params.settings.app.get('beta'), 19 params.settings.app.get('beta'),
20 ); 20 );
21 autoUpdater.channel = autoUpdater.allowPrerelease ? 'beta' : 'latest';
22
23 if (params.settings.app.get('nightly')) {
24 autoUpdater.allowPrerelease = Boolean(
25 params.settings.app.get('nightly'),
26 );
27 autoUpdater.channel = 'alpha';
28 }
29 21
30 if (args.action === 'check') { 22 if (args.action === 'check') {
31 debug('checking for update'); 23 debug('checking for update');
diff --git a/src/features/nightlyBuilds/Component.js b/src/features/nightlyBuilds/Component.js
deleted file mode 100644
index 216e35f65..000000000
--- a/src/features/nightlyBuilds/Component.js
+++ /dev/null
@@ -1,142 +0,0 @@
1import { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, injectIntl } from 'react-intl';
6import { H1 } from '../../components/ui/headline';
7
8import Modal from '../../components/ui/Modal';
9import Button from '../../components/ui/Button';
10import { state as ModalState } from './store';
11import SettingsStore from '../../stores/SettingsStore';
12import UIStore from '../../stores/UIStore';
13import UserStore from '../../stores/UserStore';
14import globalMessages from '../../i18n/globalMessages';
15
16const messages = defineMessages({
17 title: {
18 id: 'feature.nightlyBuilds.title',
19 defaultMessage: 'Nightly Builds',
20 },
21 info: {
22 id: 'feature.nightlyBuilds.info',
23 defaultMessage:
24 "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 },
26 activate: {
27 id: 'feature.nightlyBuilds.activate',
28 defaultMessage: 'Activate',
29 },
30});
31
32const styles = theme => ({
33 modal: {
34 width: '80%',
35 maxWidth: 600,
36 background: theme.styleTypes.primary.contrast,
37 paddingTop: 30,
38 },
39 info: {
40 paddingBottom: 20,
41 },
42 headline: {
43 fontSize: 20,
44 marginBottom: 20,
45 marginTop: -27,
46 },
47 buttonContainer: {
48 display: 'flex',
49 },
50 button: {
51 width: '50%',
52 marginTop: 10,
53 cursor: 'pointer',
54 },
55 activateButton: {
56 marginRight: 10,
57 background: '#c45a5a !important',
58 color: '#ffffff !important',
59 },
60});
61
62class NightlyBuildsModal extends Component {
63 close() {
64 ModalState.isModalVisible = false;
65
66 const { ui } = this.props.actions;
67 ui.openSettings({ path: 'app' });
68 }
69
70 activate() {
71 const { settings, user } = this.props.actions;
72
73 settings.update({
74 type: 'app',
75 data: {
76 nightly: true,
77 },
78 });
79 user.update({
80 userData: {
81 nightly: true,
82 },
83 });
84 this.close();
85 }
86
87 render() {
88 const { isModalVisible } = ModalState;
89
90 const { classes } = this.props;
91
92 const { intl } = this.props;
93
94 return (
95 <Modal
96 isOpen={isModalVisible}
97 className={`${classes.modal} nightly-builds`}
98 shouldCloseOnOverlayClick
99 close={this.close.bind(this)}
100 >
101 <H1 className={classes.headline}>
102 {intl.formatMessage(messages.title)}
103 </H1>
104
105 <p className={classes.info}>{intl.formatMessage(messages.info)}</p>
106
107 <div className={classes.buttonContainer}>
108 <Button
109 type="button"
110 label={intl.formatMessage(messages.activate)}
111 className={`${classes.button} ${classes.activateButton}`}
112 onClick={() => this.activate()}
113 />
114 <Button
115 type="button"
116 label={intl.formatMessage(globalMessages.cancel)}
117 className={classes.button}
118 onClick={() => this.close()}
119 />
120 </div>
121 </Modal>
122 );
123 }
124}
125
126NightlyBuildsModal.propTypes = {
127 stores: PropTypes.shape({
128 settings: PropTypes.instanceOf(SettingsStore).isRequired,
129 }).isRequired,
130 actions: PropTypes.shape({
131 settings: PropTypes.instanceOf(SettingsStore).isRequired,
132 user: PropTypes.instanceOf(UserStore).isRequired,
133 ui: PropTypes.instanceOf(UIStore).isRequired,
134 }).isRequired,
135 classes: PropTypes.object.isRequired,
136};
137
138export default injectIntl(
139 injectSheet(styles)(
140 inject('stores', 'actions')(observer(NightlyBuildsModal)),
141 ),
142);
diff --git a/src/features/nightlyBuilds/index.ts b/src/features/nightlyBuilds/index.ts
deleted file mode 100644
index 14afbaf1b..000000000
--- a/src/features/nightlyBuilds/index.ts
+++ /dev/null
@@ -1,41 +0,0 @@
1import { state as ModalState } from './store';
2
3export { default as Component } from './Component';
4
5const debug = require('debug')('Ferdi:feature:nightlyBuilds');
6
7const state = ModalState;
8
9export default function initialize() {
10 debug('Initialize nightlyBuilds feature');
11
12 function showModal() {
13 state.isModalVisible = true;
14 }
15
16 function toggleFeature() {
17 if (window['ferdi'].stores.settings.app.nightly) {
18 window['ferdi'].actions.settings.update({
19 type: 'app',
20 data: {
21 nightly: false,
22 },
23 });
24 window['ferdi'].actions.user.update({
25 userData: {
26 nightly: false,
27 },
28 });
29 } else {
30 // We need to close the settings, otherwise the modal will be drawn under the settings window
31 window['ferdi'].actions.ui.closeSettings();
32 showModal();
33 }
34 }
35
36 window['ferdi'].features.nightlyBuilds = {
37 state,
38 showModal,
39 toggleFeature,
40 };
41}
diff --git a/src/features/nightlyBuilds/store.ts b/src/features/nightlyBuilds/store.ts
deleted file mode 100644
index ed06e5a7d..000000000
--- a/src/features/nightlyBuilds/store.ts
+++ /dev/null
@@ -1,7 +0,0 @@
1import { observable } from 'mobx';
2
3const defaultState = {
4 isModalVisible: false,
5};
6
7export const state = observable(defaultState);
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index db528ac47..b6445b4bc 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -10,9 +10,6 @@
10 "connectionLostBanner.informationLink": "What happened?", 10 "connectionLostBanner.informationLink": "What happened?",
11 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 11 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
12 "feature.basicAuth.signIn": "Sign In", 12 "feature.basicAuth.signIn": "Sign In",
13 "feature.nightlyBuilds.activate": "Activate",
14 "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.",
15 "feature.nightlyBuilds.title": "Nightly Builds",
16 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 13 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
17 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 14 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
18 "feature.publishDebugInfo.privacy": "Privacy policy", 15 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -201,7 +198,7 @@
201 "settings.app.form.autoLaunchInBackground": "Open in background", 198 "settings.app.form.autoLaunchInBackground": "Open in background",
202 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start", 199 "settings.app.form.autoLaunchOnStart": "Launch Ferdi on start",
203 "settings.app.form.automaticUpdates": "Enable updates", 200 "settings.app.form.automaticUpdates": "Enable updates",
204 "settings.app.form.beta": "Include beta versions", 201 "settings.app.form.beta": "Include pre-releases",
205 "settings.app.form.clipboardNotifications": "Don't show notifications for clipboard events", 202 "settings.app.form.clipboardNotifications": "Don't show notifications for clipboard events",
206 "settings.app.form.closeToSystemTray": "Close Ferdi to system tray", 203 "settings.app.form.closeToSystemTray": "Close Ferdi to system tray",
207 "settings.app.form.confirmOnQuit": "Confirm when quitting Ferdi", 204 "settings.app.form.confirmOnQuit": "Confirm when quitting Ferdi",
@@ -452,4 +449,4 @@
452 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 449 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>",
453 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 450 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
454 "workspaces.switchingIndicator.switchingTo": "Switching to" 451 "workspaces.switchingIndicator.switchingTo": "Switching to"
455} 452} \ No newline at end of file
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 26a045314..e2c0c08ef 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -7,7 +7,6 @@ import serviceProxy from '../features/serviceProxy';
7import basicAuth from '../features/basicAuth'; 7import basicAuth from '../features/basicAuth';
8import workspaces from '../features/workspaces'; 8import workspaces from '../features/workspaces';
9import quickSwitch from '../features/quickSwitch'; 9import quickSwitch from '../features/quickSwitch';
10import nightlyBuilds from '../features/nightlyBuilds';
11import publishDebugInfo from '../features/publishDebugInfo'; 10import publishDebugInfo from '../features/publishDebugInfo';
12import communityRecipes from '../features/communityRecipes'; 11import communityRecipes from '../features/communityRecipes';
13import todos from '../features/todos'; 12import todos from '../features/todos';
@@ -70,7 +69,6 @@ export default class FeaturesStore extends Store {
70 basicAuth(); 69 basicAuth();
71 workspaces(this.stores, this.actions); 70 workspaces(this.stores, this.actions);
72 quickSwitch(); 71 quickSwitch();
73 nightlyBuilds();
74 publishDebugInfo(); 72 publishDebugInfo();
75 communityRecipes(this.stores, this.actions); 73 communityRecipes(this.stores, this.actions);
76 todos(this.stores, this.actions); 74 todos(this.stores, this.actions);
diff --git a/src/styles/features.scss b/src/styles/features.scss
index 80362b648..c6d982b25 100644
--- a/src/styles/features.scss
+++ b/src/styles/features.scss
@@ -23,6 +23,6 @@
23 } 23 }
24} 24}
25 25
26.theme__dark .publish-debug, .theme__dark .nightly-builds { 26.theme__dark .publish-debug {
27 background: $dark-theme-gray-darkest; 27 background: $dark-theme-gray-darkest;
28} 28}