import { useState } from 'react' import { IconChevronRight, IconDotsVertical } from '@tabler/icons-react' import ContextMenu from './ContextMenu.jsx' /** * MobileCardView - компонент для отображения табличных данных в виде карточек на мобильных * Поддерживает swipe gestures для действий */ function MobileCardView({ items, onItemClick, renderContent, // функция для рендера содержимого карточки actions // массив действий { label, icon, onClick, variant } }) { const [swipedItem, setSwipedItem] = useState(null) const [touchStart, setTouchStart] = useState(null) const [touchEnd, setTouchEnd] = useState(null) // минимальная дистанция свайпа в px const minSwipeDistance = 50 const onTouchStart = (e, item) => { setTouchEnd(null) setTouchStart(e.targetTouches[0].clientX) } const onTouchMove = (e, item) => { setTouchEnd(e.targetTouches[0].clientX) } const onTouchEnd = (item) => { if (!touchStart || !touchEnd) return const distance = touchStart - touchEnd const isLeftSwipe = distance > minSwipeDistance const isRightSwipe = distance < -minSwipeDistance if (isLeftSwipe) { setSwipedItem(item) } else if (isRightSwipe) { setSwipedItem(null) } } return (
{items.map((item, index) => { const isSwiped = swipedItem === item return (
onTouchStart(e, item)} onTouchMove={(e) => onTouchMove(e, item)} onTouchEnd={() => onTouchEnd(item)} onClick={() => !isSwiped && onItemClick && onItemClick(item)} >
{renderContent(item)}
{/* Меню действий */}
({ ...action, onClick: () => action.onClick(item) }))}>
{/* Swipe actions */} {isSwiped && (
{actions.slice(0, 2).map((action, idx) => { const Icon = action.icon return ( ) })}
)}
) })}
) } export default MobileCardView