aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
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 /src/components
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
Diffstat (limited to 'src/components')
-rw-r--r--src/components/AppUpdateInfoBar.js66
-rw-r--r--src/components/auth/AuthLayout.js17
-rw-r--r--src/components/layout/AppLayout.js34
3 files changed, 88 insertions, 29 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 />