From b894c6958c76ece7f0657686e2d552b5a271bf18 Mon Sep 17 00:00:00 2001 From: Ferit Date: Thu, 8 Oct 2026 01:22:20 +0300 Subject: [PATCH] fix(useCookie): preserve empty cookie values --- docs/useCookie.md | 3 +++ src/useCookie.ts | 2 +- tests/useCookie.test.tsx | 29 ++++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/useCookie.md b/docs/useCookie.md index 92bf9f63e7..783a4c7cd4 100644 --- a/docs/useCookie.md +++ b/docs/useCookie.md @@ -34,6 +34,9 @@ const Demo = () => { ## Reference +The returned value is `null` when the cookie does not exist. An existing cookie with +an empty value is returned as an empty string (`''`). + ```ts const [value, updateCookie, deleteCookie] = useCookie(cookieName: string); ``` diff --git a/src/useCookie.ts b/src/useCookie.ts index 4bdd6c96de..afdf3b84b1 100644 --- a/src/useCookie.ts +++ b/src/useCookie.ts @@ -4,7 +4,7 @@ import Cookies from 'js-cookie'; const useCookie = ( cookieName: string ): [string | null, (newValue: string, options?: Cookies.CookieAttributes) => void, () => void] => { - const [value, setValue] = useState(() => Cookies.get(cookieName) || null); + const [value, setValue] = useState(() => Cookies.get(cookieName) ?? null); const updateCookie = useCallback( (newValue: string, options?: Cookies.CookieAttributes) => { diff --git a/tests/useCookie.test.tsx b/tests/useCookie.test.tsx index cc72dc460a..fffdbb8852 100644 --- a/tests/useCookie.test.tsx +++ b/tests/useCookie.test.tsx @@ -1,9 +1,36 @@ import { renderHook, act } from '@testing-library/react-hooks'; import Cookies from 'js-cookie'; -import { useCookie } from '../src'; +import useCookie from '../src/useCookie'; const setup = (cookieName: string) => renderHook(() => useCookie(cookieName)); +it('should preserve an existing cookie with an empty value', () => { + const cookieName = 'empty-cookie'; + Cookies.set(cookieName, ''); + + const { result, unmount } = setup(cookieName); + + expect(result.current[0]).toBe(''); + unmount(); + Cookies.remove(cookieName); +}); + +it('should preserve an empty value after updating and remounting', () => { + const cookieName = 'empty-updated-cookie'; + const { result, unmount } = setup(cookieName); + + act(() => { + result.current[1](''); + }); + expect(result.current[0]).toBe(''); + unmount(); + + const remounted = setup(cookieName); + expect(remounted.result.current[0]).toBe(''); + remounted.unmount(); + Cookies.remove(cookieName); +}); + it('should have initial value of null if no cookie exists', () => { const { result } = setup('some-cookie');