diff options
author | Dominik Guzei <dominik.guzei@gmail.com> | 2019-06-05 17:23:29 +0200 |
---|---|---|
committer | Dominik Guzei <dominik.guzei@gmail.com> | 2019-06-05 17:23:29 +0200 |
commit | 70c4494b254688037c8b7033911d2d5f06e600a2 (patch) | |
tree | 5ef06c2b0fe08a170a1b25323f32009efc6d06bc | |
parent | Fix case in menu label (diff) | |
download | ferdium-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.js | 66 | ||||
-rw-r--r-- | src/components/auth/AuthLayout.js | 17 | ||||
-rw-r--r-- | src/components/layout/AppLayout.js | 34 | ||||
-rw-r--r-- | src/containers/auth/AuthLayoutContainer.js | 3 | ||||
-rw-r--r-- | src/i18n/locales/defaultMessages.json | 95 | ||||
-rw-r--r-- | src/i18n/messages/src/components/AppUpdateInfoBar.json | 41 | ||||
-rw-r--r-- | src/i18n/messages/src/components/layout/AppLayout.json | 49 |
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 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { defineMessages, intlShape } from 'react-intl'; | ||
4 | |||
5 | import { announcementActions } from '../features/announcements/actions'; | ||
6 | import InfoBar from './ui/InfoBar'; | ||
7 | |||
8 | const 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 | |||
23 | class 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 | |||
66 | export 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 '../. | |||
11 | import globalMessages from '../../i18n/globalMessages'; | 11 | import globalMessages from '../../i18n/globalMessages'; |
12 | 12 | ||
13 | import { isWindows } from '../../environment'; | 13 | import { isWindows } from '../../environment'; |
14 | import AppUpdateInfoBar from '../AppUpdateInfoBar'; | ||
14 | 15 | ||
15 | export default @observer class AuthLayout extends Component { | 16 | export 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'; | |||
17 | import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; | 17 | import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; |
18 | import { workspaceStore } from '../../features/workspaces'; | 18 | import { workspaceStore } from '../../features/workspaces'; |
19 | import { announcementActions } from '../../features/announcements/actions'; | 19 | import { announcementActions } from '../../features/announcements/actions'; |
20 | import AppUpdateInfoBar from '../AppUpdateInfoBar'; | ||
20 | 21 | ||
21 | function createMarkup(HTMLString) { | 22 | function 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 | } |