Files
SRCmail/components/providers/embedded-bridge-provider.tsx
T

44 lines
1.4 KiB
TypeScript

"use client";
import { useEffect } from "react";
import { isEmbedded, listenFromParent } from "@/lib/iframe-bridge";
import { getPathPrefix, getLocaleFromPath } from "@/lib/browser-navigation";
import { useAuthStore } from "@/stores/auth-store";
import { useConfig } from "@/hooks/use-config";
export function EmbeddedBridgeProvider({ children }: { children: React.ReactNode }) {
const { parentOrigin, embeddedMode } = useConfig();
const logout = useAuthStore((s) => s.logout);
useEffect(() => {
if (!embeddedMode || !isEmbedded()) return;
// Refuse to attach the listener without a pinned parent origin -
// otherwise any cross-origin frame could forge sso:trigger-logout.
if (!parentOrigin) {
console.error(
"[embedded-bridge] embeddedMode is enabled but parentOrigin is not configured; refusing to attach message listener",
);
return;
}
const unsubscribe = listenFromParent((msg) => {
switch (msg.type) {
case "sso:trigger-login": {
// Navigate to login page to start SSO flow
const prefix = getPathPrefix();
const locale = getLocaleFromPath();
window.location.href = `${prefix}/${locale}/login`;
break;
}
case "sso:trigger-logout":
logout();
break;
}
}, parentOrigin);
return unsubscribe;
}, [embeddedMode, parentOrigin, logout]);
return <>{children}</>;
}