Git Product home page Git Product logo

mais-todos-challenge's Introduction

Mais Todos - Challenge React

Projeto desenvolvido em React para o Challenge da Mais Todos (https://github.com/MaisTodos/challenge-frontend-react)

mais todos store

Bibliotecas utilizadas

  • axios (^1.5.1): Uma biblioteca JavaScript para fazer requisições HTTP no navegador e no Node.js. É amplamente utilizada para realizar solicitações de API de forma eficiente.

  • react-hook-form (^7.47.0): Uma biblioteca popular para lidar com formulários em aplicativos React. Ela oferece uma maneira eficaz de gerenciar o estado do formulário e validação.

  • react-router-dom (^6.16.0): Uma biblioteca para roteamento de páginas em aplicativos React. Ela permite criar aplicativos de página única (SPA) com navegação suave entre diferentes componentes e URLs.

  • typescript (^4.4.2): Uma linguagem de programação superset do JavaScript que adiciona tipagem estática ao JavaScript. É amplamente utilizado para desenvolvimento em larga escala e melhoria da segurança e manutenção do código.

  • zod (^3.22.2): Uma biblioteca para validação de esquema de dados em TypeScript. Ela ajuda a definir e validar estruturas de dados de forma segura e eficiente.

  • zustand (^4.4.1): Uma biblioteca de gerenciamento de estado para React baseada em hooks. Ela fornece uma maneira simples e eficaz de gerenciar o estado do aplicativo com o mínimo de boilerplate.

  • stripe (^13.8.0): Uma biblioteca para integrar a funcionalidade de pagamento da plataforma Stripe

Executando o projeto localmente

npm run prepare
npm run start

Executando os testes

npm run test

Adicionando um produto

Clicar em "+" no header

adicionar produto

Editando um produto

Acessar qualquer produto da lista e clicar em "Editar produto"

editar produto

Deletando um produto

Acessar qualquer produto da lista, clicar em "Editar produto" e depois em "Deletar produto"

Alguns padrões utilizados

Em projetos que não utilizam 100% clean arch procuro sempre utilizar padrões dessa arquitetura para facilitar a manutenção, testes, reaproveitamento, etc.

Inversão de dependência

No exemplo abaixo a funcão de submissão é recebida como prop o que pode ser considerado uma inversão de dependência. Isso torna possível reutlizar o mesmo formulário para edição e adição do produto, apenas trocando a função de submissão.

function FormWrapper() {
  const handleSubmit = (values) => {
    ...
  }

  return (
    <ProductForm onSubmit={handleSubmit} />
  )
}

Expondo nós da DOM

Em certos componentes se faz necessário utilizar a função forwardRef para expor um nó da DOM para um componente pai. Útil em casos que um componente, seja interno ou de biblioteca, adiciona event handlers ao componente filho.

import { forwardRef } from "react";

type ButtonIconProps = {
  as?: React.ElementType | keyof JSX.IntrinsicElements
} & React.ComponentProps<any>

export const ButtonIcon = forwardRef<HTMLButtonElement, ButtonIconProps>(({ children, as = "button", ...props }, ref) => {
  const Component = as

  return  (
    <Component ref={ref} type="button" {...props}>
      {children}
    </Component>
  )     
})

Polimorfismo

Utilizando o mesmo exemplo acima, a prop as permite alterar a tag renderizada, evitando a duplicação de código em casos que precisamos renderizar um botão como uma âncora por exemplo.

Optimistic Updates

Com React Query podemos atualizar de forma Otimista nossa UI, ou seja, refletir de forma imediata uma alteração que ainda está ocorrendo e assim melhorar a experiência do usuário.

const { mutate: updateCart } = useMutation({
  mutationFn: updateCartService,
  onMutate: async (newCart) => {
    await queryClient.cancelQueries({ queryKey: queryKey })
    const previousValue = queryClient.getQueryData(queryKey)
    queryClient.setQueryData<Cart>(queryKey, (old) => ({...old!, products: newCart.products}))

    return { previousValue }
  },
  onError: (_err, _newCart, context) => {
    queryClient.setQueryData(getCartQueryKey(cartId), context?.previousValue)
  },
  onSettled: () => {
    queryClient.invalidateQueries({ queryKey: queryKey })
  },
})

mais-todos-challenge's People

Contributors

cslz4 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.