UNPKG

tiny-utm-keeper

Version:

Zero-dependency, TypeScript-first UTM parameter tracker for first-touch/last-touch attribution. SSR-friendly.

95 lines (94 loc) 2.26 kB
/** * Check if we're in a browser environment */ export const isBrowser = () => { return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined'; }; /** * Safely get item from localStorage */ export const getStorageItem = (key) => { if (!isBrowser()) { return null; } try { return window.localStorage.getItem(key); } catch (error) { console.warn('[tiny-utm-keeper] Failed to read from localStorage:', error); return null; } }; /** * Safely set item in localStorage */ export const setStorageItem = (key, value) => { if (!isBrowser()) { return false; } try { window.localStorage.setItem(key, value); return true; } catch (error) { console.warn('[tiny-utm-keeper] Failed to write to localStorage:', error); return false; } }; /** * Safely remove item from localStorage */ export const removeStorageItem = (key) => { if (!isBrowser()) { return false; } try { window.localStorage.removeItem(key); return true; } catch (error) { console.warn('[tiny-utm-keeper] Failed to remove from localStorage:', error); return false; } }; /** * Get stored UTM data */ export const getStoredUTMData = (storageKey) => { const data = getStorageItem(storageKey); if (!data) { return null; } try { const parsed = JSON.parse(data); // Check if expired if (parsed.expiresAt && Date.now() > parsed.expiresAt) { removeStorageItem(storageKey); return null; } return parsed; } catch (error) { console.warn('[tiny-utm-keeper] Failed to parse stored UTM data:', error); return null; } }; /** * Save UTM data to storage */ export const saveUTMData = (storageKey, params, expirationDays) => { const now = Date.now(); const expiresAt = now + expirationDays * 24 * 60 * 60 * 1000; const data = { params, timestamp: now, expiresAt, }; return setStorageItem(storageKey, JSON.stringify(data)); }; /** * Clear stored UTM data */ export const clearUTMData = (storageKey) => { return removeStorageItem(storageKey); };