1
resposta

Os gráficos não aparecem na tela

App.tsx

import './App.css';
import Cabecalho from './components/Cabecalho';
import Container from './components/Container';
import Grafico from './components/Grafico';
import Rodape from './components/Rodape';
import Tabela from './components/Tabela';
import Titulo from './components/Titulo';
import useDadosConsulta from './useDadosConsulta';
import useDadosProfissional from './useDadosProfissional';

function App() {

  const { dados: consultas, erro: consultasErro } = useDadosConsulta();
  const { dados: profissionais, erro: profissionaisErro } = useDadosProfissional();

  if (consultasErro || profissionaisErro) {
    console.log("Ocorreu um erro na requisição");
  }

  return (
    <>
    <Cabecalho/>
    <Container>
      <Titulo>Área Administrativa</Titulo>
      <Tabela consultas={consultas}/>
      <Grafico consultas={consultas} profissionais={profissionais}/>
    </Container>
    <Rodape/>
    </>
  );
}

export default App;

Grafico.tsx

import { ResponsiveContainer } from "recharts";
import { Bar } from "recharts";
import { XAxis } from "recharts";
import { YAxis } from "recharts";
import { BarChart } from "recharts";
import styled from "styled-components";
import IConsulta from "../../types/IConsulta";
import IProfissional from "../../types/IProfissional";
import useDadosGrafico from "./useDadosGrafico";

interface Props {
    profissionais: IProfissional[] | null,
    consultas: IConsulta[] | null
}

interface IDados {
    nome: string,
    consultas: number
}

const SecaoEstilizada = styled.section`
background-color: var(--branco);
border-radius: 16px;
`

function Grafico({ profissionais, consultas }: Props) {
    let dados: Array<IDados> = useDadosGrafico({ profissionais, consultas });
    return (
        <SecaoEstilizada>
            <ResponsiveContainer width="100%" height={350}>
                <BarChart
                    layout="vertical"
                    data={dados}
                    margin={{ top: 25, right: 40, left: 40, bottom: 20 }}
                >
                    <XAxis type="number"></XAxis>
                    <YAxis type="category" dataKey="nome"></YAxis>
                    <Bar dataKey="consultas" fill="#083860" barSize={30}></Bar>
                </BarChart>
            </ResponsiveContainer>
        </SecaoEstilizada>
    )
}

export default Grafico;

useDadosGrafico.tsx

import IConsulta from "../../types/IConsulta";
import IProfissional from "../../types/IProfissional";

interface Props {
    profissionais: IProfissional[] | null,
    consultas: IConsulta[] | null
}

interface IDados {
    nome: string,
    consultas: number
}

const useDadosGrafico = ({ profissionais, consultas }: Props) => {
    let dados: Array<IDados> = [];

    if (profissionais && consultas) {
        dados = profissionais.map((profissional) => ({
            nome: profissional.nome,
            consultas: consultas.filter((consulta) =>
                consulta.profissional.some((prof) => prof.nome === profissional.nome)
            ).length
        }))
    }

    return dados;
}

export default useDadosGrafico;

O que está acontecendo ?

Aguardo um retorno.

Att.

1 resposta

Oi, Gerson, tudo bem?

Muito obrigado por compartilhar o seu código, contudo não consegui encontrar problemas nos arquivos que você compartilhou, que pudesse fazer o gráfico não aparecer na tela.

Pode ser que o problema esteja em outra parte do seu código ou até mesmo nos comandos que você está utilizando para rodar a API, peço que verifique no arquivo "package.json" se nos scriptsvocê definiu o comando:

"api": "json-server --watch -p 8080 db.json"

Além disso, no arquivo "useFetch.ts" certifique-se que você definiu a porta do localhost como 8080 no comando que faz a requisição da API, do contrário os dados não serão carregados. O código para a requisição correta está abaixo:

    useEffect(() => {
        fetch(`http://localhost:8080/${url}`).then(
            resposta => resposta.json()
        ).then(dados => setDados(dados)).catch((erro => setErro(erro)))
    }, [url])

Se você fez essa definição, você poderá rodar a API com o comando npm run api.

Lembre-se de sempre rodas a API quando estiver usando o projeto, mantendo o terminal aberto.

Caso ainda esteja com problemas, peço que você compartilhe o link do seu projeto no GitHub ou uma pasta com todos os arquivos que você utilizou no através do Google Drive. Dessa forma, conseguirei realizar os testes necessários e te ajudar de forma mais assertiva. Lembre-se que, se enviar os arquivos por meio do Google Drive, é necessário conceder permissão para que eu possa ter acesso.

Espero que dê tudo certo!

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!