diff --git a/package.json b/package.json index 6c6d88562..8623d2509 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "next-supabase-saas-kit-turbo", - "version": "2.23.3", + "version": "2.23.4", "private": true, "sideEffects": false, "engines": { diff --git a/packages/i18n/src/i18n.client.ts b/packages/i18n/src/i18n.client.ts index 8242c05c2..4bf842dec 100644 --- a/packages/i18n/src/i18n.client.ts +++ b/packages/i18n/src/i18n.client.ts @@ -43,9 +43,15 @@ export async function initializeI18nClient( { ...settings, detection: { - order: ['htmlTag', 'cookie', 'navigator'], + order: ['cookie', 'htmlTag', 'navigator'], caches: ['cookie'], lookupCookie: 'lang', + cookieMinutes: 60 * 24 * 365, // 1 year + cookieOptions: { + sameSite: 'lax', + secure: typeof window !== 'undefined' && window.location.protocol === 'https:', + path: '/', + }, }, interpolation: { escapeValue: false, diff --git a/packages/ui/src/makerkit/mobile-mode-toggle.tsx b/packages/ui/src/makerkit/mobile-mode-toggle.tsx index 92c9f9ee8..6c370a62f 100644 --- a/packages/ui/src/makerkit/mobile-mode-toggle.tsx +++ b/packages/ui/src/makerkit/mobile-mode-toggle.tsx @@ -31,5 +31,6 @@ export function MobileModeToggle(props: { className?: string }) { } function setCookieTheme(theme: string) { - document.cookie = `theme=${theme}; path=/; max-age=31536000`; + const secure = typeof window !== 'undefined' && window.location.protocol === 'https:'; + document.cookie = `theme=${theme}; path=/; max-age=31536000; SameSite=Lax${secure ? '; Secure' : ''}`; } diff --git a/packages/ui/src/makerkit/mode-toggle.tsx b/packages/ui/src/makerkit/mode-toggle.tsx index 3cfc05175..69b9d6cd5 100644 --- a/packages/ui/src/makerkit/mode-toggle.tsx +++ b/packages/ui/src/makerkit/mode-toggle.tsx @@ -36,7 +36,7 @@ export function ModeToggle(props: { className?: string }) { key={mode} onClick={() => { setTheme(mode); - setCookeTheme(mode); + setCookieTheme(mode); }} > @@ -80,7 +80,7 @@ export function SubMenuModeToggle() { key={mode} onClick={() => { setTheme(mode); - setCookeTheme(mode); + setCookieTheme(mode); }} > @@ -125,8 +125,9 @@ export function SubMenuModeToggle() { ); } -function setCookeTheme(theme: string) { - document.cookie = `theme=${theme}; path=/; max-age=31536000`; +function setCookieTheme(theme: string) { + const secure = typeof window !== 'undefined' && window.location.protocol === 'https:'; + document.cookie = `theme=${theme}; path=/; max-age=31536000; SameSite=Lax${secure ? '; Secure' : ''}`; } function Icon({ theme }: { theme: string | undefined }) { diff --git a/packages/ui/src/shadcn/sidebar.tsx b/packages/ui/src/shadcn/sidebar.tsx index d139181ac..560bd3bfd 100644 --- a/packages/ui/src/shadcn/sidebar.tsx +++ b/packages/ui/src/shadcn/sidebar.tsx @@ -96,7 +96,8 @@ const SidebarProvider: React.FC< _setOpen(value); // This sets the cookie to keep the sidebar state. - document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; + const secure = typeof window !== 'undefined' && window.location.protocol === 'https:'; + document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}; SameSite=Lax${secure ? '; Secure' : ''}`; }, [setOpenProp, open], );