65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import type { ReactNode } from "react";
|
|
|
|
/**
|
|
* Install session from the URL hash BEFORE React AuthProvider runs.
|
|
* Cross-subdomain localStorage is empty until this runs; without it,
|
|
* ProtectedRoute saw ?businessId= and bounced admins back to /businesses.
|
|
*/
|
|
const HANDOFF_BOOT = `
|
|
(function () {
|
|
try {
|
|
var raw = location.hash ? location.hash.replace(/^#/, "") : "";
|
|
if (!raw) return;
|
|
var p = new URLSearchParams(raw);
|
|
var access = p.get("access");
|
|
var refresh = p.get("refresh");
|
|
var businessId = p.get("businessId");
|
|
var clearManaged = p.get("clearManaged") === "1";
|
|
var next = p.get("next") || "/profile";
|
|
if (!access || !refresh) return;
|
|
|
|
localStorage.setItem("marketplace_access_token", access);
|
|
localStorage.setItem("marketplace_refresh_token", refresh);
|
|
|
|
var root = "localhost";
|
|
try {
|
|
// Best-effort shared cookie for *.localhost / prod root
|
|
document.cookie =
|
|
"marketplace_access_token=" +
|
|
encodeURIComponent(access) +
|
|
"; Path=/; Max-Age=1209600; SameSite=Lax; Domain=" +
|
|
root;
|
|
document.cookie =
|
|
"marketplace_refresh_token=" +
|
|
encodeURIComponent(refresh) +
|
|
"; Path=/; Max-Age=1209600; SameSite=Lax; Domain=" +
|
|
root;
|
|
} catch (e) {}
|
|
|
|
if (businessId) {
|
|
localStorage.setItem("marketplace_managed_business_id", businessId);
|
|
sessionStorage.setItem("marketplace_managed_business_id", businessId);
|
|
} else if (clearManaged) {
|
|
localStorage.removeItem("marketplace_managed_business_id");
|
|
sessionStorage.removeItem("marketplace_managed_business_id");
|
|
}
|
|
|
|
var target = next.charAt(0) === "/" ? next : "/" + next;
|
|
location.replace(target);
|
|
} catch (e) {}
|
|
})();
|
|
`;
|
|
|
|
export default function AuthHandoffLayout({
|
|
children,
|
|
}: {
|
|
children: ReactNode;
|
|
}) {
|
|
return (
|
|
<>
|
|
<script dangerouslySetInnerHTML={{ __html: HANDOFF_BOOT }} />
|
|
{children}
|
|
</>
|
|
);
|
|
}
|