import { useState } from "react"; import { Box } from "theme-ui"; import { useToasts } from "react-toast-notifications"; import MapControls from "./MapControls"; import MapInteraction from "./MapInteraction"; import MapGrid from "./MapGrid"; import DrawingTool from "../tools/DrawingTool"; import FogTool from "../tools/FogTool"; import MeasureTool from "../tools/MeasureTool"; import NetworkedMapPointer from "../../network/NetworkedMapPointer"; import { useSettings } from "../../contexts/SettingsContext"; import { useUserId } from "../../contexts/UserIdContext"; import Action from "../../actions/Action"; import { AddStatesAction, CutFogAction, EditStatesAction, RemoveStatesAction, } from "../../actions"; import Session from "../../network/Session"; import { Drawing, DrawingState } from "../../types/Drawing"; import { Fog, FogState } from "../../types/Fog"; import { Map as MapType, MapToolId } from "../../types/Map"; import { MapState } from "../../types/MapState"; import { Settings } from "../../types/Settings"; import { MapChangeEventHandler, MapResetEventHandler, TokenStateRemoveHandler, NoteChangeEventHandler, NoteRemoveEventHander, TokenStateChangeEventHandler, NoteCreateEventHander, SelectionItemsChangeEventHandler, SelectionItemsRemoveEventHandler, SelectionItemsCreateEventHandler, TokensStateCreateHandler, } from "../../types/Events"; import useMapTokens from "../../hooks/useMapTokens"; import useMapNotes from "../../hooks/useMapNotes"; import { MapActions } from "../../hooks/useMapActions"; import useMapSelection from "../../hooks/useMapSelection"; type MapProps = { map: MapType | null; mapState: MapState | null; mapActions: MapActions; onMapTokenStateChange: TokenStateChangeEventHandler; onMapTokenStateRemove: TokenStateRemoveHandler; onMapTokensStateCreate: TokensStateCreateHandler; onSelectionItemsChange: SelectionItemsChangeEventHandler; onSelectionItemsRemove: SelectionItemsRemoveEventHandler; onSelectionItemsCreate: SelectionItemsCreateEventHandler; onMapChange: MapChangeEventHandler; onMapReset: MapResetEventHandler; onMapDraw: (action: Action) => void; onFogDraw: (action: Action) => void; onMapNoteCreate: NoteCreateEventHander; onMapNoteChange: NoteChangeEventHandler; onMapNoteRemove: NoteRemoveEventHander; allowMapChange: boolean; session: Session; onUndo: () => void; onRedo: () => void; }; function Map({ map, mapState, mapActions, onMapTokenStateChange, onMapTokenStateRemove, onMapTokensStateCreate, onSelectionItemsChange, onSelectionItemsRemove, onSelectionItemsCreate, onMapChange, onMapReset, onMapDraw, onFogDraw, onMapNoteCreate, onMapNoteChange, onMapNoteRemove, allowMapChange, session, onUndo, onRedo, }: MapProps) { const { addToast } = useToasts(); const userId = useUserId(); const [selectedToolId, setSelectedToolId] = useState("move"); const { settings, setSettings } = useSettings(); function handleToolSettingChange(change: Partial) { setSettings((prevSettings) => ({ ...prevSettings, ...change, })); } const drawShapes = Object.values(mapState?.drawings || {}); const fogShapes = Object.values(mapState?.fogs || {}); function handleToolAction(action: string) { if (action === "eraseAll") { onMapDraw(new RemoveStatesAction(drawShapes.map((s) => s.id))); } } function handleMapShapeAdd(shape: Drawing) { onMapDraw(new AddStatesAction([shape])); } function handleMapShapesRemove(shapeIds: string[]) { onMapDraw(new RemoveStatesAction(shapeIds)); } function handleFogShapesAdd(shapes: Fog[]) { onFogDraw(new AddStatesAction(shapes)); } function handleFogShapesCut(shapes: Fog[]) { onFogDraw(new CutFogAction(shapes)); } function handleFogShapesRemove(shapeIds: string[]) { onFogDraw(new RemoveStatesAction(shapeIds)); } function handleFogShapesEdit(shapes: Partial[]) { onFogDraw(new EditStatesAction(shapes)); } const { tokens, propTokens, tokenMenu, tokenDragOverlay } = useMapTokens( map, mapState, onMapTokenStateChange, onMapTokenStateRemove, onMapTokensStateCreate, selectedToolId ); const { notes, noteMenu, noteDragOverlay } = useMapNotes( map, mapState, onMapNoteCreate, onMapNoteChange, onMapNoteRemove, selectedToolId ); const { selectionTool, selectionMenu, selectionDragOverlay } = useMapSelection( map, mapState, onSelectionItemsChange, onSelectionItemsRemove, onSelectionItemsCreate, selectedToolId, settings.select ); return ( {tokenMenu} {noteMenu} {selectionMenu} {tokenDragOverlay} {noteDragOverlay} {selectionDragOverlay} } selectedToolId={selectedToolId} onSelectedToolChange={setSelectedToolId} > {map && map.showGrid && } {propTokens} {notes} {tokens} {selectionTool} ); } export default Map;