| | |
| | | const businessHandlerMapRef = useRef(createBusinessHandlerMap()); |
| | | const socketOpenHandlerRef = useRef<(() => void) | null>(null); |
| | | const lastFetchedVehicleOrderIdRef = useRef<string | null>(null); |
| | | const hasSocketOpenedRef = useRef(false); |
| | | |
| | | /** |
| | | * Socket 就绪后,对当前订单补做一次状态同步兜底。 |
| | | * 断网期间若漏掉“到达上车点”等关键推送,这里会通过活跃订单接口把页面拉回最新态。 |
| | | */ |
| | | const syncCurrentOrderAfterSocketReady = () => { |
| | | if (depsRef.current.orderId && typeof depsRef.current.syncSitesFromActiveOrder === 'function') { |
| | | depsRef.current.syncSitesFromActiveOrder(); |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * 绑定业务事件监听。 |
| | |
| | | wsManager.on('message', messageHandlerRef.current); |
| | | messageBound.current = true; |
| | | } |
| | | // 当 Socket 鉴权成功(通常发生在重连后),如果当前存在订单,则触发一次状态同步兜底 |
| | | // 以防止在前台弱网断开重连期间漏掉重要的订单状态转换 |
| | | if (depsRef.current.orderId && typeof depsRef.current.syncSitesFromActiveOrder === 'function') { |
| | | depsRef.current.syncSitesFromActiveOrder(); |
| | | } |
| | | syncCurrentOrderAfterSocketReady(); |
| | | }; |
| | | messageHandlerRef.current = (data) => { |
| | | console.log('ws message:', data); |
| | | }; |
| | | if (wsManager.isConnectedStatus()) { |
| | | bindSocketListeners(); |
| | | hasSocketOpenedRef.current = true; |
| | | } |
| | | return () => { |
| | | if (authSuccessBound.current && authSuccessHandlerRef.current) { |
| | |
| | | } |
| | | const handleOpen = () => { |
| | | bindSocketListeners(); |
| | | if (hasSocketOpenedRef.current) { |
| | | syncCurrentOrderAfterSocketReady(); |
| | | } |
| | | hasSocketOpenedRef.current = true; |
| | | }; |
| | | socketOpenHandlerRef.current = handleOpen; |
| | | wsManager.on('open', handleOpen); |