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. 23
      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 ? cookieLocale
: defaultLocale; : 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 ( return (
<html <html
lang={locale} lang={locale}
@ -99,6 +117,14 @@ export default async function RootLayout({
/> />
<link rel="preconnect" href="https://habibapp.com" /> <link rel="preconnect" href="https://habibapp.com" />
<link rel="dns-prefetch" 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 <script
id="habib-core-bootstrap" id="habib-core-bootstrap"
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{

23
src/lib/auth-bridge.ts

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

8
src/lib/cookies.ts

@ -18,7 +18,13 @@ export function getClientCookie(name: string) {
new RegExp(`(?:^|; )${escapeCookieName(name)}=([^;]*)`), 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( export function setClientCookie(

Loading…
Cancel
Save