Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Challenge - Jonatas Pinto #22

Closed
wants to merge 86 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
dddb20e
feat: initial setup
jonataspinto Oct 28, 2023
80372b8
build: config jest and RTL
jonataspinto Oct 28, 2023
5365fe4
feat(components): create component brand logo
jonataspinto Oct 28, 2023
74ef147
feat(components): create component Menu
jonataspinto Oct 28, 2023
a584943
feat(components): create component Header
jonataspinto Oct 28, 2023
3a3439b
feat(app/layout): adding component header in global app layout
jonataspinto Oct 28, 2023
304d36d
feat(components/ThemeRegistry/theme): sets style override to AppBar c…
jonataspinto Oct 28, 2023
3510096
chore(jest): configure module name mapper and create mock to window.r…
jonataspinto Oct 28, 2023
7deb51c
feat(_mock): creating mock with menu links
jonataspinto Oct 28, 2023
ef416b0
test(components/header): creating assertions to jsx and custom hook
jonataspinto Oct 28, 2023
31e3cd6
fix(components/Logo): adding role `img`
jonataspinto Oct 28, 2023
5e179cd
fix(components/Menu): adding testid
jonataspinto Oct 28, 2023
71684e3
chore(eslint): disabling `react-in-jsx-scope` rule
jonataspinto Oct 28, 2023
f9a8013
refactor(components/MenuItems, AuthMenuItems): using menu links mock
jonataspinto Oct 28, 2023
e76521f
feat(_mock/lang): create mock with texts
jonataspinto Oct 29, 2023
e09e840
refactor(app/layout): uses metadata from lang mock
jonataspinto Oct 29, 2023
d09ce32
fix(_mock/menu): fixing tracker route
jonataspinto Oct 29, 2023
af49553
feat(components): implements tracker order form
jonataspinto Oct 29, 2023
1726def
feat(components): implements call to action "send with us"
jonataspinto Oct 29, 2023
243205a
feat(app): implements tracker page mobile
jonataspinto Oct 29, 2023
9f07d65
feat(components/TrackerForm): implements custom hook with validations…
jonataspinto Oct 29, 2023
9f5da75
feat(_mock): creating mock of orders list
jonataspinto Oct 29, 2023
70d1557
feat(app/orders): implements get order details route
jonataspinto Oct 29, 2023
1abbad9
chore(types): create definition for OrderDetails
jonataspinto Oct 29, 2023
67adcc7
refactor(components/ShipmentCapture): get text of container from lang…
jonataspinto Oct 29, 2023
40c4343
refactor(app/tracker/page): removing invalid prop of component and ad…
jonataspinto Oct 29, 2023
639289b
feat(components): create TrackerDetails component
jonataspinto Oct 29, 2023
e8c111f
feat(app/tracker): create tracker details page
jonataspinto Oct 29, 2023
919efc5
fix(components/TrackerDetails): fixing alignment
jonataspinto Oct 29, 2023
bc52e68
refactor(components/Header): adjusting padding for desktop view
jonataspinto Oct 29, 2023
1d5f522
refactor(components/TrackerForm): adjusting padding for desktop view
jonataspinto Oct 29, 2023
5240e1c
refactor(components/ShipmentCaptureCta): adjusting padding for deskto…
jonataspinto Oct 29, 2023
61ca050
refactor(components/TrackerDetails): adjusting padding for desktop view
jonataspinto Oct 29, 2023
32c8816
refactor(app/tracker): changing view structure and spacing
jonataspinto Oct 29, 2023
61e2668
refactor(app/tracker/details-page): changing view structure, styles a…
jonataspinto Oct 29, 2023
3345b08
chore(next.config): configure rewrites for friendly routes
jonataspinto Oct 29, 2023
0a900c7
refactor(_mock/menu): changing tracker route
jonataspinto Oct 29, 2023
f00a225
refactor(components/TrackerForm): changing route to details view
jonataspinto Oct 29, 2023
2159dc3
refactor(_mock/lang/ptBr): changing track form object
jonataspinto Oct 29, 2023
218a17c
refactor(components/TrackerForm): get values from ptBR lang and remov…
jonataspinto Oct 29, 2023
5aa717d
refactor(app/tracker): removing props from TrackerForm
jonataspinto Oct 29, 2023
56bb557
feat(_mock/lang/ptBr): adds ourServices block
jonataspinto Oct 29, 2023
c473c3d
feat(components): create section with cards of services
jonataspinto Oct 29, 2023
8d7a4e8
feat(app/tracker): rendering section `OurServices`
jonataspinto Oct 29, 2023
5fe1c1a
refactor(components/TrackerForm): adjusting borders radius
jonataspinto Oct 29, 2023
82f02eb
refactor(app/tracker): adjusting border of container track form and s…
jonataspinto Oct 29, 2023
26c0b6a
refactor(components/Header): adjusting padding of logo for desktop view
jonataspinto Oct 29, 2023
cf68ca5
refactor(app/tracker): removing unnecessary property
jonataspinto Oct 29, 2023
64d7925
refactor(components/OurServices): removing border of cards
jonataspinto Oct 29, 2023
c01e5a7
fix(app/orders/get): fixing case sensitive comparison
jonataspinto Oct 29, 2023
456ae47
chore(next.config): configure redirect of the base path to page of tr…
jonataspinto Oct 30, 2023
9c8ad5d
fix(components/TrackerDetails): fixing spacing
jonataspinto Oct 30, 2023
39c4048
fix(app/tracker/details-page): fixing spacing on top page
jonataspinto Oct 30, 2023
911bab6
feat(_mock/lang/ptBr): moving menu links to ptBr constant
jonataspinto Oct 30, 2023
5896471
chore(_mock): delete menu mock
jonataspinto Oct 30, 2023
20c8e33
refactor(components/Menu): changing path to menu links mock
jonataspinto Oct 30, 2023
1cee979
refactor(components/header.spec): changing path to menu links mock
jonataspinto Oct 30, 2023
fcef6c2
fix(components/header): adjusting color and width of open menu button
jonataspinto Oct 30, 2023
928910f
feat(_mock/lang/ptBr): adding footer menu keys
jonataspinto Oct 30, 2023
fd07d07
feat(components): creating footer menu component
jonataspinto Oct 30, 2023
8232982
feat(app/layout): adding footer component
jonataspinto Oct 30, 2023
4dc26b5
feat: adding store icons
jonataspinto Oct 30, 2023
55cb354
feat(components/footer): creating component with links of store apps
jonataspinto Oct 30, 2023
36e20e8
feat(components/footer/FooterMenu): adjusting spacing and render stor…
jonataspinto Oct 30, 2023
1fb25d1
feat(components/Footer): rendering logo
jonataspinto Oct 30, 2023
a7c1159
feat(components/Footer): adjusting spacing
jonataspinto Oct 30, 2023
1b2b1bb
feat(app/layout): adding border bottom in main box
jonataspinto Oct 30, 2023
1a860d4
chore: configure node version
jonataspinto Oct 30, 2023
450ace2
doc: create file with challenge description
jonataspinto Oct 30, 2023
2de0562
doc(Readme): create file with instructions to run app
jonataspinto Oct 30, 2023
05e9104
doc(Readme): adding sell symbol in commands
jonataspinto Oct 30, 2023
8300294
doc(Readme): removing sell symbol in commands
jonataspinto Oct 30, 2023
0ebb50c
doc(Readme): changing the hierarchy of titles
jonataspinto Oct 30, 2023
d67c119
build(docker): configure docker container of dev
jonataspinto Oct 30, 2023
15a7e23
doc(Readme): adding instructions to run docker container
jonataspinto Oct 30, 2023
fc27408
chore: adding cypress
jonataspinto Oct 30, 2023
bde9d56
test(cypress): create integration test to tracking
jonataspinto Oct 30, 2023
6ae2af7
fix(components/TrackerDetails): fixing typo error
jonataspinto Oct 30, 2023
6f8396f
refactor(package.json): changing name of cypress test script
jonataspinto Oct 30, 2023
8fb252e
doc(Readme): adding instructions to run tests
jonataspinto Oct 30, 2023
ba62b94
doc(Readme): adding technical notes
jonataspinto Oct 30, 2023
fc53d31
refactor: replace route `/rastreamento` to `/rastreador`
jonataspinto Oct 30, 2023
6a34979
feat(services): implements http client
jonataspinto Oct 30, 2023
5eb1cd2
feat(services): implements orders services layer
jonataspinto Oct 30, 2023
1349521
feat(app/tracker/details-page): using OrdersService
jonataspinto Oct 30, 2023
194bb63
feat(components/TrackerForm/hook): using OrdersService
jonataspinto Oct 30, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Dockerfile
.dockerignore
node_modules
README.md
.next
.git
22 changes: 22 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react/recommended",
"plugin:@next/next/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["@typescript-eslint", "react"],
"rules": {
"react/react-in-jsx-scope": "off"
}
}
35 changes: 35 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v18.17.1
9 changes: 9 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.format": true
},
}
26 changes: 26 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
FROM node:18-alpine

