Quellcode durchsuchen

fix(alipay): add navigation locks to CheckoutModal and happy-spin to prevent overlapping multi-callbacks causing stacked screens

zbb vor 1 Monat
Ursprung
Commit
87750b54e3

+ 1 - 1
app.json

@@ -12,7 +12,7 @@
       "supportsTablet": false,
       "bundleIdentifier": "com.asios",
       "appleTeamId": "Y9ZVX3FRX6",
-      "buildNumber": "10",
+      "buildNumber": "11",
       "infoPlist": {
         "ITSAppUsesNonExemptEncryption": false,
         "NSPhotoLibraryUsageDescription": "App需要访问您的相册以便您可以上传头像或保存商品分享图片。",

+ 12 - 0
app/award-detail/components/CheckoutModal.tsx

@@ -260,13 +260,24 @@ export const CheckoutModal = forwardRef<CheckoutModalRef, CheckoutModalProps>(
       }
     };
 
+    const isNavigatingRef = useRef(false);
+
     const handleSuccess = (tradeNo: string) => {
       setVisible(false);
+
+      if (isNavigatingRef.current) return;
+      isNavigatingRef.current = true;
+
       router.push({
         pathname: "/lottery" as any,
         params: { tradeNo, num, poolId },
       });
       onSuccess({ tradeNo, num });
+
+      // Reset after a short delay to allow subsequent purchases
+      setTimeout(() => {
+        isNavigatingRef.current = false;
+      }, 2000);
     };
 
     const handleNativePay = async (
@@ -343,6 +354,7 @@ export const CheckoutModal = forwardRef<CheckoutModalRef, CheckoutModalProps>(
             Alert.alert("支付中断", `状态码: ${status}`);
           }
         } catch (e: any) {
+          if (isResolved) return;
           isResolved = true;
           console.log("Alipay Error:", e);
           Alert.alert("支付异常", e.message || "调用支付宝失败");

+ 4 - 0
app/happy-spin/index.tsx

@@ -41,6 +41,7 @@ export default function LotteryScreen() {
   const [loading, setLoading] = useState(true);
   const [sound, setSound] = useState<Audio.Sound>();
   const [animationFinished, setAnimationFinished] = useState(false);
+  const isFinishedRef = useRef(false);
 
   // Video state
   const [videoVisible, setVideoVisible] = useState(false);
@@ -154,6 +155,9 @@ export default function LotteryScreen() {
       timerRef.current = null;
     }
 
+    if (isFinishedRef.current) return;
+    isFinishedRef.current = true;
+
     if (isGrid) {
       // Stop sound and mark finished, stay on page
       sound?.stopAsync();

+ 28 - 16
app/treasure-hunt/components/CheckoutModal.tsx

@@ -1,29 +1,29 @@
 import { Image } from "expo-image";
 import { useRouter } from "expo-router";
 import React, {
-    forwardRef,
-    useImperativeHandle,
-    useRef,
-    useState,
+  forwardRef,
+  useImperativeHandle,
+  useRef,
+  useState,
 } from "react";
 import {
-    ActivityIndicator,
-    Alert,
-    AppState,
-    Dimensions,
-    Modal,
-    ScrollView,
-    StyleSheet,
-    Text,
-    TouchableOpacity,
-    View,
+  ActivityIndicator,
+  Alert,
+  AppState,
+  Dimensions,
+  Modal,
+  ScrollView,
+  StyleSheet,
+  Text,
+  TouchableOpacity,
+  View,
 } from "react-native";
 
 import { applyOrder, getApplyResult, previewOrder } from "@/services/award";
 import Alipay from "expo-native-alipay";
 import {
-    LotteryResultModal,
-    LotteryResultModalRef,
+  LotteryResultModal,
+  LotteryResultModalRef,
 } from "./LotteryResultModal";
 
 const { width: SCREEN_WIDTH } = Dimensions.get("window");
@@ -260,13 +260,24 @@ export const CheckoutModal = forwardRef<CheckoutModalRef, CheckoutModalProps>(
       }
     };
 
+    const isNavigatingRef = useRef(false);
+
     const handleSuccess = (tradeNo: string) => {
       setVisible(false);
+
+      if (isNavigatingRef.current) return;
+      isNavigatingRef.current = true;
+
       router.push({
         pathname: "/happy-spin" as any,
         params: { tradeNo, num, poolId },
       });
       onSuccess({ tradeNo, num });
+
+      // Reset after a short delay to allow subsequent purchases
+      setTimeout(() => {
+        isNavigatingRef.current = false;
+      }, 2000);
     };
 
     const handleNativePay = async (
@@ -342,6 +353,7 @@ export const CheckoutModal = forwardRef<CheckoutModalRef, CheckoutModalProps>(
             Alert.alert("支付中断", `状态码: ${status}`);
           }
         } catch (e: any) {
+          if (isResolved) return;
           isResolved = true;
           console.log("Alipay Error:", e);
           Alert.alert("支付异常", e.message || "调用支付宝失败");