Source

Components/FavouriteSet.js

import React , {useState, useEffect} from 'react';
import Dexie from "dexie";
import styled from 'styled-components';
import {NavLink} from "react-router-dom";

const CarDetailOrange = styled.div`
  cursor: pointer;
  background-color:#ec6b0c;
  width:80%;
  padding-left:16px;
  padding-right:16px;
  margin-bottom:16px;
  padding-top:16px;
  padding-bottom:16px;
  text-align:center;
  border-radius:8px;
  -webkit-transition:0.3s linear;
  -moz-transition:0.3s linear;
  transition:0.3s linear;
  &:hover {
    background-color: black;
  } 
  @media (max-width: 360px) {
    padding-left:8px;
    padding-right:8px;
  }
  @media (max-width: 320px) {
    width:84%;
  }
  @media (max-width: 305px) {
    padding-left:4px;
    padding-right:4px;
  }
`;

const StyledLink = styled(NavLink).attrs()`
  background-color:#ec6b0c;
  width:80%;
  padding-left:16px;
  padding-right:16px;
  margin-bottom:16px;
  padding-top:16px;
  padding-bottom:16px;
  text-decoration: none;
  text-align:center;
  border-radius:8px;
  -webkit-transition:0.3s linear;
  -moz-transition:0.3s linear;
  transition:0.3s linear;
  color:white;
  &:hover {
    background-color: black;
    text-decoration:none;
  }
  @media (max-width: 360px) {
    padding-left:8px;
  padding-right:8px;
  }
  @media (max-width: 320px) {
    width:84%;
  }
  @media (max-width: 305px) {
    padding-left:4px;
    padding-right:4px;
  }
`;

/**
 * Set and delete favourite cars
 * @param {object} props 
 */
const FavouriteSet = (props) => {
    
  //set the database 
  const db = new Dexie("CarsIds");
  //create the database store
  db.version(1).stores({
      posts: "id"
  })
  db.open().catch((err) => {
      console.log(err.stack || err)
  })
  
  //set the state and property
  const [posts, setPosts] = useState("");

  const addFavourite = () => {
    let canUpdate=true;
    if(props.carId===undefined){
      posts.forEach((idPost)=>{
        if (idPost.id===window.location.href.slice(21).replace(/\D/g, "")){ //checking if car is already in database
          canUpdate=false;
        }
      })
      if(canUpdate===true){
        let post = {
          id:window.location.href.slice(21).replace(/\D/g, ""),
        }
        db.posts.add(post).then(async() => {
          //retrieve all posts inside the database
          let allPosts = await db.posts.toArray();
          //set the posts
          setPosts(allPosts);
        });
      }
    }
    if(props.carId!==undefined){
      posts.forEach((idPost)=>{
        if (idPost.id===props.carId){
          canUpdate=false;
        }
      })
      if(canUpdate===true){
        let post = {
          id:props.carId,
        }
        db.posts.add(post).then(async() => {
          //retrieve all posts inside the database
          let allPosts = await db.posts.toArray();
          //set the posts
          setPosts(allPosts);
        });
      }
    }
  }
  useEffect(() => {
    let unmounted = false
    //get all posts from the database
    const getPosts = async() => {
      let allPosts = await db.posts.toArray();
      if(!unmounted)
        setPosts(allPosts);
    }
    getPosts();
    return () => {
      unmounted = true
 }
  })

  return (
  <React.Fragment>
    <CarDetailOrange onClick={e => addFavourite()}>Add to Favourites</CarDetailOrange>
    <StyledLink to="/FavouriteList">  View Favourites</StyledLink>
  </React.Fragment>
  );
}

export default FavouriteSet;