import React from "react"; import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "./ui/empty"; import { IconFolderCode, IconFileX, IconSearch, IconInbox, IconDatabaseOff, IconClipboardX, } from "@tabler/icons-react"; import { ArrowUpRightIcon } from "lucide-react"; interface NoDataProps { title?: string; description?: string; icon?: | "search" | "file" | "inbox" | "folder" | "database" | "clipboard" | React.ReactNode; action?: React.ReactNode; variant?: "default" | "outline" | "muted" | "gradient"; showLearnMore?: boolean; learnMoreHref?: string; learnMoreText?: string; } const NoData: React.FC = ({ title = "Nenhum resultado encontrado", description = "Não foram encontrados registros com os filtros informados. Tente ajustar os parâmetros de pesquisa.", icon = "search", action, variant = "outline", showLearnMore = false, learnMoreHref = "#", learnMoreText = "Saiba mais", }) => { const getIcon = () => { if (React.isValidElement(icon)) { return icon; } const iconClass = "h-10 w-10 text-slate-400"; switch (icon) { case "file": return ; case "inbox": return ; case "folder": return ; case "database": return ; case "clipboard": return ; case "search": default: return ; } }; const getVariantClasses = () => { const baseClasses = "min-h-[450px] w-full"; switch (variant) { case "outline": return `${baseClasses} border-2 border-dashed border-slate-200 bg-white`; case "muted": return `${baseClasses} bg-gradient-to-b from-slate-50/80 via-white to-white`; case "gradient": return `${baseClasses} bg-gradient-to-br from-slate-50 via-blue-50/30 to-white border border-slate-100`; default: return `${baseClasses} bg-white`; } }; return (
{getIcon()}
{title} {description}
{action && {action}} {showLearnMore && ( {learnMoreText} )}
); }; export default NoData;