Browse Source

feat: implement initial server-side injection of marriage data into window global and improve cookie parsing robustness

master
mortezaei 2 weeks ago
parent
commit
5148c60ad8
  1. 26
      src/app/layout.tsx
  2. 21
      src/lib/auth-bridge.ts
  3. 8
      src/lib/cookies.ts

26
src/app/layout.tsx

@ -85,6 +85,24 @@ export default async function RootLayout({
? cookieLocale
: defaultLocale;
const rawMarriageCookie =
cookieStore.get("HABIB_MARRIAGE_DATA")?.value ??
cookieStore.get("habib_marriage_data")?.value;
let initialMarriageJson: string | null = null;
if (rawMarriageCookie) {
try {
const decoded = decodeURIComponent(rawMarriageCookie);
JSON.parse(decoded);
initialMarriageJson = decoded;
} catch {
try {
JSON.parse(rawMarriageCookie);
initialMarriageJson = rawMarriageCookie;
} catch {}
}
}
return (
<html
lang={locale}
@ -99,6 +117,14 @@ export default async function RootLayout({
/>
<link rel="preconnect" href="https://habibapp.com" />
<link rel="dns-prefetch" href="https://habibapp.com" />
{initialMarriageJson && (
<script
id="habib-early-marriage-initial-data"
dangerouslySetInnerHTML={{
__html: `window.__HABIB_MARRIAGE_INITIAL_DATA__ = ${initialMarriageJson}; window.HABIB_MARRIAGE = window.__HABIB_MARRIAGE_INITIAL_DATA__;`,
}}
/>
)}
<script
id="habib-core-bootstrap"
dangerouslySetInnerHTML={{

21
src/lib/auth-bridge.ts

@ -35,6 +35,9 @@ class AuthBridge {
}
public getMarriageData(): Record<string, any> | null {
if (!this.marriageData) {
this.syncFromStorage();
}
return this.marriageData;
}
@ -48,19 +51,31 @@ class AuthBridge {
HABIB_COINS?: number;
HABIB_MARRIAGE?: Record<string, any>;
__HABIB_MARRIAGE_INITIAL_DATA__?: Record<string, any>;
__HABIB_BOOTSTRAP__?: Record<string, any>;
};
if (win.HABIB_MARRIAGE || win.__HABIB_MARRIAGE_INITIAL_DATA__) {
if (
win.HABIB_MARRIAGE ||
win.__HABIB_MARRIAGE_INITIAL_DATA__ ||
win.__HABIB_BOOTSTRAP__?.marriage
) {
this.marriageData =
win.HABIB_MARRIAGE ?? win.__HABIB_MARRIAGE_INITIAL_DATA__ ?? null;
win.HABIB_MARRIAGE ??
win.__HABIB_MARRIAGE_INITIAL_DATA__ ??
win.__HABIB_BOOTSTRAP__?.marriage ??
null;
} else {
const rawMarriageCookie =
getClientCookie("HABIB_MARRIAGE_DATA") ??
getClientCookie("habib_marriage_data");
if (rawMarriageCookie) {
try {
this.marriageData = JSON.parse(rawMarriageCookie);
} catch {
try {
this.marriageData = JSON.parse(decodeURIComponent(rawMarriageCookie));
} catch (e) {}
} catch {}
}
}
}

8
src/lib/cookies.ts

@ -18,7 +18,13 @@ export function getClientCookie(name: string) {
new RegExp(`(?:^|; )${escapeCookieName(name)}=([^;]*)`),
);
return match ? decodeURIComponent(match[1]) : null;
if (!match) return null;
try {
return decodeURIComponent(match[1]);
} catch {
return match[1];
}
}
export function setClientCookie(

Loading…
Cancel
Save