|
1 | 1 | import React, { Component, Suspense } from 'react'; |
2 | 2 | import { Route, Routes } from 'react-router-dom'; |
3 | 3 | 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'; |
5 | 6 |
|
6 | 7 | import { fetchMetadata, fetchMessages, dismissMessage } from 'actions'; |
7 | 8 | import { |
@@ -60,11 +61,11 @@ class Router extends Component { |
60 | 61 | fetchIfNeeded() { |
61 | 62 | const { metadata, messages } = this.props; |
62 | 63 |
|
63 | | - if (metadata.shouldLoad) { |
| 64 | + if (metadata.shouldLoad && !metadata.isError) { |
64 | 65 | this.props.fetchMetadata(); |
65 | 66 | } |
66 | 67 |
|
67 | | - if (messages.shouldLoad) { |
| 68 | + if (messages.shouldLoad && !messages.isError) { |
68 | 69 | this.fetchMessages(); |
69 | 70 | } |
70 | 71 | } |
@@ -92,23 +93,44 @@ class Router extends Component { |
92 | 93 | const { metadata, session, pinnedMessage, dismissMessage } = this.props; |
93 | 94 | const isLoaded = metadata && metadata.app && session; |
94 | 95 |
|
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"> |
98 | 120 | <Spinner className={Classes.LARGE} /> |
99 | 121 | </div> |
100 | 122 | </div> |
101 | 123 | ); |
102 | 124 |
|
103 | 125 | if (!isLoaded) { |
104 | | - return Loading; |
| 126 | + return loading; |
105 | 127 | } |
106 | 128 |
|
107 | 129 | return ( |
108 | 130 | <> |
109 | 131 | <Navbar /> |
110 | 132 | <MessageBanner message={pinnedMessage} onDismiss={dismissMessage} /> |
111 | | - <Suspense fallback={Loading}> |
| 133 | + <Suspense fallback={loading}> |
112 | 134 | <Routes> |
113 | 135 | <Route path="oauth" element={<OAuthScreen />} /> |
114 | 136 | <Route path="logout" element={<LogoutScreen />} /> |
@@ -164,4 +186,5 @@ export default connect(mapStateToProps, { |
164 | 186 | fetchMetadata, |
165 | 187 | fetchMessages, |
166 | 188 | dismissMessage, |
| 189 | + injectIntl, |
167 | 190 | })(Router); |
0 commit comments