56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
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');
|
|
}
|
|
|
|
export function isFedcmLoginPopup() {
|
|
if (typeof window === 'undefined') return false;
|
|
if (window.opener) return true;
|
|
if (window.IdentityProvider?.close) return true;
|
|
const params = new URLSearchParams(window.location.search);
|
|
return params.get('fedcm') === '1';
|
|
}
|