/** * Utility for handling storage in iframe contexts * Falls back to localStorage when cookies are blocked */ export const isInIframe = (): boolean => { try { return window.self !== window.top; } catch { return true; // If we can't access window.top, we're likely in an iframe } }; export const isMobileDevice = (): boolean => { if (typeof window === 'undefined') return false; // Check user agent for mobile patterns const userAgent = window.navigator.userAgent; const mobilePattern = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i; // Also check for touch capability and screen size const hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0; const hasSmallScreen = window.innerWidth <= 768; // Common mobile breakpoint return mobilePattern.test(userAgent) || (hasTouchScreen && hasSmallScreen); }; export const STORAGE_KEYS = { ACCESS_TOKEN: "deepsite-auth-token-fallback", USER_DATA: "deepsite-user-data-fallback", } as const; export const iframeStorage = { setItem: (key: string, value: string): void => { try { localStorage.setItem(key, value); } catch (error) { console.warn("Failed to set localStorage item:", error); } }, getItem: (key: string): string | null => { try { return localStorage.getItem(key); } catch (error) { console.warn("Failed to get localStorage item:", error); return null; } }, removeItem: (key: string): void => { try { localStorage.removeItem(key); } catch (error) { console.warn("Failed to remove localStorage item:", error); } }, clear: (): void => { try { localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN); localStorage.removeItem(STORAGE_KEYS.USER_DATA); } catch (error) { console.warn("Failed to clear localStorage items:", error); } }, }; export const storeAuthDataFallback = (accessToken: string, userData: any): void => { if (isInIframe()) { iframeStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, accessToken); iframeStorage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(userData)); } }; export const getAuthDataFallback = (): { token: string | null; user: any | null } => { if (isInIframe()) { const token = iframeStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN); const userDataStr = iframeStorage.getItem(STORAGE_KEYS.USER_DATA); const user = userDataStr ? JSON.parse(userDataStr) : null; return { token, user }; } return { token: null, user: null }; }; export const clearAuthDataFallback = (): void => { if (isInIframe()) { iframeStorage.clear(); } };