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

Implementação desafio Switch Dreams - SwitchGym - Leonardo Ribas #1

Open
wants to merge 53 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
7e5866a
🎉 Primeiro commit
LeonardoRibas Jun 4, 2022
5af5b3a
➕ Adiciona React Navigation
LeonardoRibas Jun 4, 2022
775f43f
➕ Adiciona Native Base
LeonardoRibas Jun 4, 2022
86030de
✨ Adiciona Splash Screen
LeonardoRibas Jun 5, 2022
a8224e3
➕ Adiciona react-native/native-stack
LeonardoRibas Jun 5, 2022
c44f8ae
➕ Adiciona suporte a Svgs
LeonardoRibas Jun 5, 2022
f71a379
➕ Adiciona custom font
LeonardoRibas Jun 5, 2022
0f3e096
🩹 Conserta AppLoading (biblioteca depreciada)
LeonardoRibas Jun 5, 2022
3f395e8
🍱 Adiona imagens de plano de fundo
LeonardoRibas Jun 5, 2022
c9bea87
🍱 Adiciona logo.svg
LeonardoRibas Jun 5, 2022
f7aa445
✨ Adiciona configuracao de carregamento e rotas
LeonardoRibas Jun 5, 2022
6d41540
🏷️ Adiciona tipagem das rotas
LeonardoRibas Jun 5, 2022
f0b0cec
💄 Extende o tema do Native base
LeonardoRibas Jun 5, 2022
590dc93
✨ Adiciona comoponente de Image background
LeonardoRibas Jun 5, 2022
541fe24
🚧 Implementa design da tela de Login
LeonardoRibas Jun 5, 2022
a37255f
💄 Conserta cor do texto do input
LeonardoRibas Jun 6, 2022
c17ebc1
💄 Melhora contraste da imagem de fundo
LeonardoRibas Jun 8, 2022
60b432c
✨ Adiciona tela de Cadastro
LeonardoRibas Jun 8, 2022
442c719
✨ Adiciona pagina de listagem de aulas
LeonardoRibas Jun 10, 2022
486e598
✨ Adiciona componente de card de aula
LeonardoRibas Jun 10, 2022
ca5d26a
✨ Adiciona helper functions para date e time
LeonardoRibas Jun 10, 2022
e58772e
🚧 Adiciona navegacao para listagem de aulas
LeonardoRibas Jun 10, 2022
56c979b
🏷️ Corrige tipagem de rotas
LeonardoRibas Jun 10, 2022
f239564
✨ Adicona integracao com API
LeonardoRibas Jun 10, 2022
0cdb5cf
🏷️ Adiciona tipagem para aula
LeonardoRibas Jun 10, 2022
2561359
🩹 Conserta Statusbar
LeonardoRibas Jun 11, 2022
5ef2d3d
➕ Adiciona bib para datepicker
LeonardoRibas Jun 11, 2022
6c03bd1
🩹 Conserta scroll da FlatList
LeonardoRibas Jun 11, 2022
b09cd4a
💄 Melhora posicionamento do spinner
LeonardoRibas Jun 12, 2022
e9d3ba2
🚧 Adiciona pagina de Edicao de Aula
LeonardoRibas Jun 12, 2022
0bf4617
➕ Adiciona react-hook-form
LeonardoRibas Jun 12, 2022
8a88010
🩹 Conserta title da pagina de edicao de aula
LeonardoRibas Jun 13, 2022
e9e5027
🩹 Conserta estilo da statusbar
LeonardoRibas Jun 13, 2022
cd7e0c1
✨ Adiciona login com integracao a api
LeonardoRibas Jun 13, 2022
68a879f
✨ Adiciona controlled custom input
LeonardoRibas Jun 13, 2022
aa6b127
➕ Adiciona AsyncStorage e SecureStore
LeonardoRibas Jun 13, 2022
d0cf904
✨ Coleta nome do usuario para exibicao no header
LeonardoRibas Jun 13, 2022
4ed22bc
✨ Salva informacoes do usuario apos autenticacao
LeonardoRibas Jun 13, 2022
dd8deb0
✨ Adiciona refresh a FlatList
LeonardoRibas Jun 13, 2022
435aeb2
✏️ Renomeia component de input
LeonardoRibas Jun 13, 2022
62fb673
✨ Adiciona componente de select controlado
LeonardoRibas Jun 13, 2022
96a4719
♻️ Move funcao de login para services
LeonardoRibas Jun 13, 2022
76976e2
✨ Adiciona cadastro integrado com a API
LeonardoRibas Jun 13, 2022
2755d49
➕ Adiiciona axios
LeonardoRibas Jun 13, 2022
bbbf3a4
✨ Adiciona datepicker input
LeonardoRibas Jun 13, 2022
cb5c42a
💄Adiciona prop para cor de texto do input
LeonardoRibas Jun 13, 2022
a2982d7
🩹 Corrige valor de defaultValue
LeonardoRibas Jun 13, 2022
7a7d135
✨ Integra edicao de aula com a api
LeonardoRibas Jun 13, 2022
2795d8b
♻️ Cria componente para AcionSheet
LeonardoRibas Jun 13, 2022
199cf4e
⬆️ Atualiza expo
LeonardoRibas Jun 13, 2022
7e0d57f
📝 Limpa o README
LeonardoRibas Jun 13, 2022
5c129f6
Create README.md
LeonardoRibas Jun 13, 2022
8657a57
Update README.md
LeonardoRibas Jun 14, 2022
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
4 changes: 4 additions & 0 deletions .expo-shared/assets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true,
"40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true
}
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
node_modules/
.expo/
dist/
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/

