Перехват useCookie при сборке

#reactjs #cookies #react-hooks #gatsby

#reactjs #файлы cookie #реагирующие перехваты #гэтсби

Вопрос:

Я использую пользовательский крючок для установки, редактирования и удаления файлов cookie на моем сайте Gatsby:

use-cookie.ts

 import { useState } from 'react';

const getItem = (key: string) => {
  if (typeof document !== undefined) {
    document.cookie.split('; ').reduce((total, currentCookie) => {
      const item = currentCookie.split('=');
      const storedKey = item[0];
      const storedValue = item[1];

      return key === storedKey ? decodeURIComponent(storedValue) : total;
    }, '');
  }
};

const setItem = (key: string, value: string | boolean, numberOfDays: number) => {
  const now = new Date();

  now.setTime(now.getTime()   numberOfDays * 60 * 60 * 24 * 1000);

  if (typeof document !== undefined) {
    document.cookie = `${key}=${value}; expires=${now.toUTCString()}; path=/`;
  }
};

export const useCookie = (key: string, defaultValue: string | boolean | any) => {
  const getCookie = () => (getItem(key), defaultValue);
  const [cookie, setCookie] = useState(getCookie());

  const updateCookie = (value: string, numberOfDays: number) => {
    setCookie(value);
    setItem(key, value, numberOfDays);
  };

  return [cookie, updateCookie];
};
  

Я использую его в компоненте следующим образом:

 const [initialCookieValue, updateCookieValue] = useCookie('cookie', false);
  

Однако, несмотря на проверку всех ссылок на document with if (typeof document !== undefined) , мой сайт все еще ломается при сборке WebpackError: ReferenceError: document is not defined . Я понятия не имею, что я делаю не так, или как это исправить, но я знаю, что ошибка исчезнет, если я удалю хук.

Есть идеи?

Ответ №1:

Проверьте undefined как строку, 'undefined' .

   if (typeof document !== 'undefined')
  

Применяется к вашему коду:

 import { useState } from 'react';

const getItem = (key: string) => {
  if (typeof document !== 'undefined') {
    document.cookie.split('; ').reduce((total, currentCookie) => {
      const item = currentCookie.split('=');
      const storedKey = item[0];
      const storedValue = item[1];

      return key === storedKey ? decodeURIComponent(storedValue) : total;
    }, '');
  }
};

const setItem = (key: string, value: string | boolean, numberOfDays: number) => {
  const now = new Date();

  now.setTime(now.getTime()   numberOfDays * 60 * 60 * 24 * 1000);

  if (typeof document !== 'undefined') {
    document.cookie = `${key}=${value}; expires=${now.toUTCString()}; path=/`;
  }
};

export const useCookie = (key: string, defaultValue: string | boolean | any) => {
  const getCookie = () => (getItem(key), defaultValue);
  const [cookie, setCookie] = useState(getCookie());

  const updateCookie = (value: string, numberOfDays: number) => {
    setCookie(value);
    setItem(key, value, numberOfDays);
  };

  return [cookie, updateCookie];
};