import { ChevronRight, Loader } from 'lucide-react' import Link from 'next/link' import React, { cloneElement, PropsWithChildren } from 'react' import { cn } from 'ui' interface CardButtonProps { title?: string | React.ReactNode description?: string footer?: React.ReactNode url?: string linkHref?: string imgUrl?: string imgAlt?: string onClick?: () => void icon?: React.ReactNode loading?: boolean className?: string fixedHeight?: boolean hideChevron?: boolean titleClass?: string containerElement?: React.ReactNode } // Define separate interfaces for each type of container interface LinkContainerProps extends Omit, 'title'> { href: string } interface UrlContainerProps extends Omit, 'title'> { href: string } interface NonLinkContainerProps extends Omit, 'title'> {} interface ButtonContainerProps extends Omit< React.ButtonHTMLAttributes, 'title' > {} // Union of all container props type ContainerProps = | LinkContainerProps | UrlContainerProps | NonLinkContainerProps | ButtonContainerProps const CardButton = ({ title, description, children, footer, url = '', linkHref = '', imgUrl, imgAlt, icon, className, loading = false, fixedHeight = true, hideChevron = false, titleClass = '', containerElement, ...props }: PropsWithChildren) => { const isLink = url || linkHref || props.onClick let Container: React.ElementType let containerProps: ContainerProps = {} const ContainerComponentOverride = containerElement && React.isValidElement(containerElement) ? (props: any) => cloneElement(containerElement, { ...props }) : undefined if (props.onClick) { Container = ContainerComponentOverride ?? 'button' containerProps = props } else if (linkHref) { Container = ContainerComponentOverride ?? Link containerProps = { href: linkHref, ...props, } } else if (url) { Container = ContainerComponentOverride ?? 'a' containerProps = { href: url, ...props, } } else { Container = ContainerComponentOverride ?? 'div' containerProps = props } let containerClasses = [ 'group relative text-left', 'bg-surface-100', 'border border-surface', 'rounded-md p-5 flex flex-row', 'transition ease-in-out duration-150', ] if (isLink) { containerClasses = [ ...containerClasses, 'cursor-pointer', 'hover:bg-surface-200', 'hover:border-control', ] } if (fixedHeight) { containerClasses = [...containerClasses, 'min-h-32 md:min-h-44'] } const ImageContainer = ({ children }: { children: React.ReactNode }) => { return
{children}
} const contents = ( <> {imgUrl && ( {`${imgAlt}`} )} {icon && {icon}}
{typeof title === 'string' ? (
{title}
) : ( title )} {(children || description) && (

{description}

{children && children}
)} {footer &&
{footer}
}
{isLink && (
{loading ? : !hideChevron ? : <>}
)} ) return ( {contents} ) } export default CardButton