# macOS
.DS_Store
95 changes: 95 additions & 0 deletions App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import * as Font from 'expo-font'
import theme from './src/styles/theme'
import Login from './src/screens/Login'
import SignUp from './src/screens/SignUp'
import { StatusBar } from 'expo-status-bar'
import ClassList from './src/screens/ClassList'
import ClassEdit from './src/screens/ClassEdit'
import { NativeBaseProvider } from 'native-base'
import * as SplashScreen from 'expo-splash-screen'
import { useState, useEffect, useCallback } from 'react'
import { NavigationContainer } from '@react-navigation/native'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { createNativeStackNavigator } from '@react-navigation/native-stack'
import {
Lexend_100Thin,
Lexend_200ExtraLight,
Lexend_300Light,
Lexend_400Regular,
Lexend_500Medium,
Lexend_700Bold,
Lexend_800ExtraBold,
Lexend_900Black,
} from '@expo-google-fonts/lexend'

const Stack = createNativeStackNavigator<RootStackParamList>()

export default function App() {
const [appIsReady, setAppIsReady] = useState(false)

useEffect(() => {
async function prepare() {
try {
await SplashScreen.preventAutoHideAsync()
await Font.loadAsync({
Lexend_100Thin,
Lexend_200ExtraLight,
Lexend_300Light,
Lexend_400Regular,
Lexend_500Medium,
Lexend_700Bold,
Lexend_800ExtraBold,
Lexend_900Black,
})
} catch (e) {
console.warn(e)
} finally {
setAppIsReady(true)
}
}

prepare()
}, [])

const onLayoutRootView = useCallback(async () => {
if (appIsReady) {
await SplashScreen.hideAsync()
}
}, [appIsReady])

if (!appIsReady) {
return null
}

return (
<SafeAreaProvider onLayout={onLayoutRootView}>
<NativeBaseProvider theme={theme}>
<StatusBar style="light" />
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen
name="Login"
component={Login}
options={{ headerShown: false }}
/>
<Stack.Screen
name="SignUp"
component={SignUp}
options={{ headerShown: false }}
/>
<Stack.Screen
name="ClassList"
component={ClassList}
options={{ headerShown: false }}
/>
<Stack.Screen
name="ClassEdit"
component={ClassEdit}
options={{ title: 'Edição de aula' }}
/>
</Stack.Navigator>
</NavigationContainer>
</NativeBaseProvider>
</SafeAreaProvider>
)
}
82 changes: 31 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,68 +1,48 @@
# Switch Dreams Challenge
<p align="center">
<img src="./assets/logo.svg" height="150" width="175" alt="UnBRU" />
</p>

O desafio proposto visa avaliar suas habilidades com o React Native, sendo isso parte do processo seletivo para vaga de desenvolvedor frontend da Switch Dreams.
<h1 align="center">SwitchGym</h1>

Esperamos que você tenha uma boa noção nos seguintes tópicos:
<p align="center">A academia Fit Dreams possui uma grande versatilidade de aulas em seu cronograma, sendo que as atividades variam a cada mês. A Fit Dreams acaba de te contratar para desenvolver o frontend de um sistema que organizará a disponibilidade de cada aula.</p>