WORKDIR /app

# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \
# Allow install without lockfile, so example works even without Node.js installed locally
else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \
fi

COPY src ./src
COPY public ./public
COPY next.config.js .
COPY tsconfig.json .

# Start Next.js in development mode based on the preferred package manager
CMD \
if [ -f yarn.lock ]; then yarn dev; \
elif [ -f package-lock.json ]; then npm run dev; \
elif [ -f pnpm-lock.yaml ]; then pnpm dev; \
else yarn dev; \
fi
210 changes: 164 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,64 +1,182 @@
## Loggi no Talent Fest Brasil 9ª Geração Laboratória
## Live at:

Olá! Estamos felizes em te apresentar o desafio de front-end da Loggi. A partir de agora, você está recebendo o desafio de construir, com a sua visão, **"como deveria ser a interface do [rastreador de pacotes da Loggi](https://www.loggi.com/rastreador/)?"**.
https://challenge-tracker-frontend.vercel.app/rastreador

Este desafio pode ser usado para avaliar tecnicamente todas as pessoas interessadas em nossas vagas de desenvolvimento de Frontend. O que muda, basicamente, são os critérios de avaliação.
Códigos de ratreio dos pedidos mocados.
| ID | Status |
| --- | --- |
| ABCD12345 | Em trânsito |
| EFGH67890 | Entregue |
| IJKL34567 | Em trânsito |

