Created components to display errors when loading a server

This commit is contained in:
Alejandro Celaya 2020-03-08 12:37:55 +01:00
parent febecab33c
commit d1a5ee43e9
6 changed files with 62 additions and 15 deletions

View file

@ -1,8 +1,8 @@
@import '../utils/base'; @import '../utils/base';
.home { .home {
text-align: center;
height: calc(100vh - #{$headerHeight}); height: calc(100vh - #{$headerHeight});
text-align: center;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View file

@ -7,6 +7,7 @@ import classNames from 'classnames';
import * as PropTypes from 'prop-types'; import * as PropTypes from 'prop-types';
import { serverType } from '../servers/prop-types'; import { serverType } from '../servers/prop-types';
import Message from '../utils/Message'; import Message from '../utils/Message';
import { ServerError } from '../servers/helpers/ServerError';
import NotFound from './NotFound'; import NotFound from './NotFound';
import './MenuLayout.scss'; import './MenuLayout.scss';
@ -32,16 +33,11 @@ const MenuLayout = (TagsList, ShortUrls, AsideMenu, CreateShortUrl, ShortUrlVisi
} }
if (selectedServer.serverNotFound) { if (selectedServer.serverNotFound) {
return <Message type="error">Could not find this Shlink server in this host.</Message>; return <ServerError type="not-found" />;
} }
if (selectedServer.serverNotReachable) { if (selectedServer.serverNotReachable) {
return ( return <ServerError type="not-reachable" />;
<Message type="error">
<p>Oops! Could not connect to this Shlink server.</p>
Make sure you have internet connection, and the server is properly configured and on-line.
</Message>
);
} }
const burgerClasses = classNames('menu-layout__burger-icon', { const burgerClasses = classNames('menu-layout__burger-icon', {

View file

@ -10,6 +10,7 @@ import './ServersListGroup.scss';
const propTypes = { const propTypes = {
servers: PropTypes.arrayOf(serverType).isRequired, servers: PropTypes.arrayOf(serverType).isRequired,
children: PropTypes.node.isRequired, children: PropTypes.node.isRequired,
className: PropTypes.string,
}; };
const ServerListItem = ({ id, name }) => ( const ServerListItem = ({ id, name }) => (
@ -24,15 +25,15 @@ ServerListItem.propTypes = {
name: PropTypes.string, name: PropTypes.string,
}; };
const ServersListGroup = ({ servers, children }) => ( const ServersListGroup = ({ servers, children, className }) => (
<React.Fragment> <div className={className}>
<h5>{children}</h5> <h5>{children}</h5>
{servers.length && ( {servers.length > 0 && (
<ListGroup className="servers-list__list-group"> <ListGroup className="servers-list__list-group">
{servers.map(({ id, name }) => <ServerListItem key={id} id={id} name={name} />)} {servers.map(({ id, name }) => <ServerListItem key={id} id={id} name={name} />)}
</ListGroup> </ListGroup>
)} )}
</React.Fragment> </div>
); );
ServersListGroup.propTypes = propTypes; ServersListGroup.propTypes = propTypes;

View file

@ -0,0 +1,32 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Link } from 'react-router-dom';
import Message from '../../utils/Message';
import ServersListGroup from '../ServersListGroup';
import './ServerError.scss';
const propTypes = {
type: PropTypes.oneOf([ 'not-found', 'not-reachable' ]).isRequired,
};
export const ServerError = ({ type }) => (
<div className="server-error-container flex-column">
<div className="row w-100">
<Message type="error">
{type === 'not-found' && 'Could not find this Shlink server.'}
{type === 'not-reachable' && (
<React.Fragment>
<p>Oops! Could not connect to this Shlink server.</p>
Make sure you have internet connection, and the server is properly configured and on-line.
</React.Fragment>
)}
</Message>
</div>
<ServersListGroup servers={[]} className="mt-3 mt-md-5">
These are the {type === 'not-reachable' ? 'other' : ''} servers currently configured. Choose one of
them or <Link to="/server/create">add a new one</Link>.
</ServersListGroup>
</div>
);
ServerError.propTypes = propTypes;

View file

@ -0,0 +1,6 @@
.server-error-container {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
}

View file

@ -1,12 +1,24 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
export const serverType = PropTypes.shape({ const regularServerType = PropTypes.shape({
id: PropTypes.string, id: PropTypes.string,
name: PropTypes.string, name: PropTypes.string,
url: PropTypes.string, url: PropTypes.string,
apiKey: PropTypes.string, apiKey: PropTypes.string,
version: PropTypes.string, version: PropTypes.string,
printableVersion: PropTypes.string, printableVersion: PropTypes.string,
serverNotFound: PropTypes.bool,
serverNotReachable: PropTypes.bool,
}); });
const notFoundServerType = PropTypes.shape({
serverNotFound: PropTypes.bool.isRequired,
});
const notReachableServerType = PropTypes.shape({
serverNotReachable: PropTypes.bool.isRequired,
});
export const serverType = PropTypes.oneOfType([
regularServerType,
notFoundServerType,
notReachableServerType,
]);