3
respostas

[Reclamação] Por gentileza, disponibilizem os arquivos finais do curso.

Prezados, por gentileza, revisem este último módulo pois está quase impossível finalizar, no vídeo é dito uma coisa, no página "Faça como eu fiz"está outra, está ocasionando erros que nem a Luri está ajudando, pois quando peço dela o código para comparar ela também traz algumas partes diferentes de como foi mostrado. Abaixo compartilho a situação atual do meu projeto, acontece ao clicar em um livro na página principal, para ser inserido no JSON de favoritos:

Uncaught runtime errors:
×
ERROR
Request failed with status code 500
AxiosError: Request failed with status code 500
    at settle (http://localhost:3000/static/js/bundle.js:52752:12)
    at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:51415:66)
    at Axios.request (http://localhost:3000/static/js/bundle.js:51905:41)
    at async postFavorito (http://localhost:3000/static/js/bundle.js:1696:3)
    at async insertFavorito (http://localhost:3000/static/js/bundle.js:868:5)
3 respostas

Olá, Charlles.

Tudo bem?

Eu analisei e peguei o projeto final do GitHub, eu entrei em qualquer aula no repositório e mudei a branch para a última aula. O instrutor só mexe no Front. Vou deixar os arquivos que ele altera, para você comparar:

  • "Favoritos.js" da pasta "rotas":
import styled from 'styled-components'
import { useEffect, useState } from 'react'
import livroImg from '../imagens/livro.png'
import { deleteFavorito, getFavoritos } from '../servico/favoritos'

const FavoritosContainer = styled.div`
    width: 100vw;
    height: 100vh;
    background-image: linear-gradient(90deg,#002F52 35%,#326589 165%);
`

const Titulo = styled.h2`
    color: #FFF;
    font-size: 36px;
    text-align: center;
    width: 100%;
    padding-top: 35px
`

const Resultado = styled.div`
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 20px 0;
    cursor: pointer;
    text-align: center;
    padding: 0 100px;

    p {
        width: 200px;
        color: #FFF;
    }

    img {
        width: 100px;
    }

    &:hover {
        border: 1px solid white;
    }
`

const ResultadoContainer = styled.div`
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
`

function Favoritos() {
    const [ favoritos, setFavoritos ] = useState([])

    const fetchFavoritos = async() => {
        const livrosFavoritos = await getFavoritos()
        setFavoritos(livrosFavoritos)
    }
    
    async function deletarFavorito(id) {
        await deleteFavorito(id)
        await fetchFavoritos()
        alert(`livro de id:${id} removido dos favoritos`)
    }

    useEffect(() => {
        fetchFavoritos()
    }, [])

    
    
    return (
        <FavoritosContainer>
            <Titulo>Aqui estão seus livros favoritos:</Titulo>
            <ResultadoContainer>
                { favoritos.length ?
                    favoritos.map( favorito => (
                        <Resultado onClick={() => deletarFavorito(favorito.id)}>
                            <img alt='teste' src={livroImg}/>
                            <p>{favorito.nome}</p>
                        </Resultado> )) : null
                }
            </ResultadoContainer>
        </FavoritosContainer>
    );
}

export default Favoritos
  • "favorito.js" da pasta "servico":
import axios from "axios";

const FavoritosAPI = axios.create({
    baseURL: 'http://localhost:8000/favoritos'
})


async function getFavoritos() {
    const response = await FavoritosAPI.get('/')

    return response.data
}

async function postFavorito(id) {
    const response = await FavoritosAPI.post(`/${id}`)
    return response.data
}

async function deleteFavorito(id) {
    const response = await FavoritosAPI.delete(`/${id}`)
    return response.data
}


export {
    getFavoritos,
    postFavorito,
    deleteFavorito
}
  • "index.js" da pasta "Pesquisa" em "components", como não cabe aqui, vou deixar em outra resposata logo abaixo:
  1. "index.js" da pasta "Pesquisa" em "components":
import Input from '../Input'
import styled from 'styled-components'
import { useEffect, useState } from 'react'
import livroImg from '../../imagens/livro.png'
import { getLivros } from '../../servico/livros'
import { postFavorito } from '../../servico/favoritos'

const PesquisaContainer = styled.section`
    background-image: linear-gradient(90deg, #002F52 35%, #326589 165%);
    color: #FFF;
    text-align: center;
    padding: 85px 0;
    height: 470px;
    width: 100%;
`

const Titulo = styled.h2`
    color: #FFF;
    font-size: 36px;
    text-align: center;
    width: 100%;
`

const Subtitulo = styled.h3`
    font-size: 16px;
    font-weight: 500;
    margin-bottom: 40px;
`

const Resultado = styled.div`
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 20px;
    cursor: pointer;

    p {
        width: 200px;
    }

    img {
        width: 100px;
    }

    &:hover {
        border: 1px solid white;
    }
`

function Pesquisa() {
    const [livrosPesquisados, setLivrosPesquisados] = useState([])
    const [livros, setLivros] = useState([])

    const fetchLivros = async() => {
        const livros = await getLivros()
        setLivros(livros)
    }
    
    
    useEffect(() => {
        fetchLivros()
    }, [])

    function insertFavorito(id) {
        postFavorito(id)
        alert(`livro de id:${id} adicionado aos favoritos`)
    }

    return (
        <PesquisaContainer>
            <Titulo>Já sabe por onde começar?</Titulo>
            <Subtitulo>Encontre seu livro em nossa estante.</Subtitulo>
            <Input
                placeholder="Escreva sua próxima leitura"
                onBlur={evento => {
                    const textoDigitado = evento.target.value
                    const resultadoPesquisa = livros.length ? livros.filter( livro => livro.nome.includes(textoDigitado)) : []
                    setLivrosPesquisados(resultadoPesquisa)
                }}
            />
            { livrosPesquisados.map( livro => (
                <Resultado onClick={() => insertFavorito(livro.id)}>
                    <img alt='teste' src={livroImg}/>
                    <p>{livro.nome}</p>
                </Resultado>
            ) ) }
        </PesquisaContainer>
    )
}

export default Pesquisa

Uma dica: Eu percebi que logo abaixo de cada vídeo a transcrição do vídeo e o código estão corretos. Você pode se basear na transcrição em vez do " Faça como eu fiz". Fora isso vou encaminhar o seu feedback para a equipe da Alura analisarem o conteúdo.

Esses códigos são da última etapa(aula) do nome "Usando API de Favoritos".

Muito grato pela resposta, vou seguir estes códigos enviados para corrigir o erro. Grato!