Spaces:
Running
Running
/** | |
* 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(); | |
} | |
}; | |