Files
grungnet/src/components/map/MapTiles.js

179 lines
4.6 KiB
JavaScript
Raw Normal View History

import React, { useContext } from "react";
2020-10-01 15:05:30 +10:00
import { Flex, Box, Text, IconButton, Close, Label } from "theme-ui";
2020-04-25 00:42:23 +10:00
import SimpleBar from "simplebar-react";
import { useMedia } from "react-media";
2020-10-01 15:05:30 +10:00
import Case from "case";
import RemoveMapIcon from "../../icons/RemoveMapIcon";
import ResetMapIcon from "../../icons/ResetMapIcon";
2020-10-01 15:05:30 +10:00
import GroupIcon from "../../icons/GroupIcon";
import MapTile from "./MapTile";
import Link from "../Link";
import FilterBar from "../FilterBar";
import DatabaseContext from "../../contexts/DatabaseContext";
function MapTiles({
maps,
2020-10-01 15:05:30 +10:00
groups,
selectedMaps,
selectedMapStates,
onMapSelect,
onMapsRemove,
onMapsReset,
onMapAdd,
onMapEdit,
onDone,
selectMode,
onSelectModeChange,
2020-09-30 15:39:56 +10:00
search,
onSearchChange,
2020-10-01 15:05:30 +10:00
onMapsGroup,
}) {
const { databaseStatus } = useContext(DatabaseContext);
const isSmallScreen = useMedia({ query: "(max-width: 500px)" });
let hasMapState = false;
2020-09-30 13:58:43 +10:00
for (let state of selectedMapStates) {
if (
Object.values(state.tokens).length > 0 ||
state.mapDrawActions.length > 0 ||
state.fogDrawActions.length > 0
) {
hasMapState = true;
break;
}
}
let hasSelectedDefaultMap = false;
for (let map of selectedMaps) {
if (map.type === "default") {
hasSelectedDefaultMap = true;
break;
}
}
2020-10-01 15:05:30 +10:00
function mapToTile(map) {
const isSelected = selectedMaps.includes(map);
return (
<MapTile
key={map.id}
map={map}
isSelected={isSelected}
onMapSelect={onMapSelect}
onMapEdit={onMapEdit}
onDone={onDone}
large={isSmallScreen}
canEdit={
isSelected && selectMode === "single" && selectedMaps.length === 1
}
badges={[`${map.grid.size.x}x${map.grid.size.y}`]}
2020-10-01 15:05:30 +10:00
/>
);
}
const multipleSelected = selectedMaps.length > 1;
return (
<Box sx={{ position: "relative" }}>
<FilterBar
onFocus={() => onMapSelect()}
search={search}
onSearchChange={onSearchChange}
selectMode={selectMode}
onSelectModeChange={onSelectModeChange}
onAdd={onMapAdd}
addTitle="Add Map"
/>
2020-09-30 15:39:56 +10:00
<SimpleBar style={{ height: "400px" }}>
2020-04-25 00:42:23 +10:00
<Flex
p={2}
pb={4}
bg="muted"
2020-04-25 00:42:23 +10:00
sx={{
flexWrap: "wrap",
2020-04-25 00:42:23 +10:00
borderRadius: "4px",
2020-09-30 15:39:56 +10:00
minHeight: "400px",
2020-10-01 15:05:30 +10:00
alignContent: "flex-start",
2020-04-25 00:42:23 +10:00
}}
onClick={() => onMapSelect()}
2020-04-25 00:42:23 +10:00
>
2020-10-01 15:05:30 +10:00
{groups.map((group) => (
<React.Fragment key={group}>
<Label mx={1} mt={2}>
{Case.capital(group)}
</Label>
{maps[group].map(mapToTile)}
</React.Fragment>
))}
2020-04-25 00:42:23 +10:00
</Flex>
</SimpleBar>
{databaseStatus === "disabled" && (
<Box
sx={{
position: "absolute",
top: 0,
left: 0,
right: 0,
textAlign: "center",
}}
bg="highlight"
p={1}
>
<Text as="p" variant="body2">
2020-05-03 18:30:01 +10:00
Map saving is unavailable. See <Link to="/faq#saving">FAQ</Link> for
more information.
</Text>
</Box>
)}
{selectedMaps.length > 0 && (
<Flex
sx={{
position: "absolute",
bottom: 0,
left: 0,
right: 0,
justifyContent: "space-between",
}}
bg="overlay"
>
<Close
title="Clear Selection"
aria-label="Clear Selection"
onClick={() => onMapSelect()}
/>
<Flex>
<IconButton
2020-10-01 15:05:30 +10:00
aria-label={multipleSelected ? "Group Maps" : "Group Map"}
title={multipleSelected ? "Group Maps" : "Group Map"}
onClick={() => onMapsGroup()}
disabled={hasSelectedDefaultMap}
>
<GroupIcon />
</IconButton>
<IconButton
aria-label={multipleSelected ? "Reset Maps" : "Reset Map"}
title={multipleSelected ? "Reset Maps" : "Reset Map"}
onClick={() => onMapsReset()}
disabled={!hasMapState}
>
<ResetMapIcon />
</IconButton>
<IconButton
2020-10-01 15:05:30 +10:00
aria-label={multipleSelected ? "Remove Maps" : "Remove Map"}
title={multipleSelected ? "Remove Maps" : "Remove Map"}
onClick={() => onMapsRemove()}
2020-09-30 13:58:43 +10:00
disabled={hasSelectedDefaultMap}
>
<RemoveMapIcon />
</IconButton>
</Flex>
</Flex>
)}
</Box>
);
}
export default MapTiles;