Openstatus
www.openstatus.dev
1"use client";
2
3import { useCallback, useEffect, useState } from "react";
4
5export function useCookieState<T extends string>(
6 name: string,
7 defaultValue?: T,
8 config?: { expires?: number },
9) {
10 const [state, setState] = useState<T>();
11
12 const handleChange = useCallback(
13 (value: T) => {
14 if (document) {
15 const date = new Date();
16 date.setTime(date.getTime() + 365 * 24 * 60 * 60 * 1000); // in one year
17 document.cookie = `${name}=${value}; path=/; expires=${
18 config?.expires ?? date.toUTCString()
19 }`;
20 setState(value);
21 }
22 },
23 [name, config],
24 );
25
26 // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>
27 useEffect(() => {
28 if (document) {
29 const cookie = document.cookie
30 .split("; ")
31 .find((row) => row.startsWith(name));
32 if (!cookie) {
33 setState(defaultValue);
34 return;
35 }
36 const value = cookie.split("=")[1] as T;
37 setState(value);
38 }
39 }, []);
40
41 return [state, handleChange] as const;
42}