cyb/src/utils/safeLocalStorage.ts

/**
 * Safe localStorage wrappers that handle:
 * - Private browsing mode (Safari QuotaExceededError)
 * - Disabled localStorage
 * - Corrupt JSON data from old versions
 */

function getItem(key: string, defaultValue: string | null = null): string | null {
  try {
    return localStorage.getItem(key) ?? defaultValue;
  } catch {
    return defaultValue;
  }
}

function setItem(key: string, value: string): boolean {
  try {
    localStorage.setItem(key, value);
    return true;
  } catch {
    return false;
  }
}

function getJSON<T>(key: string, defaultValue: T): T {
  try {
    const raw = localStorage.getItem(key);
    if (raw === null) {
      return defaultValue;
    }
    return JSON.parse(raw) as T;
  } catch {
    return defaultValue;
  }
}

function setJSON(key: string, value: unknown): boolean {
  try {
    localStorage.setItem(key, JSON.stringify(value));
    return true;
  } catch {
    return false;
  }
}

function removeItem(key: string): boolean {
  try {
    localStorage.removeItem(key);
    return true;
  } catch {
    return false;
  }
}

const safeLocalStorage = {
  getItem,
  setItem,
  getJSON,
  setJSON,
  removeItem,
};

export default safeLocalStorage;

Neighbours