Vercel/src/components/SwitcherItem.tsx
2025-03-24 23:45:15 -05:00

68 lines
1.5 KiB
TypeScript

import { clsx } from 'clsx/lite';
import { SHOULD_PREFETCH_ALL_LINKS } from '@/app/config';
import { ReactNode } from 'react';
import Spinner from './Spinner';
import LinkWithIconLoader from './LinkWithIconLoader';
export default function SwitcherItem({
icon,
title,
href,
className: classNameProp,
onClick,
active,
isInteractive = true,
noPadding,
prefetch = SHOULD_PREFETCH_ALL_LINKS,
}: {
icon: ReactNode
title?: string
href?: string
className?: string
onClick?: () => void
active?: boolean
isInteractive?: boolean
noPadding?: boolean
prefetch?: boolean
}) {
const className = clsx(
'flex items-center justify-center',
'w-[42px] h-full',
'py-0.5 px-1.5',
isInteractive && 'cursor-pointer',
isInteractive && 'hover:bg-gray-100/60 active:bg-gray-100',
isInteractive && 'dark:hover:bg-gray-900/75 dark:active:bg-gray-900',
active
? 'text-black dark:text-white'
: 'text-gray-400 dark:text-gray-600',
active
? 'hover:text-black dark:hover:text-white'
: 'hover:text-gray-700 dark:hover:text-gray-400',
classNameProp,
);
const renderIcon = () => noPadding
? icon
: <div className={clsx(
'w-[28px] h-[24px]',
'flex items-center justify-center',
)}>
{icon}
</div>;
return (
href
? <LinkWithIconLoader {...{
title,
href,
className,
prefetch,
icon: renderIcon(),
loader: <Spinner />,
}} />
: <div {...{ title, onClick, className }}>
{renderIcon()}
</div>
);
};