prometheus
44 строки · 1.2 Кб
1import React, { FC, ComponentType } from 'react';
2import { Alert } from 'reactstrap';
3import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4import { faSpinner } from '@fortawesome/free-solid-svg-icons';
5
6interface StatusIndicatorProps {
7error?: Error;
8isLoading?: boolean;
9customErrorMsg?: JSX.Element;
10componentTitle?: string;
11}
12
13export const withStatusIndicator =
14<T extends Record<string, any>>( // eslint-disable-line @typescript-eslint/no-explicit-any
15Component: ComponentType<T>
16): FC<StatusIndicatorProps & T> =>
17({ error, isLoading, customErrorMsg, componentTitle, ...rest }) => {
18if (error) {
19return (
20<Alert color="danger">
21{customErrorMsg ? (
22customErrorMsg
23) : (
24<>
25<strong>Error:</strong> Error fetching {componentTitle || Component.displayName}: {error.message}
26</>
27)}
28</Alert>
29);
30}
31
32if (isLoading) {
33return (
34<FontAwesomeIcon
35size="3x"
36icon={faSpinner}
37spin
38className="position-absolute"
39style={{ transform: 'translate(-50%, -50%)', top: '50%', left: '50%' }}
40/>
41);
42}
43return <Component {...(rest as T)} />;
44};
45