Skip to content

Commit 19adc88

Browse files
Fix infinite request loop if metadata request fails (#3948)
Fixes #3812. Previously, the UI would retry the metadata request indefinitely and without a delay. Now, if the metadata request fails, an error message and a button to reload the page are displayed. I haven’t implemented automatic retries with back-offs for now, as this adds complexity and I’m not sure it’s necessary.
1 parent fd7935b commit 19adc88

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

ui/src/app/Router.jsx

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React, { Component, Suspense } from 'react';
22
import { Route, Routes } from 'react-router-dom';
33
import { connect } from 'react-redux';
4-
import { Spinner, Classes } from '@blueprintjs/core';
4+
import { Button, Spinner, Classes } from '@blueprintjs/core';
5+
import { FormattedMessage, injectIntl } from 'react-intl';
56

67
import { fetchMetadata, fetchMessages, dismissMessage } from 'actions';
78
import {
@@ -60,11 +61,11 @@ class Router extends Component {
6061
fetchIfNeeded() {
6162
const { metadata, messages } = this.props;
6263

63-
if (metadata.shouldLoad) {
64+
if (metadata.shouldLoad && !metadata.isError) {
6465
this.props.fetchMetadata();
6566
}
6667

67-
if (messages.shouldLoad) {
68+
if (messages.shouldLoad && !messages.isError) {
6869
this.fetchMessages();
6970
}
7071
}
@@ -92,23 +93,44 @@ class Router extends Component {
9293
const { metadata, session, pinnedMessage, dismissMessage } = this.props;
9394
const isLoaded = metadata && metadata.app && session;
9495

95-
const Loading = (
96-
<div className="RouterLoading">
97-
<div className="spinner">
96+
if (metadata.isError) {
97+
return (
98+
<div className="Router">
99+
<div className="Router__error">
100+
<p className={Classes.TEXT_LARGE}>
101+
<FormattedMessage
102+
id="router.error.message"
103+
defaultMessage="Sorry, something went wrong and Aleph couldn’t load. Please try again in a few minutes or contact an administrator if the error persists."
104+
/>
105+
</p>
106+
<Button large icon="reset" onClick={() => window.location.reload()}>
107+
<FormattedMessage
108+
id="router.error.retry"
109+
defaultMessage="Retry"
110+
/>
111+
</Button>
112+
</div>
113+
</div>
114+
);
115+
}
116+
117+
const loading = (
118+
<div className="Router">
119+
<div className="Router__spinner">
98120
<Spinner className={Classes.LARGE} />
99121
</div>
100122
</div>
101123
);
102124

103125
if (!isLoaded) {
104-
return Loading;
126+
return loading;
105127
}
106128

107129
return (
108130
<>
109131
<Navbar />
110132
<MessageBanner message={pinnedMessage} onDismiss={dismissMessage} />
111-
<Suspense fallback={Loading}>
133+
<Suspense fallback={loading}>
112134
<Routes>
113135
<Route path="oauth" element={<OAuthScreen />} />
114136
<Route path="logout" element={<LogoutScreen />} />
@@ -164,4 +186,5 @@ export default connect(mapStateToProps, {
164186
fetchMetadata,
165187
fetchMessages,
166188
dismissMessage,
189+
injectIntl,
167190
})(Router);

ui/src/app/Router.scss

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
@import 'app/variables.scss';
22

3-
.RouterLoading {
3+
.Router {
44
height: 100vh;
55
display: flex;
66
align-items: center;
77
justify-content: center;
8+
}
9+
10+
.Router__error,
11+
.Router__spinner {
12+
align-self: center;
13+
margin: auto;
14+
}
815

9-
.spinner {
10-
align-self: center;
11-
margin: auto;
12-
}
16+
.Router__error {
17+
max-width: $aleph-screen-sm-max-width;
18+
padding: $aleph-content-padding;
19+
text-align: center;
1320
}

0 commit comments

Comments
 (0)