diff --git a/src/components/Tile.js b/src/components/Tile.js index 66d5ddc..5e7714d 100644 --- a/src/components/Tile.js +++ b/src/components/Tile.js @@ -10,18 +10,37 @@ function Tile({ onSelect, onEdit, onDoubleClick, - large, + size, canEdit, badges, editTitle, }) { + let width; + let margin; + switch (size) { + case "small": + width = "24%"; + margin = "0.5%"; + break; + case "medium": + width = "32%"; + margin = `${2 / 3}%`; + break; + case "large": + width = "48%"; + margin = "1%"; + break; + default: + width = "32%"; + margin = `${2 / 3}%`; + } return ( { e.stopPropagation(); @@ -126,7 +145,7 @@ Tile.defaultProps = { onSelect: () => {}, onEdit: () => {}, onDoubleClick: () => {}, - large: false, + size: "medium", canEdit: false, badges: [], editTitle: "Edit", diff --git a/src/components/map/MapEditor.js b/src/components/map/MapEditor.js index d1e046a..d6b22d2 100644 --- a/src/components/map/MapEditor.js +++ b/src/components/map/MapEditor.js @@ -8,6 +8,7 @@ import usePreventOverscroll from "../../helpers/usePreventOverscroll"; import useStageInteraction from "../../helpers/useStageInteraction"; import useImageCenter from "../../helpers/useImageCenter"; import { getMapDefaultInset, getMapMaxZoom } from "../../helpers/map"; +import useResponsiveLayout from "../../helpers/useResponsiveLayout"; import { MapInteractionProvider } from "../../contexts/MapInteractionContext"; import KeyboardContext from "../../contexts/KeyboardContext"; @@ -104,11 +105,14 @@ function MapEditor({ map, onSettingsChange }) { map.grid.inset.topLeft.y !== defaultInset.topLeft.y || map.grid.inset.bottomRight.x !== defaultInset.bottomRight.x || map.grid.inset.bottomRight.y !== defaultInset.bottomRight.y; + + const layout = useResponsiveLayout(); + return ( onMapSelect(map)} onEdit={() => onMapEdit(map.id)} onDoubleClick={onDone} - large={large} + size={size} canEdit={canEdit} badges={badges} editTitle="Edit Map" diff --git a/src/components/map/MapTiles.js b/src/components/map/MapTiles.js index 3e7f3f1..296ec1a 100644 --- a/src/components/map/MapTiles.js +++ b/src/components/map/MapTiles.js @@ -1,7 +1,6 @@ import React, { useContext } from "react"; import { Flex, Box, Text, IconButton, Close, Label } from "theme-ui"; import SimpleBar from "simplebar-react"; -import { useMedia } from "react-media"; import Case from "case"; import RemoveMapIcon from "../../icons/RemoveMapIcon"; @@ -14,6 +13,8 @@ import FilterBar from "../FilterBar"; import DatabaseContext from "../../contexts/DatabaseContext"; +import useResponsiveLayout from "../../helpers/useResponsiveLayout"; + function MapTiles({ maps, groups, @@ -32,7 +33,7 @@ function MapTiles({ onMapsGroup, }) { const { databaseStatus } = useContext(DatabaseContext); - const isSmallScreen = useMedia({ query: "(max-width: 500px)" }); + const layout = useResponsiveLayout(); let hasMapState = false; for (let state of selectedMapStates) { @@ -61,7 +62,7 @@ function MapTiles({ onMapSelect={onMapSelect} onMapEdit={onMapEdit} onDone={onDone} - large={isSmallScreen} + size={layout.tileSize} canEdit={ isSelected && selectMode === "single" && selectedMaps.length === 1 } @@ -83,7 +84,9 @@ function MapTiles({ onAdd={onMapAdd} addTitle="Add Map" /> - + onMapSelect()} diff --git a/src/components/token/TokenPreview.js b/src/components/token/TokenPreview.js index ef1d165..6ff8f29 100644 --- a/src/components/token/TokenPreview.js +++ b/src/components/token/TokenPreview.js @@ -8,6 +8,7 @@ import usePreventOverscroll from "../../helpers/usePreventOverscroll"; import useStageInteraction from "../../helpers/useStageInteraction"; import useDataSource from "../../helpers/useDataSource"; import useImageCenter from "../../helpers/useImageCenter"; +import useResponsiveLayout from "../../helpers/useResponsiveLayout"; import GridOnIcon from "../../icons/GridOnIcon"; import GridOffIcon from "../../icons/GridOffIcon"; @@ -78,11 +79,13 @@ function TokenPreview({ token }) { 1 ); + const layout = useResponsiveLayout(); + return ( onTokenSelect(token)} onEdit={() => onTokenEdit(token.id)} - large={large} + size={size} canEdit={canEdit} badges={badges} editTitle="Edit Token" diff --git a/src/components/token/TokenTiles.js b/src/components/token/TokenTiles.js index 932ce81..e0b735c 100644 --- a/src/components/token/TokenTiles.js +++ b/src/components/token/TokenTiles.js @@ -15,6 +15,8 @@ import FilterBar from "../FilterBar"; import DatabaseContext from "../../contexts/DatabaseContext"; +import useResponsiveLayout from "../../helpers/useResponsiveLayout"; + function TokenTiles({ tokens, groups, @@ -31,7 +33,7 @@ function TokenTiles({ onTokensHide, }) { const { databaseStatus } = useContext(DatabaseContext); - const isSmallScreen = useMedia({ query: "(max-width: 500px)" }); + const layout = useResponsiveLayout(); let hasSelectedDefaultToken = selectedTokens.some( (token) => token.type === "default" @@ -47,7 +49,7 @@ function TokenTiles({ isSelected={isSelected} onTokenSelect={onTokenSelect} onTokenEdit={onTokenEdit} - large={isSmallScreen} + size={layout.tileSize} canEdit={ isSelected && token.type !== "default" && @@ -87,7 +89,9 @@ function TokenTiles({ onAdd={onTokenAdd} addTitle="Add Token" /> - + onTokenSelect()} diff --git a/src/helpers/useResponsiveLayout.js b/src/helpers/useResponsiveLayout.js new file mode 100644 index 0000000..cb9e583 --- /dev/null +++ b/src/helpers/useResponsiveLayout.js @@ -0,0 +1,27 @@ +import { useMedia } from "react-media"; + +function useResponsiveLayout() { + const isMediumScreen = useMedia({ query: "(min-width: 500px)" }); + const isLargeScreen = useMedia({ query: "(min-width: 1500px)" }); + const screenSize = isLargeScreen + ? "large" + : isMediumScreen + ? "medium" + : "small"; + + const modalSize = isLargeScreen + ? "842px" + : isMediumScreen + ? "642px" + : "500px"; + + const tileSize = isLargeScreen + ? "small" + : isMediumScreen + ? "medium" + : "large"; + + return { screenSize, modalSize, tileSize }; +} + +export default useResponsiveLayout; diff --git a/src/modals/EditMapModal.js b/src/modals/EditMapModal.js index da46b01..e25d2ff 100644 --- a/src/modals/EditMapModal.js +++ b/src/modals/EditMapModal.js @@ -9,6 +9,7 @@ import MapDataContext from "../contexts/MapDataContext"; import { isEmpty } from "../helpers/shared"; import { getMapDefaultInset } from "../helpers/map"; +import useResponsiveLayout from "../helpers/useResponsiveLayout"; function EditMapModal({ isOpen, onDone, map, mapState }) { const { updateMap, updateMapState } = useContext(MapDataContext); @@ -98,11 +99,13 @@ function EditMapModal({ isOpen, onDone, map, mapState }) { const [showMoreSettings, setShowMoreSettings] = useState(true); + const layout = useResponsiveLayout(); + return ( diff --git a/src/modals/SelectMapModal.js b/src/modals/SelectMapModal.js index 27195c2..e10ec74 100644 --- a/src/modals/SelectMapModal.js +++ b/src/modals/SelectMapModal.js @@ -17,6 +17,7 @@ import useKeyboard from "../helpers/useKeyboard"; import { resizeImage } from "../helpers/image"; import { useSearch, useGroup, handleItemSelect } from "../helpers/select"; import { getMapDefaultInset, getGridSize, gridSizeVaild } from "../helpers/map"; +import useResponsiveLayout from "../helpers/useResponsiveLayout"; import MapDataContext from "../contexts/MapDataContext"; import AuthContext from "../contexts/AuthContext"; @@ -346,11 +347,13 @@ function SelectMapModal({ }; }, []); + const layout = useResponsiveLayout(); + return (