ConceptPortal-public/rsconcept/frontend/src/components/wrap/DataLoader.tsx

34 lines
1.0 KiB
TypeScript
Raw Normal View History

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 (
<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>
<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;