Openstatus www.openstatus.dev
at main 42 lines 1.1 kB view raw
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}