114 lines
3.4 KiB
TypeScript
114 lines
3.4 KiB
TypeScript
/**
|
|
* EN: OAuth utility functions for social authentication
|
|
* VI: Các hàm tiện ích OAuth cho xác thực mạng xã hội
|
|
*/
|
|
|
|
/**
|
|
* EN: Get API base URL from environment
|
|
* VI: Lấy API base URL từ environment
|
|
*/
|
|
const getApiBaseUrl = (): string => {
|
|
return process.env.NEXT_PUBLIC_API_URL || 'http://localhost/api/v1';
|
|
};
|
|
|
|
/**
|
|
* EN: OAuth provider types
|
|
* VI: Các loại provider OAuth
|
|
*/
|
|
export type OAuthProvider = 'google' | 'facebook' | 'github';
|
|
|
|
/**
|
|
* EN: Initiate OAuth flow by redirecting to backend OAuth endpoint
|
|
* VI: Bắt đầu luồng OAuth bằng cách chuyển hướng đến endpoint OAuth của backend
|
|
*
|
|
* @param provider - OAuth provider (google, facebook, github)
|
|
* @param redirectUrl - Optional redirect URL after successful authentication
|
|
*/
|
|
export const initiateOAuth = (provider: OAuthProvider, redirectUrl?: string): void => {
|
|
// EN: Store redirect URL in sessionStorage for use after callback
|
|
// VI: Lưu redirect URL vào sessionStorage để sử dụng sau callback
|
|
if (redirectUrl && typeof window !== 'undefined') {
|
|
sessionStorage.setItem('oauth_redirect', redirectUrl);
|
|
}
|
|
|
|
// EN: Build OAuth initiation URL
|
|
// VI: Xây dựng URL bắt đầu OAuth
|
|
const apiBaseUrl = getApiBaseUrl();
|
|
const oauthUrl = `${apiBaseUrl}/auth/social/${provider}`;
|
|
|
|
// EN: Redirect to backend OAuth endpoint
|
|
// VI: Chuyển hướng đến endpoint OAuth của backend
|
|
if (typeof window !== 'undefined') {
|
|
window.location.href = oauthUrl;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* EN: Handle OAuth callback by extracting token from URL
|
|
* VI: Xử lý OAuth callback bằng cách trích xuất token từ URL
|
|
*
|
|
* @param token - Access token from OAuth callback
|
|
* @returns Access token string
|
|
*/
|
|
export const handleOAuthCallback = (token: string): string => {
|
|
return token;
|
|
};
|
|
|
|
/**
|
|
* EN: Handle OAuth error by extracting error message from URL
|
|
* VI: Xử lý lỗi OAuth bằng cách trích xuất thông báo lỗi từ URL
|
|
*
|
|
* @param errorMessage - Error message from OAuth callback
|
|
* @returns Error message string
|
|
*/
|
|
export const handleOAuthError = (errorMessage: string): string => {
|
|
return decodeURIComponent(errorMessage);
|
|
};
|
|
|
|
/**
|
|
* EN: Get stored redirect URL from sessionStorage
|
|
* VI: Lấy redirect URL đã lưu từ sessionStorage
|
|
*
|
|
* @returns Redirect URL or null
|
|
*/
|
|
export const getStoredRedirectUrl = (): string | null => {
|
|
if (typeof window === 'undefined') {
|
|
return null;
|
|
}
|
|
const redirectUrl = sessionStorage.getItem('oauth_redirect');
|
|
if (redirectUrl) {
|
|
sessionStorage.removeItem('oauth_redirect');
|
|
}
|
|
return redirectUrl;
|
|
};
|
|
|
|
/**
|
|
* EN: Google OAuth initiation helper
|
|
* VI: Helper để bắt đầu OAuth Google
|
|
*
|
|
* @param redirectUrl - Optional redirect URL after successful authentication
|
|
*/
|
|
export const signInWithGoogle = (redirectUrl?: string): void => {
|
|
initiateOAuth('google', redirectUrl);
|
|
};
|
|
|
|
/**
|
|
* EN: Facebook OAuth initiation helper
|
|
* VI: Helper để bắt đầu OAuth Facebook
|
|
*
|
|
* @param redirectUrl - Optional redirect URL after successful authentication
|
|
*/
|
|
export const signInWithFacebook = (redirectUrl?: string): void => {
|
|
initiateOAuth('facebook', redirectUrl);
|
|
};
|
|
|
|
/**
|
|
* EN: GitHub OAuth initiation helper
|
|
* VI: Helper để bắt đầu OAuth GitHub
|
|
*
|
|
* @param redirectUrl - Optional redirect URL after successful authentication
|
|
*/
|
|
export const signInWithGitHub = (redirectUrl?: string): void => {
|
|
initiateOAuth('github', redirectUrl);
|
|
};
|