Файлы cookie — это не что иное, как способ запомнить вас веб-сайту. Вы когда-нибудь пытались добавить товары в корзину, даже не войдя в систему? Когда вы, наконец, войдете в систему, вы увидите, что ваши предметы добавлены в вашу учетную запись. Это волшебство файлов cookie!

Во многих странах веб-сайты обязаны содержать баннер с согласием на использование файлов cookie и прикрепленную страницу политики использования файлов cookie для тех, кто впервые посещает веб-сайт.

Одним из способов добавления баннера cookie является использование реагирующих библиотек, таких как react-cookie-consent.

Здесь я задокументировал, как добавить пользовательский баннер cookie в ваше реагирующее приложение с помощью Material UI.

  1. Давайте сначала создадим простое приложение для реагирования.

2. Загляните внутрь своего приложения.

3. Мы начнем с нуля.

Удалите все файлы по умолчанию в папке src.

Кроме того, удалите все кроме index.html из общей папки.

4. Обязательно добавьте в приложение Material UI и react-router-dom

5. Давайте теперь добавим базовую Домашнюю страницу

В папку src- добавьте следующие базовые файлы App.js и файл index.js.

Так как мы будем использовать Routes react-router-dom, обязательно добавьте ‹BrowserRouter› в файл index.js.

6. Следующие файлы добавляются в папку компонентов внутри папки src

import {Link, Typography} from '@mui/material';
import {Box} from '@mui/system';
import React from 'react';
import cookies from '../../assets/cookies-image.jpg';
const WelcomeCard = () => {
 return (
  <Box
   sx={{
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    textAlign: 'center',
   }}
  >
   <Typography variant="h4"> Demo Application</Typography>
   <Typography variant="h6">Cookies to a react app</Typography>
   <Typography variant="body2">
    {' '}
    This is a tutorial on how to add{' '}
    <Link
     href="https://en.wikipedia.org/wiki/HTTP_cookie"
     target="_blank"
     rel="noopener"
    >
     cookies
    </Link>{' '}
    to your application
   </Typography>
   <img
    src={cookies}
    alt="cookies"
    width={'50%'}
   />
  </Box>
 );
};

export default WelcomeCard;

Добавьте изображение в папку с ресурсами

7. Разработайте логику для всплывающих окон с файлами cookie

Мы можем работать с файлами cookie с помощью файла DOM «document.cookie».

Мы будем создавать функции для:

  • открыть баннер cookie
  • закрыть баннер cookie
  • получить печенье
  • принять куки
  • отклонить куки

Булева функция состояния реакции [open, setOpen] также потребуется для баннера cookie.

Внутри файла App.js:

import { Box, CssBaseline } from "@mui/material";
import React, { useState } from "react";
import CookieBanner from "./components/app.cookie.banner";
import AppRoutes from "./routes";

function App() {
  const [open, setOpen] = useState(false);

  const handleCookieClose = () => {
    setOpen(false);
  };

  const handleCookieOpen = () => {
    let cookieName = getCookie('cookiePolicy');
    if (cookieName !== '') {
      //if cookie is present: dont show banner
      setOpen(false);
    } else {
      setOpen(true);
    }
  };

  const getCookie = (cookieName) => {
    let name = cookieName + "=";
    let decodedCookie = decodeURIComponent(document.cookie);
    let total = decodedCookie.split(';');
    for (let i = 0; i < total.length; i++) {
      let cookie = total[i];
      while (cookie.charAt(0) === ' ') {
        cookie = cookie.substring(1);
      }
      if (cookie.indexOf(name) === 0) {
        return cookie.substring(name.length, cookie.length);
      }
    }
    return '';
  };

  const handleCookieAccepted = () => {
    const expiry = new Date();
    //let us save the cookie for 1 month
    expiry.setTime(expiry.getTime() + (30 * 24 * 60 * 60 * 1000));
    let expires = 'expires=' + expiry.toUTCString();
    document.cookie = 'cookiePolicy=accepted;' + expires;
    setOpen(false);
  };

  const handleCookieDeclined = () => {
    setOpen(false);
    //let us save the cookie for the current session only
    //use the default expiry : session
    document.cookie = "cookiePolicy=declined";
  }


  return (
    <Box onLoad={handleCookieOpen} sx={{ margin: 0 }}>
      <CssBaseline />
      <Box sx={{ flexGrow: 1 }}>
        <AppRoutes />
      </Box>
      <CookieBanner open={open} handleCookieAccepted={handleCookieAccepted}
        handleCookieClose={handleCookieClose} handleCookieDeclined={handleCookieDeclined} />
    </Box>);
}

