import React, { useEffect, useState, useRef } from "react"; import { View, Text, StyleSheet, TouchableOpacity, StatusBar, Platform, BackHandler, Image, Modal, SafeAreaView, Alert } from "react-native"; import { useTranslation } from "react-i18next"; import { useNavigation } from "@react-navigation/native"; 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, statusCodes, } from "@react-native-google-signin/google-signin"; import { LoginManager, AccessToken, Settings } from "react-native-fbsdk-next"; 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); // 稍微修改了日志信息 } type RootStackParamList = { Login: undefined; EmailLogin: undefined; MainTabs: { screen: string }; Google: undefined; Home: { screen: string }; }; type LoginScreenProps = { onClose?: () => void; isModal?: boolean; }; export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => { const { setUser } = useUserStore(); const { t } = useTranslation(); const navigation = useNavigation>(); // 全新的状态管理方式 const [emailModalVisible, setEmailModalVisible] = useState(false); const [phoneModalVisible, setPhoneModalVisible] = useState(false); // 防止多次触发 const isProcessingEmail = useRef(false); const isProcessingPhone = useRef(false); // 处理Android返回按钮 useEffect(() => { const backAction = () => { if (emailModalVisible) { setEmailModalVisible(false); return true; } if (phoneModalVisible) { setPhoneModalVisible(false); return true; } handleClose(); return true; }; const backHandler = BackHandler.addEventListener( "hardwareBackPress", backAction ); return () => backHandler.remove(); }, [emailModalVisible, phoneModalVisible]); // 关闭主屏幕 const handleClose = () => { if (isModal && onClose) { onClose(); } else { navigation.goBack(); } }; // 处理谷歌登录 const handleGoogleLogin = async () => { 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"); } } }; const [userInfo, setUserInfo] = useState(null); useEffect(() => { // 确保在 App 启动时初始化 SDK。这通常在您的 App.js 的顶层完成。 // 如果您在 app.json 中配置了 Facebook App ID,这里可以省略 Settings.setAppID 和 Settings.setDisplayName Settings.initializeSDK(); // 在应用程序启动时检查是否已经登录(可选) AccessToken.getCurrentAccessToken().then(data => { if (data) { console.log("已登录 Facebook,Token:", data.accessToken); // 可以尝试获取用户信息 // fetchFacebookProfile(data.accessToken); } }); }, []); // 辅助函数:获取 Facebook 用户资料 (可选,需要 'public_profile' 权限) const fetchFacebookProfile = async (token:string) => { try { const response = await fetch(`https://graph.facebook.com/me?fields=id,name,email&access_token=${token}`); const profile = await response.json(); setUserInfo(profile); console.log('Facebook User Info:', profile); return profile; } catch (error) { console.error('获取 Facebook 用户资料错误:', error); Alert.alert("获取资料失败", "无法从 Facebook 获取用户详细资料,请检查网络或权限设置。"); return null; } }; // 处理Facebook登录 const handleFacebookLogin = async () => { try { // 可选: 先退出登录,确保每次都是全新登录 (主要用于测试) // await LoginManager.logOut(); const result = await LoginManager.logInWithPermissions([ "public_profile", "email", ]); if (result.isCancelled) { Alert.alert("登录取消", "用户取消了 Facebook 登录。"); return; } const data = await AccessToken.getCurrentAccessToken(); // 确保 accessToken 存在且为字符串 if (!data || !data.accessToken) { Alert.alert("登录失败", "无法获取有效的 Facebook AccessToken。"); return; } const tokenString = data.accessToken.toString(); console.log("Facebook Access Token:", tokenString); // 获取 Facebook 用户信息 const profile = await fetchFacebookProfile(tokenString); if (profile) { try { // 准备发送给后端的数据 - 扁平化格式 const facebookData = { id: profile.id, name: profile.name, email: profile.email, access_token: tokenString }; console.log("发送给后端的Facebook数据:", facebookData); // 调用后端Facebook登录API const res = await loginApi.facebookLogin(facebookData); console.log("Facebook 后端登录响应:", res); // 获取用户信息并更新状态 const user = await userApi.getProfile(); setUser(user); // 导航到主页面 navigation.navigate("MainTabs", { screen: "Home" }); } catch (err) { console.log("Facebook 后端登录失败:", err); Alert.alert("登录失败", "Facebook 登录验证失败,请重试。"); } } else { Alert.alert("登录失败", "无法获取 Facebook 用户信息,请重试。"); } } catch (error: any) { console.error("Facebook 登录或获取资料时发生错误:", error); let errorMessage = "发生未知错误"; if (error && typeof error.message === 'string') { errorMessage = error.message; } Alert.alert("登录错误", `Facebook 操作失败:${errorMessage}`); } }; // 处理Apple登录 const handleAppleLogin = () => { // 处理Apple登录 }; // 处理Instagram登录 const handleInstagramLogin = () => { // 处理Instagram登录 }; // 显示邮箱登录 const showEmailModal = () => { if (isProcessingEmail.current) return; isProcessingEmail.current = true; // 确保手机模态框已关闭 setPhoneModalVisible(false); // 延迟打开邮箱模态框,避免冲突 setTimeout(() => { setEmailModalVisible(true); isProcessingEmail.current = false; }, 100); }; // 显示手机登录 const showPhoneModal = () => { if (isProcessingPhone.current) return; isProcessingPhone.current = true; // 确保邮箱模态框已关闭 setEmailModalVisible(false); // 延迟打开手机模态框,避免冲突 setTimeout(() => { setPhoneModalVisible(true); isProcessingPhone.current = false; }, 100); }; // 关闭邮箱登录 const hideEmailModal = () => { console.log("Hiding email modal"); setEmailModalVisible(false); }; // 关闭手机登录 const hidePhoneModal = () => { console.log("Hiding phone modal"); setPhoneModalVisible(false); }; // 处理忘记密码 const handleForgotPassword = () => { // 处理忘记密码 }; return ( {/* 顶部蓝色背景区域 */} brainnel 💰 {t("wholesalePrice")} 🚚 {t("fastShipping")} {/* 登录区域 */} × {t("loginSubtitle")} {/* 登录按钮 */} {isDevelopment ? "🧪 " + t("continueWithGoogle") + " (测试模式)" : t("continueWithGoogle")} f {t("continueWithFacebook")} {Platform.OS === "ios" && ( 🍎 {t("continueWithApple")} )} 📷 {t("continueWithInstagram")} ✉️ {t("continueWithEmail")} 📱 {t("continueWithPhone")} {/* 忘记密码 */} {t("forgotPassword")} {/* 服务条款 */} {t("termsText")}{" "} {t("termsOfUse")} {t("and")} {t("privacyPolicy")} {/* 邮箱登录模态框 - 直接渲染 */} {/* 手机登录模态框 - 直接渲染 */} ); }; const styles = StyleSheet.create({ safeArea: { flex: 1, }, safeAreaContent: { flex: 1, paddingTop: 0, }, container: { flex: 1, backgroundColor: "#FFF", }, closeButton: { position: "absolute", top: 15, left: 10, width: 24, height: 24, justifyContent: "center", alignItems: "center", zIndex: 1, }, closeButtonText: { color: "#000", fontSize: fontSize(24), fontWeight: "300", }, blueHeader: { backgroundColor: "#0066FF", paddingHorizontal: 20, paddingBottom: 20, paddingTop: Platform.OS === "ios" ? 60 : 40, borderBottomLeftRadius: 24, borderBottomRightRadius: 24, }, logo: { fontSize: fontSize(28), fontWeight: "bold", color: "#fff", marginBottom: 15, }, features: { flexDirection: "row", gap: 16, }, featureItem: { flexDirection: "row", alignItems: "center", gap: 8, }, featureIconContainer: { backgroundColor: "rgba(255, 255, 255, 0.2)", borderRadius: 8, width: 24, height: 24, justifyContent: "center", alignItems: "center", }, featureIcon: { fontSize: fontSize(12), }, featureText: { fontSize: fontSize(14), color: "#fff", }, loginContainer: { flex: 1, paddingHorizontal: 20, paddingTop: Platform.OS === "ios" ? 40 : 20, }, titleContainer: { alignItems: "center", marginBottom: 30, paddingTop: 20, position: "relative", }, subtitle: { fontSize: fontSize(14), color: "#666", textAlign: "center", }, loginButton: { flexDirection: "row", height: 50, borderRadius: 25, borderWidth: 1, borderColor: "#E1E1E1", alignItems: "center", marginBottom: 12, paddingHorizontal: 16, backgroundColor: "#fff", }, loginButtonIcon: { width: 24, height: 24, borderRadius: 12, justifyContent: "center", alignItems: "center", marginRight: 16, }, facebookIcon: { backgroundColor: "#3b5998", }, appleIconBg: { backgroundColor: "#000", }, instagramIcon: { backgroundColor: "#E1306C", }, loginButtonText: { flex: 1, fontSize: fontSize(16), color: "#000", textAlign: "center", marginRight: 16, }, forgotPassword: { alignItems: "center", marginVertical: 20, }, forgotPasswordText: { color: "#0066FF", fontSize: fontSize(14), }, termsContainer: { alignItems: "center", marginTop: 10, }, terms: { fontSize: fontSize(12), color: "#666", textAlign: "center", lineHeight: 18, }, link: { color: "#0066FF", }, }); export default LoginScreen;