Browser cookies are a lightweight way to store data that needs to persist between sessions or across different parts of your application. In this post, we’ll explore how to build a custom React hook, useCookie, to make working with cookies seamless in your React applications.
1. Cookie Utility Functions
Before we build the useCookie hook, let’s create a set of helper functions to handle common operations with browser cookies: setting, getting, and removing cookies.
setCookie: Add or Update a Cookie
The setCookie function allows us to save a key-value pair in cookies with an optional expiration time.
export function setCookie(key: string, value: unknown, expireDays = 1): void {
const d = new Date();
d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
document.cookie = `${key}=${value}; expires=${d.toUTCString()}; path=/`;
}
-
What It Does:
- Takes a
key,value, andexpireDays(default is 1 day). - Computes the expiration date.
- Creates a cookie string with the provided key-value pair and expiration.
- Takes a
- Usage:
setCookie("theme", "dark", 7); // Saves a cookie for 7 days
getCookie: Retrieve a Cookie Value
The getCookie function retrieves the value of a cookie by its key.
export function getCookie(key: string): string | undefined {
const name = `${key}=`;
const decodedCookie = decodeURIComponent(document.cookie);
const ca = decodedCookie.split(";");
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === " ") {
c = c.substring(1);
}
if (c.indexOf(name) === 0) {
return c.substring(name.length, c.length);
}
}
return undefined;
}
-
How It Works:
- Decodes the
document.cookiestring for readability. - Splits cookies into an array and searches for the specified key.
- Returns the value or
undefinedif the key isn’t found.
- Decodes the
- Usage:
const theme = getCookie("theme"); // Retrieves "dark"
removeCookie: Delete a Cookie
The removeCookie function removes a cookie by overwriting it with an empty value and no expiration date.
export function removeCookie(key: string) {
document.cookie = `${key}=; path=/`;
}
- Usage:
removeCookie("theme"); // Deletes the "theme" cookie
2. The useCookie Hook
The useCookie hook combines the cookie utility functions with React’s useState to provide an elegant way to manage cookies in your components.
Hook Initialization
import { useState } from "react";
import { getCookie, setCookie, removeCookie } from "@/utils/cookie";
export default function useCookie<T>(key: string, initialValue: T) {
const [value, setValue] = useState(() => {
const data = getCookie(key);
return (data || initialValue) as T;
});
// ...additional logic
}
-
Parameters:
-
key: The cookie key to manage. -
initialValue: The value to use if the cookie doesn’t already exist.
-
-
State Initialization:
- Fetches the cookie’s current value using
getCookie. - Defaults to
initialValueif the cookie doesn’t exist.
- Fetches the cookie’s current value using
Dispatching State Changes
The handleDispatch function updates both the local state and the cookie.
function handleDispatch(action: DispatchAction<T>) {
if (typeof action === "function") {
setValue((prevState) => {
const newValue = (action as (prevState: T) => T)(prevState);
setCookie(key, newValue);
return newValue;
});
} else {
setValue(action);
setCookie(key, action);
}
}
-
How It Works:
- If
actionis a function, it applies it to the current state and computes the new value. - Otherwise, it directly sets the state and updates the cookie.
- If
-
Cookie Sync:
- Calls
setCookieto ensure the browser cookie stays in sync with the state.
- Calls
Clearing the State
The clearState function removes the cookie and resets the state.
function clearState() {
removeCookie(key);
setValue(undefined as T);
}
-
What It Does:
- Deletes the cookie using
removeCookie. - Resets the local state to
undefined.
- Deletes the cookie using
Returning the Hook’s API
The hook exposes an array containing the current value, a dispatcher function, and a clear function.
return [value, handleDispatch, clearState] as const;
-
API:
-
value: The current value of the cookie. -
handleDispatch: A function to update the state and cookie. -
clearState: A function to clear the state and remove the cookie.
-
3. Using the useCookie Hook
Here’s an example of how to use the useCookie hook in a React component:
import useCookie from "@/hooks/useCookie";
function ThemeSwitcher() {
const [theme, setTheme, clearTheme] = useCookie<string>("theme", "light");
return (
<div>
<h1>Current Theme: {theme}</h1>
<button onClick={() => setTheme("light")}>Light Mode</button>
<button onClick={() => setTheme("dark")}>Dark Mode</button>
<button onClick={clearTheme}>Clear Theme</button>
</div>
);
}
-
Key Features
- The
themevalue is stored in a cookie and persists across sessions. - Changing the theme updates both the state and the cookie.
- The
clearThemefunction resets the theme and removes the cookie.
- The
4. Advantages of useCookie Hook
- Simplified Cookie Management: Abstracts cookie logic into a reusable hook.
- State Synchronization: Keeps React state in sync with browser cookies.
- Error Handling: Built-in mechanisms for decoding and handling cookies.
Conclusion
The useCookie hook makes it easier to manage browser cookies in your React applications while maintaining type safety and a clean codebase. With this hook, you can handle cookie-based state management effortlessly and avoid repetitive boilerplate code.
Ready to integrate this hook into your projects? Let me know how it works for you or share your improvements!
Top comments (0)