- HTTP e estrutura básica da web
- Linguagem de programação Javascript
- Framework React Native
- Ferramenta [Expo](https://docs.expo.dev/)
- Consumo de API
<p align="center">
<a href="https://www.youtube.com/watch?v=g77mTRphddA">Demonstração do App</a> •
<a href="https://www.figma.com/file/cjjZ6TZJHbi37ItearnNQ7/Switch-Gym?node-id=0%3A1">Prototipação no Figma</a> •
<a href="https://expo.dev/@leonardoribas/front-end-challenge?serviceType=classic&distribution=expo-go">Publish do Projeto</a>
</p>

Além disso é sempre interessante estar atento aos padrões usuais de qualidade de código.
## Solução

## Problema
O <a href="https://nativebase.io/">Native Base</a> foi utilizado como UI Kit na solução proposta.

A academia Fit Dreams possui uma grande versatilidade de aulas em seu cronograma, sendo que as atividades variam a cada mês. A Fit Dreams acaba de te contratar para desenvolver o frontend de um sistema que organizará a disponibilidade de cada aula.

As informações das aulas estão disponíveis na API informada via email, assim como seus respectivos endpoints. A partir da API fornecida, deve-se desenvolver em React Native as telas:
A solução implementa as seguintes telas:

- Cadastro de usuário
- Login
- Index de aulas disponíveis
- Show da aula
- Edit da aula

Cada aula contém as informações:
- Login de usuário
- Listagem de aulas disponíveis
- Detalhes da aula
- Ediçãa da aula

- Nome da aula
- Nome do professor
- Horário
- Dias da semana
- Imagem de capa da aula
- Descrição

## API
Para obter as informações que utilizará no aplicativo utilize a API fornecida:
## Instalação

Documentação: [https://documenter.getpostman.com/view/12265896/Uz59MeAK](https://documenter.getpostman.com/view/12265896/Uz59MeAK)

API: https://switch-gym.herokuapp.com/
- Pré-requisitos:
<a href="https://nodejs.org/en/">Nodejs</a>, <a href="https://docs.expo.dev/get-started/installation/">Expo</a>, <a href="https://expo.dev/client">Expo Go</a>

## Requisitos
1. Instale as dependêcias do projeto

Para iniciar o desafio, crie um fork a partir do presente repositório e inicie seu projeto react native nele. Altere o readme com todas as informações que julgar pertinente para o desafio. Para entregar a sua implementação você deve criar uma PR e inserir no readme um link de um vídeo demonstrativo de todas as telas e do fluxo criado para o projeto.
```bash
npm install
```

2. Incie o projeto

## Avaliação
```bash
expo start
```

Avaliaremos as seguintes habilidades

- Nível de conhecimento em Javascript
- Nível de conhecimento em React Native
- Nível de conhecimento em consumo de APIs
- Qualidade do código
- Utilização do github

## Entrega
Deve-se fazer uma [Publish](https://docs.expo.dev/workflow/publishing/#how-to-publish) através do Expo para que o aplicativo seja mais facilmente testado, além de deixar o link no readme de um vídeo demonstrando o aplicativo.

## Diferenciais
- Testes automatizados (para os testes recomenda-se o uso do Jest)
- Linter
- Prototipação das telas no Figma
## API

## Observações
Ao enviar o desafio você declara que a solução implementada foi 100% feita por você, sem violar nenhuma licença de software de terceiros.
Documentação: [https://documenter.getpostman.com/view/12265896/Uz59MeAK](https://documenter.getpostman.com/view/12265896/Uz59MeAK)

API: https://switch-gym.herokuapp.com/
35 changes: 35 additions & 0 deletions app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"expo": {
"name": "front-end-challenge",
"slug": "front-end-challenge",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#3F1980"
},
"updates": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": true
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#FFFFFF"
}
},
"web": {
"favicon": "./assets/favicon.png"
},
"androidStatusBar": {
"barStyle": "light-content",
"backgroundColor": "#3F1980"
}
}
}
Binary file added assets/adaptive-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/login_bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/signup_bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/splash.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};
6 changes: 6 additions & 0 deletions declarations.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
declare module '*.svg' {
import React from 'react'
import { SvgProps } from 'react-native-svg'
const content: React.FC<SvgProps>
export default content
}
19 changes: 19 additions & 0 deletions metro.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const { getDefaultConfig } = require('expo/metro-config')

module.exports = (() => {
const config = getDefaultConfig(__dirname)

const { transformer, resolver } = config

config.transformer = {
...transformer,
babelTransformerPath: require.resolve('react-native-svg-transformer'),
}
config.resolver = {
...resolver,
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
sourceExts: [...resolver.sourceExts, 'svg'],
}

return config
})()
43 changes: 43 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"name": "front-end-challenge",
"version": "1.0.0",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject"
},
"dependencies": {
"@expo-google-fonts/lexend": "^0.2.2",
"@react-native-async-storage/async-storage": "~1.17.3",
"@react-native-community/datetimepicker": "^6.1.3",
"@react-navigation/native": "^6.0.10",
"@react-navigation/native-stack": "^6.6.2",
"axios": "^0.27.2",
"expo": "~45.0.0",
"expo-font": "~10.1.0",
"expo-secure-store": "~11.2.0",
"expo-splash-screen": "~0.15.1",
"expo-status-bar": "~1.3.0",
"expo-updates": "~0.13.2",
"native-base": "^3.4.6",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-hook-form": "^7.32.0",
"react-native": "0.68.2",
"react-native-safe-area-context": "4.2.4",
"react-native-screens": "~3.11.1",
"react-native-svg": "^12.3.0",
"react-native-web": "0.17.7"
},
"devDependencies": {
"@babel/core": "^7.12.9",
"@types/react": "~17.0.21",
"@types/react-native": "~0.66.13",
"react-native-svg-transformer": "^1.0.0",
"typescript": "~4.3.5"
},
"private": true
}
Loading