Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problemas: Cannot read properties of undefined

Codigo esta igual ao ensinado porem esta apresentando problema de Cannot read properties of undefined.

import { createContext, useContext, useState } from "react";

export const FavoritosContext = createContext(); //Criando context
FavoritosContext.displayName = "Favoritos"; //Nomeclatura, como ele vai ser chamado

export default function FavoritosProvider({ children }) {
    const [favoritos, setFavoritos] = useState([]); //Criando estado para armazenar os favoritos

    return (
        <FavoritosContext.Provider
            value={{ favoritos, setFavoritos }}>
            {children}
        </FavoritosContext.Provider>
    )
}

//Hook personalizados
export function useFavoritoContext() {
    const { favorito, setFavorito } = useContext(FavoritosContext); //Retorna os valores de provider

    function adicionarFavorito(novoFavorito) {
        const favoritoRepetido = favorito.some(item => item.id === novoFavorito.id); //Procura na lista se tem um favorito igual ao que esta sendo adicionado

        let novaLista = [...favorito]; //Fazendo nova lista

        //Se não ouver item repetido vai adicionar a lista de favoritos
        if (!favoritoRepetido) {
            novaLista.push(novoFavorito);
            return setFavorito(novaLista);
        }

        //Caso seja repetido (Desfavoritar o filme)
        novaLista.filter((item) => item.id !== novoFavorito.id);
        return setFavorito(novaLista);
    }
    return {
        favorito,
        adicionarFavorito
    }
}
import { useFavoritoContext } from 'contextos/Favoritos';
import styles from './Card.module.css';
import iconeFavoritar from './favoritar.png';
import iconeDesfavoritar from './desfavoritar.png';

function Card({ id, capa, titulo }) {
    const {favorito, adicionarFavorito} = useFavoritoContext();

    const ehFavorito = favorito.some((item) => item.id === id);

    const icone = ehFavorito ? iconeFavoritar : iconeDesfavoritar;

    return (
        <div className={styles.container}>
            <img src={capa} alt={titulo} className={styles.capa} />
            <h2>{titulo}</h2>
            <img src={icone}
                alt='Favoritar filme'
                className={styles.favoritar}
                onClick={() => {
                    adicionarFavorito({ id, titulo, capa })
                }} />
        </div>
    )
}

export default Card;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Se alguem poderia me ajudar por favor.

1 resposta
solução!

Olá Jhonata, tudo bem?

Há um pequeno erro no seu código dentro do hook useFavoritoContext. Você está desestruturando favorito e setFavorito do contexto, mas no FavoritosProvider você definiu favoritos e setFavoritos. Note que os nomes das variáveis são diferentes (favorito vs favoritos). Isso tá causando o problema.

Vamos corrigir isso:

  1. Altere o nome das variáveis desestruturadas no hook useFavoritoContext para favoritos e setFavoritos.

  2. Veja se você tá utilizando as variáveis corretas no restante do código.

Código completo do Favoritos.js

import { createContext, useContext, useState } from "react";

export const FavoritosContext = createContext();
FavoritosContext.displayName = "Favoritos";

export default function FavoritosProvider({ children }) {
    const [favorito, setFavorito] = useState([]);

    return (
        <FavoritosContext.Provider
            value={{ favorito, setFavorito }}>
            {children}
        </FavoritosContext.Provider>
    )
}

export function useFavoritoContext() {
    const { favorito, setFavorito } = useContext(FavoritosContext);

    function adicionarFavorito(novoFavorito) {
        const favoritoRepetido = favorito.some(item => item.id === novoFavorito.id);

        let novaLista = [...favorito];

        if (!favoritoRepetido) {
            novaLista.push(novoFavorito);
            return setFavorito(novaLista);
        }

        novaLista.splice(novaLista.indexOf(novoFavorito), 1);
        return setFavorito(novaLista);
    }
    return {
        favorito,
        adicionarFavorito
    }
}

Você sempre pode conferir se seu código está igual ao da aula nesse respositório.

Um abraço e bons estudos.