import cn from 'classnames'; import mergeRefs from 'merge-refs'; import { forwardRef, KeyboardEvent, KeyboardEventHandler, MouseEvent, ReactElement, ReactNode, useCallback, useRef, } from 'react'; import { PromoTagProps } from '@snack-uikit/promo-tag'; import { Typography } from '@snack-uikit/typography'; import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils'; import { SIZE, TEST_IDS } from '../../constants'; import { CardContext } from '../../context'; import { Check, FunctionBadgeWrapper, PromoBadge } from '../../helperComponents'; import { Size } from '../../types'; import { HeaderProps } from '../Header'; import { TRIGGER_CLICK_KEY_CODES } from './constants'; import styles from './styles.module.scss'; export type CardProps = WithSupportProps<{ /** Управление состоянием интерактивности */ disabled?: boolean; /** Управление состоянием выбран/не выбран */ checked?: boolean; /** Имя инпута в dom-дереве */ name?: string; /** Управление состоянием наличия обводки */ outline?: boolean; /** Отображение галочки для режима массового выделения карточек */ multipleSelection?: boolean; /** Колбек на клик по карточке */ onClick?(e: MouseEvent): void; /** Размер */ size?: Size; /** PromoBadge */ promoBadge?: Pick | string; /** Вложенный контент */ children?: ReactNode; /** Вложенный Header */ header?: ReactElement; /** Вложенный Footer */ footer?: ReactNode; /** Вложенный Image */ image?: ReactNode; /** Вложенный FunctionBadge */ functionBadge?: ReactNode; /** CSS-класс для элемента с контентом */ className?: string; /** Ссылка карточки */ href?: string; /** Всегда показывать FunctionBadge */ badgeAlwaysVisible?: boolean; /** Колбек нажатия клавиши клавиатуры */ onKeyDown?: KeyboardEventHandler; }>; export const Card = forwardRef( ( { onClick, disabled = false, checked, outline, multipleSelection = false, size = SIZE.M, children, header, footer, functionBadge, promoBadge, image, className, href, onKeyDown: onKeyDownProp, name, badgeAlwaysVisible, ...rest }, ref, ) => { const localDivRef = useRef(null); const localAnchorRef = useRef(null); const onKeyDown = useCallback( (e: KeyboardEvent) => { if (e.target === localDivRef.current) { if (TRIGGER_CLICK_KEY_CODES.includes(e.code) || e.key === ' ') { href ? localAnchorRef.current?.click() : localDivRef.current?.click(); } onKeyDownProp?.(e); } }, [href, onKeyDownProp], ); const supportProps = extractSupportProps(rest); return ( {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */} ); }, );