Browse Source

feat(ui): creates sessionStorage wrapper (#31612)

This PR makes a wrapper around sessionStorage that won't error out when we can't modify session storage the same way we handle localStorage. It also makes sure that if window is ever undefined, it won't blow up (not sure if that's possible with Sentry but it's definitely possible with server-side rendering).
Stephen Cefali 3 years ago
parent
commit
52ddd432cf

+ 31 - 0
static/app/utils/createStorage.tsx

@@ -0,0 +1,31 @@
+// our storage wrapper is a subset of the full API
+type Storage = Pick<globalThis.Storage, 'getItem' | 'setItem' | 'removeItem'>;
+
+export default function createStorage(getStorage: () => globalThis.Storage): Storage {
+  try {
+    const storage = getStorage();
+    const mod = 'sentry';
+    storage.setItem(mod, mod);
+    storage.removeItem(mod);
+
+    return {
+      setItem: storage.setItem.bind(storage),
+      getItem: storage.getItem.bind(storage),
+      removeItem: storage.removeItem.bind(storage),
+    } as Storage;
+  } catch (e) {
+    return {
+      setItem() {
+        return;
+      },
+      // Returns null if key doesn't exist:
+      // https://developer.mozilla.org/en-US/docs/Web/API/Storage/getItem
+      getItem() {
+        return null;
+      },
+      removeItem() {
+        return null;
+      },
+    };
+  }
+}

+ 3 - 37
static/app/utils/localStorage.tsx

@@ -1,39 +1,5 @@
-interface LocalStorage {
-  getItem(key: string): string | null;
-  removeItem(key: string): void;
-  setItem(key: string, value: string): void;
-}
+import createLocalStorage from './createStorage';
 
-function createLocalStorage(): LocalStorage {
-  try {
-    const localStorage = window.localStorage;
+const Storage = createLocalStorage(() => window.localStorage);
 
-    const mod = 'sentry';
-    localStorage.setItem(mod, mod);
-    localStorage.removeItem(mod);
-
-    return {
-      setItem: localStorage.setItem.bind(localStorage),
-      getItem: localStorage.getItem.bind(localStorage),
-      removeItem: localStorage.removeItem.bind(localStorage),
-    } as LocalStorage;
-  } catch (e) {
-    return {
-      setItem() {
-        return;
-      },
-      // Returns null if key doesn't exist:
-      // https://developer.mozilla.org/en-US/docs/Web/API/Storage/getItem
-      getItem() {
-        return null;
-      },
-      removeItem() {
-        return null;
-      },
-    } as LocalStorage;
-  }
-}
-
-const functions = createLocalStorage();
-
-export default functions;
+export default Storage;

+ 5 - 0
static/app/utils/sessionStorage.tsx

@@ -0,0 +1,5 @@
+import createLocalStorage from './createStorage';
+
+const Storage = createLocalStorage(() => window.sessionStorage);
+
+export default Storage;