| | |
| | | import React, { useState, useRef, useEffect, useMemo } from "react"; |
| | | import { useTranslate } from "react-admin"; |
| | | import { |
| | | TextField, |
| | | Select, |
| | |
| | | import Player from './player'; |
| | | import * as Tool from './tool'; |
| | | import { NotificationProvider, useNotification } from './Notification'; |
| | | import Insight from "./insight"; |
| | | import Device from "./Device"; |
| | | import Settings from "./settings"; |
| | | import * as Http from './http'; |
| | | import WebSocketClient from './websocket' |
| | | |
| | | let player; |
| | | let websocket; |
| | | |
| | | const Map = () => { |
| | | const notify = useNotification(); |
| | | const translate = useTranslate(); |
| | | const theme = useTheme(); |
| | | const themeMode = theme.palette.mode; |
| | | const notify = useNotification(); |
| | | |
| | | const mapRef = useRef(); |
| | | const contentRef = useRef(); |
| | |
| | | const [mapContainer, setMapContainer] = useState(null); |
| | | |
| | | const [mode, setMode] = useState(MapMode.OBSERVER_MODE); |
| | | const [deviceVisible, setDeviceVisible] = React.useState(false); |
| | | const [insightVisible, setInsightVisible] = useState(false); |
| | | const [deviceVisible, setDeviceVisible] = useState(false); |
| | | const [settingsVisible, setSettingsVisible] = useState(false); |
| | | |
| | | const [spriteSettings, setSpriteSettings] = useState(null); |
| | | const prevSpriteSettingsRef = React.useRef(); |
| | | |
| | | useEffect(() => { |
| | | Tool.patchRaLayout('0px'); |
| | |
| | | setMapContainer(player.mapContainer); |
| | | Tool.setApp(player.app); |
| | | Tool.setMapContainer(player.mapContainer); |
| | | Tool.setThemeMode(themeMode); |
| | | Http.setNotify(notify); |
| | | // websocket = new WebSocketClient('/ws/map/websocket'); |
| | | |
| | | await Http.fetchMapData(0); |
| | | // websocket.connect(); |
| | | // websocket.onMessage = (data) => { |
| | | // Tool.updateMapStatusInRealTime(data, () => curFloorRef.current, setCurSPrite); |
| | | // } |
| | | |
| | | } |
| | | initialize(); |
| | |
| | | handleResize(); |
| | | window.addEventListener('resize', handleResize); |
| | | |
| | | notify('Welcome to Rcs', 'info'); |
| | | notify.info('Welcome to Rcs'); |
| | | |
| | | return () => { |
| | | if (websocket) { |
| | | websocket.onMessage = () => { } |
| | | websocket.close(); |
| | | } |
| | | player.destroy(); |
| | | window.removeEventListener('resize', handleResize); |
| | | Tool.patchRaLayout(''); |
| | |
| | | }, [themeMode]) |
| | | |
| | | const switchMode = (mode) => { |
| | | Tool.removeSelectedEffect(); |
| | | |
| | | setDeviceVisible(false); |
| | | setSettingsVisible(false); |
| | | |
| | | setSpriteSettings(null); |
| | | |
| | | switch (mode) { |
| | | case MapMode.OBSERVER_MODE: |
| | | setDeviceVisible(false); |
| | | player.hideGridLines(); |
| | | player.hideStarryBackground(); |
| | | |
| | | player.activateMapMultiSelect((selectedSprites, restartFn) => { |
| | | console.log(selectedSprites); |
| | | }); |
| | | |
| | | break |
| | | case MapMode.MOVABLE_MODE: |
| | | player.showGridLines(); |
| | | player.hideStarryBackground(); |
| | | |
| | | player.activateMapMultiSelect((selectedSprites, restartFn) => { |
| | | Tool.spriteListBeMovable(selectedSprites, () => { |
| | | restartFn(); |
| | | }); |
| | | }); |
| | | break |
| | | case MapMode.SETTINGS_MODE: |
| | | setDeviceVisible(false); |
| | | player.hideGridLines(); |
| | | player.showStarryBackground(); // 0x2f68ac |
| | | |
| | | player.activateMapMultiSelect((selectedSprites, restartFn) => { |
| | | console.log(selectedSprites); |
| | | }); |
| | | |
| | | mapContainer.children.forEach(child => { |
| | | Tool.beSettings(child, setSpriteSettings); |
| | | }) |
| | | break |
| | | default: |
| | | break |
| | |
| | | return |
| | | } |
| | | switchMode(mode); |
| | | }, [mode]); |
| | | }, [mode, mapContainer]); |
| | | |
| | | const onDrop = (sprite, type, x, y) => { |
| | | const { mapX, mapY } = Tool.getRealPosition(x, y); |
| | | sprite.x = mapX; |
| | | sprite.y = mapY; |
| | | |
| | | // Utils.initSprite(sprite, type); |
| | | // mapContainer.addChild(sprite); |
| | | // Utils.beMovable(sprite); |
| | | Tool.initSprite(sprite, type); |
| | | mapContainer.addChild(sprite); |
| | | Tool.beMovable(sprite); |
| | | }; |
| | | |
| | | // watch spriteSettings |
| | | useEffect(() => { |
| | | if (!mapContainer) { |
| | | return; |
| | | } |
| | | prevSpriteSettingsRef.current = spriteSettings; |
| | | if (spriteSettings && prevSpriteSettings !== spriteSettings) { |
| | | Tool.removeSelectedEffect(); |
| | | } |
| | | if (spriteSettings) { |
| | | Tool.showSelectedEffect(spriteSettings) |
| | | setSettingsVisible(true); |
| | | } else { |
| | | Tool.removeSelectedEffect(); |
| | | } |
| | | }, [spriteSettings, mapContainer]) |
| | | const prevSpriteSettings = prevSpriteSettingsRef.current; |
| | | |
| | | const actions = [ |
| | | { icon: <FileCopyIcon />, name: '复制' }, |
| | |
| | | sx={{ mr: 1 }} |
| | | onClick={() => setDeviceVisible(!deviceVisible)} |
| | | > |
| | | 添加模型 |
| | | {translate('page.map.devices.title')} |
| | | </Button> |
| | | </> |
| | | )} |
| | |
| | | </SpeedDial> |
| | | </Box> |
| | | |
| | | <Insight |
| | | open={insightVisible} |
| | | onCancel={() => { |
| | | setInsightVisible(false); |
| | | }} |
| | | width={378} |
| | | /> |
| | | |
| | | <Device |
| | | open={deviceVisible} |
| | | onCancel={() => { |
| | | setDeviceVisible(false); |
| | | }} |
| | | onDrop={onDrop} |
| | | width={378} |
| | | /> |
| | | |
| | | <Settings |
| | | open={settingsVisible} |
| | | onCancel={() => { |
| | | setSpriteSettings(null); |
| | | setSettingsVisible(false); |
| | | }} |
| | | sprite={spriteSettings} |
| | | setSpriteSettings={setSpriteSettings} |
| | | width={570} |
| | | /> |
| | | |
| | | </Box> |