Portal/rsconcept/frontend/src/components/wrap/DataLoader.tsx

42 lines
1.0 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
import InfoError, { ErrorData } from '../info/InfoError';
import { CProps } from '../props';
import Loader from '../ui/Loader';
import AnimateFade from './AnimateFade';
interface DataLoaderProps extends CProps.AnimatedDiv {
id: string;
isLoading?: boolean;
error?: ErrorData;
hasNoData?: boolean;
}
2024-09-19 17:48:48 +03:00
function DataLoader({
id,
isLoading,
hasNoData,
error,
className,
children,
...restProps
}: React.PropsWithChildren<DataLoaderProps>) {
2024-06-07 20:17:03 +03:00
return (
2024-12-11 14:59:04 +03:00
<>
2024-06-07 20:17:03 +03:00
{!isLoading && !error && !hasNoData ? (
2024-07-19 20:42:54 +03:00
<AnimateFade id={id} key={`${id}-data`} className={className} {...restProps}>
2024-06-07 20:17:03 +03:00
{children}
</AnimateFade>
) : null}
{!isLoading && !error && hasNoData ? (
2024-07-19 20:42:54 +03:00
<AnimateFade key={`${id}-no-data`} className='w-full text-center p-1' {...restProps}>
2024-06-07 20:17:03 +03:00
Данные не загружены
</AnimateFade>
) : null}
{isLoading ? <Loader key={`${id}-loader`} /> : null}
{error ? <InfoError key={`${id}-error`} error={error} /> : null}
2024-12-11 14:59:04 +03:00
</>
2024-06-07 20:17:03 +03:00
);
}
export default DataLoader;