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

[Projeto] Hook genérico?

import { RecoilState, useSetRecoilState } from "recoil";

const useModifyItemFromRecoilState = <T>(
  recoilState: RecoilState<T[]>
): ((item: T, keyToCompare: keyof T) => void) => {
  if (!recoilState) throw new Error("useModifyItemFromRecoilState: missing arguments.");

  const setRecoilState = useSetRecoilState(recoilState);

  return (itemModified: T, keyToCompare: keyof T) => {
    setRecoilState((prevState) => {
      const index = prevState.findIndex((ev) => ev[keyToCompare] === itemModified[keyToCompare]);
      const prevItems = prevState.slice(0, index);
      const laterItems = prevState.slice(index + 1);

      return [...prevItems, itemModified, ...laterItems];
    });
  };
};

export default useModifyItemFromRecoilState;

Fiz algumas modificações para tornar esse Hook mais genérico para conseguir usar em qualquer array que é um estado Recoil. Tem alguma coisa que pode ser melhor?

2 respostas
solução!

Salve, Levi!

Legal o seu hook! Normalmente eu não costumo ver rotinas genéricas de atualização assim, porque é comum existir alguma regra de negócio envolvida.

O que você achou do uso do hook em si? Um dos motivos para extrairmos o hook é desacoplar o uso do Recoil dos componentes e um dos parâmetros do hook é justamente um RecoilState.

A nível de algorítimo e legibilidade de código, achei bem bacana! Pensar fora da caixinha é sempre muito legal.

No momento que fiz esse Hook, não tinha chegado no momento que você tinha criado aquele Hook de pegar a lista de Eventos, que no primeiro momento não fez muito sentido para mim, mas depois de refletir um pouco reparei que faz sim, aí não tive essa ideia de fazer algo do escopo do projeto invés de algo genérico e acoplado a uma biblioteca.

Mas foi uma bom desafio de lógica e implementação. Agradecido pela resposta.