2
respostas

Filtragem não funciona

Boa tarde, o meu código não funciona após as implementações de filtragem, mesmo eu criando novos eventos mais recentes e tentando filtra-los.

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

Meu código:

useListaDeEventos.ts

import { useRecoilValue } from "recoil";
import { listaDeEventosState } from "../atom";

const useListaDeEventos = () => {
    return useRecoilValue(listaDeEventosState)
}

export default useListaDeEventos;

ListaDeEventos

import React from "react";
import Evento from "../Evento";
import Filtro from "../Filtro";
import style from "./ListaDeEventos.module.scss";
import useListaDeEventos from "../state/hooks/useListaDeEventos";
import { useRecoilValue } from "recoil";
import { IFiltroDeEventos } from "../../interfaces/iFiltroDeEventos";
import { filtroDeEventos } from "../state/atom";

const ListaDeEventos: React.FC = () => {
  const todosOsEventos = useListaDeEventos();
  const filtro = useRecoilValue<IFiltroDeEventos>(filtroDeEventos)

  const eventos = todosOsEventos.filter(evento => {
    if (!filtro.data){
      return true
    }
    const ehOMesmoDia = filtro.data.toISOString().slice(0, 10) === evento.inicio.toISOString().slice(0, 10)
    return ehOMesmoDia
  })

  return (
    <section>
      <Filtro />
      <div className={style.Scroll}>
        {eventos.map((evento) => (
          <Evento evento={evento} key={evento.id} />
        ))}
      </div>
    </section>);
};

export default ListaDeEventos;

Filtro

import React, { useState } from 'react';
import style from './Filtro.module.scss';
import { useSetRecoilState } from 'recoil';
import { filtroDeEventos } from '../state/atom';
import { IFiltroDeEventos } from '../../interfaces/iFiltroDeEventos';

const Filtro: React.FC = () => {
  
  const [data, setData] = useState('')
  const setFiltroDeEvento = useSetRecoilState<IFiltroDeEventos>(filtroDeEventos)
  
  const submeterForm = (evento: React.FormEvent<HTMLFormElement>) => {
    evento.preventDefault()
    
    const filtro: IFiltroDeEventos = {}
    if(data) {
      filtro.data = new Date()
    } else {
      filtro.data = null
    }
    setFiltroDeEvento(filtro);
  }

  return (<form className={style.Filtro} onSubmit={submeterForm}>
    <h3 className={style.titulo}>Filtrar por data</h3>
    <input 
      type="date" 
      name="data"
      className={style.input}
      onChange={evento => setData(evento.target.value)} 
      placeholder="Por data"
      value={data} />

    <button className={style.botao}>
      Filtrar
    </button>

  </form>)
}

export default Filtro
2 respostas

E aí, Gabriel!

Primeira coisa que me chamou a atenção é o trecho no Filtro onde você define o valor para filtro.data:

if(data) {
  filtro.data = new Date()
} else {
  filtro.data = null
}

Aqui você está sempre setando a data como um novo objeto Date(). Se quiser que ela seja a mesma que você está pegando do input, deveria ser algo assim:

if (data) {
  filtro.data = new Date(data);
} else {
  filtro.data = null;
}

Agora, outra coisa a ser verificada é na hora de comparar as datas na filtragem, mais especificamente neste trecho no ListaDeEventos:

const ehOMesmoDia = filtro.data.toISOString().slice(0, 10) === evento.inicio.toISOString().slice(0, 10);

Aqui você está comparando diretamente a string da data, e isso pode estar causando problemas de comparação. Uma alternativa é converter ambas as datas para o formato de string e então comparar, ou usar uma biblioteca de manipulação de datas, como o date-fns.

import { isSameDay } from 'date-fns';

const ehOMesmoDia = isSameDay(new Date(filtro.data), new Date(evento.inicio));

Dá uma olhada nesses pontos e vê se resolve. Se ainda tiver problemas, grita aí!

Olá!

Sim, meu erro estava no componente Filtro porque eu não estava definindo o new Date.

const filtro: IFiltroDeEventos = {}
    if(data) {
      filtro.data = new Date(data)                          // antes era somente new Date ();
    } else {
      filtro.data = null
    }
    setFiltroDeEvento(filtro);
  }

Obrigado pela atenção :)