Openstatus www.openstatus.dev
at main 41 lines 1.0 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 | 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}