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. 51
      app/screens/BalanceScreen/BalanceScreen.tsx
  5. 141
      app/screens/loginList/index.tsx
  6. 11
      app/screens/previewOrder/perviewOrder.tsx
  7. 656
      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": [ "plugins": [
"expo-video", "expo-video",
"expo-apple-authentication",
[ [
"expo-build-properties", "expo-build-properties",
{ {

7
app/locales/en/translation.json

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

3
app/locales/fr/translation.json

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

51
app/screens/BalanceScreen/BalanceScreen.tsx

@ -27,6 +27,7 @@ import BackIcon from "../../components/BackIcon";
import useUserStore from "../../store/user"; import useUserStore from "../../store/user";
import { Transaction, payApi } from "../../services/api/payApi"; import { Transaction, payApi } from "../../services/api/payApi";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { userApi } from "../../services";
type BalanceScreenNavigationProp = NativeStackNavigationProp< type BalanceScreenNavigationProp = NativeStackNavigationProp<
RootStackParamList, RootStackParamList,
@ -35,7 +36,7 @@ type BalanceScreenNavigationProp = NativeStackNavigationProp<
export const BalanceScreen = () => { export const BalanceScreen = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { user } = useUserStore(); const { user, setUser } = useUserStore();
const navigation = useNavigation<BalanceScreenNavigationProp>(); const navigation = useNavigation<BalanceScreenNavigationProp>();
const [isModalVisible, setIsModalVisible] = useState(false); const [isModalVisible, setIsModalVisible] = useState(false);
const [rechargeHistory, setRechargeHistory] = useState<Transaction[]>([]); const [rechargeHistory, setRechargeHistory] = useState<Transaction[]>([]);
@ -54,21 +55,21 @@ export const BalanceScreen = () => {
const fetchRechargeHistory = async (page: number, refresh = false) => { const fetchRechargeHistory = async (page: number, refresh = false) => {
if (loading || (!hasMore && !refresh)) return; if (loading || (!hasMore && !refresh)) return;
try { try {
setLoading(true); setLoading(true);
const response = await payApi.getTransactionHistory(page, pageSize); const response = await payApi.getTransactionHistory(page, pageSize);
if (response.items.length < pageSize) { if (response.items.length < pageSize) {
setHasMore(false); setHasMore(false);
} }
if (refresh) { if (refresh) {
setRechargeHistory(response.items); setRechargeHistory(response.items);
} else { } else {
setRechargeHistory(prev => [...prev, ...response.items]); setRechargeHistory((prev) => [...prev, ...response.items]);
} }
setCurrentPage(page); setCurrentPage(page);
} catch (error) { } catch (error) {
console.error("Failed to fetch transaction history:", error); console.error("Failed to fetch transaction history:", error);
@ -76,7 +77,7 @@ export const BalanceScreen = () => {
setLoading(false); setLoading(false);
} }
}; };
const handleLoadMore = () => { const handleLoadMore = () => {
if (!loading && hasMore) { if (!loading && hasMore) {
fetchRechargeHistory(currentPage + 1); fetchRechargeHistory(currentPage + 1);
@ -85,25 +86,23 @@ export const BalanceScreen = () => {
useFocusEffect( useFocusEffect(
useCallback(() => { useCallback(() => {
userApi.getProfile().then((res) => {
setUser(res);
});
fetchRechargeHistory(1, true); fetchRechargeHistory(1, true);
}, []) }, [])
); );
const renderTransactionItem = ({ item }: { item: Transaction }) => ( const renderTransactionItem = ({ item }: { item: Transaction }) => (
<View style={styles.transactionHistoryList} key={item.transaction_id}> <View style={styles.transactionHistoryList} key={item.transaction_id}>
<View style={styles.transactionDetailsPanel}> <View style={styles.transactionDetailsPanel}>
<View style={styles.transactionDetailsRow}> <View style={styles.transactionDetailsRow}>
<Text style={styles.transactionDescriptionBold}> <Text style={styles.transactionDescriptionBold}>{item.type}</Text>
{item.type}
</Text>
<Text <Text
style={[ style={[
styles.transactionAmountDisplay, styles.transactionAmountDisplay,
{ {
color: color: Number(item.amount) < 0 ? "#0035a4" : "#ff5217",
Number(item.amount) < 0
? "#0035a4"
: "#ff5217",
}, },
]} ]}
> >
@ -111,17 +110,13 @@ export const BalanceScreen = () => {
</Text> </Text>
</View> </View>
<View style={styles.transactionInfoRow}> <View style={styles.transactionInfoRow}>
<Text style={styles.transactionDate}> <Text style={styles.transactionDate}>{item.timestamp}</Text>
{item.timestamp} <Text style={styles.shipmentReference}>{item.type}</Text>
</Text>
<Text style={styles.shipmentReference}>
{item.type}
</Text>
</View> </View>
</View> </View>
</View> </View>
); );
const renderFooter = () => { const renderFooter = () => {
if (!loading) return null; if (!loading) return null;
return ( return (
@ -150,7 +145,9 @@ export const BalanceScreen = () => {
<FlatList <FlatList
data={rechargeHistory} data={rechargeHistory}
renderItem={renderTransactionItem} renderItem={renderTransactionItem}
keyExtractor={(item) => item.transaction_id.toString()} keyExtractor={(item, index) =>
item.transaction_id.toString() + index
}
onEndReached={handleLoadMore} onEndReached={handleLoadMore}
onEndReachedThreshold={0.5} onEndReachedThreshold={0.5}
ListFooterComponent={renderFooter} ListFooterComponent={renderFooter}
@ -174,7 +171,9 @@ export const BalanceScreen = () => {
<View style={styles.totalBalanceCard}> <View style={styles.totalBalanceCard}>
<View style={styles.cardContainer}> <View style={styles.cardContainer}>
<View style={styles.financialInfoContainer}> <View style={styles.financialInfoContainer}>
<Text style={styles.largeBlackText}>{user?.balance}</Text> <Text style={styles.largeBlackText}>
{user?.balance}
</Text>
<View style={styles.svgContainer}></View> <View style={styles.svgContainer}></View>
</View> </View>
<View style={styles.totalSoldInfoContainer}> <View style={styles.totalSoldInfoContainer}>
@ -470,7 +469,7 @@ const styles = StyleSheet.create({
}, },
loaderContainer: { loaderContainer: {
paddingVertical: 20, paddingVertical: 20,
alignItems: 'center', alignItems: "center",
justifyContent: '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 fontSize from "../../utils/fontsizeUtils";
import EmailLoginModal from "./EmailLoginModal"; import EmailLoginModal from "./EmailLoginModal";
import PhoneLoginModal from "./PhoneLoginModal"; import PhoneLoginModal from "./PhoneLoginModal";
import { loginApi } from "../../services/api/login";
import { userApi } from "../../services";
import useUserStore from "../../store/user";
// 使用标准的ES6模块导入 // 使用标准的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__; // 开发模式检测 const isDevelopment = __DEV__; // 开发模式检测
// 移出条件块,始终尝试配置 Google 登录 // 移出条件块,始终尝试配置 Google 登录
try { // try {
// 配置 Google 登录 // // 配置 Google 登录
GoogleSignin.configure({ // GoogleSignin.configure({
iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID // iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID
webClientId: "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID // webClientId:
scopes: ['profile', 'email'], // "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID
offlineAccess: false, // <-- 确保为 false 或移除 // scopes: ["profile", "email"],
forceCodeForRefreshToken: false, // <-- 确保为 false 或移除 // offlineAccess: false, // <-- 确保为 false 或移除
}); // forceCodeForRefreshToken: false, // <-- 确保为 false 或移除
} catch (error) { // });
console.log('Google Sign-in模块配置错误:', error); // 稍微修改了日志信息 // } catch (error) {
} // console.log("Google Sign-in模块配置错误:", error); // 稍微修改了日志信息
// }
type RootStackParamList = { type RootStackParamList = {
Login: undefined; Login: undefined;
@ -51,6 +58,7 @@ type LoginScreenProps = {
}; };
export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => { export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
const { setUser } = useUserStore();
const { t } = useTranslation(); const { t } = useTranslation();
const navigation = const navigation =
useNavigation<NativeStackNavigationProp<RootStackParamList>>(); useNavigation<NativeStackNavigationProp<RootStackParamList>>();
@ -97,63 +105,52 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
// 处理谷歌登录 // 处理谷歌登录
const handleGoogleLogin = async () => { const handleGoogleLogin = async () => {
try { // try {
// 开发模式下的模拟登录
// 注释掉开发模式下的模拟登录,以便进行真实登录测试 // if (!GoogleSignin || typeof GoogleSignin.signIn !== "function") {
/* // console.log("Google Sign-in模块未正确初始化或配置失败");
if (isDevelopment) { // return;
console.log('开发模式:模拟Google登录成功'); // }
const mockUserInfo = {
user: { // await GoogleSignin.hasPlayServices();
id: 'dev_user_123', // const userInfo = await GoogleSignin.signIn();
name: 'Test User', // console.log("Google 登录成功:", userInfo);
email: 'test@example.com', // try {
photo: null, // const res = await loginApi.googleLogin(userInfo);
}, // const user = await userApi.getProfile();
}; // setUser(user);
console.log('模拟用户信息:', mockUserInfo); // navigation.navigate("MainTabs", { screen: "Home" });
// } catch (err) {
// 这里可以处理登录成功后的逻辑 // console.log("Google 登录失败:", err);
// 比如导航到主页面或保存用户信息 // navigation.navigate("Login");
// navigation.navigate("MainTabs", { screen: "Home" }); // }
return; // // 这里可以处理登录成功后的逻辑
} // // 比如导航到主页面或保存用户信息
*/ // // navigation.navigate("MainTabs", { screen: "Home" });
// } catch (error: any) {
// 生产模式下的真实Google登录 (现在开发模式也会执行) // console.log("Google 登录错误:", error);
if (!GoogleSignin || typeof GoogleSignin.signIn !== 'function') {
console.log('Google Sign-in模块未正确初始化或配置失败'); // // 开发模式下的错误处理
return; // if (isDevelopment) {
} // console.log("开发模式:忽略Google登录错误,但已尝试真实登录"); // 修改日志,表明已尝试真实登录
// return;
await GoogleSignin.hasPlayServices(); // }
const userInfo = await GoogleSignin.signIn();
console.log('Google 登录成功:', userInfo); // if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) {
// console.log("用户取消登录");
// 这里可以处理登录成功后的逻辑 // } else if (statusCodes && error.code === statusCodes.IN_PROGRESS) {
// 比如导航到主页面或保存用户信息 // console.log("登录正在进行中");
// navigation.navigate("MainTabs", { screen: "Home" }); // } else if (
// statusCodes &&
} catch (error: any) { // error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE
console.log('Google 登录错误:', error); // ) {
// console.log("Play Services 不可用");
// 开发模式下的错误处理 // } else {
if (isDevelopment) { // console.log("其他错误:", error.message);
console.log('开发模式:忽略Google登录错误,但已尝试真实登录'); // 修改日志,表明已尝试真实登录 // navigation.navigate("Login");
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);
}
}
}; };
// 处理Facebook登录 // 处理Facebook登录
@ -263,7 +260,9 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
/> />
</View> </View>
<Text style={styles.loginButtonText}> <Text style={styles.loginButtonText}>
{isDevelopment ? '🧪 ' + t("continueWithGoogle") + ' (测试模式)' : t("continueWithGoogle")} {isDevelopment
? "🧪 " + t("continueWithGoogle") + " (测试模式)"
: t("continueWithGoogle")}
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>

11
app/screens/previewOrder/perviewOrder.tsx

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

656
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-i18next": "^15.4.1",
"react-native": "0.76.9", "react-native": "0.76.9",
"react-native-dropdown-picker": "^5.4.6", "react-native-dropdown-picker": "^5.4.6",
"react-native-fbsdk-next": "^13.4.1",
"react-native-gesture-handler": "~2.20.2", "react-native-gesture-handler": "~2.20.2",
"react-native-image-viewing": "^0.2.2", "react-native-image-viewing": "^0.2.2",
"react-native-image-zoom-viewer": "^3.0.1", "react-native-image-zoom-viewer": "^3.0.1",
@ -14505,6 +14506,24 @@
"react-native": "*" "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": { "node_modules/react-native-gesture-handler": {
"version": "2.20.2", "version": "2.20.2",
"resolved": "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz", "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", "axios": "^1.8.4",
"events": "^3.3.0", "events": "^3.3.0",
"expo": "~52.0.41", "expo": "~52.0.41",
"expo-apple-authentication": "~7.1.3",
"expo-auth-session": "~6.0.3", "expo-auth-session": "~6.0.3",
"expo-build-properties": "~0.13.3", "expo-build-properties": "~0.13.3",
"expo-crypto": "~14.0.2", "expo-crypto": "~14.0.2",
@ -44,6 +45,7 @@
"react-i18next": "^15.4.1", "react-i18next": "^15.4.1",
"react-native": "0.76.9", "react-native": "0.76.9",
"react-native-dropdown-picker": "^5.4.6", "react-native-dropdown-picker": "^5.4.6",
"react-native-fbsdk-next": "^13.4.1",
"react-native-gesture-handler": "~2.20.2", "react-native-gesture-handler": "~2.20.2",
"react-native-image-viewing": "^0.2.2", "react-native-image-viewing": "^0.2.2",
"react-native-image-zoom-viewer": "^3.0.1", "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-message-util "^29.7.0"
jest-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: expo-application@~6.0.2:
version "6.0.2" version "6.0.2"
resolved "https://registry.npmmirror.com/expo-application/-/expo-application-6.0.2.tgz" 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" resolved "https://registry.npmmirror.com/react-native-dropdown-picker/-/react-native-dropdown-picker-5.4.6.tgz"
integrity sha512-T1XBHbE++M6aRU3wFYw3MvcOuabhWZ29RK/Ivdls2r1ZkZ62iEBZknLUPeVLMX3x6iUxj4Zgr3X2DGlEGXeHsA== 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: react-native-gesture-handler@~2.20.2:
version "2.20.2" version "2.20.2"
resolved "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz" resolved "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz"

Loading…
Cancel
Save