Updated select tool to take edit permissions into account

This commit is contained in:
Mitchell McCaffrey 2021-08-05 14:36:57 +10:00
parent e044a7cd4b
commit 17defb0aec
5 changed files with 54 additions and 23 deletions

View File

@ -151,8 +151,7 @@ function Map({
onMapNoteCreate, onMapNoteCreate,
onMapNoteChange, onMapNoteChange,
onMapNoteRemove, onMapNoteRemove,
selectedToolId, selectedToolId
!!(map?.owner === userId || mapState?.editFlags.includes("notes"))
); );
const { selectionTool, selectionMenu, selectionDragOverlay } = const { selectionTool, selectionMenu, selectionDragOverlay } =

View File

@ -42,6 +42,8 @@ type MapSelectProps = {
onSelectionMenuOpen: (open: boolean) => void; onSelectionMenuOpen: (open: boolean) => void;
onSelectionDragStart: () => void; onSelectionDragStart: () => void;
onSelectionDragEnd: () => void; onSelectionDragEnd: () => void;
disabledTokens: Record<string, boolean>;
disabledNotes: Record<string, boolean>;
}; };
function SelectTool({ function SelectTool({
@ -53,6 +55,8 @@ function SelectTool({
onSelectionMenuOpen, onSelectionMenuOpen,
onSelectionDragStart, onSelectionDragStart,
onSelectionDragEnd, onSelectionDragEnd,
disabledTokens,
disabledNotes,
}: MapSelectProps) { }: MapSelectProps) {
const stageScale = useDebouncedStageScale(); const stageScale = useDebouncedStageScale();
const mapWidth = useMapWidth(); const mapWidth = useMapWidth();
@ -192,7 +196,10 @@ function SelectTool({
const tokens = tokensGroup.children; const tokens = tokensGroup.children;
if (tokens) { if (tokens) {
for (let token of tokens) { for (let token of tokens) {
if (intersection.intersects(token.position())) { if (
!(token.id() in disabledTokens) &&
intersection.intersects(token.position())
) {
intersectingItems.push({ type: "token", id: token.id() }); intersectingItems.push({ type: "token", id: token.id() });
} }
} }
@ -200,7 +207,10 @@ function SelectTool({
const notes = notesGroup.children; const notes = notesGroup.children;
if (notes) { if (notes) {
for (let note of notes) { for (let note of notes) {
if (intersection.intersects(note.position())) { if (
!(note.id() in disabledNotes) &&
intersection.intersects(note.position())
) {
intersectingItems.push({ type: "note", id: note.id() }); intersectingItems.push({ type: "note", id: note.id() });
} }
} }

View File

@ -4,6 +4,7 @@ import { useState } from "react";
import NoteDragOverlay from "../components/note/NoteDragOverlay"; import NoteDragOverlay from "../components/note/NoteDragOverlay";
import NoteMenu from "../components/note/NoteMenu"; import NoteMenu from "../components/note/NoteMenu";
import NoteTool from "../components/tools/NoteTool"; import NoteTool from "../components/tools/NoteTool";
import { useUserId } from "../contexts/UserIdContext";
import { import {
NoteChangeEventHandler, NoteChangeEventHandler,
NoteCreateEventHander, NoteCreateEventHander,
@ -19,13 +20,18 @@ function useMapNotes(
onNoteCreate: NoteCreateEventHander, onNoteCreate: NoteCreateEventHander,
onNoteChange: NoteChangeEventHandler, onNoteChange: NoteChangeEventHandler,
onNoteRemove: NoteRemoveEventHander, onNoteRemove: NoteRemoveEventHander,
selectedToolId: MapToolId, selectedToolId: MapToolId
allowNoteEditing: boolean
) { ) {
const userId = useUserId();
const allowNoteEditing = !!(
map?.owner === userId || mapState?.editFlags.includes("notes")
);
const [isNoteMenuOpen, setIsNoteMenuOpen] = useState<boolean>(false); const [isNoteMenuOpen, setIsNoteMenuOpen] = useState<boolean>(false);
const [noteMenuOptions, setNoteMenuOptions] = useState<NoteMenuOptions>(); const [noteMenuOptions, setNoteMenuOptions] = useState<NoteMenuOptions>();
const [noteDraggingOptions, setNoteDraggingOptions] = const [noteDraggingOptions, setNoteDraggingOptions] =
useState<NoteDraggingOptions>(); useState<NoteDraggingOptions>();
function handleNoteMenuOpen(noteId: string, noteNode: Konva.Node) { function handleNoteMenuOpen(noteId: string, noteNode: Konva.Node) {
setNoteMenuOptions({ noteId, noteNode }); setNoteMenuOptions({ noteId, noteNode });
setIsNoteMenuOpen(true); setIsNoteMenuOpen(true);

View File

@ -2,6 +2,7 @@ import { useEffect, useState } from "react";
import SelectionDragOverlay from "../components/selection/SelectionDragOverlay"; import SelectionDragOverlay from "../components/selection/SelectionDragOverlay";
import SelectionMenu from "../components/selection/SelectionMenu"; import SelectionMenu from "../components/selection/SelectionMenu";
import SelectTool from "../components/tools/SelectTool"; import SelectTool from "../components/tools/SelectTool";
import { useUserId } from "../contexts/UserIdContext";
import { import {
SelectionItemsChangeEventHandler, SelectionItemsChangeEventHandler,
SelectionItemsCreateEventHandler, SelectionItemsCreateEventHandler,
@ -21,6 +22,24 @@ function useMapSelection(
selectedToolId: MapToolId, selectedToolId: MapToolId,
settings: SelectToolSettings settings: SelectToolSettings
) { ) {
const userId = useUserId();
const disabledTokens: Record<string, boolean> = {};
const disabledNotes: Record<string, boolean> = {};
if (mapState && map && map.owner !== userId) {
if (!mapState.editFlags.includes("tokens")) {
for (let token of Object.values(mapState.tokens)) {
if (token.owner !== userId) {
disabledTokens[token.id] = true;
}
}
}
if (!mapState.editFlags.includes("notes")) {
for (let note of Object.values(mapState.notes)) {
disabledNotes[note.id] = true;
}
}
}
const [isSelectionMenuOpen, setIsSelectionMenuOpen] = const [isSelectionMenuOpen, setIsSelectionMenuOpen] =
useState<boolean>(false); useState<boolean>(false);
const [isSelectionDragging, setIsSelectionDragging] = useState(false); const [isSelectionDragging, setIsSelectionDragging] = useState(false);
@ -72,6 +91,8 @@ function useMapSelection(
onSelectionMenuOpen={handleSelectionMenuOpen} onSelectionMenuOpen={handleSelectionMenuOpen}
onSelectionDragStart={handleSelectionDragStart} onSelectionDragStart={handleSelectionDragStart}
onSelectionDragEnd={handleSelectionDragEnd} onSelectionDragEnd={handleSelectionDragEnd}
disabledTokens={disabledTokens}
disabledNotes={disabledNotes}
/> />
); );

View File

@ -27,27 +27,22 @@ function useMapTokens(
onTokenStateRemove: TokenStateRemoveHandler, onTokenStateRemove: TokenStateRemoveHandler,
selectedToolId: MapToolId selectedToolId: MapToolId
) { ) {
const [isTokenMenuOpen, setIsTokenMenuOpen] = useState<boolean>(false);
const [tokenMenuOptions, setTokenMenuOptions] = useState<TokenMenuOptions>();
const [tokenDraggingOptions, setTokenDraggingOptions] =
useState<TokenDraggingOptions>();
const userId = useUserId(); const userId = useUserId();
const disabledTokens: Record<string, boolean> = {}; const disabledTokens: Record<string, boolean> = {};
// If we have a map and state and have the token permission disabled if (mapState && map) {
// and are not the map owner if (!mapState.editFlags.includes("tokens") && map.owner !== userId) {
if (
mapState &&
!mapState.editFlags.includes("tokens") &&
map?.owner !== userId
) {
for (let token of Object.values(mapState.tokens)) { for (let token of Object.values(mapState.tokens)) {
if (token.owner !== userId) { if (token.owner !== userId) {
disabledTokens[token.id] = true; disabledTokens[token.id] = true;
} }
} }
} }
}
const [isTokenMenuOpen, setIsTokenMenuOpen] = useState<boolean>(false);
const [tokenMenuOptions, setTokenMenuOptions] = useState<TokenMenuOptions>();
const [tokenDraggingOptions, setTokenDraggingOptions] =
useState<TokenDraggingOptions>();
function handleTokenMenuOpen(tokenStateId: string, tokenImage: Konva.Node) { function handleTokenMenuOpen(tokenStateId: string, tokenImage: Konva.Node) {
setTokenMenuOptions({ tokenStateId, tokenImage }); setTokenMenuOptions({ tokenStateId, tokenImage });