56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import { AUTH_REFRESH_KEY, AUTH_SESSION_KEY, AUTH_TOKEN_KEY } from '@/lib/api';
|
|
|
|
export const EMBEDDED_AUTH_MESSAGE = 'lendry-id-embedded-auth';
|
|
|
|
export interface EmbeddedAuthPayload {
|
|
type: typeof EMBEDDED_AUTH_MESSAGE;
|
|
token: string;
|
|
refreshToken?: string;
|
|
sessionId?: string;
|
|
}
|
|
|
|
export function postEmbeddedAuthToIframe(iframe: HTMLIFrameElement, auth: { token: string; refreshToken?: string | null; sessionId?: string | null }) {
|
|
const target = iframe.contentWindow;
|
|
if (!target || !auth.token) return;
|
|
const payload: EmbeddedAuthPayload = {
|
|
type: EMBEDDED_AUTH_MESSAGE,
|
|
token: auth.token,
|
|
refreshToken: auth.refreshToken ?? undefined,
|
|
sessionId: auth.sessionId ?? undefined
|
|
};
|
|
target.postMessage(payload, window.location.origin);
|
|
}
|
|
|
|
export function useEmbeddedAuthFallback() {
|
|
const [embeddedToken, setEmbeddedToken] = useState<string | null>(null);
|
|
|
|
useEffect(() => {
|
|
function handleMessage(event: MessageEvent) {
|
|
if (event.origin !== window.location.origin) return;
|
|
const data = event.data as Partial<EmbeddedAuthPayload> | null;
|
|
if (!data || data.type !== EMBEDDED_AUTH_MESSAGE || !data.token?.trim()) return;
|
|
|
|
const token = data.token.trim();
|
|
setEmbeddedToken(token);
|
|
window.localStorage.setItem(AUTH_TOKEN_KEY, token);
|
|
if (data.refreshToken) {
|
|
window.localStorage.setItem(AUTH_REFRESH_KEY, data.refreshToken);
|
|
}
|
|
if (data.sessionId) {
|
|
window.localStorage.setItem(AUTH_SESSION_KEY, data.sessionId);
|
|
}
|
|
}
|
|
|
|
window.addEventListener('message', handleMessage);
|
|
if (window.parent !== window) {
|
|
window.parent.postMessage({ type: 'lendry-id-embedded-auth-request' }, window.location.origin);
|
|
}
|
|
return () => window.removeEventListener('message', handleMessage);
|
|
}, []);
|
|
|
|
return embeddedToken;
|
|
}
|