Browse Source

进度条

main
Mac 2 weeks ago
parent
commit
878d6f8e64
  1. 25
      app/screens/ProfileScreen.tsx
  2. 276
      app/screens/loginList/index.tsx
  3. 4
      app/services/api/userApi.ts
  4. 42
      loginHas.txt

25
app/screens/ProfileScreen.tsx

@ -131,17 +131,26 @@ export const ProfileScreen = () => {
style={styles.VipImg} style={styles.VipImg}
/> />
<Text style={styles.discountPercentageTextStyle}> <Text style={styles.discountPercentageTextStyle}>
{((1 - user?.vip_discount) * 100).toFixed(0)}% -{((1 - user?.vip_discount) * 100).toFixed(0)}%
</Text> </Text>
</View> </View>
</View> </View>
<View style={styles.progressBar}> <View style={styles.progressBar}>
<View style={styles.progressBarFill}> <View style={styles.progressBarFill}>
<Text style={styles.progressBarText}> <Text style={styles.progressBarText}>
40000/50000 {user.points}/{user.next_level_points_threshold}
</Text> </Text>
</View> </View>
<View style={styles.progressBarLine}></View> <View style={styles.progressBarContainer}>
<View
style={[
styles.progressBarFilled,
{
width: `${Math.min((user.points / user.next_level_points_threshold) * 100, 100)}%`
}
]}
></View>
</View>
</View> </View>
</View> </View>
<View style={styles.vipExplanation}> <View style={styles.vipExplanation}>
@ -567,10 +576,18 @@ const styles = StyleSheet.create({
fontFamily: "Segoe UI", fontFamily: "Segoe UI",
color: "#fcca80", color: "#fcca80",
}, },
progressBarLine: { progressBarContainer: {
width: "100%", width: "100%",
height: 3, height: 3,
backgroundColor: "#d9d9d9", backgroundColor: "#d9d9d9",
position: "relative",
},
progressBarFilled: {
position: "absolute",
top: 0,
left: 0,
height: "100%",
backgroundColor: "#f2cc86",
}, },
vipExplanation: { vipExplanation: {
width: "100%", width: "100%",

276
app/screens/loginList/index.tsx

@ -23,29 +23,29 @@ import { userApi } from "../../services";
import useUserStore from "../../store/user"; import useUserStore from "../../store/user";
// 使用标准的ES6模块导入 // 使用标准的ES6模块导入
import { // import {
GoogleSignin, // GoogleSignin,
statusCodes, // statusCodes,
} from "@react-native-google-signin/google-signin"; // } from "@react-native-google-signin/google-signin";
import { LoginManager, AccessToken, Settings } from "react-native-fbsdk-next"; // import { LoginManager, AccessToken, Settings } from "react-native-fbsdk-next";
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: // webClientId:
"449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID // "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID
scopes: ["profile", "email"], // scopes: ["profile", "email"],
offlineAccess: false, // <-- 确保为 false 或移除 // offlineAccess: false, // <-- 确保为 false 或移除
forceCodeForRefreshToken: false, // <-- 确保为 false 或移除 // forceCodeForRefreshToken: false, // <-- 确保为 false 或移除
}); // });
} catch (error) { // } catch (error) {
console.log("Google Sign-in模块配置错误:", error); // 稍微修改了日志信息 // console.log("Google Sign-in模块配置错误:", error); // 稍微修改了日志信息
} // }
type RootStackParamList = { type RootStackParamList = {
Login: undefined; Login: undefined;
@ -108,150 +108,122 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
// 处理谷歌登录 // 处理谷歌登录
const handleGoogleLogin = async () => { const handleGoogleLogin = async () => {
try { // try {
if (!GoogleSignin || typeof GoogleSignin.signIn !== "function") { // if (!GoogleSignin || typeof GoogleSignin.signIn !== "function") {
console.log("Google Sign-in模块未正确初始化或配置失败"); // console.log("Google Sign-in模块未正确初始化或配置失败");
return; // return;
} // }
await GoogleSignin.hasPlayServices(); // await GoogleSignin.hasPlayServices();
const userInfo = await GoogleSignin.signIn(); // const userInfo = await GoogleSignin.signIn();
console.log("Google 登录成功:", userInfo); // console.log("Google 登录成功:", userInfo);
try { // try {
const res = await loginApi.googleLogin(userInfo); // const res = await loginApi.googleLogin(userInfo);
const user = await userApi.getProfile(); // const user = await userApi.getProfile();
setUser(user); // setUser(user);
navigation.navigate("MainTabs", { screen: "Home" }); // navigation.navigate("MainTabs", { screen: "Home" });
} catch (err) { // } catch (err) {
console.log("Google 登录失败:", err); // console.log("Google 登录失败:", err);
navigation.navigate("Login"); // navigation.navigate("Login");
} // }
// 这里可以处理登录成功后的逻辑 // // 这里可以处理登录成功后的逻辑
// 比如导航到主页面或保存用户信息 // // 比如导航到主页面或保存用户信息
// navigation.navigate("MainTabs", { screen: "Home" }); // // navigation.navigate("MainTabs", { screen: "Home" });
} catch (error: any) { // } catch (error: any) {
console.log("Google 登录错误:", error); // console.log("Google 登录错误:", error);
// 开发模式下的错误处理 // // 开发模式下的错误处理
if (isDevelopment) { // if (isDevelopment) {
console.log("开发模式:忽略Google登录错误,但已尝试真实登录"); // 修改日志,表明已尝试真实登录 // console.log("开发模式:忽略Google登录错误,但已尝试真实登录"); // 修改日志,表明已尝试真实登录
return; // return;
} // }
if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) { // if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) {
console.log("用户取消登录"); // console.log("用户取消登录");
} else if (statusCodes && error.code === statusCodes.IN_PROGRESS) { // } else if (statusCodes && error.code === statusCodes.IN_PROGRESS) {
console.log("登录正在进行中"); // console.log("登录正在进行中");
} else if ( // } else if (
statusCodes && // statusCodes &&
error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE // error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE
) { // ) {
console.log("Play Services 不可用"); // console.log("Play Services 不可用");
} else { // } else {
console.log("其他错误:", error.message); // console.log("其他错误:", error.message);
navigation.navigate("Login"); // navigation.navigate("Login");
} // }
} // }
}; };
const [userInfo, setUserInfo] = useState<any>(null); const [userInfo, setUserInfo] = useState<any>(null);
useEffect(() => { // useEffect(() => {
// 确保在 App 启动时初始化 SDK。这通常在您的 App.js 的顶层完成。 // // 确保在 App 启动时初始化 SDK。这通常在您的 App.js 的顶层完成。
// 如果您在 app.json 中配置了 Facebook App ID,这里可以省略 Settings.setAppID 和 Settings.setDisplayName // // 如果您在 app.json 中配置了 Facebook App ID,这里可以省略 Settings.setAppID 和 Settings.setDisplayName
Settings.initializeSDK(); // Settings.initializeSDK();
// 在应用程序启动时检查是否已经登录(可选)
AccessToken.getCurrentAccessToken().then(data => {
if (data) {
console.log("已登录 Facebook,Token:", data.accessToken);
// 可以尝试获取用户信息
// fetchFacebookProfile(data.accessToken);
}
});
}, []); // // 在应用程序启动时检查是否已经登录(可选)
// AccessToken.getCurrentAccessToken().then(data => {
// if (data) {
// console.log("已登录 Facebook,Token:", data.accessToken);
// // 可以尝试获取用户信息
// // fetchFacebookProfile(data.accessToken);
// }
// });
// }, []);
// 辅助函数:获取 Facebook 用户资料 (可选,需要 'public_profile' 权限) // 辅助函数:获取 Facebook 用户资料 (可选,需要 'public_profile' 权限)
const fetchFacebookProfile = async (token:string) => { // const fetchFacebookProfile = async (token:string) => {
try { // try {
const response = await fetch(`https://graph.facebook.com/me?fields=id,name,email&access_token=${token}`); // const response = await fetch(`https://graph.facebook.com/me?fields=id,name,email&access_token=${token}`);
const profile = await response.json(); // const profile = await response.json();
setUserInfo(profile); // setUserInfo(profile);
console.log('Facebook User Info:', profile); // console.log('Facebook User Info:', profile);
return profile; // } catch (error) {
} catch (error) { // console.error('获取 Facebook 用户资料错误:', error);
console.error('获取 Facebook 用户资料错误:', error); // Alert.alert("获取资料失败", "无法从 Facebook 获取用户详细资料,请检查网络或权限设置。");
Alert.alert("获取资料失败", "无法从 Facebook 获取用户详细资料,请检查网络或权限设置。"); // }
return null; // };
}
};
// 处理Facebook登录 // 处理Facebook登录
const handleFacebookLogin = async () => { const handleFacebookLogin = async () => {
try { // try {
// 可选: 先退出登录,确保每次都是全新登录 (主要用于测试) // // 可选: 先退出登录,确保每次都是全新登录 (主要用于测试)
// await LoginManager.logOut(); // // await LoginManager.logOut();
const result = await LoginManager.logInWithPermissions([ // const result = await LoginManager.logInWithPermissions([
"public_profile", // "public_profile",
"email", // "email",
]); // ]);
if (result.isCancelled) { // if (result.isCancelled) {
Alert.alert("登录取消", "用户取消了 Facebook 登录。"); // Alert.alert("登录取消", "用户取消了 Facebook 登录。");
return; // return;
} // }
const data = await AccessToken.getCurrentAccessToken(); // const data = await AccessToken.getCurrentAccessToken();
// 确保 accessToken 存在且为字符串 // // 确保 accessToken 存在且为字符串
if (!data || !data.accessToken) { // if (!data || !data.accessToken) {
Alert.alert("登录失败", "无法获取有效的 Facebook AccessToken。"); // Alert.alert("登录失败", "无法获取有效的 Facebook AccessToken。");
return; // return;
} // }
const tokenString = data.accessToken.toString(); // const tokenString = data.accessToken.toString();
console.log("Facebook Access Token:", tokenString); // console.log("Facebook Access Token:", tokenString);
// 获取 Facebook 用户信息 // // 直接获取 Facebook 用户信息并打印
const profile = await fetchFacebookProfile(tokenString); // await fetchFacebookProfile(tokenString);
if (profile) { // // 移除之前的 Alert, 因为 fetchFacebookProfile 内部会处理打印和可能的错误提示
try { // // 如果 fetchFacebookProfile 成功,信息已在控制台,如果失败,它会 Alert
// 准备发送给后端的数据 - 扁平化格式 // // 可以选择在这里加一个通用成功提示,表明流程已执行
const facebookData = { // Alert.alert("操作完成", "已尝试 Facebook 登录并获取用户信息,请查看控制台输出。");
id: profile.id,
name: profile.name, // } catch (error: any) {
email: profile.email, // console.error("Facebook 登录或获取资料时发生错误:", error);
access_token: tokenString // let errorMessage = "发生未知错误";
}; // if (error && typeof error.message === 'string') {
// errorMessage = error.message;
console.log("发送给后端的Facebook数据:", facebookData); // }
// Alert.alert("登录错误", `Facebook 操作失败:${errorMessage}`);
// 调用后端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登录 // 处理Apple登录

4
app/services/api/userApi.ts

@ -19,7 +19,9 @@ export interface User {
balance_currency:string, balance_currency:string,
country_en:string, country_en:string,
language:string, language:string,
vip_level:number vip_level:number,
points:number,
next_level_points_threshold:number
} }
export interface UserSettings { export interface UserSettings {

42
loginHas.txt

@ -176,9 +176,11 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
const profile = await response.json(); const profile = await response.json();
setUserInfo(profile); setUserInfo(profile);
console.log('Facebook User Info:', profile); console.log('Facebook User Info:', profile);
return profile;
} catch (error) { } catch (error) {
console.error('获取 Facebook 用户资料错误:', error); console.error('获取 Facebook 用户资料错误:', error);
Alert.alert("获取资料失败", "无法从 Facebook 获取用户详细资料,请检查网络或权限设置。"); Alert.alert("获取资料失败", "无法从 Facebook 获取用户详细资料,请检查网络或权限设置。");
return null;
} }
}; };
@ -208,13 +210,39 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => {
const tokenString = data.accessToken.toString(); const tokenString = data.accessToken.toString();
console.log("Facebook Access Token:", tokenString); console.log("Facebook Access Token:", tokenString);
// 直接获取 Facebook 用户信息并打印 // 获取 Facebook 用户信息
await fetchFacebookProfile(tokenString); const profile = await fetchFacebookProfile(tokenString);
// 移除之前的 Alert, 因为 fetchFacebookProfile 内部会处理打印和可能的错误提示 if (profile) {
// 如果 fetchFacebookProfile 成功,信息已在控制台,如果失败,它会 Alert try {
// 可以选择在这里加一个通用成功提示,表明流程已执行 // 准备发送给后端的数据 - 扁平化格式
Alert.alert("操作完成", "已尝试 Facebook 登录并获取用户信息,请查看控制台输出。"); 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) { } catch (error: any) {
console.error("Facebook 登录或获取资料时发生错误:", error); console.error("Facebook 登录或获取资料时发生错误:", error);

Loading…
Cancel
Save