zcloud-gbs-bi-react/src/pages/Container/Map/index.js

119 lines
4.7 KiB
JavaScript
Raw Normal View History

2026-01-05 14:53:49 +08:00
import { useFullscreen, useMount } from "ahooks";
import { message } from "antd";
import autoFit from "autofit.js";
import { useEffect, useMemo, useReducer, useRef } from "react";
2026-01-05 14:53:49 +08:00
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import BottomUtils from "./components/BottomUtils";
import CenterUtils from "./components/CenterUtils";
import Content from "./components/Content";
import Header from "./components/Header";
import RightUtils from "./components/RightUtils";
import { Context, initialMapState, MAP_ACTION, mapReducer } from "./js/context";
import useInitMap from "./js/initMap";
2026-01-05 14:53:49 +08:00
import mitt from "./js/mitt";
2026-01-07 13:51:33 +08:00
import {
changeCoverMaskVisibleMittKey,
clickBranchOfficePointMittKey,
clickPortPointMittKey,
resetBottomUtilsMittKey,
2026-01-07 13:51:33 +08:00
} from "./js/mittKey";
2026-01-05 14:53:49 +08:00
import "./index.less";
2026-01-16 17:18:09 +08:00
function Map(props) {
2026-01-05 14:53:49 +08:00
const query = useGetUrlQuery();
const { viewer, mapMethods, initMap, externalEntryPort } = useInitMap();
2026-01-05 14:53:49 +08:00
const fullscreenRef = useRef(null); // 全屏容器的ref
const [isFullscreen, { toggleFullscreen }] = useFullscreen(fullscreenRef);
const [state, dispatch] = useReducer(mapReducer, initialMapState);
2026-01-05 14:53:49 +08:00
// 页面组件只调用语义化 actions不直接感知 reducer action 或 mitt 事件名。
const actions = useMemo(() => ({
selectPort: data => dispatch({ type: MAP_ACTION.SELECT_PORT, payload: data }),
selectBranchOffice: data => dispatch({ type: MAP_ACTION.SELECT_BRANCH_OFFICE, payload: data }),
setArea: area => dispatch({ type: MAP_ACTION.SET_AREA, payload: area }),
setBottomUtilsIndex: index => dispatch({ type: MAP_ACTION.SET_BOTTOM_UTILS_INDEX, payload: index }),
resetBottomUtils: () => dispatch({ type: MAP_ACTION.RESET_BOTTOM_UTILS }),
resetRightUtils: () => dispatch({ type: MAP_ACTION.RESET_RIGHT_UTILS }),
setPureMap: visible => dispatch({ type: MAP_ACTION.SET_PURE_MAP, payload: visible }),
setCoverMaskVisible: visible => dispatch({ type: MAP_ACTION.SET_COVER_MASK_VISIBLE, payload: visible }),
}), []);
2026-01-05 14:53:49 +08:00
useMount(() => {
autoFit.init({ dw: 1920, dh: 1080, el: "#contentContainer", resize: true });
2026-01-07 16:38:01 +08:00
sessionStorage.removeItem("mapCurrentBranchOfficeId");
initMap();
2026-01-05 14:53:49 +08:00
if (query.mapType === "港口") {
const entered = externalEntryPort(query);
if (!entered)
message.warning("港口入口参数不完整,无法定位到对应港口");
2026-01-05 14:53:49 +08:00
}
else {
2026-01-15 18:01:40 +08:00
setTimeout(() => {
mapMethods.current.flyTo();
mapMethods.current.addPortPoint();
2026-01-15 18:01:40 +08:00
}, 500);
2026-01-05 14:53:49 +08:00
}
// Cesium 工具层暂时通过 mitt 通知;所有事件在根组件统一转成 reducer action。
const handlePortClick = data => actions.selectPort(data);
const handleBranchOfficeClick = data => actions.selectBranchOffice(data);
const handleCoverMaskVisible = (visible) => {
actions.setCoverMaskVisible(visible);
if (!visible) {
2026-01-07 13:51:33 +08:00
message.success("地图绘制完成");
2026-01-05 14:53:49 +08:00
}
};
const handleResetBottomUtils = () => actions.resetBottomUtils();
mitt.on(clickPortPointMittKey, handlePortClick);
mitt.on(clickBranchOfficePointMittKey, handleBranchOfficeClick);
mitt.on(changeCoverMaskVisibleMittKey, handleCoverMaskVisible);
mitt.on(resetBottomUtilsMittKey, handleResetBottomUtils);
2026-01-05 14:53:49 +08:00
return () => {
autoFit.off();
mitt.off(clickPortPointMittKey, handlePortClick);
mitt.off(clickBranchOfficePointMittKey, handleBranchOfficeClick);
mitt.off(changeCoverMaskVisibleMittKey, handleCoverMaskVisible);
mitt.off(resetBottomUtilsMittKey, handleResetBottomUtils);
2026-01-05 14:53:49 +08:00
};
});
2026-01-19 14:09:05 +08:00
useEffect(() => {
query.accessTicket && window.sessionStorage.setItem("accessTicket", query.accessTicket);
query.clientId && window.sessionStorage.setItem("clientId", query.clientId);
query.orgId && window.sessionStorage.setItem("orgId", query.orgId);
query.token && window.sessionStorage.setItem("token", query.token);
}, []);
2026-01-05 14:53:49 +08:00
const providerValues = useMemo(
() => ({ viewer, mapMethods, ...state, actions }),
[viewer, mapMethods, state, actions],
2026-01-05 14:53:49 +08:00
);
return (
<div ref={fullscreenRef}>
<Context.Provider value={providerValues}>
<div id="cesiumContainer" />
<div id="contentContainer">
<Header />
<CenterUtils />
<RightUtils history={props.history} isFullscreen={isFullscreen} toggleFullscreen={toggleFullscreen} />
<BottomUtils />
2026-01-16 17:18:09 +08:00
<Content history={props.history} />
2026-01-05 14:53:49 +08:00
</div>
</Context.Provider>
<div
style={{ display: state.coverMaskVisible ? "block" : "none" }}
2026-01-05 14:53:49 +08:00
className="coverMaskContainer"
2026-01-07 13:51:33 +08:00
onClick={() => message.warning("正在绘制地图,请等待绘制完成在进行操作")}
2026-01-05 14:53:49 +08:00
/>
</div>
);
}
export default Map;