添加Apple登录

This commit is contained in:
xianyi
2026-01-16 09:58:07 +08:00
parent cc88c283ce
commit 370f04d721
8 changed files with 521 additions and 46 deletions

View File

@@ -2,6 +2,8 @@ import { API_CONFIG, API_ENDPOINTS } from "@/constants/api";
import {
ApiListResponse,
ApiResponse,
AppleSignInRequest,
AppleSignInResponse,
Country,
H2HData,
League,
@@ -9,11 +11,15 @@ import {
Match,
MatchDetailData,
OddsData,
RefreshTokenRequest,
RefreshTokenResponse,
SearchResult,
Sport,
UpcomingMatch,
UserProfile,
} from "@/types/api";
import axios from "axios";
import { storage } from "./storage";
const apiClient = axios.create({
baseURL: API_CONFIG.BASE_URL,
@@ -23,6 +29,55 @@ const apiClient = axios.create({
},
});
apiClient.interceptors.request.use(async (config) => {
const token = await storage.getAccessToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
const refreshTokenApi = async (
request: RefreshTokenRequest
): Promise<RefreshTokenResponse> => {
try {
const response = await apiClient.post<
ApiResponse<RefreshTokenResponse>
>(API_ENDPOINTS.REFRESH_TOKEN, request);
if (response.data.code === 0) {
return response.data.data;
}
throw new Error(response.data.message);
} catch (error) {
console.error("Refresh token error:", error);
throw error;
}
};
apiClient.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
const refreshTokenValue = await storage.getRefreshToken();
if (refreshTokenValue) {
const res = await refreshTokenApi({ refreshToken: refreshTokenValue });
await storage.setAccessToken(res.accessToken);
originalRequest.headers.Authorization = `Bearer ${res.accessToken}`;
return apiClient(originalRequest);
}
} catch {
await storage.clear();
}
}
return Promise.reject(error);
}
);
export const fetchSports = async (): Promise<Sport[]> => {
try {
const response = await apiClient.get<ApiResponse<ApiListResponse<Sport>>>(
@@ -311,3 +366,58 @@ export const fetchH2H = async (
throw error;
}
};
export const appleSignIn = async (
request: AppleSignInRequest
): Promise<AppleSignInResponse> => {
try {
const response = await apiClient.post<
ApiResponse<AppleSignInResponse>
>(API_ENDPOINTS.APPLE_SIGNIN, request);
if (response.data.code === 0) {
return response.data.data;
}
throw new Error(response.data.message);
} catch (error) {
console.error("Apple sign in error:", error);
throw error;
}
};
export const logout = async (): Promise<string> => {
try {
const response = await apiClient.post<ApiResponse<string>>(
API_ENDPOINTS.LOGOUT
);
if (response.data.code === 0) {
return response.data.data;
}
throw new Error(response.data.message);
} catch (error) {
console.error("Logout error:", error);
throw error;
}
};
export const refreshToken = refreshTokenApi;
export const fetchUserProfile = async (): Promise<UserProfile> => {
try {
const response = await apiClient.get<ApiResponse<UserProfile>>(
API_ENDPOINTS.USER_PROFILE
);
if (response.data.code === 0) {
return response.data.data;
}
throw new Error(response.data.message);
} catch (error) {
console.error("Fetch user profile error:", error);
throw error;
}
};