Há apenas uma parte falando sobre adicionar na interface de IEventoFiltro, porém não tem a implementação para fazê-la funcionar.
Eu implementei assim:
selectors.ts
import { selector } from "recoil";
import { IEvento } from "../interfaces/IEvento";
import { filtroEventosState, listaEventosState } from "./atom";
export const eventosFiltradosState = selector<IEvento[]>({
key: "eventosFiltradosState",
get: ({ get }) => {
const todosEventos = get(listaEventosState);
const filtro = get(filtroEventosState);
const eventos = todosEventos.filter((evt) => {
if (filtro.data) {
const ehOMesmoDia = filtro.data.toISOString().slice(0, 10) === evt.inicio.toISOString().slice(0, 10);
return filtro.estado !== "ambos"
? filtro.estado === "completos"
? ehOMesmoDia && evt.completo
: ehOMesmoDia && !evt.completo
: ehOMesmoDia;
}
if (filtro.estado === "completos") return evt.completo;
if (filtro.estado === "incompletos") return !evt.completo;
return true;
});
return eventos;
},
});
Filtro/index.tsx
import React, { useState } from "react";
import { useSetRecoilState } from "recoil";
import { IFiltroEventos } from "../../common/interfaces/IFiltro";
import { filtroEventosState } from "../../common/stores/atom";
import style from "./Filtro.module.scss";
const Filtro = () => {
const [data, setData] = useState("");
const [estado, setEstado] = useState<"ambos" | "incompletos" | "completos">("ambos");
const setFiltroEvento = useSetRecoilState(filtroEventosState);
const submeterForm = (evento: React.FormEvent<HTMLFormElement>) => {
evento.preventDefault();
const filtro: IFiltroEventos = {};
if (!data && !estado) {
filtro.data = null;
filtro.estado = null;
}
if (data && !estado) filtro.data = new Date(data);
if (estado && !data) filtro.estado = estado;
filtro.data = new Date(data);
filtro.estado = estado;
setFiltroEvento(filtro);
};
return (
<form className={style.Filtro} onSubmit={submeterForm}>
<div>
<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}
/>
</div>
<div>
<h3>Filtrar por estado:</h3>
<label>
Ambos:
<input type="radio" name="estado" value={estado} onChange={() => setEstado("ambos")} />
</label>
<label>
Completos:
<input type="radio" name="estado" value={estado} onChange={() => setEstado("completos")} />
</label>
<label>
Incompletos:
<input type="radio" name="estado" value={estado} onChange={() => setEstado("incompletos")} />
</label>
</div>
<button className={style.botao}>Filtrar</button>
</form>
);
};
export default Filtro;
Queria saber como o professor implementou.