umami/src/components/common/LoadingPanel.tsx

37 lines
973 B
TypeScript
Raw Normal View History

2024-08-09 08:09:54 +00:00
import { ReactNode } from 'react';
import classNames from 'classnames';
import { Loading } from 'react-basics';
2024-08-17 06:42:26 +00:00
import ErrorMessage from 'components/common/ErrorMessage';
2024-08-09 08:09:54 +00:00
import Empty from 'components/common/Empty';
2024-08-17 06:42:26 +00:00
import styles from './LoadingPanel.module.css';
2024-08-09 08:09:54 +00:00
export function LoadingPanel({
data,
error,
isFetched,
isLoading,
loadingIcon = 'dots',
className,
children,
}: {
data?: any;
error?: Error;
isFetched?: boolean;
isLoading?: boolean;
loadingIcon?: 'dots' | 'spinner';
isEmpty?: boolean;
className?: string;
children: ReactNode;
}) {
2024-08-09 22:02:48 +00:00
const isEmpty = !isLoading && isFetched && data && Array.isArray(data) && data.length === 0;
2024-08-09 08:09:54 +00:00
return (
<div className={classNames(styles.panel, className)}>
2024-08-17 06:42:26 +00:00
{isLoading && !isFetched && <Loading className={styles.loading} icon={loadingIcon} />}
2024-08-09 08:09:54 +00:00
{error && <ErrorMessage />}
{!error && isEmpty && <Empty />}
{!error && !isEmpty && data && children}
</div>
);
}