import React, { useState, useRef } from "react"; import { Grid, Flex, Box } from "theme-ui"; import { useSpring, animated } from "react-spring"; import { useDraggable } from "@dnd-kit/core"; import TokenImage from "./TokenImage"; import TokenBarToken from "./TokenBarToken"; import Draggable from "../drag/Draggable"; import Vector2 from "../../helpers/Vector2"; import GroupIcon from "../../icons/GroupIcon"; function TokenBarTokenGroup({ group, tokens, draggable }) { const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id: draggable && group.id, disabled: !draggable, }); const [isOpen, setIsOpen] = useState(false); const { height } = useSpring({ height: isOpen ? (tokens.length + 1) * 56 : 56, }); function renderToken(token) { if (draggable) { return ( ); } else { return ; } } function renderTokens() { if (isOpen) { return ( handleOpenClick(e, false)} key="group" title={group.name} {...listeners} {...attributes} > {tokens.map(renderToken)} ); } else { return ( {tokens.slice(0, 4).map((token) => ( ))} ); } } // Reject the opening of a group if the pointer has moved const clickDownPositionRef = useRef(new Vector2(0, 0)); function handleOpenDown(event) { clickDownPositionRef.current = new Vector2(event.clientX, event.clientY); } function handleOpenClick(event, newOpen) { const clickPosition = new Vector2(event.clientX, event.clientY); const distance = Vector2.distance( clickPosition, clickDownPositionRef.current ); if (distance < 5) { setIsOpen(newOpen); } } return ( !isOpen && handleOpenClick(e, true)} > {renderTokens()} ); } export default TokenBarTokenGroup;