Skip to content

Latest commit

 

History

History
119 lines (76 loc) · 6.87 KB

File metadata and controls

119 lines (76 loc) · 6.87 KB

Desafio do Frontend Mentor | Seção de comentários interativos

Sendo exatamente a proposta do Frontend Mentor, este projeto é realmente desafiador para provar as habilidades em JavaScript. O principal objetivo deste desafio é simular as principais interações existentes em uma seção de comentários, chegando bem próximo dos comentários contidos nas redes sociais do dia a dia.

Esse desafio reforça muito a lógica de programação, ainda mais com alguns perfeiçoamentos que fiz por conta própria no projeto, pois requere que você escreva / execute cada bloco de código considerando o que já foi ou irá ser executado. Está mesma lógica com certeza foi o que mais foi trabalhado neste projeto, pois me mostrou a grande relevância e benefício de pensar antes de escrever.

Captura de tela do projeto

📋 Índice

🔎 Visão geral

✅ Status

Finalizado.

🏁 O desafio

Para a resolução deste desafio, os usuários devem ser capazes de:

  • Visualizar exatamente o layout proposto de acordo com o tamanho da janela de exibição (responsividade)
  • Visualizar os estados – pairar, clicar ou selecionar – nos elementos interativos para uma usabilidade adequada
  • Criar, ler, atualizar e excluir comentários e respostas
  • Visualizar a data que seu comentário foi postado
  • Avaliar comentários que não sejam de si próprio
  • Visualizar os comentários atualizados mesmo recarregando a página ou saindo do navegador

🔗 Acesse o projeto

⚙️ Desenvolvimento

💻 Tecnologias utilizadas

  • HTML
  • CSS / SASS
  • Vanilla JavaScript

💡 Aperfeiçoamentos

Para chegar mais próximo de um exemplo real de uma seção de comentários – como os contidos nas redes sociais –, e pensando em melhorar a usabilidade, pensei em algumas melhorias não requiridas pelo Frontend Mentor.

Criar perfil de usuário

Na primeira renderização da página no navegador do usuário, eu exijo um nome que será armazenado no localStorage e utilizado quando a pessoa publicar um comentário. Aproveitei também para permitir que o mesmo usuário possa acrescentar uma foto de forma opcional.

Após acrescentar e confirmar um nome de usuário, a janela de criar um perfil é fechada, podendo ser reaberta pelo usuário no momento que desejar clicando sobre seu nome de usuário, exibido no canto superior direito da página.

create-profile.mp4

Mensagens de erro ou sucesso

Achei interessante em várias ocasiões exibir algumas mensagens ou avisos para evitar o usuário de ficar confuso. A maioria delas são exibidas no canto superior direito da página, mas algumas são exibidas em janela modal para chamar mais atenção (como o caso de cancelar as edições feitas em um comentário).

messages.mp4

Animações

Algo totalmente secundário, mas que dá um charme ao projeto, são as animações. Decidi acrescenta-las em praticamente todas as interações do usuário, como ao postar ou deletar um comentário, por exemplo.

A maioria delas é relacionada a uma transição de altura ou deslocamento. Apesar de a base ser feita com CSS, a aplicação é em JavaScript para priorizar valores exatos (como altura do elemento) e coloca-las em todas as ocasiões (não só ao exibir um elemento, mas também ao oculta-lo).

animations.mp4

💡 Aprendizados

Lógica de programação

Como destacado na introdução deste readme, a lógica de programação foi o principal ponto trabalhado neste desafio. O conceito de pensar antes de escrever nunca foi tão aplicado por mim antes.

Separar o que é essencial do secundário; considerar o contexto que você vai escrever um novo bloco de código; considerar o que já foi e o que será executado após o seu novo código; reaproveitar funções e módulos que se encaixam em ocasiões diferentes. A junção de tudo isso foi pra mim, fatores essenciais para concluir este projeto exatamente com o resultado desejado.

Classes e funções construtoras

O uso das classes foi também um ponto chave no desenvolvimento do código deste projeto. Como uma alternativa de sintaxe da função construtora, as classes me permitiu uma clareza e organização do código como um todo de forma que eu nunca tinha aplicado antes.

Para exemplificar o uso, uma classe seria o comentário em si, com propriedades como id, usuário que postou, conteúdo do comentário e etc. Os métodos, toda a interação, como deletar, editar, avaliar e etc. Como eu precisava de objetos com as mesmas propriedades, já que o projeto inteiro é sobre comentários, mas valores diferentes nestas mesmas chaves, o uso das classes se encaixou perfeitamente nesta ocasião.

Timestamp

Também pude aproveitar o uso do método Date.now() para se basear na marca temporal do JavaScript na hora de setar as datas de publicações dos comentários. Apesar de não ser necessário neste desafio, é um aspecto positivo para considerar os fusos horários diferentes.

Além disso, fiz toda a formatação dessas datas para serem exibidas corretamente ao usuário, como por exemplo, verificar se o período (dia, semana etc) é o primeiro ou não para então mostrar a data no singular (1 dia atrás) ou plural (2 dias atrás).

Apesar de haver outras funções e retornos envolvidos para o resultado desejado, a função que formata as datas é a seguinte:

const handleGrammar = (isPlural = true) => {
    const text = `${currentPeriod} ${periodName}`;
    const complement = "atrás";
    const plural = `${text}s ${complement}`;
    const single = `${text} ${complement}`;

    if (isPlural) {
        const pluralOfMonths = `${currentPeriod} meses ${complement}`;

        return periodName === "mês" ? pluralOfMonths : plural;
    } else {
        return single;
    }
}