beta/src/components/Layout/Sidebar/SidebarLink.tsx (75 lines of code) (raw):
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*/
/* eslint-disable jsx-a11y/no-static-element-interactions */
/* eslint-disable jsx-a11y/click-events-have-key-events */
import * as React from 'react';
import scrollIntoView from 'scroll-into-view-if-needed';
import cn from 'classnames';
import {IconNavArrow} from 'components/Icon/IconNavArrow';
import Link from 'next/link';
import {useIsMobile} from '../useMediaQuery';
interface SidebarLinkProps {
href: string;
selected?: boolean;
title: string;
level: number;
icon?: React.ReactNode;
heading?: boolean;
isExpanded?: boolean;
isBreadcrumb?: boolean;
hideArrow?: boolean;
}
export function SidebarLink({
href,
selected = false,
title,
level,
heading = false,
isExpanded,
isBreadcrumb,
hideArrow,
}: SidebarLinkProps) {
const ref = React.useRef<HTMLAnchorElement>(null);
const isMobile = useIsMobile();
React.useEffect(() => {
if (ref && ref.current && !!selected && !isMobile) {
scrollIntoView(ref.current, {
scrollMode: 'if-needed',
block: 'center',
inline: 'nearest',
});
}
}, [ref, selected, isMobile]);
return (
<Link href={href}>
<a
ref={ref}
title={title}
aria-current={selected ? 'page' : undefined}
className={cn(
'p-2 pr-2 w-full rounded-none lg:rounded-r-lg text-left hover:bg-gray-5 dark:hover:bg-gray-80 relative flex items-center justify-between',
{
'my-6': heading,
'text-primary dark:text-primary-dark': heading && !isBreadcrumb,
'text-sm pl-6': level > 0,
'pl-5': level < 2,
'text-base font-bold': level === 0,
'dark:text-primary-dark text-primary ': level === 0 && !selected,
'text-base text-link dark:text-link-dark': level === 1 && selected,
'dark:text-primary-dark text-primary': heading,
'text-base text-secondary dark:text-secondary-dark':
!selected && !heading,
'text-base text-link dark:text-link-dark bg-highlight dark:bg-highlight-dark border-blue-40 hover:bg-highlight hover:text-link dark:hover:bg-highlight-dark dark:hover:text-link-dark':
selected,
}
)}>
{title}
{isExpanded != null && !heading && !hideArrow && (
<span
className={cn('pr-1', {
'text-link': isExpanded,
'text-gray-30': !isExpanded,
})}>
<IconNavArrow displayDirection={isExpanded ? 'down' : 'right'} />
</span>
)}
</a>
</Link>
);
}