fix and update
This commit is contained in:
47
apps/frontend/lib/fedcm-login-bridge.ts
Normal file
47
apps/frontend/lib/fedcm-login-bridge.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { syncFedcmSession } from '@/lib/api';
|
||||
|
||||
type FedcmLoginNavigator = Navigator & {
|
||||
login?: {
|
||||
setStatus: (status: 'logged-in' | 'logged-out') => void;
|
||||
};
|
||||
};
|
||||
|
||||
type FedcmIdentityProviderGlobal = {
|
||||
close?: () => void;
|
||||
};
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
IdentityProvider?: FedcmIdentityProviderGlobal;
|
||||
}
|
||||
}
|
||||
|
||||
/** Завершение входа в popup FedCM: cookie + Set-Login для браузера. */
|
||||
export async function finalizeFedcmLogin(accessToken: string) {
|
||||
if (typeof window === 'undefined' || !accessToken) {
|
||||
return;
|
||||
}
|
||||
|
||||
await syncFedcmSession(accessToken);
|
||||
|
||||
const loginApi = (navigator as FedcmLoginNavigator).login;
|
||||
if (loginApi?.setStatus) {
|
||||
try {
|
||||
loginApi.setStatus('logged-in');
|
||||
} catch {
|
||||
// FedCM API может быть недоступен вне popup-контекста
|
||||
}
|
||||
}
|
||||
|
||||
if (window.IdentityProvider?.close) {
|
||||
try {
|
||||
window.IdentityProvider.close();
|
||||
} catch {
|
||||
// закрытие необязательно — браузер сам закроет popup после setStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function shouldFinalizeFedcmLogin(pathname: string) {
|
||||
return pathname.startsWith('/auth/login');
|
||||
}
|
||||
Reference in New Issue
Block a user