| | |
| | | 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) { |
| | |
| | | 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, |