Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Deletando todos os colaboradores e times

Quando clico no ícone de deletar, a função está deletando todos os colaboradores e times de uma vez, ao invés de apagar somente o que foi clicado. Tentei gerar o id do colaborador diretamente pelo index.js do componente de time com o uuidv4 e passá-lo como prop para o componente de colaborador mas mesmo assim o bug persiste. Caso possam me ajudar, o link do repositório é https://github.com/gustavo-atanazio/organo.git

Código do componente de time: Código em JavaScript

Código do componente de colaborador:

import {AiFillCloseCircle, AiFillHeart, AiOutlineHeart} from 'react-icons/ai'
import './Colaborador.css'

const Colaborador = ({colaborador, corDeFundo, aoDeletar, aoFavoritar}) => {

    function favoritar() {
        aoFavoritar(colaborador.id)
    }

    const propsFavorito = {
        size: 25,
        onClick: favoritar
    }

    return (
        <div className='colaborador'>
            <AiFillCloseCircle 
                size={25} 
                className='deletar' 
                onClick={() => aoDeletar(colaborador.id)}
            />
            <div className='cabecalho' style={{backgroundColor: corDeFundo}}>
                <img src={colaborador.imagem} alt={colaborador.nome}/>
            </div>
            <div className='rodape'>
                <h4>{colaborador.nome}</h4>
                <h5>{colaborador.cargo}</h5>
                <div className='favoritar'>
                    {colaborador.favorito 
                        ? <AiFillHeart {...propsFavorito} color='#FF0000'/> 
                        : <AiOutlineHeart {...propsFavorito}/>
                    }
                </div>
            </div>
        </div>
    )
}

export default Colaborador;

Código do App.js:

import { useState } from 'react';
import Banner from './componentes/Banner/Banner.js';
import Formulario from './componentes/Formulario';
import Rodape from './componentes/Rodape';
import Time from './componentes/Time';
import { v4 as uuidv4 } from 'uuid';

function App() {

  const [times, setTimes] = useState([
    {
      id: uuidv4(),
      nome: 'Programação',
      cor:'#57C278',
    },
    {
      id: uuidv4(),
      nome: 'Front-End',
      cor: '#82CFFA',
    },
    {
      id: uuidv4(),
      nome: 'Data Science',
      cor: '#A6D157',
    },
    {
      id: uuidv4(),
      nome: 'Devops',
      cor: '#E06B69',
    },
    {
      id: uuidv4(),
      nome: 'UX e Design',
      cor: '#D86EBF',
    },
    {
      id: uuidv4(),
      nome: 'Mobile',
      cor: '#FEBA05',
    },
    {
      id: uuidv4(),
      nome: 'Inovação e Gestão',
      cor: '#FF8A29',
    }
  ]);

  const [colaboradores, setColaboradores] = useState([]);

  function deletarColaborador(id) {
    setColaboradores(colaboradores.filter(colaborador => colaborador.id !== id))
  }

  function mudarCorDoTime(cor, id) {
    setTimes(times.map(time => {
      if (time.id === id) {
        time.cor = cor
      }
      return time;
    }))
  }

  function cadastrarTime(novoTime) {
    setTimes([...times, {...novoTime, id: uuidv4()}])
  }

  function resolverFavorito(id) {
    setColaboradores(colaboradores.map(colaborador => {
      if (colaborador.id === id) colaborador.favorito = !colaborador.favorito;
      return colaborador;
    }))
  }

  return (
    <div className="App">
      <Banner />
      <Formulario
        cadastrarTime={cadastrarTime}
        times={times.map(time => time.nome)} 
        aoCadastrar={colaborador => setColaboradores([...colaboradores, colaborador])}
      />
      {times.map(time => 
        <Time
          aoFavoritar={resolverFavorito}
          mudarCor={mudarCorDoTime} 
          key={time.id}
          time={time}
          colaboradores={colaboradores.filter(colaborador => colaborador.time === time.nome)}
          aoDeletar={deletarColaborador}
        />
      )}
      <Rodape />
    </div>
  );
}

export default App;
2 respostas
solução!

Olá Gustavo! Tudo bem? Fiz o download do seu projeto e rodei aqui no meu computador, dando uma olhada consegui descobrir o problema! A questão aqui é que o id dos colaboradores não está sendo definido em nenhum lugar do código, então sempre que você faz uma consulta baseada no id do colaborador o resultado é undefined. Portanto como todos os colaboradores estão com o mesmo id (undefined), sempre que você favorita ou exclui algum deles, essa ação é aplicada a todos eles. Para resolver esse problema só foi preciso alterar uma linha de código:

// No arquivo App.js, logo após o Banner
<Formulario
    cadastrarTime={cadastrarTime}
    times={times.map(time => time.nome)} 

    // Desestruturando o objeto colaborador, para poder adicionar o id gerado automaticamente com a lib uuidv4
    aoCadastrar={colaborador => setColaboradores([...colaboradores, {...colaborador, id: uuidv4()}])}

  />

Depois de adicionar o id aos colaboradores, o projeto começa a funcionar normalmente. Espero ter ajudado!

Muito obrigado!