aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-06-05 17:23:29 +0200
committerLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-06-05 17:23:29 +0200
commit70c4494b254688037c8b7033911d2d5f06e600a2 (patch)
tree5ef06c2b0fe08a170a1b25323f32009efc6d06bc
parentFix case in menu label (diff)
downloadferdium-app-70c4494b254688037c8b7033911d2d5f06e600a2.tar.gz
ferdium-app-70c4494b254688037c8b7033911d2d5f06e600a2.tar.zst
ferdium-app-70c4494b254688037c8b7033911d2d5f06e600a2.zip
support app updates also for unauthenticated users
-rw-r--r--src/components/AppUpdateInfoBar.js66
-rw-r--r--src/components/auth/AuthLayout.js17
-rw-r--r--src/components/layout/AppLayout.js34
-rw-r--r--src/containers/auth/AuthLayoutContainer.js3
-rw-r--r--src/i18n/locales/defaultMessages.json95
-rw-r--r--src/i18n/messages/src/components/AppUpdateInfoBar.json41
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json49
7 files changed, 187 insertions, 118 deletions
diff --git a/src/components/AppUpdateInfoBar.js b/src/components/AppUpdateInfoBar.js
new file mode 100644
index 000000000..4fb3a8b71
--- /dev/null
+++ b/src/components/AppUpdateInfoBar.js
@@ -0,0 +1,66 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4
5import { announcementActions } from '../features/announcements/actions';
6import InfoBar from './ui/InfoBar';
7
8const messages = defineMessages({
9 updateAvailable: {
10 id: 'infobar.updateAvailable',
11 defaultMessage: '!!!A new update for Franz is available.',
12 },
13 changelog: {
14 id: 'infobar.buttonChangelog',
15 defaultMessage: '!!!Changelog',
16 },
17 buttonInstallUpdate: {
18 id: 'infobar.buttonInstallUpdate',
19 defaultMessage: '!!!Restart & install update',
20 },
21});
22
23class AppUpdateInfoBar extends Component {
24 static propTypes = {
25 onInstallUpdate: PropTypes.func.isRequired,
26 nextAppReleaseVersion: PropTypes.string,
27 };
28
29 static defaultProps = {
30 nextAppReleaseVersion: null,
31 };
32
33 static contextTypes = {
34 intl: intlShape,
35 };
36
37 render() {
38 const { intl } = this.context;
39 const {
40 onInstallUpdate,
41 nextAppReleaseVersion,
42 } = this.props;
43
44 return (
45 <InfoBar
46 type="primary"
47 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)}
48 onClick={onInstallUpdate}
49 sticky
50 >
51 <span className="mdi mdi-information" />
52 {intl.formatMessage(messages.updateAvailable)}
53 {' '}
54 <button
55 className="info-bar__inline-button"
56 type="button"
57 onClick={() => announcementActions.show({ targetVersion: nextAppReleaseVersion })}
58 >
59 <u>{intl.formatMessage(messages.changelog)}</u>
60 </button>
61 </InfoBar>
62 );
63 }
64}
65
66export default AppUpdateInfoBar;
diff --git a/src/components/auth/AuthLayout.js b/src/components/auth/AuthLayout.js
index ac8fdbe5b..9bde58461 100644
--- a/src/components/auth/AuthLayout.js
+++ b/src/components/auth/AuthLayout.js
@@ -11,6 +11,7 @@ import { oneOrManyChildElements, globalError as globalErrorPropType } from '../.
11import globalMessages from '../../i18n/globalMessages'; 11import globalMessages from '../../i18n/globalMessages';
12 12
13import { isWindows } from '../../environment'; 13import { isWindows } from '../../environment';
14import AppUpdateInfoBar from '../AppUpdateInfoBar';
14 15
15export default @observer class AuthLayout extends Component { 16export default @observer class AuthLayout extends Component {
16 static propTypes = { 17 static propTypes = {
@@ -22,6 +23,13 @@ export default @observer class AuthLayout extends Component {
22 isHealthCheckLoading: PropTypes.bool.isRequired, 23 isHealthCheckLoading: PropTypes.bool.isRequired,
23 isFullScreen: PropTypes.bool.isRequired, 24 isFullScreen: PropTypes.bool.isRequired,
24 darkMode: PropTypes.bool.isRequired, 25 darkMode: PropTypes.bool.isRequired,
26 nextAppReleaseVersion: PropTypes.string,
27 installAppUpdate: PropTypes.func.isRequired,
28 appUpdateIsDownloaded: PropTypes.bool.isRequired,
29 };
30
31 static defaultProps = {
32 nextAppReleaseVersion: null,
25 }; 33 };
26 34
27 static contextTypes = { 35 static contextTypes = {
@@ -38,6 +46,9 @@ export default @observer class AuthLayout extends Component {
38 isHealthCheckLoading, 46 isHealthCheckLoading,
39 isFullScreen, 47 isFullScreen,
40 darkMode, 48 darkMode,
49 nextAppReleaseVersion,
50 installAppUpdate,
51 appUpdateIsDownloaded
41 } = this.props; 52 } = this.props;
42 const { intl } = this.context; 53 const { intl } = this.context;
43 54
@@ -53,6 +64,12 @@ export default @observer class AuthLayout extends Component {
53 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 64 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
54 </InfoBar> 65 </InfoBar>
55 )} 66 )}
67 {appUpdateIsDownloaded && (
68 <AppUpdateInfoBar
69 nextAppReleaseVersion={nextAppReleaseVersion}
70 onInstallUpdate={installAppUpdate}
71 />
72 )}
56 {isOnline && !isAPIHealthy && ( 73 {isOnline && !isAPIHealthy && (
57 <InfoBar 74 <InfoBar
58 type="danger" 75 type="danger"
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index b31c00f54..321eb8e3a 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -17,6 +17,7 @@ import { isWindows } from '../../environment';
17import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 17import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
18import { workspaceStore } from '../../features/workspaces'; 18import { workspaceStore } from '../../features/workspaces';
19import { announcementActions } from '../../features/announcements/actions'; 19import { announcementActions } from '../../features/announcements/actions';
20import AppUpdateInfoBar from '../AppUpdateInfoBar';
20 21
21function createMarkup(HTMLString) { 22function createMarkup(HTMLString) {
22 return { __html: HTMLString }; 23 return { __html: HTMLString };
@@ -27,22 +28,10 @@ const messages = defineMessages({
27 id: 'infobar.servicesUpdated', 28 id: 'infobar.servicesUpdated',
28 defaultMessage: '!!!Your services have been updated.', 29 defaultMessage: '!!!Your services have been updated.',
29 }, 30 },
30 updateAvailable: {
31 id: 'infobar.updateAvailable',
32 defaultMessage: '!!!A new update for Franz is available.',
33 },
34 buttonReloadServices: { 31 buttonReloadServices: {
35 id: 'infobar.buttonReloadServices', 32 id: 'infobar.buttonReloadServices',
36 defaultMessage: '!!!Reload services', 33 defaultMessage: '!!!Reload services',
37 }, 34 },
38 changelog: {
39 id: 'infobar.buttonChangelog',
40 defaultMessage: '!!!Changelog',
41 },
42 buttonInstallUpdate: {
43 id: 'infobar.buttonInstallUpdate',
44 defaultMessage: '!!!Restart & install update',
45 },
46 requiredRequestsFailed: { 35 requiredRequestsFailed: {
47 id: 'infobar.requiredRequestsFailed', 36 id: 'infobar.requiredRequestsFailed',
48 defaultMessage: '!!!Could not load services and user information', 37 defaultMessage: '!!!Could not load services and user information',
@@ -173,23 +162,10 @@ class AppLayout extends Component {
173 </InfoBar> 162 </InfoBar>
174 )} 163 )}
175 {appUpdateIsDownloaded && ( 164 {appUpdateIsDownloaded && (
176 <InfoBar 165 <AppUpdateInfoBar
177 type="primary" 166 nextAppReleaseVersion={nextAppReleaseVersion}
178 ctaLabel={intl.formatMessage(messages.buttonInstallUpdate)} 167 onInstallUpdate={installAppUpdate}
179 onClick={installAppUpdate} 168 />
180 sticky
181 >
182 <span className="mdi mdi-information" />
183 {intl.formatMessage(messages.updateAvailable)}
184 {' '}
185 <button
186 className="info-bar__inline-button"
187 type="button"
188 onClick={() => announcementActions.show({ targetVersion: nextAppReleaseVersion })}
189 >
190 <u>{intl.formatMessage(messages.changelog)}</u>
191 </button>
192 </InfoBar>
193 )} 169 )}
194 {isDelayAppScreenVisible && (<DelayApp />)} 170 {isDelayAppScreenVisible && (<DelayApp />)}
195 <BasicAuth /> 171 <BasicAuth />
diff --git a/src/containers/auth/AuthLayoutContainer.js b/src/containers/auth/AuthLayoutContainer.js
index e63f40c06..1f9c1ea61 100644
--- a/src/containers/auth/AuthLayoutContainer.js
+++ b/src/containers/auth/AuthLayoutContainer.js
@@ -51,6 +51,9 @@ export default @inject('stores', 'actions') @observer class AuthLayoutContainer
51 isHealthCheckLoading={app.healthCheckRequest.isExecuting} 51 isHealthCheckLoading={app.healthCheckRequest.isExecuting}
52 isFullScreen={app.isFullScreen} 52 isFullScreen={app.isFullScreen}
53 darkMode={app.isSystemDarkModeEnabled} 53 darkMode={app.isSystemDarkModeEnabled}
54 installAppUpdate={actions.app.installUpdate}
55 nextAppReleaseVersion={app.nextAppReleaseVersion}
56 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED}
54 > 57 >
55 {children} 58 {children}
56 </AuthLayout> 59 </AuthLayout>
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 5183e9bc3..67ab39fe9 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -2,6 +2,50 @@
2 { 2 {
3 "descriptors": [ 3 "descriptors": [
4 { 4 {
5 "defaultMessage": "!!!A new update for Franz is available.",
6 "end": {
7 "column": 3,
8 "line": 12
9 },
10 "file": "src/components/AppUpdateInfoBar.js",
11 "id": "infobar.updateAvailable",
12 "start": {
13 "column": 19,
14 "line": 9
15 }
16 },
17 {
18 "defaultMessage": "!!!Changelog",
19 "end": {
20 "column": 3,
21 "line": 16
22 },
23 "file": "src/components/AppUpdateInfoBar.js",
24 "id": "infobar.buttonChangelog",
25 "start": {
26 "column": 13,
27 "line": 13
28 }
29 },
30 {
31 "defaultMessage": "!!!Restart & install update",
32 "end": {
33 "column": 3,
34 "line": 20
35 },
36 "file": "src/components/AppUpdateInfoBar.js",
37 "id": "infobar.buttonInstallUpdate",
38 "start": {
39 "column": 23,
40 "line": 17
41 }
42 }
43 ],
44 "path": "src/components/AppUpdateInfoBar.json"
45 },
46 {
47 "descriptors": [
48 {
5 "defaultMessage": "!!!Import your Franz 4 services", 49 "defaultMessage": "!!!Import your Franz 4 services",
6 "end": { 50 "end": {
7 "column": 3, 51 "column": 3,
@@ -625,78 +669,39 @@
625 "defaultMessage": "!!!Your services have been updated.", 669 "defaultMessage": "!!!Your services have been updated.",
626 "end": { 670 "end": {
627 "column": 3, 671 "column": 3,
628 "line": 29 672 "line": 30
629 }, 673 },
630 "file": "src/components/layout/AppLayout.js", 674 "file": "src/components/layout/AppLayout.js",
631 "id": "infobar.servicesUpdated", 675 "id": "infobar.servicesUpdated",
632 "start": { 676 "start": {
633 "column": 19, 677 "column": 19,
634 "line": 26 678 "line": 27
635 }
636 },
637 {
638 "defaultMessage": "!!!A new update for Franz is available.",
639 "end": {
640 "column": 3,
641 "line": 33
642 },
643 "file": "src/components/layout/AppLayout.js",
644 "id": "infobar.updateAvailable",
645 "start": {
646 "column": 19,
647 "line": 30
648 } 679 }
649 }, 680 },
650 { 681 {
651 "defaultMessage": "!!!Reload services", 682 "defaultMessage": "!!!Reload services",
652 "end": { 683 "end": {
653 "column": 3, 684 "column": 3,
654 "line": 37 685 "line": 34
655 }, 686 },
656 "file": "src/components/layout/AppLayout.js", 687 "file": "src/components/layout/AppLayout.js",
657 "id": "infobar.buttonReloadServices", 688 "id": "infobar.buttonReloadServices",
658 "start": { 689 "start": {
659 "column": 24, 690 "column": 24,
660 "line": 34 691 "line": 31
661 }
662 },
663 {
664 "defaultMessage": "!!!Changelog",
665 "end": {
666 "column": 3,
667 "line": 41
668 },
669 "file": "src/components/layout/AppLayout.js",
670 "id": "infobar.buttonChangelog",
671 "start": {
672 "column": 13,
673 "line": 38
674 }
675 },
676 {
677 "defaultMessage": "!!!Restart & install update",
678 "end": {
679 "column": 3,
680 "line": 45
681 },
682 "file": "src/components/layout/AppLayout.js",
683 "id": "infobar.buttonInstallUpdate",
684 "start": {
685 "column": 23,
686 "line": 42
687 } 692 }
688 }, 693 },
689 { 694 {
690 "defaultMessage": "!!!Could not load services and user information", 695 "defaultMessage": "!!!Could not load services and user information",
691 "end": { 696 "end": {
692 "column": 3, 697 "column": 3,
693 "line": 49 698 "line": 38
694 }, 699 },
695 "file": "src/components/layout/AppLayout.js", 700 "file": "src/components/layout/AppLayout.js",
696 "id": "infobar.requiredRequestsFailed", 701 "id": "infobar.requiredRequestsFailed",
697 "start": { 702 "start": {
698 "column": 26, 703 "column": 26,
699 "line": 46 704 "line": 35
700 } 705 }
701 } 706 }
702 ], 707 ],
diff --git a/src/i18n/messages/src/components/AppUpdateInfoBar.json b/src/i18n/messages/src/components/AppUpdateInfoBar.json
new file mode 100644
index 000000000..c4c2d0cae
--- /dev/null
+++ b/src/i18n/messages/src/components/AppUpdateInfoBar.json
@@ -0,0 +1,41 @@
1[
2 {
3 "id": "infobar.updateAvailable",
4 "defaultMessage": "!!!A new update for Franz is available.",
5 "file": "src/components/AppUpdateInfoBar.js",
6 "start": {
7 "line": 9,
8 "column": 19
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "infobar.buttonChangelog",
17 "defaultMessage": "!!!Changelog",
18 "file": "src/components/AppUpdateInfoBar.js",
19 "start": {
20 "line": 13,
21 "column": 13
22 },
23 "end": {
24 "line": 16,
25 "column": 3
26 }
27 },
28 {
29 "id": "infobar.buttonInstallUpdate",
30 "defaultMessage": "!!!Restart & install update",
31 "file": "src/components/AppUpdateInfoBar.js",
32 "start": {
33 "line": 17,
34 "column": 23
35 },
36 "end": {
37 "line": 20,
38 "column": 3
39 }
40 }
41] \ 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 4dd354afc..b71889155 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,24 +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": 26, 7 "line": 27,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 29,
12 "column": 3
13 }
14 },
15 {
16 "id": "infobar.updateAvailable",
17 "defaultMessage": "!!!A new update for Franz is available.",
18 "file": "src/components/layout/AppLayout.js",
19 "start": {
20 "line": 30, 11 "line": 30,
21 "column": 19
22 },
23 "end": {
24 "line": 33,
25 "column": 3 12 "column": 3
26 } 13 }
27 }, 14 },
@@ -30,37 +17,11 @@
30 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
31 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
32 "start": { 19 "start": {
33 "line": 34, 20 "line": 31,
34 "column": 24 21 "column": 24
35 }, 22 },
36 "end": { 23 "end": {
37 "line": 37, 24 "line": 34,
38 "column": 3
39 }
40 },
41 {
42 "id": "infobar.buttonChangelog",
43 "defaultMessage": "!!!Changelog",
44 "file": "src/components/layout/AppLayout.js",
45 "start": {
46 "line": 38,
47 "column": 13
48 },
49 "end": {
50 "line": 41,
51 "column": 3
52 }
53 },
54 {
55 "id": "infobar.buttonInstallUpdate",
56 "defaultMessage": "!!!Restart & install update",
57 "file": "src/components/layout/AppLayout.js",
58 "start": {
59 "line": 42,
60 "column": 23
61 },
62 "end": {
63 "line": 45,
64 "column": 3 25 "column": 3
65 } 26 }
66 }, 27 },
@@ -69,11 +30,11 @@
69 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
70 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
71 "start": { 32 "start": {
72 "line": 46, 33 "line": 35,
73 "column": 26 34 "column": 26
74 }, 35 },
75 "end": { 36 "end": {
76 "line": 49, 37 "line": 38,
77 "column": 3 38 "column": 3
78 } 39 }
79 } 40 }