import React from 'react'; import { useCommonTranslations } from '@/hooks/useCommonTranslations'; import { getIconClasses } from '@/lib/icons'; import { spacing } from '@/lib/spacing'; import Badge from '@/components/ui/Badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import Spinner from '@/components/ui/Spinner'; interface DataCardProps { title: string; data?: T[] | null; count?: number; isLoading?: boolean; error?: Error | null; emptyMessage?: string; loadingMessage?: string; errorMessage?: string; countBadge?: boolean; children?: (data: T[]) => React.ReactNode; renderItem?: (item: T, index: number) => React.ReactNode; } function DataCard({ title, data, count, isLoading = false, error, emptyMessage, loadingMessage, errorMessage, countBadge = true, children, renderItem, }: DataCardProps) { const { common } = useCommonTranslations(); const defaultEmptyMessage = common.noData; const defaultLoadingMessage = common.loading; const defaultErrorMessage = common.error; return (
{title} {countBadge && count !== undefined && !isLoading && !error && ( {count} )}
{isLoading ? (
{loadingMessage || defaultLoadingMessage}
) : error ? (

{errorMessage || defaultErrorMessage}

{error.message}

) : !data || data.length === 0 ? (

{emptyMessage || defaultEmptyMessage}

) : children ? ( children(data) ) : renderItem ? (
{data.map((item, index) => renderItem(item, index))}
) : null}
); } export default React.memo(DataCard) as (props: DataCardProps) => React.JSX.Element;