Spaces:
Build error
Build error
| import { Tooltip } from "@heroui/react"; | |
| import React, { ReactNode } from "react"; | |
| import { NavLink } from "react-router"; | |
| import { cn } from "#/utils/utils"; | |
| export interface TooltipButtonProps { | |
| children: ReactNode; | |
| tooltip: string; | |
| onClick?: () => void; | |
| href?: string; | |
| navLinkTo?: string; | |
| ariaLabel: string; | |
| testId?: string; | |
| className?: React.HTMLAttributes<HTMLButtonElement>["className"]; | |
| disabled?: boolean; | |
| } | |
| export function TooltipButton({ | |
| children, | |
| tooltip, | |
| onClick, | |
| href, | |
| navLinkTo, | |
| ariaLabel, | |
| testId, | |
| className, | |
| disabled = false, | |
| }: TooltipButtonProps) { | |
| const handleClick = (e: React.MouseEvent) => { | |
| if (onClick && !disabled) { | |
| onClick(); | |
| e.preventDefault(); | |
| } | |
| }; | |
| const buttonContent = ( | |
| <button | |
| type="button" | |
| aria-label={ariaLabel} | |
| data-testid={testId} | |
| onClick={handleClick} | |
| className={cn( | |
| "hover:opacity-80", | |
| disabled && "opacity-50 cursor-not-allowed", | |
| className, | |
| )} | |
| disabled={disabled} | |
| > | |
| {children} | |
| </button> | |
| ); | |
| let content; | |
| if (navLinkTo && !disabled) { | |
| content = ( | |
| <NavLink | |
| to={navLinkTo} | |
| onClick={handleClick} | |
| className={({ isActive }) => | |
| cn( | |
| "hover:opacity-80", | |
| isActive ? "text-white" : "text-[#9099AC]", | |
| className, | |
| ) | |
| } | |
| aria-label={ariaLabel} | |
| data-testid={testId} | |
| > | |
| {children} | |
| </NavLink> | |
| ); | |
| } else if (navLinkTo && disabled) { | |
| // If disabled and has navLinkTo, render a button that looks like a NavLink but doesn't navigate | |
| content = ( | |
| <button | |
| type="button" | |
| aria-label={ariaLabel} | |
| data-testid={testId} | |
| className={cn( | |
| "text-[#9099AC]", | |
| "opacity-50 cursor-not-allowed", | |
| className, | |
| )} | |
| disabled | |
| > | |
| {children} | |
| </button> | |
| ); | |
| } else if (href && !disabled) { | |
| content = ( | |
| <a | |
| href={href} | |
| target="_blank" | |
| rel="noreferrer noopener" | |
| className={cn("hover:opacity-80", className)} | |
| aria-label={ariaLabel} | |
| data-testid={testId} | |
| > | |
| {children} | |
| </a> | |
| ); | |
| } else if (href && disabled) { | |
| // If disabled and has href, render a button that looks like a link but doesn't navigate | |
| content = ( | |
| <button | |
| type="button" | |
| aria-label={ariaLabel} | |
| data-testid={testId} | |
| className={cn("opacity-50 cursor-not-allowed", className)} | |
| disabled | |
| > | |
| {children} | |
| </button> | |
| ); | |
| } else { | |
| content = buttonContent; | |
| } | |
| return ( | |
| <Tooltip content={tooltip} closeDelay={100} placement="right"> | |
| {content} | |
| </Tooltip> | |
| ); | |
| } | |