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

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;