You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.5 KiB
121 lines
3.5 KiB
import React, { useEffect } from 'react';
|
|
import { Outlet } from 'react-router';
|
|
import { Toast } from 'antd-mobile';
|
|
|
|
import Bridge, { bridgeOb, emitBridgeEvent } from './utils/bridge';
|
|
import { useAppDispatch, useAppSelector } from './utils/hooks';
|
|
import { addNewPoint, updateTaskState } from './store/features/measureSlice';
|
|
import {
|
|
refreshStationList,
|
|
updateBleList,
|
|
updateDevice,
|
|
updateSyncProgress,
|
|
} from './store/features/contextSlice';
|
|
import { createWebSocket, sharedWsUrl } from './services/socket';
|
|
import {
|
|
fetchOrgTree,
|
|
fetchRailTypes,
|
|
syncBaseData,
|
|
updateSyncBaseProgress,
|
|
} from './store/features/baseData';
|
|
|
|
function App() {
|
|
const dispatch = useAppDispatch();
|
|
const baseState = useAppSelector((state) => state.baseData);
|
|
const contextState = useAppSelector((state) => state.context);
|
|
|
|
// 获取轨型数据
|
|
useEffect(() => {
|
|
if (baseState.railTypes.length === 0) {
|
|
dispatch(fetchRailTypes());
|
|
}
|
|
}, [baseState.railTypes.length, dispatch]);
|
|
|
|
// 监听推送消息,更新store
|
|
useEffect(() => {
|
|
const subscription = bridgeOb.subscribe((datagram) => {
|
|
if (datagram.type === 'measure-event') {
|
|
dispatch(updateTaskState(datagram.data));
|
|
} else if (datagram.type === 'measure-point') {
|
|
dispatch(addNewPoint(datagram.data));
|
|
} else if (datagram.type === 'peripheral-status') {
|
|
dispatch(updateDevice(datagram.data));
|
|
} else if (datagram.type === 'ble-list') {
|
|
dispatch(updateBleList(datagram.data));
|
|
} else if (datagram.type === 'sync-progress') {
|
|
dispatch(updateSyncProgress(datagram.data));
|
|
} else if (datagram.type === 'update-base-progress') {
|
|
dispatch(updateSyncBaseProgress(datagram.data));
|
|
}
|
|
});
|
|
return () => subscription.unsubscribe();
|
|
}, [dispatch]);
|
|
|
|
// 开启推送
|
|
useEffect(() => {
|
|
// if (appWebview) {
|
|
// registerBridgeFunc();
|
|
// } else {
|
|
//连接websocket
|
|
const wsClient = createWebSocket(sharedWsUrl);
|
|
const subscription = wsClient.dataOb.subscribe((data) => {
|
|
emitBridgeEvent(data);
|
|
});
|
|
wsClient.connect();
|
|
return () => subscription.unsubscribe();
|
|
// }
|
|
}, []);
|
|
|
|
// 初始同步数据
|
|
useEffect(() => {
|
|
Bridge.needSyncBaseData().then((res) => {
|
|
if (!res.success) {
|
|
return Toast.show(res.message);
|
|
}
|
|
if (res.data.needSync) {
|
|
dispatch(syncBaseData());
|
|
} else {
|
|
dispatch(fetchOrgTree());
|
|
}
|
|
});
|
|
}, [dispatch]);
|
|
|
|
// 同步完成后,重新获取局/段/线信息
|
|
useEffect(() => {
|
|
if (
|
|
baseState.syncBaseProgress.finish &&
|
|
!baseState.syncBaseProgress.error &&
|
|
baseState.syncBaseProgress.progress === 100
|
|
) {
|
|
dispatch(fetchOrgTree());
|
|
}
|
|
}, [baseState.syncBaseProgress, dispatch]);
|
|
|
|
// 预获取车站信息
|
|
useEffect(() => {
|
|
if (contextState.currXMCode) {
|
|
dispatch(
|
|
refreshStationList({
|
|
tljCode: contextState.currOrgCode,
|
|
gwdCode: contextState.currGWDCode,
|
|
xmCode: contextState.currXMCode,
|
|
})
|
|
);
|
|
}
|
|
}, [contextState.currGWDCode, contextState.currOrgCode, contextState.currXMCode, dispatch]);
|
|
|
|
return (
|
|
<>
|
|
<Outlet />
|
|
|
|
{/* <Mask visible={baseState.syncingBaseData}>
|
|
<div className="flex flex-col items-center gap-4 absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
|
|
<SpinLoading color="white" />
|
|
<p className="text-white text-sm">正在同步,请稍候...</p>
|
|
</div>
|
|
</Mask> */}
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default App;
|