Next.js Discord

Discord Forum

Local storage

Answered
Zepeto posted this in #help-forum
Open in Discord
Avatar
Hi, I'm trying to access the local storage in my helper.ts file, however I have this error :
Error: localStorage is not defined
How can I accomplish that ?
Answered by B33fb0n3
no, because it needs the local storage. The server (server component) don't know any local storage. Because of that, it need to be importated like that and need to be clientside
View full answer

29 Replies

Avatar
@B33fb0n3 localStorage is only available in client component. You added use client on top?
Avatar
Yes but then I have an error when calling the function in my helper file TypeError: (0 , _lib_helper__WEBPACK_IMPORTED_MODULE_3__.testFunction) is not a function
Avatar
@Zepeto Yes but then I have an error when calling the function in my helper file `TypeError: (0 , _lib_helper__WEBPACK_IMPORTED_MODULE_3__.testFunction) is not a function`
Avatar
try to import the component that need the helper function like this:
const ComponentC = dynamic(() => import('path/to/Component'), { ssr: false })
Avatar
@Zepeto You mean I should import the helper file this way ?
Avatar
nah, only the component that uses your helper
Avatar
@B33fb0n3 nah, only the component that uses your helper
Avatar
Oh okay, but I'm using the function in the server component of my page
Avatar
Should I call it in a client component ?
Avatar
@Zepeto Should I call it in a client component ?
Avatar
yea, localStorage is only available in client component.
Avatar
@B33fb0n3 yea, localStorage is only available in client component.
Avatar
And then call my client component in my server one ?
Avatar
I created this function in a file
"use client";

export const getLocalStorage = (key: string) => {
  return localStorage.getItem(key);
};

Then I call it in my helper file (which is not a client component)
export const testFunction = () => {
  const test = getLocalStorage("test");
  console.log(test);
};

But I still have this error (0 , _client_helper__WEBPACK_IMPORTED_MODULE_2__.getLocalStorage) is not a function
Avatar
@B33fb0n3 try to import the component that need the helper function like this: tsx const ComponentC = dynamic(() => import('path/to/Component'), { ssr: false })
Avatar
Promise<typeof import("...mypath")>' is not assignable to parameter of type 'DynamicOptions<{}> | Loader<{}>'.
Avatar
@B33fb0n3 which one did you try now? testFunction or getLocalStorage?
Avatar
importing getLocalStorage in the helper file (which contain the testFunction)
Avatar
@Zepeto importing getLocalStorage in the helper file (which contain the testFunction)
Avatar
can you give me an reproduction repo? For example through jsfiddle or https://codesandbox.io/ ?
Avatar
Sure let me 15min
Avatar
@Zepeto https://codesandbox.io/p/devbox/vibrant-wilbur-nd5fg5
Avatar
I modified your repo a bit to make it work: https://codesandbox.io/p/devbox/vibrant-wilbur-nd5fg5
You can see, that you need to import the Component that uses the helper function without SSR. After that, there are no more errors
Avatar
@Zepeto I still see the errors
Avatar
Whoops, I shared the wrong link. This is the right one: https://codesandbox.io/p/devbox/epic-panka-xykssv
Avatar
@Zepeto My page.tsx is a server component 🥲
Avatar
I changed the code, so page.tsx is not a client component anymore
Avatar
@B33fb0n3 I changed the code, so page.tsx is not a client component anymore
Avatar
Thanks, can SomeComponent.tsx be a server component too ?
Avatar
@Zepeto Thanks, can SomeComponent.tsx be a server component too ?
Avatar
no, because it needs the local storage. The server (server component) don't know any local storage. Because of that, it need to be importated like that and need to be clientside
Answer
Avatar
okay thanks 🙂
Avatar
sure thing