## O desafio
---

Quando fazemos uma compra online, ou enviamos uma encomenda para um amigo ou cliente, gostamos de acompanhar e saber o que está acontecendo com nosso pacote. Esta experiência é muito importante tanto para quem envia quanto para quem está aguardando recebimento.
## Descrição do desafio e requisitos técnicos:

Neste desafio, te convidamos a pensar como "dono da Loggi". É você quem vai definir (e implementar) como será a experiência de uso deste "rastreador". Você pode usar como inspiração o [rastreador atual do site da Loggi](https://www.loggi.com/rastreador/) ou de outros sites que você use e goste de acompanhar suas encomendas.
Leia a descrição do desafio e os requisitos técnicos no [challenge.md](challenge.md) para obter mais detalhes.

---

## Instruções técnicas
## Como rodar o projeto:

Você deverá criar um fork deste repositório e desenvolver no seu espaço no GitHub. Ao final do desenvolvimento, você deverá abrir um [Pull Request](https://github.com/joseluizcoe/desafio-loggi-front-end/pulls) para o repositório do desafio (este repositório) ou enviar o link do seu repositório para um de nossos recrutadores.
#### Clone o repositório:

Importante: Use o README.md do seu repositório para nos mostrar as instruções de como rodar seu projeto.
```shell
git clone git@github.com:jonataspinto/challenge-tracker-frontend.git
```

Para este desafio, temos algumas ferramentas que gostaríamos que fossem utilizadas:
* [Next.js](https://nextjs.org/) - Para desenvolvimento do front-end e backend (use a rota /api)
* [Material UI](https://mui.com/) - Para componentes visuais de front-end
* GitHub - para versionamento de código
#### Requisitos:

Para não perder tempo configurando projeto, você pode usar [este template pronto](https://github.com/mui/material-ui/tree/master/examples/material-ui-nextjs) que usa as ferramentas acima.
```
Nodejs versão 18
```

Sugerimos que para a parte de backend (retorno de dados) você use (ou implemente) algum mock para que consiga focar apenas no front-end.
> **Note**
> A versão sugerida já está configurada no `.nvmrc` basta executar `$ nvm use`

#### Instalação de dependências:

## O mínimo que esperamos
- Que você seja a pessoa que fez o projeto - _ficaríamos bem desapontados se outra pessoa fizesse o desafio por você._
- Que os commits sejam pequenos, com poucas alterações, mostrando seu raciocínio de construção nos comentários

Separamos alguns níveis de avaliação.
- Navegue para a raiz do projeto.

### Nivel Básico:
- Documentação - precisamos conseguir rodar o projeto apenas lendo a documentação, sem perguntar nada para ninguém.
- Documentação - além de entender o projeto, é importante estarem documentadas as decisões (principalmente de experiência do usuário)
- Organização do código
- Componentes React (HTML) escrito da maneira mais semântica possível
- Mobile first e layout responsivo
- Parte visual da experiência proposta
```shell
cd challenge-tracker-frontend
```

### Nível Médio:
- Testes unitários
- BEM (css)
- Aplicação de animações (sem degradar a performance)
- Ver o projeto rodando online em algum lugar (Bucket estático S3, Heroku, Netlify, Vercel)
- Pull request criado neste repositório a partir do fork
- Instalando as dependências.

### Nível Avançado:
- Docker - projeto rodando em um container para desenvolvimento local
- Testes e2e
- Estrutura de dados
- Desenho da arquitetura da solução
```shell
yarn
```

## O que será avaliado em todos os níveis
- Criatividade (da solução proposta)
- Experiência de uso do serviço
- Histórico de commits
- Documentação de como rodar o projeto
- Organização do seu código
- Adaptação mobile (layout responsivo)
- Componentização e extensibilidade dos componentes Javascript
ou

```shell
npm run install
```

#### Iniciar servidor de desenvolvimento:

```shell
yarn dev
```

ou

```shell
npm run dev
```

Acesse [localhost:3000](http://localhost:3000) para visualizar em seu navegador. :tada:

#### Build de produção:

```shell
yarn build
```

ou

```shell
npm run build
```

#### Iniciar servidor após Build:

```shell
yarn start
```

ou

```shell
npm run start
```

Acesse [localhost:3000](http://localhost:3000) para visualizar em seu navegador. :tada:

### Rodando com Docker

#### Requisitos

Instale o [Docker Desktop](https://docs.docker.com/get-docker/) para Mac, Windows ou Linux. `Docker Desktop` inclui `Docker Compose`` como parte da instalação.

#### Iniciar servidor de desenvolvimento:

Build da imagem:

```shell
docker compose build
```

Rodando o container da aplicação:

```shell
docker compose up -d
```

Acesse [localhost:3000](http://localhost:3000) para visualizar em seu navegador. :tada:

---

## Testes automatizados.

### Testes unitários/integração:

Rodando os testes:

```sell
yarn test
```

ou

```shell
npm run test
```

### Testes e2e:

> **Note**
> O cypress está configurado para acessar o ambiente http://localhost:3000, então o projeto deve estar rodando antes de executar o comando de testes.

Rodando os testes:

```sell
yarn test:cypress
```

ou

```shell
npm run test:cypress
```

---

## Explicando algumas decisões:

#### Nextjs + Material UI

Segui o que foi proposto [desafio](challenge.md).

#### Typescript

Embora o boilerplate sugerido ainda não esteja configurado, optei pelo TypeScript devido à minha familiaridade com a linguagem.

#### Corbetura de testes

Testes de unidade e integração, implementados com o uso do Jest e do RTL, desempenham um papel crucial na garantia de que os componentes reutilizáveis em uma aplicação se comportem de maneira consistente em diversos cenários. Entretanto, é inegável que escrever uma quantidade substancial de testes para abranger toda a aplicação pode ser um processo demorado.

Diante dessa realidade, embora tenha desenvolvido alguns testes com Jest e RTL como demonstrações de boas práticas, tomei a decisão estratégica de dar ênfase aos testes end-to-end (E2E) em uma parte significativa da cobertura. Essa decisão se fundamenta na eficiência da implementação e na minha aspiração de demonstrar competência em uma ferramenta menos convencional.

Vale ressaltar que um dos fatores que contribuíram para essa escolha foi a utilização do Material-UI, uma vez que todos os componentes já são submetidos a testes abrangentes, o que aumenta a confiabilidade do sistema como um todo.

#### Layout

No modelo original, o cabeçalho era visível somente na visualização para desktop. Optei por manter o cabeçalho visível em ambas as visualizações, desktop e mobile, enquanto reorganizava os elementos de navegação, separando-os em links de páginas e links de autenticação.

No formulário, mantive a estrutura geral, com foco na melhoria da consistência dos espaçamentos, bordas e na paleta de cores. Além disso, acrescentei informações detalhadas sobre os serviços disponíveis no catálogo da Loggi.

No rodapé, a estrutura permaneceu a mesma, com uma exceção: um bloco adicional que inclui os links para as redes sociais e os termos. A exclusão desse último bloco ocorreu devido ao prazo de entrega do desafio.

Na tela de detalhes, mantive a estrutura principal, concentrando-me na aprimoração da consistência dos espaçamentos, bordas e paleta de cores.
Loading