From d053bb48f33da4a416161af2e12abc5c66b9c739 Mon Sep 17 00:00:00 2001 From: Mitchell McCaffrey Date: Tue, 25 May 2021 18:07:10 +1000 Subject: [PATCH] Add group support for token bar --- src/components/token/TokenBar.js | 49 ++++++++--- .../token/{ListToken.js => TokenBarToken.js} | 4 +- src/components/token/TokenBarTokenGroup.js | 84 +++++++++++++++++++ 3 files changed, 123 insertions(+), 14 deletions(-) rename src/components/token/{ListToken.js => TokenBarToken.js} (90%) create mode 100644 src/components/token/TokenBarTokenGroup.js diff --git a/src/components/token/TokenBar.js b/src/components/token/TokenBar.js index acfb395..b914644 100644 --- a/src/components/token/TokenBar.js +++ b/src/components/token/TokenBar.js @@ -4,8 +4,10 @@ import { Box, Flex } from "theme-ui"; import SimpleBar from "simplebar-react"; import { DragOverlay, DndContext } from "@dnd-kit/core"; -import ListToken from "./ListToken"; +import TokenBarToken from "./TokenBarToken"; +import TokenBarTokenGroup from "./TokenBarTokenGroup"; import SelectTokensButton from "./SelectTokensButton"; + import Draggable from "../drag/Draggable"; import useSetting from "../../hooks/useSetting"; @@ -36,15 +38,38 @@ function TokenBar({ onMapTokenStateCreate }) { onMapTokenStateCreate(tokenState); } } - const tokens = tokenGroups - .map((group) => tokensById[group.id]) - // TODO: Add group support - .filter((token) => token && !token.hideInSidebar) - .map((token) => ( - - - - )); + + function renderTokens() { + let tokens = []; + for (let group of tokenGroups) { + if (group.type === "item") { + const token = tokensById[group.id]; + if (token && !token.hideInSidebar) { + tokens.push( + + + + ); + } + } else { + const groupTokens = []; + for (let item of group.items) { + const token = tokensById[item.id]; + if (token && !token.hideInSidebar) { + groupTokens.push(token); + } + } + tokens.push( + + ); + } + } + return tokens; + } return ( - {tokens} + {renderTokens()} {createPortal( - {dragId && } + {dragId && } , document.body )} diff --git a/src/components/token/ListToken.js b/src/components/token/TokenBarToken.js similarity index 90% rename from src/components/token/ListToken.js rename to src/components/token/TokenBarToken.js index c9ae6df..f6dd70f 100644 --- a/src/components/token/ListToken.js +++ b/src/components/token/TokenBarToken.js @@ -5,7 +5,7 @@ import usePreventTouch from "../../hooks/usePreventTouch"; import TokenImage from "./TokenImage"; -function ListToken({ token }) { +function TokenBarToken({ token }) { const imageRef = useRef(); // Stop touch to prevent 3d touch gesutre on iOS usePreventTouch(imageRef); @@ -29,4 +29,4 @@ function ListToken({ token }) { ); } -export default ListToken; +export default TokenBarToken; diff --git a/src/components/token/TokenBarTokenGroup.js b/src/components/token/TokenBarTokenGroup.js new file mode 100644 index 0000000..4499f45 --- /dev/null +++ b/src/components/token/TokenBarTokenGroup.js @@ -0,0 +1,84 @@ +import React, { useState } from "react"; +import { Grid, Flex } from "theme-ui"; +import { useSpring, animated } from "react-spring"; + +import TokenImage from "./TokenImage"; +import TokenBarToken from "./TokenBarToken"; + +import Draggable from "../drag/Draggable"; + +import GroupIcon from "../../icons/GroupIcon"; + +function TokenBarTokenGroup({ group, tokens }) { + const [isOpen, setIsOpen] = useState(false); + + const { height } = useSpring({ + height: isOpen ? (tokens.length + 1) * 56 : 56, + }); + + function renderTokens() { + if (isOpen) { + return ( + <> + setIsOpen(false)} + key="group" + alt={group.name} + title={group.name} + > + + + {tokens.map((token) => ( + + + + ))} + + ); + } else { + return tokens.slice(0, 4).map((token) => ( + + )); + } + } + + return ( + !isOpen && setIsOpen(true)} + > + + {renderTokens()} + + + ); +} + +export default TokenBarTokenGroup;