zjk
2026-05-22 4d90b2f6466c821f1ec89c700df324959feae574
feat(coupon-ws): 新增优惠券消息WebSocket处理并优化监听Hook

- 为WebSocket管理器添加COUPON_MESSAGE事件分发逻辑
- 移除优惠券消息Hook的登录校验依赖,延长自动隐藏时长至5分钟
- 简化Hook的消息绑定与解绑逻辑
2个文件已修改
48 ■■■■■ 已修改文件
src/pages/robotaxi/home/hooks/use-coupon-message-ws.ts 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/websocket.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/robotaxi/home/hooks/use-coupon-message-ws.ts
@@ -5,20 +5,14 @@
  content?: any;
};
type Deps = {
  /** 登录校验。 */
  checkOtp: (silent?: boolean) => Promise<unknown>;
};
/**
 * 首页优惠券消息 WebSocket 监听。
 */
export default function useCouponMessageWs(deps: Deps) {
export default function useCouponMessageWs() {
  const [couponMessageContent, setCouponMessageContent] = useState(''); // 当前展示的消息文案
  const [showCouponMessage, setShowCouponMessage] = useState(false); // 是否展示消息提示
  const couponMessageTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null); // 自动关闭定时器
  const couponMessageBoundRef = useRef(false); // 当前页面是否已绑定消息监听
  const { checkOtp } = deps;
  const clearCouponMessageTimer = () => {
    if (couponMessageTimerRef.current) {
@@ -58,47 +52,21 @@
      couponMessageTimerRef.current = setTimeout(() => {
        setShowCouponMessage(false);
        couponMessageTimerRef.current = null;
      }, 3000);
      }, 3000 * 100);
    };
    let openHandler: (() => void) | null = null;
    const bindCouponMessage = () => {
      if (couponMessageBoundRef.current) {
        return;
      }
    if (!couponMessageBoundRef.current) {
      wsManager.on('COUPON_MESSAGE', couponMessageHandler);
      couponMessageBoundRef.current = true;
    };
    void checkOtp(false).then((otp) => {
      if (!otp) {
        return;
      }
      if (wsManager.isConnectedStatus()) {
        bindCouponMessage();
        return;
      }
      openHandler = () => {
        bindCouponMessage();
        if (openHandler) {
          wsManager.off('open', openHandler);
        }
      };
      wsManager.on('open', openHandler);
    });
    }
    return () => {
      clearCouponMessageTimer();
      if (openHandler) {
        wsManager.off('open', openHandler);
      }
      if (couponMessageBoundRef.current) {
        wsManager.off('COUPON_MESSAGE', couponMessageHandler);
        couponMessageBoundRef.current = false;
      }
    };
  }, [checkOtp]);
  }, []);
  return {
    showCouponMessage,
src/utils/websocket.ts
@@ -854,6 +854,12 @@
      const status = Number(content?.status);
      this.notifyListeners('update_end_address_status', { status, data, content });
    }
    if (data?.type === 'COUPON_MESSAGE') {
      this.notifyListeners('COUPON_MESSAGE', {
        data,
        content: data?.content
      });
    }
  }
  /**