2020-11-03 16:21:39 +11:00
|
|
|
import React, { useContext, useState, useEffect } from "react";
|
2020-11-03 17:15:39 +11:00
|
|
|
import shortid from "shortid";
|
|
|
|
|
import { Group } from "react-konva";
|
2020-11-03 16:21:39 +11:00
|
|
|
|
|
|
|
|
import MapInteractionContext from "../../contexts/MapInteractionContext";
|
|
|
|
|
import MapStageContext from "../../contexts/MapStageContext";
|
2020-11-03 17:15:39 +11:00
|
|
|
import AuthContext from "../../contexts/AuthContext";
|
2020-11-03 16:21:39 +11:00
|
|
|
|
|
|
|
|
import { getBrushPositionForTool } from "../../helpers/drawing";
|
|
|
|
|
import { getRelativePointerPositionNormalized } from "../../helpers/konva";
|
|
|
|
|
|
2020-11-03 17:15:39 +11:00
|
|
|
import MapNote from "./MapNote";
|
|
|
|
|
|
2020-11-03 16:21:39 +11:00
|
|
|
const defaultNoteSize = 2;
|
|
|
|
|
|
2020-11-03 17:15:39 +11:00
|
|
|
function MapNotes({
|
|
|
|
|
map,
|
|
|
|
|
selectedToolSettings,
|
|
|
|
|
active,
|
|
|
|
|
gridSize,
|
|
|
|
|
onNoteAdd,
|
|
|
|
|
notes,
|
|
|
|
|
}) {
|
|
|
|
|
const { interactionEmitter } = useContext(MapInteractionContext);
|
|
|
|
|
const { userId } = useContext(AuthContext);
|
2020-11-03 16:21:39 +11:00
|
|
|
const mapStageRef = useContext(MapStageContext);
|
|
|
|
|
const [isBrushDown, setIsBrushDown] = useState(false);
|
2020-11-03 17:15:39 +11:00
|
|
|
const [noteData, setNoteData] = useState(null);
|
2020-11-03 16:21:39 +11:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!active) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const mapStage = mapStageRef.current;
|
|
|
|
|
|
|
|
|
|
function getBrushPosition() {
|
|
|
|
|
const mapImage = mapStage.findOne("#mapImage");
|
|
|
|
|
return getBrushPositionForTool(
|
|
|
|
|
map,
|
|
|
|
|
getRelativePointerPositionNormalized(mapImage),
|
|
|
|
|
map.snapToGrid,
|
|
|
|
|
false,
|
|
|
|
|
gridSize,
|
|
|
|
|
[]
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleBrushDown() {
|
2020-11-03 17:15:39 +11:00
|
|
|
const brushPosition = getBrushPosition();
|
|
|
|
|
setNoteData({
|
|
|
|
|
x: brushPosition.x,
|
|
|
|
|
y: brushPosition.y,
|
|
|
|
|
size: defaultNoteSize,
|
|
|
|
|
text: "",
|
|
|
|
|
id: shortid.generate(),
|
|
|
|
|
lastModified: Date.now(),
|
|
|
|
|
lastModifiedBy: userId,
|
|
|
|
|
visible: true,
|
|
|
|
|
locked: false,
|
|
|
|
|
});
|
2020-11-03 16:21:39 +11:00
|
|
|
setIsBrushDown(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleBrushMove() {
|
2020-11-03 17:15:39 +11:00
|
|
|
const brushPosition = getBrushPosition();
|
|
|
|
|
setNoteData((prev) => ({
|
|
|
|
|
...prev,
|
|
|
|
|
x: brushPosition.x,
|
|
|
|
|
y: brushPosition.y,
|
|
|
|
|
}));
|
2020-11-03 16:21:39 +11:00
|
|
|
setIsBrushDown(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleBrushUp() {
|
2020-11-03 17:15:39 +11:00
|
|
|
onNoteAdd(noteData);
|
|
|
|
|
setNoteData(null);
|
2020-11-03 16:21:39 +11:00
|
|
|
setIsBrushDown(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interactionEmitter.on("dragStart", handleBrushDown);
|
|
|
|
|
interactionEmitter.on("drag", handleBrushMove);
|
|
|
|
|
interactionEmitter.on("dragEnd", handleBrushUp);
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
interactionEmitter.off("dragStart", handleBrushDown);
|
|
|
|
|
interactionEmitter.off("drag", handleBrushMove);
|
|
|
|
|
interactionEmitter.off("dragEnd", handleBrushUp);
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Group>
|
2020-11-03 17:15:39 +11:00
|
|
|
{notes.map((note) => (
|
|
|
|
|
<MapNote note={note} map={map} key={note.id} />
|
|
|
|
|
))}
|
|
|
|
|
{isBrushDown && noteData && <MapNote note={noteData} map={map} />}
|
2020-11-03 16:21:39 +11:00
|
|
|
</Group>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default MapNotes;
|