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 | undefined>();
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 useEffect(() => {
27 if (document) {
28 const cookie = document.cookie
29 .split("; ")
30 .find((row) => row.startsWith(name));
31 if (!cookie) {
32 setState(defaultValue);
33 return;
34 }
35 const value = cookie.split("=")[1] as T;
36 setState(value);
37 }
38 }, [defaultValue, name]);
39
40 return [state, handleChange] as const;
41}