2021-02-06 13:32:38 +11:00
|
|
|
import React, { useState } from "react";
|
2021-05-06 15:04:53 +10:00
|
|
|
import { Box } from "theme-ui";
|
2021-06-14 11:57:08 +10:00
|
|
|
import { useToasts } from "react-toast-notifications";
|
2020-03-19 17:33:57 +11:00
|
|
|
|
2020-04-18 23:31:40 +10:00
|
|
|
import MapControls from "./MapControls";
|
2020-04-27 17:29:46 +10:00
|
|
|
import MapInteraction from "./MapInteraction";
|
2021-02-08 16:53:56 +11:00
|
|
|
import MapTokens from "./MapTokens";
|
2020-04-18 18:11:21 +10:00
|
|
|
import MapDrawing from "./MapDrawing";
|
2020-04-28 22:05:47 +10:00
|
|
|
import MapFog from "./MapFog";
|
2020-05-31 16:25:05 +10:00
|
|
|
import MapGrid from "./MapGrid";
|
2020-06-26 12:23:06 +10:00
|
|
|
import MapMeasure from "./MapMeasure";
|
2020-07-28 17:59:26 +10:00
|
|
|
import NetworkedMapPointer from "../../network/NetworkedMapPointer";
|
2020-11-03 16:21:39 +11:00
|
|
|
import MapNotes from "./MapNotes";
|
2020-03-20 13:33:12 +11:00
|
|
|
|
2021-02-06 13:32:38 +11:00
|
|
|
import { useTokenData } from "../../contexts/TokenDataContext";
|
|
|
|
|
import { useSettings } from "../../contexts/SettingsContext";
|
2020-04-27 17:29:46 +10:00
|
|
|
|
2020-05-21 16:46:50 +10:00
|
|
|
import TokenMenu from "../token/TokenMenu";
|
2020-05-21 22:57:44 +10:00
|
|
|
import TokenDragOverlay from "../token/TokenDragOverlay";
|
2020-11-05 14:41:33 +11:00
|
|
|
import NoteMenu from "../note/NoteMenu";
|
|
|
|
|
import NoteDragOverlay from "../note/NoteDragOverlay";
|
2020-04-19 13:33:31 +10:00
|
|
|
|
2021-02-04 09:11:27 +11:00
|
|
|
import {
|
|
|
|
|
AddShapeAction,
|
|
|
|
|
CutShapeAction,
|
|
|
|
|
EditShapeAction,
|
|
|
|
|
RemoveShapeAction,
|
|
|
|
|
} from "../../actions";
|
2021-06-02 17:49:31 +10:00
|
|
|
import { Fog, Path, Shape } from "../../helpers/drawing";
|
|
|
|
|
import Session from "../../network/Session";
|
|
|
|
|
import { Grid } from "../../helpers/grid";
|
|
|
|
|
import { ImageFile } from "../../helpers/image";
|
|
|
|
|
|
2021-06-03 15:31:18 +10:00
|
|
|
export type Resolutions = Record<string, ImageFile>
|
2021-06-02 17:49:31 +10:00
|
|
|
export type Map = {
|
|
|
|
|
id: string,
|
|
|
|
|
name: string,
|
|
|
|
|
owner: string,
|
2021-06-03 15:31:18 +10:00
|
|
|
file?: Uint8Array,
|
|
|
|
|
quality?: string,
|
|
|
|
|
resolutions?: Resolutions,
|
2021-06-02 17:49:31 +10:00
|
|
|
grid: Grid,
|
|
|
|
|
group: string,
|
|
|
|
|
width: number,
|
|
|
|
|
height: number,
|
|
|
|
|
type: string,
|
|
|
|
|
lastUsed: number,
|
|
|
|
|
lastModified: number,
|
|
|
|
|
created: number,
|
|
|
|
|
showGrid: boolean,
|
|
|
|
|
snapToGrid: boolean,
|
2021-06-03 15:31:18 +10:00
|
|
|
thumbnail?: ImageFile,
|
2021-06-02 17:49:31 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type Note = {
|
|
|
|
|
id: string,
|
|
|
|
|
color: string,
|
|
|
|
|
lastModified: number,
|
|
|
|
|
lastModifiedBy: string,
|
|
|
|
|
locked: boolean,
|
|
|
|
|
size: number,
|
|
|
|
|
text: string,
|
|
|
|
|
textOnly: boolean,
|
|
|
|
|
visible: boolean,
|
|
|
|
|
x: number,
|
|
|
|
|
y: number,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type TokenState = {
|
|
|
|
|
id: string,
|
|
|
|
|
tokenId: string,
|
|
|
|
|
owner: string,
|
|
|
|
|
size: number,
|
|
|
|
|
label: string,
|
|
|
|
|
status: string[],
|
|
|
|
|
x: number,
|
|
|
|
|
y: number,
|
|
|
|
|
lastModifiedBy: string,
|
|
|
|
|
lastModified: number,
|
|
|
|
|
rotation: number,
|
|
|
|
|
locked: boolean,
|
|
|
|
|
visible: boolean
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface PathId extends Path {
|
|
|
|
|
id: string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface ShapeId extends Shape {
|
|
|
|
|
id: string
|
|
|
|
|
}
|
|
|
|
|
export type MapState = {
|
|
|
|
|
tokens: Record<string, TokenState>,
|
|
|
|
|
drawShapes: PathId | ShapeId,
|
|
|
|
|
fogShapes: Fog[],
|
2021-06-03 15:31:18 +10:00
|
|
|
editFlags: ["drawing", "tokens", "notes", "fog"],
|
2021-06-02 17:49:31 +10:00
|
|
|
notes: Note[],
|
|
|
|
|
mapId: string,
|
|
|
|
|
}
|
2020-03-20 13:33:12 +11:00
|
|
|
|
2020-03-20 18:06:24 +11:00
|
|
|
function Map({
|
2020-04-23 11:54:29 +10:00
|
|
|
map,
|
2020-04-23 17:23:34 +10:00
|
|
|
mapState,
|
2021-02-04 09:11:27 +11:00
|
|
|
mapActions,
|
2020-04-24 18:39:11 +10:00
|
|
|
onMapTokenStateChange,
|
|
|
|
|
onMapTokenStateRemove,
|
2020-04-13 00:24:03 +10:00
|
|
|
onMapChange,
|
2021-02-22 17:14:12 +11:00
|
|
|
onMapReset,
|
2020-04-19 15:15:48 +10:00
|
|
|
onMapDraw,
|
2020-04-30 09:29:16 +10:00
|
|
|
onMapDrawUndo,
|
|
|
|
|
onMapDrawRedo,
|
2020-04-28 22:05:47 +10:00
|
|
|
onFogDraw,
|
2020-04-30 09:29:16 +10:00
|
|
|
onFogDrawUndo,
|
|
|
|
|
onFogDrawRedo,
|
2020-11-04 15:03:34 +11:00
|
|
|
onMapNoteChange,
|
2020-11-05 14:41:33 +11:00
|
|
|
onMapNoteRemove,
|
2020-04-29 21:12:57 +10:00
|
|
|
allowMapDrawing,
|
|
|
|
|
allowFogDrawing,
|
2020-07-17 15:57:52 +10:00
|
|
|
allowMapChange,
|
2020-11-05 16:21:52 +11:00
|
|
|
allowNoteEditing,
|
2020-04-30 15:12:34 +10:00
|
|
|
disabledTokens,
|
2020-07-28 17:59:26 +10:00
|
|
|
session,
|
2021-06-02 17:49:31 +10:00
|
|
|
}: {
|
|
|
|
|
map: any
|
|
|
|
|
mapState: MapState
|
|
|
|
|
mapActions: any,
|
|
|
|
|
onMapTokenStateChange: any,
|
|
|
|
|
onMapTokenStateRemove: any,
|
|
|
|
|
onMapChange: any,
|
|
|
|
|
onMapReset: any,
|
|
|
|
|
onMapDraw: any,
|
|
|
|
|
onMapDrawUndo: any,
|
|
|
|
|
onMapDrawRedo: any,
|
|
|
|
|
onFogDraw: any,
|
|
|
|
|
onFogDrawUndo: any,
|
|
|
|
|
onFogDrawRedo: any,
|
|
|
|
|
onMapNoteChange: any,
|
|
|
|
|
onMapNoteRemove: any,
|
|
|
|
|
allowMapDrawing: boolean,
|
|
|
|
|
allowFogDrawing: boolean,
|
|
|
|
|
allowMapChange: boolean,
|
|
|
|
|
allowNoteEditing: boolean,
|
|
|
|
|
disabledTokens: any,
|
|
|
|
|
session: Session
|
2020-03-20 18:06:24 +11:00
|
|
|
}) {
|
2021-06-14 11:57:08 +10:00
|
|
|
const { addToast } = useToasts();
|
|
|
|
|
|
2021-02-06 13:32:38 +11:00
|
|
|
const { tokensById } = useTokenData();
|
2020-03-20 21:46:52 +11:00
|
|
|
|
2021-02-22 15:32:35 +11:00
|
|
|
const [selectedToolId, setSelectedToolId] = useState("move");
|
2021-06-02 17:49:31 +10:00
|
|
|
const { settings, setSettings }: { settings: any, setSettings: any} = useSettings();
|
2020-04-29 20:55:52 +10:00
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleToolSettingChange(tool: any, change: any) {
|
|
|
|
|
setSettings((prevSettings: any) => ({
|
2020-04-27 17:29:46 +10:00
|
|
|
...prevSettings,
|
|
|
|
|
[tool]: {
|
|
|
|
|
...prevSettings[tool],
|
|
|
|
|
...change,
|
|
|
|
|
},
|
|
|
|
|
}));
|
|
|
|
|
}
|
2020-04-19 00:24:06 +10:00
|
|
|
|
2021-02-04 09:11:27 +11:00
|
|
|
const drawShapes = Object.values(mapState?.drawShapes || {});
|
|
|
|
|
const fogShapes = Object.values(mapState?.fogShapes || {});
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleToolAction(action: string) {
|
2020-04-29 20:55:52 +10:00
|
|
|
if (action === "eraseAll") {
|
2021-02-04 09:11:27 +11:00
|
|
|
onMapDraw(new RemoveShapeAction(drawShapes.map((s) => s.id)));
|
2020-04-29 20:55:52 +10:00
|
|
|
}
|
2020-04-30 09:29:16 +10:00
|
|
|
if (action === "mapUndo") {
|
|
|
|
|
onMapDrawUndo();
|
|
|
|
|
}
|
|
|
|
|
if (action === "mapRedo") {
|
|
|
|
|
onMapDrawRedo();
|
|
|
|
|
}
|
|
|
|
|
if (action === "fogUndo") {
|
|
|
|
|
onFogDrawUndo();
|
|
|
|
|
}
|
|
|
|
|
if (action === "fogRedo") {
|
|
|
|
|
onFogDrawRedo();
|
|
|
|
|
}
|
2020-04-29 20:55:52 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleMapShapeAdd(shape: Shape) {
|
2021-02-04 09:11:27 +11:00
|
|
|
onMapDraw(new AddShapeAction([shape]));
|
2020-04-19 13:33:31 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleMapShapesRemove(shapeIds: string[]) {
|
2021-02-04 09:11:27 +11:00
|
|
|
onMapDraw(new RemoveShapeAction(shapeIds));
|
2020-04-20 11:56:56 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleFogShapesAdd(shapes: Shape[]) {
|
2021-02-16 08:27:39 +11:00
|
|
|
onFogDraw(new AddShapeAction(shapes));
|
2020-04-28 22:05:47 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleFogShapesCut(shapes: Shape[]) {
|
2021-02-16 08:27:39 +11:00
|
|
|
onFogDraw(new CutShapeAction(shapes));
|
2020-06-09 12:45:52 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleFogShapesRemove(shapeIds: string[]) {
|
2021-02-04 09:11:27 +11:00
|
|
|
onFogDraw(new RemoveShapeAction(shapeIds));
|
2020-04-19 13:33:31 +10:00
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function handleFogShapesEdit(shapes: Shape[]) {
|
2021-02-04 09:11:27 +11:00
|
|
|
onFogDraw(new EditShapeAction(shapes));
|
2020-04-29 20:40:34 +10:00
|
|
|
}
|
|
|
|
|
|
2020-04-27 17:29:46 +10:00
|
|
|
const disabledControls = [];
|
2020-04-29 21:12:57 +10:00
|
|
|
if (!allowMapDrawing) {
|
2020-06-21 11:01:03 +10:00
|
|
|
disabledControls.push("drawing");
|
2020-04-29 21:32:23 +10:00
|
|
|
}
|
2020-04-23 11:54:29 +10:00
|
|
|
if (!map) {
|
2021-02-22 15:32:35 +11:00
|
|
|
disabledControls.push("move");
|
2020-06-26 12:23:06 +10:00
|
|
|
disabledControls.push("measure");
|
2020-07-28 17:59:26 +10:00
|
|
|
disabledControls.push("pointer");
|
2020-04-19 13:33:31 +10:00
|
|
|
}
|
2020-04-29 21:12:57 +10:00
|
|
|
if (!allowFogDrawing) {
|
|
|
|
|
disabledControls.push("fog");
|
|
|
|
|
}
|
2020-07-17 15:57:52 +10:00
|
|
|
if (!allowMapChange) {
|
|
|
|
|
disabledControls.push("map");
|
|
|
|
|
}
|
2020-11-05 16:21:52 +11:00
|
|
|
if (!allowNoteEditing) {
|
|
|
|
|
disabledControls.push("note");
|
|
|
|
|
}
|
2020-04-30 09:29:16 +10:00
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
const disabledSettings: { fog: any[], drawing: any[]} = { fog: [], drawing: [] };
|
2021-02-04 09:11:27 +11:00
|
|
|
if (drawShapes.length === 0) {
|
2020-06-21 11:01:03 +10:00
|
|
|
disabledSettings.drawing.push("erase");
|
|
|
|
|
}
|
2021-02-04 09:11:27 +11:00
|
|
|
if (!mapState || mapActions.mapDrawActionIndex < 0) {
|
2020-06-21 11:01:03 +10:00
|
|
|
disabledSettings.drawing.push("undo");
|
2020-04-30 09:29:16 +10:00
|
|
|
}
|
2020-04-27 17:29:46 +10:00
|
|
|
if (
|
|
|
|
|
!mapState ||
|
2021-02-04 09:11:27 +11:00
|
|
|
mapActions.mapDrawActionIndex === mapActions.mapDrawActions.length - 1
|
2020-04-27 17:29:46 +10:00
|
|
|
) {
|
2020-06-21 11:01:03 +10:00
|
|
|
disabledSettings.drawing.push("redo");
|
2020-04-30 09:29:16 +10:00
|
|
|
}
|
2021-02-04 09:11:27 +11:00
|
|
|
if (!mapState || mapActions.fogDrawActionIndex < 0) {
|
2020-04-30 09:29:16 +10:00
|
|
|
disabledSettings.fog.push("undo");
|
|
|
|
|
}
|
|
|
|
|
if (
|
|
|
|
|
!mapState ||
|
2021-02-04 09:11:27 +11:00
|
|
|
mapActions.fogDrawActionIndex === mapActions.fogDrawActions.length - 1
|
2020-04-30 09:29:16 +10:00
|
|
|
) {
|
|
|
|
|
disabledSettings.fog.push("redo");
|
2020-04-19 13:34:07 +10:00
|
|
|
}
|
2020-04-09 18:20:10 +10:00
|
|
|
|
2020-04-27 17:29:46 +10:00
|
|
|
const mapControls = (
|
|
|
|
|
<MapControls
|
|
|
|
|
onMapChange={onMapChange}
|
2021-02-22 17:14:12 +11:00
|
|
|
onMapReset={onMapReset}
|
2020-04-27 17:29:46 +10:00
|
|
|
currentMap={map}
|
2020-05-19 16:33:23 +10:00
|
|
|
currentMapState={mapState}
|
2020-04-27 17:29:46 +10:00
|
|
|
onSelectedToolChange={setSelectedToolId}
|
|
|
|
|
selectedToolId={selectedToolId}
|
2020-08-07 17:15:16 +10:00
|
|
|
toolSettings={settings}
|
2020-04-27 17:29:46 +10:00
|
|
|
onToolSettingChange={handleToolSettingChange}
|
2020-04-29 20:55:52 +10:00
|
|
|
onToolAction={handleToolAction}
|
2020-04-27 17:29:46 +10:00
|
|
|
disabledControls={disabledControls}
|
2020-04-30 09:29:16 +10:00
|
|
|
disabledSettings={disabledSettings}
|
2020-04-27 17:29:46 +10:00
|
|
|
/>
|
|
|
|
|
);
|
2020-05-21 16:46:50 +10:00
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
const [isTokenMenuOpen, setIsTokenMenuOpen]: [ isTokenMenuOpen: boolean, setIsTokenMenuOpen: React.Dispatch<React.SetStateAction<boolean>>] = useState<boolean>(false);
|
|
|
|
|
const [tokenMenuOptions, setTokenMenuOptions]: [ tokenMenuOptions: any, setTokenMenuOptions: any ] = useState({});
|
|
|
|
|
const [tokenDraggingOptions, setTokenDraggingOptions]: [ tokenDraggingOptions: any, setTokenDragginOptions: any ] = useState();
|
|
|
|
|
function handleTokenMenuOpen(tokenStateId: string, tokenImage: any) {
|
2020-05-21 16:46:50 +10:00
|
|
|
setTokenMenuOptions({ tokenStateId, tokenImage });
|
|
|
|
|
setIsTokenMenuOpen(true);
|
|
|
|
|
}
|
2020-04-19 13:33:31 +10:00
|
|
|
|
2020-09-11 17:30:44 +10:00
|
|
|
const mapTokens = map && mapState && (
|
2021-02-08 16:53:56 +11:00
|
|
|
<MapTokens
|
|
|
|
|
map={map}
|
|
|
|
|
mapState={mapState}
|
|
|
|
|
tokenDraggingOptions={tokenDraggingOptions}
|
|
|
|
|
setTokenDraggingOptions={setTokenDraggingOptions}
|
|
|
|
|
onMapTokenStateChange={onMapTokenStateChange}
|
|
|
|
|
handleTokenMenuOpen={handleTokenMenuOpen}
|
|
|
|
|
selectedToolId={selectedToolId}
|
|
|
|
|
disabledTokens={disabledTokens}
|
|
|
|
|
/>
|
2020-07-20 19:14:46 +10:00
|
|
|
);
|
2020-03-20 17:56:34 +11:00
|
|
|
|
2020-05-22 13:46:52 +10:00
|
|
|
const tokenMenu = (
|
2020-05-21 16:46:50 +10:00
|
|
|
<TokenMenu
|
|
|
|
|
isOpen={isTokenMenuOpen}
|
|
|
|
|
onRequestClose={() => setIsTokenMenuOpen(false)}
|
2020-05-22 22:17:30 +10:00
|
|
|
onTokenStateChange={onMapTokenStateChange}
|
2020-05-22 13:46:52 +10:00
|
|
|
tokenState={mapState && mapState.tokens[tokenMenuOptions.tokenStateId]}
|
2020-05-21 16:46:50 +10:00
|
|
|
tokenImage={tokenMenuOptions.tokenImage}
|
2020-08-27 17:30:17 +10:00
|
|
|
map={map}
|
2020-05-21 16:46:50 +10:00
|
|
|
/>
|
2020-04-13 00:24:03 +10:00
|
|
|
);
|
|
|
|
|
|
2020-11-05 14:41:33 +11:00
|
|
|
const tokenDragOverlay = tokenDraggingOptions && (
|
2020-05-21 22:57:44 +10:00
|
|
|
<TokenDragOverlay
|
2021-06-02 17:49:31 +10:00
|
|
|
onTokenStateRemove={(state: any) => {
|
2020-05-22 20:43:07 +10:00
|
|
|
onMapTokenStateRemove(state);
|
2020-11-05 14:41:33 +11:00
|
|
|
setTokenDraggingOptions(null);
|
2020-04-13 00:24:03 +10:00
|
|
|
}}
|
2020-05-22 20:43:07 +10:00
|
|
|
onTokenStateChange={onMapTokenStateChange}
|
2020-11-05 14:41:33 +11:00
|
|
|
tokenState={tokenDraggingOptions && tokenDraggingOptions.tokenState}
|
|
|
|
|
tokenGroup={tokenDraggingOptions && tokenDraggingOptions.tokenGroup}
|
|
|
|
|
dragging={!!(tokenDraggingOptions && tokenDraggingOptions.dragging)}
|
|
|
|
|
token={tokensById[tokenDraggingOptions.tokenState.tokenId]}
|
2020-05-21 22:57:44 +10:00
|
|
|
/>
|
2020-04-13 00:24:03 +10:00
|
|
|
);
|
|
|
|
|
|
2020-04-24 16:18:48 +10:00
|
|
|
const mapDrawing = (
|
|
|
|
|
<MapDrawing
|
2020-08-07 12:28:50 +10:00
|
|
|
map={map}
|
2021-02-04 09:11:27 +11:00
|
|
|
shapes={drawShapes}
|
2020-04-28 22:05:47 +10:00
|
|
|
onShapeAdd={handleMapShapeAdd}
|
2020-05-31 12:12:16 +10:00
|
|
|
onShapesRemove={handleMapShapesRemove}
|
2020-08-04 14:51:31 +10:00
|
|
|
active={selectedToolId === "drawing"}
|
2020-08-07 17:15:16 +10:00
|
|
|
toolSettings={settings.drawing}
|
2020-04-28 22:05:47 +10:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const mapFog = (
|
|
|
|
|
<MapFog
|
2020-08-07 12:28:50 +10:00
|
|
|
map={map}
|
2020-04-28 22:05:47 +10:00
|
|
|
shapes={fogShapes}
|
2021-02-16 08:27:39 +11:00
|
|
|
onShapesAdd={handleFogShapesAdd}
|
|
|
|
|
onShapesCut={handleFogShapesCut}
|
2020-05-31 12:12:16 +10:00
|
|
|
onShapesRemove={handleFogShapesRemove}
|
|
|
|
|
onShapesEdit={handleFogShapesEdit}
|
2021-06-14 11:57:08 +10:00
|
|
|
onShapeError={addToast}
|
2020-08-04 14:51:31 +10:00
|
|
|
active={selectedToolId === "fog"}
|
2020-08-07 17:15:16 +10:00
|
|
|
toolSettings={settings.fog}
|
2021-01-02 12:17:27 +11:00
|
|
|
editable={allowFogDrawing && !settings.fog.preview}
|
2020-04-24 16:18:48 +10:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-10-02 17:53:23 +10:00
|
|
|
const mapGrid = map && map.showGrid && <MapGrid map={map} />;
|
2020-05-31 16:25:05 +10:00
|
|
|
|
2020-06-26 12:23:06 +10:00
|
|
|
const mapMeasure = (
|
|
|
|
|
<MapMeasure
|
2020-08-07 12:28:50 +10:00
|
|
|
map={map}
|
2020-06-26 12:23:06 +10:00
|
|
|
active={selectedToolId === "measure"}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-07-28 17:59:26 +10:00
|
|
|
const mapPointer = (
|
|
|
|
|
<NetworkedMapPointer
|
|
|
|
|
active={selectedToolId === "pointer"}
|
|
|
|
|
session={session}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
const [isNoteMenuOpen, setIsNoteMenuOpen] = useState<boolean>(false);
|
|
|
|
|
const [noteMenuOptions, setNoteMenuOptions] = useState<any>({});
|
|
|
|
|
const [noteDraggingOptions, setNoteDraggingOptions]= useState<any>();
|
|
|
|
|
function handleNoteMenuOpen(noteId: string, noteNode: any) {
|
2020-11-04 15:03:34 +11:00
|
|
|
setNoteMenuOptions({ noteId, noteNode });
|
|
|
|
|
setIsNoteMenuOpen(true);
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-02 17:49:31 +10:00
|
|
|
function sortNotes(a: any, b: any, noteDraggingOptions: any) {
|
2020-11-05 15:39:56 +11:00
|
|
|
if (
|
|
|
|
|
noteDraggingOptions &&
|
|
|
|
|
noteDraggingOptions.dragging &&
|
|
|
|
|
noteDraggingOptions.noteId === a.id
|
|
|
|
|
) {
|
|
|
|
|
// If dragging token `a` move above
|
|
|
|
|
return 1;
|
|
|
|
|
} else if (
|
|
|
|
|
noteDraggingOptions &&
|
|
|
|
|
noteDraggingOptions.dragging &&
|
|
|
|
|
noteDraggingOptions.noteId === b.id
|
|
|
|
|
) {
|
|
|
|
|
// If dragging token `b` move above
|
|
|
|
|
return -1;
|
|
|
|
|
} else {
|
|
|
|
|
// Else sort so last modified is on top
|
|
|
|
|
return a.lastModified - b.lastModified;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-03 16:21:39 +11:00
|
|
|
const mapNotes = (
|
|
|
|
|
<MapNotes
|
|
|
|
|
map={map}
|
|
|
|
|
active={selectedToolId === "note"}
|
2020-11-04 15:03:34 +11:00
|
|
|
onNoteAdd={onMapNoteChange}
|
|
|
|
|
onNoteChange={onMapNoteChange}
|
2020-11-05 15:39:56 +11:00
|
|
|
notes={
|
|
|
|
|
mapState
|
|
|
|
|
? Object.values(mapState.notes).sort((a, b) =>
|
|
|
|
|
sortNotes(a, b, noteDraggingOptions)
|
|
|
|
|
)
|
|
|
|
|
: []
|
|
|
|
|
}
|
2020-11-04 15:03:34 +11:00
|
|
|
onNoteMenuOpen={handleNoteMenuOpen}
|
2020-11-05 16:21:52 +11:00
|
|
|
draggable={
|
|
|
|
|
allowNoteEditing &&
|
2021-02-22 15:32:35 +11:00
|
|
|
(selectedToolId === "note" || selectedToolId === "move")
|
2020-11-05 16:21:52 +11:00
|
|
|
}
|
2021-06-02 17:49:31 +10:00
|
|
|
onNoteDragStart={(e: any, noteId: any) =>
|
2020-11-05 14:41:33 +11:00
|
|
|
setNoteDraggingOptions({ dragging: true, noteId, noteGroup: e.target })
|
|
|
|
|
}
|
|
|
|
|
onNoteDragEnd={() =>
|
|
|
|
|
setNoteDraggingOptions({ ...noteDraggingOptions, dragging: false })
|
|
|
|
|
}
|
2021-01-28 16:26:28 +11:00
|
|
|
fadeOnHover={selectedToolId === "drawing"}
|
2020-11-04 15:03:34 +11:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const noteMenu = (
|
2020-11-05 14:41:33 +11:00
|
|
|
<NoteMenu
|
2020-11-04 15:03:34 +11:00
|
|
|
isOpen={isNoteMenuOpen}
|
|
|
|
|
onRequestClose={() => setIsNoteMenuOpen(false)}
|
|
|
|
|
onNoteChange={onMapNoteChange}
|
|
|
|
|
note={mapState && mapState.notes[noteMenuOptions.noteId]}
|
|
|
|
|
noteNode={noteMenuOptions.noteNode}
|
|
|
|
|
map={map}
|
2020-11-03 16:21:39 +11:00
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-11-05 14:41:33 +11:00
|
|
|
const noteDragOverlay = (
|
|
|
|
|
<NoteDragOverlay
|
|
|
|
|
dragging={!!(noteDraggingOptions && noteDraggingOptions.dragging)}
|
|
|
|
|
noteGroup={noteDraggingOptions && noteDraggingOptions.noteGroup}
|
|
|
|
|
noteId={noteDraggingOptions && noteDraggingOptions.noteId}
|
2021-06-02 17:49:31 +10:00
|
|
|
onNoteRemove={(noteId: any) => {
|
2020-11-05 14:41:33 +11:00
|
|
|
onMapNoteRemove(noteId);
|
|
|
|
|
setNoteDraggingOptions(null);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-03-19 17:33:57 +11:00
|
|
|
return (
|
2021-05-06 15:04:53 +10:00
|
|
|
<Box sx={{ flexGrow: 1 }}>
|
2021-05-13 16:27:07 +10:00
|
|
|
<MapInteraction
|
|
|
|
|
map={map}
|
|
|
|
|
mapState={mapState}
|
|
|
|
|
controls={
|
|
|
|
|
<>
|
|
|
|
|
{mapControls}
|
|
|
|
|
{tokenMenu}
|
|
|
|
|
{noteMenu}
|
|
|
|
|
{tokenDragOverlay}
|
|
|
|
|
{noteDragOverlay}
|
|
|
|
|
</>
|
|
|
|
|
}
|
|
|
|
|
selectedToolId={selectedToolId}
|
|
|
|
|
onSelectedToolChange={setSelectedToolId}
|
|
|
|
|
disabledControls={disabledControls}
|
|
|
|
|
>
|
|
|
|
|
{mapGrid}
|
|
|
|
|
{mapDrawing}
|
|
|
|
|
{mapNotes}
|
|
|
|
|
{mapTokens}
|
|
|
|
|
{mapFog}
|
|
|
|
|
{mapPointer}
|
|
|
|
|
{mapMeasure}
|
|
|
|
|
</MapInteraction>
|
2021-05-06 15:04:53 +10:00
|
|
|
</Box>
|
2020-03-19 17:33:57 +11:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Map;
|