2024-01-07 03:29:16 +03:00
|
|
|
|
import { AnimatePresence } from 'framer-motion';
|
|
|
|
|
|
2024-03-20 15:27:32 +03:00
|
|
|
|
import InfoError, { ErrorData } from '../info/InfoError';
|
|
|
|
|
import { CProps } from '../props';
|
|
|
|
|
import Loader from '../ui/Loader';
|
2024-04-01 11:13:50 +03:00
|
|
|
|
import AnimateFade from './AnimateFade';
|
2024-01-07 03:29:16 +03:00
|
|
|
|
|
2024-03-20 15:03:53 +03:00
|
|
|
|
interface DataLoaderProps extends CProps.AnimatedDiv {
|
2024-01-07 03:29:16 +03:00
|
|
|
|
id: string;
|
|
|
|
|
|
2024-03-20 15:03:53 +03:00
|
|
|
|
isLoading?: boolean;
|
2024-01-07 03:29:16 +03:00
|
|
|
|
error?: ErrorData;
|
|
|
|
|
hasNoData?: boolean;
|
|
|
|
|
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-20 15:03:53 +03:00
|
|
|
|
function DataLoader({ id, isLoading, hasNoData, error, children, ...restProps }: DataLoaderProps) {
|
2024-01-07 03:29:16 +03:00
|
|
|
|
return (
|
2024-04-01 21:45:10 +03:00
|
|
|
|
<AnimatePresence>
|
2024-01-07 03:29:16 +03:00
|
|
|
|
{isLoading ? <Loader key={`${id}-loader`} /> : null}
|
|
|
|
|
{error ? <InfoError key={`${id}-error`} error={error} /> : null}
|
2024-04-01 11:13:50 +03:00
|
|
|
|
<AnimateFade id={id} key={`${id}-data`} removeContent={isLoading || !!error || hasNoData} {...restProps}>
|
|
|
|
|
{children}
|
|
|
|
|
</AnimateFade>
|
2024-04-01 21:45:10 +03:00
|
|
|
|
<AnimateFade id={id} key={`${id}-no-data`} removeContent={isLoading || !!error || !hasNoData} {...restProps}>
|
2024-04-01 11:13:50 +03:00
|
|
|
|
Данные не загружены
|
|
|
|
|
</AnimateFade>
|
2024-01-07 03:29:16 +03:00
|
|
|
|
</AnimatePresence>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default DataLoader;
|