hejianhao
2026-02-26 eea83a9be643c5ffce7fa3fce90877986a33314c
fix: 修复等待计时器在页面切换时被重置的问题

在用户离开等待页面时缓存计时器已运行时间,返回时恢复计时,避免计时被错误重置
1个文件已修改
41 ■■■■■ 已修改文件
src/robotaxi/pages/begin-route/index.tsx 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/begin-route/index.tsx
@@ -1,4 +1,4 @@
import Taro, { useDidShow } from "@tarojs/taro"
import Taro, { useDidShow, useDidHide } from "@tarojs/taro"
import { useEffect, useState, useRef, useMemo } from 'react';
import { View, Map, Text, Image, CoverView, CoverImage } from '@tarojs/components';
import './index.less';
@@ -30,6 +30,8 @@
} from '../../../robotaxi/api/begin-route';
export default function SelectMapSite() {
  const WAITING_TIMER_START_KEY = 'waitingTimerStartAt';
  const WAITING_TIMER_ELAPSED_KEY = 'waitingTimerElapsed';
  const [showCustomerService, setShowCustomerService] = useState(false); // 客服弹窗是否显示
  const [longitude, setLongitude] = useState<number | null>(null); // 经度
@@ -409,18 +411,51 @@
        setLongitude(s.longitude);
      }
      setElapsedSeconds(0);
      const cachedStartAt = Number(Taro.getStorageSync(WAITING_TIMER_START_KEY));
      const cachedElapsed = Number(Taro.getStorageSync(WAITING_TIMER_ELAPSED_KEY));
      let startAt = cachedStartAt;
      if (!Number.isFinite(startAt) || startAt <= 0) {
        if (Number.isFinite(cachedElapsed) && cachedElapsed >= 0) {
          startAt = Date.now() - cachedElapsed * 1000;
        } else {
          startAt = Date.now();
        }
        Taro.setStorageSync(WAITING_TIMER_START_KEY, startAt);
      }
      const updateElapsed = () => {
        const nextElapsed = Math.max(0, Math.floor((Date.now() - startAt) / 1000));
        setElapsedSeconds(nextElapsed);
      };
      updateElapsed();
      timer = setInterval(() => {
        setElapsedSeconds(prev => prev + 1);
        updateElapsed();
      }, 1000);
    } else {
      setElapsedSeconds(0);
      Taro.removeStorageSync(WAITING_TIMER_START_KEY);
      Taro.removeStorageSync(WAITING_TIMER_ELAPSED_KEY);
    }
    return () => {
      if (timer) clearInterval(timer);
    };
  }, [tripStatus]);
  useDidHide(() => {
    const currentTripStatus = tripStatusRef.current;
    if (currentTripStatus === 2 || currentTripStatus === 3) {
      const startAt = Number(Taro.getStorageSync(WAITING_TIMER_START_KEY));
      if (Number.isFinite(startAt) && startAt > 0) {
        const currentElapsed = Math.max(0, Math.floor((Date.now() - startAt) / 1000));
        Taro.setStorageSync(WAITING_TIMER_ELAPSED_KEY, currentElapsed);
      } else {
        Taro.setStorageSync(WAITING_TIMER_ELAPSED_KEY, elapsedSeconds);
      }
      return;
    }
    Taro.removeStorageSync(WAITING_TIMER_START_KEY);
    Taro.removeStorageSync(WAITING_TIMER_ELAPSED_KEY);
  });
  useEffect(() => {
    const storedPoints = getStoredRoutePoints(tripStatus);
    applyRoutePoints(storedPoints);