| import { Link, LinkProps } from 'react-router-dom'; | |
| import { FC, ReactNode, useEffect, useRef } from 'react'; | |
| import { classNames } from '@/shared/lib/classNames/classNames'; | |
| import cls from './AppLink.module.scss'; | |
| export enum AppLinkTheme { | |
| PRIMARY = 'primary', | |
| NAVIGATION = 'navigation', | |
| } | |
| export enum AppLinkSize { | |
| XL = 'xl', | |
| L = 'l', | |
| M = 'm', | |
| S = 's', | |
| XS = 'xs', | |
| } | |
| interface AppLinkProps extends LinkProps { | |
| className?: string; | |
| theme?: AppLinkTheme; | |
| icon?: ReactNode; | |
| reverse?: boolean; | |
| width?: string; | |
| size?: AppLinkSize; | |
| } | |
| export const AppLink: FC<AppLinkProps> = props => { | |
| const { to, className, children, reverse, theme = '', icon, width = 'auto', size = '', ...otherProps } = props; | |
| const $link = useRef<HTMLAnchorElement | null>(null); | |
| useEffect(() => { | |
| if ($link.current) $link.current.style.setProperty('--custom-width', width); | |
| }, []); | |
| const mods = { | |
| [cls.reverse]: reverse, | |
| }; | |
| return ( | |
| <Link to={to} className={classNames(cls.AppLink, mods, [className, cls[theme], cls[size]])} ref={$link} {...otherProps}> | |
| {icon && <span className={classNames(cls.icon, { [cls.mr12]: !!icon }, [])}>{icon}</span>} | |
| {children && <span className={cls.text}>{children}</span>} | |
| </Link> | |
| ); | |
| }; | |