export default App;
  • Если пользователь принимает файлы cookie, файл cookie (cookiePolicy) сохраняется в течение 1 месяца [30 (дней) * 24 (часа) * 60 (минут) * 60 (секунд) * 1000 (миллисекунд)]
  • Если пользователь отклоняет файлы cookie, файл cookie (cookiePolicy) по умолчанию сохраняется только для сеанса.
  • Баннер cookie должен появляться каждый раз при загрузке файла App.js.

8. Добавление компонента баннера cookie

import {Check, Close} from '@mui/icons-material';
import {Box, Button, Modal, Typography} from '@mui/material';
import React from 'react';
const style = {
 padding: 2,
 margin: 2,
 display: 'flex',
 justifyContent: 'space-between',
 textAlign: 'center',
 backgroundColor: 'whitesmoke',
 position: 'absolute',
 bottom: 0,
 maxHeight: 'fit-content',
 width: '100%',
};
const CookieBanner = ({
 open,
 handleCookieClose,
 handleCookieAccepted,
 handleCookieDeclined,
}) => {
 return (
  <Modal
   open={open}
   onClose={handleCookieClose}
   disableScrollLock
  >
   <Box style={style}>
    <Box>
     <Typography
      variant="body2"
      sx={{display: 'flex', justifyContent: 'center', margin: 0.5}}
     >
      We use cookies on our website to provide you with a more
      personalized digital experience.
     </Typography>
     <Typography variant="caption">
      You can read about our cookie policy <a href="/cookies">here</a>
     </Typography>
    </Box>
    <Box sx={{padding: 0, maxWidth: 'fit-content'}}>
     <Button
      onClick={handleCookieDeclined}
      color="error"
      variant="outlined"
      sx={{padding: '3px', margin: 1}}
      startIcon={<Close />}
     >
      Decline
     </Button>
     <Button
      onClick={handleCookieAccepted}
      color="success"
      variant="contained"
      sx={{padding: '3px', margin: 1}}
      startIcon={<Check />}
     >
      Accept
     </Button>
    </Box>
   </Box>
  </Modal>
 );
};

export default CookieBanner;

Обязательно добавьте файл index.js, как в случае с приветственной карточкой.

9. Добавьте домашнюю страницу и страницу политики использования файлов cookie.

import {Box, Link, Typography} from '@mui/material';

const CookiePage = () => {
 return (
  <Box
   sx={{
    display: 'flex',
    alignItems: 'center',
    flexDirection: 'column',
    margin: 5,
    backgroundColor: 'bisque',
    padding: 2,
   }}
  >
   <Typography
    variant="h5"
    color={'primary'}
   >
    Cookies
   </Typography>
   <Link
    href="/"
    sx={{color: 'green'}}
    variant="caption"
   >
    Home
   </Link>
   <Typography
    variant="body1"
    fontSize={10}
   >
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
    veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
    commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
    velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
    occaecat cupidatat non proident, sunt in culpa qui officia deserunt
    mollit anim id est laborum.
    <br />
    Quam elementum pulvinar etiam non quam lacus suspendisse. Ultricies leo
    integer malesuada nunc vel. Risus pretium quam vulputate dignissim
    suspendisse in est ante in. Est sit amet facilisis magna. Ut tellus
    elementum sagittis vitae et leo duis ut. Massa tincidunt nunc pulvinar
    sapien et ligula ullamcorper malesuada. In metus vulputate eu
    scelerisque felis imperdiet proin fermentum leo. Etiam erat velit
    scelerisque in dictum non consectetur a. Massa eget egestas purus
    viverra accumsan in nisl nisi scelerisque. Odio facilisis mauris sit
    amet. Eget aliquet nibh praesent tristique magna sit amet. Adipiscing
    elit ut aliquam purus. Urna id volutpat lacus laoreet non curabitur
    gravida arcu. Nullam ac tortor vitae purus. In metus vulputate eu
    scelerisque felis imperdiet. Viverra justo nec ultrices dui sapien eget
    mi. Sed blandit libero volutpat sed cras ornare arcu dui. Aliquam etiam
    erat velit scelerisque in. Vestibulum lorem sed risus ultricies
    tristique nulla aliquet enim. Mattis enim ut tellus elementum sagittis
    vitae et leo duis.
   </Typography>
  </Box>
 );
};
export default CookiePage;

Обязательно добавьте соответствующие файлы index.js, как это было сделано для приветственной карты.

10. Добавьте нужные маршруты

И вуаля!!!

У вас есть готовый баннер cookie

Вот ссылка на репозиторий Github

Спасибо!!! Удачного кодирования.