Browse Source

解决合并冲突

main
unknown 2 weeks ago
parent
commit
38bdb694ed
  1. 1
      app.json
  2. 7
      app/locales/en/translation.json
  3. 3
      app/locales/fr/translation.json
  4. 37
      app/screens/BalanceScreen/BalanceScreen.tsx
  5. 141
      app/screens/loginList/index.tsx
  6. 11
      app/screens/previewOrder/perviewOrder.tsx
  7. 624
      app/screens/productStatus/OrderDatails.tsx
  8. 6
      app/services/api/login.ts
  9. 5
      done.txt
  10. 19
      package-lock.json
  11. 2
      package.json
  12. 10
      yarn.lock

1
app.json

@ -59,6 +59,7 @@
},
"plugins": [
"expo-video",
"expo-apple-authentication",
[
"expo-build-properties",
{

7
app/locales/en/translation.json

@ -110,6 +110,10 @@
"login_required_subtitle": "Login to use chat features",
"login_now": "Login Now"
},
"login":{
"error":"Login failed, please try again",
"success":"Login successfully"
},
"banner": {
"today": "Today",
"shipping": {
@ -357,7 +361,8 @@
},
"order.preview": {
"login_required": "Please login first",
"payment_failed": "Payment failed",
"payment_failed": "Payment failed, please try again",
"Insufficient_balance": "Insufficient balance",
"pay_now": "Pay Now",
"payment_method": "Payment Method",
"enter_phone": "Please enter phone number",

3
app/locales/fr/translation.json

@ -293,6 +293,7 @@
"order.preview": {
"login_required": "Veuillez vous connecter d'abord",
"payment_failed": "Le paiement a échoué",
"Insufficient_balance": "Solde insuffisant",
"pay_now": "Payer maintenant",
"payment_method": "Mode de paiement",
"enter_phone": "Veuillez saisir le numéro de téléphone",
@ -324,6 +325,8 @@
},
"login": {
"logInOrSignUp": "Se connecter ou s'inscrire",
"error":"Échec de la connexion, veuillez réessayer",
"success":"Connexion réussie",
"phoneNumber": "Numéro de téléphone",
"enterPassword": "Veuillez réentrer votre mot de passe",
"passwordIncorrect": "Mot de passe incorrect, veuillez confirmer votre mot de passe.",

37
app/screens/BalanceScreen/BalanceScreen.tsx

@ -27,6 +27,7 @@ import BackIcon from "../../components/BackIcon";
import useUserStore from "../../store/user";
import { Transaction, payApi } from "../../services/api/payApi";
import { useTranslation } from "react-i18next";
import { userApi } from "../../services";
type BalanceScreenNavigationProp = NativeStackNavigationProp<
RootStackParamList,
@ -35,7 +36,7 @@ type BalanceScreenNavigationProp = NativeStackNavigationProp<
export const BalanceScreen = () => {
const { t } = useTranslation();
const { user } = useUserStore();
const { user, setUser } = useUserStore();
const navigation = useNavigation<BalanceScreenNavigationProp>();
const [isModalVisible, setIsModalVisible] = useState(false);
const [rechargeHistory, setRechargeHistory] = useState<Transaction[]>([]);
@ -66,7 +67,7 @@ export const BalanceScreen = () => {
if (refresh) {
setRechargeHistory(response.items);
} else {
setRechargeHistory(prev => [...prev, ...response.items]);
setRechargeHistory((prev) => [...prev, ...response.items]);
}
setCurrentPage(page);
@ -85,6 +86,9 @@ export const BalanceScreen = () => {
useFocusEffect(
useCallback(() => {
userApi.getProfile().then((res) => {
setUser(res);
});
fetchRechargeHistory(1, true);
}, [])
);
@ -93,17 +97,12 @@ export const BalanceScreen = () => {
<View style={styles.transactionHistoryList} key={item.transaction_id}>
<View style={styles.transactionDetailsPanel}>
<View style={styles.transactionDetailsRow}>
<Text style={styles.transactionDescriptionBold}>
{item.type}
</Text>
<Text style={styles.transactionDescriptionBold}>{item.type}</Text>
<Text
style={[
styles.transactionAmountDisplay,
{
color:
Number(item.amount) < 0
? "#0035a4"
: "#ff5217",
color: Number(item.amount) < 0 ? "#0035a4" : "#ff5217",
},
]}
>
@ -111,12 +110,8 @@ export const BalanceScreen = () => {
</Text>
</View>
<View style={styles.transactionInfoRow}>
<Text style={styles.transactionDate}>
{item.timestamp}
</Text>
<Text style={styles.shipmentReference}>
{item.type}
</Text>
<Text style={styles.transactionDate}>{item.timestamp}</Text>
<Text style={styles.shipmentReference}>{item.type}</Text>
</View>
</View>
</View>
@ -150,7 +145,9 @@ export const BalanceScreen = () => {
<FlatList
data={rechargeHistory}
renderItem={renderTransactionItem}
keyExtractor={(item) => item.transaction_id.toString()}
keyExtractor={(item, index) =>
item.transaction_id.toString() + index
}
onEndReached={handleLoadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={renderFooter}
@ -174,7 +171,9 @@ export const BalanceScreen = () => {
<View style={styles.totalBalanceCard}>
<View style={styles.cardContainer}>
<View style={styles.financialInfoContainer}>
<Text style={styles.largeBlackText}>{user?.balance}</Text>
<Text style={styles.largeBlackText}>
{user?.balance}
</Text>
<View style={styles.svgContainer}></View>
</View>
<View style={styles.totalSoldInfoContainer}>
@ -470,7 +469,7 @@ const styles = StyleSheet.create({
},
loaderContainer: {
paddingVertical: 20,
alignItems: 'center',
justifyContent: 'center',
alignItems: "center",
justifyContent: "center",
},
});

141
app/screens/loginList/index.tsx

@ -17,25 +17,32 @@ import type { NativeStackNavigationProp } from "@react-navigation/native-stack";
import fontSize from "../../utils/fontsizeUtils";
import EmailLoginModal from "./EmailLoginModal";
import PhoneLoginModal from "./PhoneLoginModal";
import { loginApi } from "../../services/api/login";
import { userApi } from "../../services";
import useUserStore from "../../store/user";
// 使用标准的ES6模块导入
import { GoogleSignin, GoogleSigninButton, statusCodes } from '@react-native-google-signin/google-signin';
// import {
// GoogleSignin,
// statusCodes,
// } from "@react-native-google-signin/google-signin";
const isDevelopment = __DEV__; // 开发模式检测
// 移出条件块,始终尝试配置 Google 登录
try {
// 配置 Google 登录
GoogleSignin.configure({
iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID
webClientId: "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID
scopes: ['profile', 'email'],
offlineAccess: false, // <-- 确保为 false 或移除
forceCodeForRefreshToken: false, // <-- 确保为 false 或移除
});
} catch (error) {
console.log('Google Sign-in模块配置错误:', error); // 稍微修改了日志信息
}
// try {
// // 配置 Google 登录
// GoogleSignin.configure({
// iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID
// webClientId:
// "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID
// scopes: ["profile", "email"],
// offlineAccess: false, // <-- 确保为 false 或移除
// forceCodeForRefreshToken: false, // <-- 确保为 false 或移除
// });
// } catch (error) {
// console.log("Google Sign-in模块配置错误:", error); // 稍微修改了日志信息
// }
type RootStackParamList = {
Login: undefined;
@ -51,6 +58,7 @@ type LoginScreenProps = {
};
export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
const { setUser } = useUserStore();
const { t } = useTranslation();
const navigation =
useNavigation<NativeStackNavigationProp<RootStackParamList>>();
@ -97,63 +105,52 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
// 处理谷歌登录
const handleGoogleLogin = async () => {
try {
// 开发模式下的模拟登录
// 注释掉开发模式下的模拟登录,以便进行真实登录测试
/*
if (isDevelopment) {
console.log('开发模式:模拟Google登录成功');
const mockUserInfo = {
user: {
id: 'dev_user_123',
name: 'Test User',
email: 'test@example.com',
photo: null,
},
};
console.log('模拟用户信息:', mockUserInfo);
// 这里可以处理登录成功后的逻辑
// 比如导航到主页面或保存用户信息
// navigation.navigate("MainTabs", { screen: "Home" });
return;
}
*/
// 生产模式下的真实Google登录 (现在开发模式也会执行)
if (!GoogleSignin || typeof GoogleSignin.signIn !== 'function') {
console.log('Google Sign-in模块未正确初始化或配置失败');
return;
}
await GoogleSignin.hasPlayServices();
const userInfo = await GoogleSignin.signIn();
console.log('Google 登录成功:', userInfo);
// 这里可以处理登录成功后的逻辑
// 比如导航到主页面或保存用户信息
// navigation.navigate("MainTabs", { screen: "Home" });
} catch (error: any) {
console.log('Google 登录错误:', error);
// 开发模式下的错误处理
if (isDevelopment) {
console.log('开发模式:忽略Google登录错误,但已尝试真实登录'); // 修改日志,表明已尝试真实登录
return;
}
if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) {
console.log('用户取消登录');
} else if (statusCodes && error.code === statusCodes.IN_PROGRESS) {
console.log('登录正在进行中');
} else if (statusCodes && error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
console.log('Play Services 不可用');
} else {
console.log('其他错误:', error.message);
}
}
// try {
// if (!GoogleSignin || typeof GoogleSignin.signIn !== "function") {
// console.log("Google Sign-in模块未正确初始化或配置失败");
// return;
// }
// await GoogleSignin.hasPlayServices();
// const userInfo = await GoogleSignin.signIn();
// console.log("Google 登录成功:", userInfo);
// try {
// const res = await loginApi.googleLogin(userInfo);
// const user = await userApi.getProfile();
// setUser(user);
// navigation.navigate("MainTabs", { screen: "Home" });
// } catch (err) {
// console.log("Google 登录失败:", err);
// navigation.navigate("Login");
// }
// // 这里可以处理登录成功后的逻辑
// // 比如导航到主页面或保存用户信息
// // navigation.navigate("MainTabs", { screen: "Home" });
// } catch (error: any) {
// console.log("Google 登录错误:", error);
// // 开发模式下的错误处理
// if (isDevelopment) {
// console.log("开发模式:忽略Google登录错误,但已尝试真实登录"); // 修改日志,表明已尝试真实登录
// return;
// }
// if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) {
// console.log("用户取消登录");
// } else if (statusCodes && error.code === statusCodes.IN_PROGRESS) {
// console.log("登录正在进行中");
// } else if (
// statusCodes &&
// error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE
// ) {
// console.log("Play Services 不可用");
// } else {
// console.log("其他错误:", error.message);
// navigation.navigate("Login");
// }
// }
};
// 处理Facebook登录
@ -263,7 +260,9 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
/>
</View>
<Text style={styles.loginButtonText}>
{isDevelopment ? '🧪 ' + t("continueWithGoogle") + ' (测试模式)' : t("continueWithGoogle")}
{isDevelopment
? "🧪 " + t("continueWithGoogle") + " (测试模式)"
: t("continueWithGoogle")}
</Text>
</TouchableOpacity>

11
app/screens/previewOrder/perviewOrder.tsx

@ -41,6 +41,7 @@ type RootStackParamList = {
};
Pay: { payUrl: string; method: string; order_id: string };
OrderDetails: { orderId?: number };
PaymentSuccessScreen: any;
};
export const PreviewOrder = () => {
@ -58,7 +59,7 @@ export const PreviewOrder = () => {
if (!user.user_id) {
return Alert.alert(t("order.preview.login_required"));
}
if (route.params.payMethod === "Brainnel Pay(Mobile Money)") {
if (route.params.payMethod === "mobile_money") {
setShowPhoneInput(true);
} else {
setShowPhoneInput(false);
@ -105,6 +106,14 @@ export const PreviewOrder = () => {
.getPayInfo(data)
.then((res) => {
if (res.success) {
if (route.params.payMethod === "balance") {
if (res.success) {
navigation.navigate("PaymentSuccessScreen", res);
return;
} else {
Alert.alert(t("order.preview.Insufficient_balance"));
}
}
logPreviewOrder(
navigation.getState().routes[navigation.getState().index - 1]
?.name as string

624
app/screens/productStatus/OrderDatails.tsx

File diff suppressed because it is too large Load Diff

6
app/services/api/login.ts

@ -0,0 +1,6 @@
import apiService from "./apiClient";
export const loginApi = {
googleLogin: (data: any) =>
apiService.post("/api/users/auth/callback/google", data),
};

5
done.txt

@ -0,0 +1,5 @@
1. 余额支付 (订单详情,支付)
2. 查看物流
3. 取消订单
4. 运费计算
5. 询盘的图搜转成base64

19
package-lock.json generated

@ -39,6 +39,7 @@
"react-i18next": "^15.4.1",
"react-native": "0.76.9",
"react-native-dropdown-picker": "^5.4.6",
"react-native-fbsdk-next": "^13.4.1",
"react-native-gesture-handler": "~2.20.2",
"react-native-image-viewing": "^0.2.2",
"react-native-image-zoom-viewer": "^3.0.1",
@ -14505,6 +14506,24 @@
"react-native": "*"
}
},
"node_modules/react-native-fbsdk-next": {
"version": "13.4.1",
"resolved": "https://registry.npmmirror.com/react-native-fbsdk-next/-/react-native-fbsdk-next-13.4.1.tgz",
"integrity": "sha512-Cto+oF0FJyvxKDjKyLKI5DgnLCeeRlXvVQb8qw0XesT1Xune1ijDWAnvt9fy6wXJ4G7K510xKkcSUsbK/KyPhg==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"peerDependencies": {
"expo": ">=47.0.0",
"react-native": ">=0.63.3"
},
"peerDependenciesMeta": {
"expo": {
"optional": true
}
}
},
"node_modules/react-native-gesture-handler": {
"version": "2.20.2",
"resolved": "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz",

2
package.json

@ -27,6 +27,7 @@
"axios": "^1.8.4",
"events": "^3.3.0",
"expo": "~52.0.41",
"expo-apple-authentication": "~7.1.3",
"expo-auth-session": "~6.0.3",
"expo-build-properties": "~0.13.3",
"expo-crypto": "~14.0.2",
@ -44,6 +45,7 @@
"react-i18next": "^15.4.1",
"react-native": "0.76.9",
"react-native-dropdown-picker": "^5.4.6",
"react-native-fbsdk-next": "^13.4.1",
"react-native-gesture-handler": "~2.20.2",
"react-native-image-viewing": "^0.2.2",
"react-native-image-zoom-viewer": "^3.0.1",

10
yarn.lock

@ -4805,6 +4805,11 @@ expect@^29.0.0, expect@^29.7.0:
jest-message-util "^29.7.0"
jest-util "^29.7.0"
expo-apple-authentication@~7.1.3:
version "7.1.3"
resolved "https://registry.npmmirror.com/expo-apple-authentication/-/expo-apple-authentication-7.1.3.tgz#3d4ec9fa29ff336eba9b280e7db110639ae7e020"
integrity sha512-TRaF513oDGjGx3hRiAwkMiSnKLN8BIR9Se5Gi3ttz2UUgP9y+tNHV6Ji6/oztJo9ON7zerHg2mn5Y+3B8c2vTQ==
expo-application@~6.0.2:
version "6.0.2"
resolved "https://registry.npmmirror.com/expo-application/-/expo-application-6.0.2.tgz"
@ -7812,6 +7817,11 @@ react-native-dropdown-picker@^5.4.6:
resolved "https://registry.npmmirror.com/react-native-dropdown-picker/-/react-native-dropdown-picker-5.4.6.tgz"
integrity sha512-T1XBHbE++M6aRU3wFYw3MvcOuabhWZ29RK/Ivdls2r1ZkZ62iEBZknLUPeVLMX3x6iUxj4Zgr3X2DGlEGXeHsA==
react-native-fbsdk-next@^13.4.1:
version "13.4.1"
resolved "https://registry.npmmirror.com/react-native-fbsdk-next/-/react-native-fbsdk-next-13.4.1.tgz"
integrity sha512-Cto+oF0FJyvxKDjKyLKI5DgnLCeeRlXvVQb8qw0XesT1Xune1ijDWAnvt9fy6wXJ4G7K510xKkcSUsbK/KyPhg==
react-native-gesture-handler@~2.20.2:
version "2.20.2"
resolved "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz"

Loading…
Cancel
Save