From e39c020014ea16468b6ad83a1a9f0fcacbdf0923 Mon Sep 17 00:00:00 2001
From: Guilherme Monte <guilherme.monte@contrarycap.com>
Date: Wed, 19 Jun 2024 22:13:07 -0300
Subject: [PATCH] fix(use-storage): using with SSR

---
 packages/use-storage/src/index.ts | 32 ++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/packages/use-storage/src/index.ts b/packages/use-storage/src/index.ts
index ed27cd709..a20478534 100644
--- a/packages/use-storage/src/index.ts
+++ b/packages/use-storage/src/index.ts
@@ -24,6 +24,34 @@ const canUseDOM =
     typeof window.sessionStorage !== 'undefined'
   )
 
+const createMemoryStorage = (): Storage => {
+  const storage: { [key: string]: string | null } = {}
+
+  return {
+    length: Object.entries(storage).length,
+    clear() {
+      Object.keys(storage).forEach(key => {
+        delete storage[key]
+      })
+    },
+    key(index) {
+      return Object.values(storage)[index] ?? null
+    },
+    getItem(key) {
+      return storage[key] ?? null
+    },
+    setItem(key, value) {
+      storage[key] = value
+    },
+    removeItem(key) {
+      delete storage[key]
+    },
+  }
+}
+
+const getStorage = (name: 'localStorage' | 'sessionStorage') =>
+  canUseDOM ? window[name] : createMemoryStorage()
+
 const subscribeStorage = (callback: () => void) => {
   if (canUseDOM) {
     window.addEventListener('storage', callback)
@@ -47,7 +75,9 @@ const useStorage = <T>(
 ): [T | null, (value: T | undefined) => void] => {
   const storage = useMemo(
     () =>
-      options?.kind === 'session' ? window.sessionStorage : window.localStorage,
+      options?.kind === 'session'
+        ? getStorage('sessionStorage')
+        : getStorage('localStorage'),
     [options?.kind],
   )