Skip to content
This repository has been archived by the owner on Mar 31, 2020. It is now read-only.

Template Scalable Redux 📲Template com organização e arquitetura para uma Aplicação Mobile Escalável em React Native utilizando Redux e Redux Saga 🗄. Esse template foi baseado no Template da Rocketseat 👉🏾(https://github.com/Rocketseat/react-native-template-rocketseat-advanced)

samuelematias/react-native-template-scalable-redux

Repository files navigation


Logo

Template Scalable Redux

Tabela de ConteĂşdo

Sobre o Projeto

Este projeto visa a criação de um template com organização e arquitetura para uma Aplicação Mobile Escalável utilizando Redux e Redux-Saga que possa ser utilizado no momento de criação de projetos utilizando React Native, visto que o processo de instalação e configuração das libs no início de um projeto podem gerar certa complexidade e muitas vezes até erros que atrasam o processo, atrapalhando assim o fluxo de desenvolvimento.

Para a criação desse template contei com a ajuda muito importante do Talysson de Oliveira. Caso tenha interesse sobre organização e arquitetura Escalável, você pode acessar o Medium do Talysson, que lá existe alguns posts sobre o assunto.

Algumas partes do template, foram baseadas no Template Rocketseat Advanced da Rocketseat.

Feito Com

Abaixo segue o que foi utilizado na criação deste template:

  • React Native - O React Native Ă© um framework que permite o desenvolvimento de aplicações mobile usando Javascript e React;

  • Redux - O Redux Ă© um contĂŞiner de estado previsĂ­vel para aplicativos JavaScript. Ele ajuda vocĂŞ a escrever aplicativos que se comportam consistentemente, executados em diferentes ambientes (cliente, servidor e nativo) e sĂŁo fáceis de testar;

    • Redux Saga - O redux-saga Ă© uma biblioteca que tem como objetivo tornar os efeitos colaterais dos aplicativos mais fáceis de gerenciar, mais eficientes de executar, fáceis de testar e melhores em lidar com falhas;

      • camelcase-keys - O camelcase-keys Converte as chaves de objeto para camel case usando camelcase;
  • React Navigation - O React Navigation surgiu da necessidade comunidade do React Native de uma navegação de forma fácil de se usar, e escrita toda em Javascript;

  • React Navigation Redux Helpers - API que permite que o usuário gerencie seu estado React Navigation de dentro do Redux.

  • React Native Gesture Handler - API declarativa que permite a manipulação de toques e gestos no React Native;

  • React Native Device Info - API que permite a acessar informações sobre o Device;

  • Axios - O Axios Ă© um cliente HTTP baseado em Promises para Browser e NodeJS;

  • Ramda - O Ramda seria Uma biblioteca funcional prática para programadores de JavaScript, que trabalha em cima de manipulação com Arrys e Objetos.

  • Moment - O Moment seria uma biblioteca para Analise, validação, manipulação e exibição de datas e horas em JavaScript.

  • Prop Types - Verificação de tipo em tempo de execução para propriedades (props) React e objetos semelhantes;

  • Reactotron - O Reactotron Ă© um app Desktop para inspecionar projetos em React ou React Native. Está disponĂ­vel para macOS, Linux e Windows;

    • reactotron-react-native - Plugin para configurar o Reactotron para se conectar ao projeto React Native;
    • reactotron-redux - Plugin que permite acompanhar todas as Actions que sĂŁo disparadas na aplicação, mostrando toda a estrutura da Action;
    • reactotron-redux-saga - Plugin que permite vocĂŞ percorrer uma saga na sua aplicação, poderá ver a saga e os efeitos que ela desencadeia ao longo do caminho;
  • Babel - O Babel Ă© um compilador JavaScript gratuito e de cĂłdigo aberto e transpiler configurável usado no desenvolvimento de aplicações Javascript;

  • Eslint - O ESLint Ă© uma ferramenta de lint plugável para JavaScript e JSX;

  • EditorConfig - O EditorConfig Ă© um formatador de arquivos e coleções em forma de Plugin para Editores de cĂłdigo/texto com o objetivo de manter um padrĂŁo de cĂłdigo consistente entre diferentes editores, IDE's ou ambientes;

  • Prettier - O Prettier Ă© um formatador de cĂłdigo opinativo, que dá suporte a várias linguagens, como o JavaScript, por exemplo. Usamos ele principalmente para manter o cĂłdigo consistente.

    • .prettierignore - Server para que arquivos especificados nesse arquivo, eles sejam ignorados pelo Prettier para fazer a formatação do cĂłdigo.
    • .prettierrc.json - Server para adicionar nele as regras do Prettier no seu projeto, de forma que qualquer pessoas que usar seu projeto, irá ter as mesmas regras que vocĂŞ.

Começando

Para conseguir utilizar o template, seja através do React Native CLI ou com uma cópia local dos arquivos, siga os passos abaixo.

Pré-requisitos

Antes de seguirmos para as configurações e uso do template, é ideal que você tenha o ambiente configurado para criar e testar aplicativos em React Native, para isso você pode seguir o guia do link abaixo:

Ambiente React Native (Android/iOS)

Estrutura de Arquivos

A estrutura de arquivos está da seguinte maneira:

.
├── src/
│   ├── assets/
│   │    └── images/
│   │        └── lego.png
│   ├── common/
│   │   ├── view/
│   │   │   ├── screens/
│   │   │   │   └── ProductDetailScreen.js
│   │   │   └── date/
│   │   │       ├── Duration.js
│   │   │       └── DateFormatting.js
│   │   ├── state/
│   │   │   └── product/
│   │   │       ├── ProductDuck.js
│   │   │       └── ProductSaga.js
│   │   └── infra/
│   │       └── github/
│   │           └── GithubApiService.js
│   ├── user/
│   │   ├── view/
│   │   │   ├── screens/
│   │   │   │   ├── UserScreen.js
│   │   │   │   └── UserDetail.js
│   │   │   ├── Avatar.js
│   │   │   └── job/
│   │   │       ├── JobTable.js
│   │   │       └── MoneyFormatting.js
│   │   ├── state/
│   │   │   ├── UserDuck.js
│   │   │   └── UserSaga.js
│   │   └── infra/
│   │       └── UserApiService.js
│   ├── store/
│   │   ├── CreateStore.js
│   │   ├── Ducks.js
│   │   └── Sagas.js
│   ├── config/
│   │   └── ReactotronConfig.js
│   ├── navigation/
│   │   └── AppNavigation.js
│   ├── themes/
│   │       ├──Colors.js
│   │       ├──Fonts.js
│   │       ├──Images.js
│   │       ├── index.js
│   │       └── Metrics.js
│   └── index.js
├── .editorconfig
├── .eslintrc.json
├── .prettier.json
├── .prettierignore
├── .gitignore
├── babel.config.js
├── dependencies.json
├── devDependencies.json
├── index.js
├── jsconfig.js
├── package.json
└── README.md

Serão explicados os arquivos e diretórios na seção de Edição.

Instalação

  1. Para instalar e utilizar esse template o processo Ă© bem simples, basta criar um projeto novo utilizando o comando:
react-native init AwesomeExample --template scalable-redux
  1. Depois do projeto criado vocĂŞ pode deletar o arquivo App.js (executando esse comando na raiz do projeto: rm ./App.js) da raiz, pois o arquivo index.js agora aponta para a pasta src.

Com isso o projeto será criado com todas as dependências do template devidamente instaladas e linkadas, tal como os arquivos de configuração que são copiados para o projeto.


Passo Adicional no Android

Para que os gestos sejam habilitados no Android é necessário um passo a mais, que é bem simples, abra o arquivo android/app/src/main/java/<pacote_do_projeto>/MainActivity.java, e começe importando os pacotes como abaixo:

// ...
import com.facebook.react.ReactActivity;
// Importações adicionadas
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;

Feito a importação vamos criar um método novo, logo abaixo do getMainComponentName(), ficando:

public class MainActivity extends ReactActivity {
  @Override
  protected String getMainComponentName() { ... }
  // MĂ©todo adicionado
  @Override
  protected ReactActivityDelegate createReactActivityDelegate() {
    return new ReactActivityDelegate(this, getMainComponentName()) {
      @Override
      protected ReactRootView createRootView() {
        return new RNGestureHandlerEnabledRootView(MainActivity.this);
      }
    };
  }
}

Edição

Nesta seção haverão instruções caso você queira editar o template, explicando para que os diretórios são utilizadas e também os arquivos de configuração.

  • src - DiretĂłrio contendo todos os arquivos da aplicação, Ă© criado um diretĂłrio src para que o cĂłdigo da aplicação possa ser isolado em um diretĂłrio e facilmente portado para outros projetos, se necessário;

    • assets - DiretĂłrio para guardar todo tipo de arquivo, relacionado a assets (Ex: images, fonts, etc..)

      • images - DiretĂłrio para guardar todo tipo de imagem.
    • common - DiretĂłrio para guardar todo tipo arquivo que seja genĂ©rico, ou seja, arquivos que sejam usados em mais de uma feature.

      • view - DiretĂłrio para guardar arquivos relacionados a view, como telas, components e utils usados na construção de components e/ou telas que sejam genĂ©ricos, ou seja, arquivos que sejam usados em mais de uma feature.

        • screens - DiretĂłrio para guardar arquivos de telas genĂ©ricas, ou seja, telas que sejam usados em mais de uma feature.

          • ProductDetailScreen.js - Exemplo de uma tela genĂ©rica na aplicação, tela essas que Ă© usada em mais de uma feature.
        • date - Exemplo de um DiretĂłrio que guarda components e utils genĂ©ricos, ou seja, components e utils que sejam usados em mais de uma feature.

          • Duration.js - Exemplo de um component que seria genĂ©rico, no caso component esse que Ă© usado em mais de uma feature.

          • DataFormatting.js - Exemplo de um arquivo util, que faria parte da criação/estrutura do component Duration.js, nesse caso sendo assim um arquivo util genĂ©rico tambĂ©m, pois ele faz parte de um component que Ă© genĂ©rico, no caso component esse que Ă© usado em mais de uma feature.

        • state - DiretĂłrio para guardar arquivos relacionados ao estado da aplicação, arquivos esses que sejam genĂ©ricas, ou seja, arquivos que sejam usados em mais de uma feature.

          • product - Exemplo de diretĂłrio que armazena arquivos do estado da aplicação relacionados a Product, arquivos esses que sĂŁo genĂ©ricos, ou seja, arquivos de estado que sĂŁo usados em mais de uma feature.

            • ProductDuck.js - Exemplo de um arquivo Redux referente a Product, arquivo esse que seria genĂ©rico, no caso, usado em mais de uma feature.

            • ProductSaga.js - Exemplo de um arquivo Saga referente a Product e ligado ao arquivo ProductDuck.js, nesse caso sendo um arquivo Saga genĂ©rico tambĂ©m, pois ele seria associado a um arquivo Redux que Ă© genĂ©rico, no caso, um arquivo Redux usado em mais de uma feature.

        • infra - DiretĂłrio para guardar arquivos relacionados a comunicação com uma API que sejam genĂ©ricos, ou seja, sĂŁo usados em mais de uma feature. E usado o termo Infra, porque seguindo a ideia de camadas, a comunicação com uma API Ă© um integrante da camada de infra estrutura.

          • github - Exemplo de um diretĂłrio que armazena arquivos de comunicação com a API do github.

            • GithubApiService.js - Exemplo de um arquivo que contem a comunicação com a API do github, no caso os EndPoints.
  • user - DiretĂłrio para guardar os arquivos relacionados APENAS a feature de User.

    • view - DiretĂłrio para guardar arquivos relacionados a view, como telas, components e utils usados na construção de components e/ou telas que sejam relacionados APENAS a feature de User.

      • screens - DiretĂłrio para guardar arquivos de telas relacionados APENAS a feature de User.

        • UserScreen.js - Exemplo de uma tela relacionada APENAS a feature de User.

        • UserDetail.js - Exemplo de uma tela relacionada APENAS a feature de User.

      • Avatar.js - Exemplo de um component relacionado APENAS a feature de User.

      • job - DiretĂłrio para guardar components e utils relacionados APENAS a feature de User.

        • JobTable.js - Exemplo de um component relacionado APENAS a feature de User.

        • MoneyFormatting.js - Exemplo de um util relacionado ao component JobTable.js, component esse que e relacionado APENAS a feature de User, fazendo com que o util tambĂ©m tenha essa caracterĂ­sticas.

      • state - DiretĂłrio para guardar arquivos relacionados ao estado da aplicação, arquivos esses relacionados APENAS a feature de User.

        • UserDuck.js - Exemplo de um arquivo Redux referente APENAS a feature de User.

        • UserSaga.js - Exemplo de um arquivo Saga referente a APENAS a feature de User e ligado ao arquivo UserDuck.js.

      • infra - DiretĂłrio para guardar arquivos relacionados a comunicação com uma API que sejam referente a APENAS a feature de User. E usado o termo Infra, porque seguindo a ideia de camadas, a comunicação com uma API Ă© um integrante da camada de infra estrutura.

        • UserApiService.js - Exemplo de um arquivo que contem a comunicação com a API de User, no caso os EndPoints.
  • store - DiretĂłrio onde será criada toda a estrutura do Redux para a aplicação, como os Ducks (Reducers + Action Types + Action Creators), os Sagas e um arquivo para centralizar toda essa configuração e disponibilizar para o restante da aplicação;

    • CreateStore.js - Arquivo responsável por executar a configuração para o funcinamento do Redux + Redux Saga, dentre suas funções estĂŁo: criar um Middleware para monitorar as Actions disparadas na aplicação, aplicar o middleware criado juntamente com um Enhancer que monitora o fluxo de uma função do Saga, criar o store global da aplicação combinando os reducers existentes e exportar o state criado;

    • Ducks.js - Arquivo responsável por importar cada Duck criado e combiná-los em um sĂł para serem usados no Redux atravĂ©s da função combineReducers();

    • Sagas.js - Arquivo responsável por relacionar as Actions disparadas pela aplicação Ă s funções do Saga, que sĂŁo Funções Generator, nele Ă© definido os Action Types a serem "escutados" e qual função executar quando um Action Creator for executado;

  • config - DiretĂłrio para guardar os arquivos de configuração da aplicação, por exemplo, a configuração de uso do Reactotron e configuração de inicialização do Firebase;

    • ReactotronConfig.js - Arquivo contendo a configuração do Reactotron, com os Plugins reactotron-redux e reactotron-redux-saga, para ser usado na aplicação;
  • navigation - DiretĂłrio para guardar o arquivo responsável pela navegação da aplicação.

    • AppNavigation.js - Arquivo com as configurações de navegação da aplicação, nele sĂŁo criados os Navigator disponibilizados na biblitoeca React Navigation;
  • themes - DiretĂłrio onde para guardar todos os arquivos relacionados a estilização de modo global.

    • Colors.js - Arquivo com as constantes das cores a serem usadas na aplicação.

    • Fonts.js - Arquivo com as fonts e seus styles a serem usados na aplicação.

    • Images.js - Arquivo com as constantes das images a serem usadas na aplicação.

    • index.js - Arquivo com todos os arquivos dessa pasta indexado.

    • Metrics.js - Arquivo com as metricas tratadas para vários tipos de devices a partir do seu PixelRatio.

  • index.js - Arquivo responsável por centralizar o cĂłdigo do diretĂłrio src, nele Ă© inserido o HOC Provider do react-redux que Ă© o responsável por disponilizar o state global para a aplicação, e dentro do Provider sĂŁo chamadas as rotas tal como qualquer outra configuração que precise ser executada na inicialização da aplicação, ele Ă© como um Entry Point do diretĂłrio src;

  • .editorconfig - Arquivo destinado Ă  configuração do Plugin Editor Config, que padroniza algumas configurações para o editor em diferentes ambientes;

  • .eslintrc.json - Arquivo de configuração do ESLint, Ă© nele que sĂŁo inseridas as regras e configurações de Linting do projeto, tal como a configuração do Resolver para o Babel Plugin Root Import e configuração da variável global __DEV__;

  • .prettier.json - Arquivo de configuração do Prettier, Ă© nele que sĂŁo inseridas as regras e configurações.

  • .prettierignore - Arquivo de ignore do Prettier, Ă© nele que sĂŁo inseridas os arquivos onde nĂŁo queremos que o prettier atue.

  • babel.config.js - Arquivo de configuração do Babel, Ă© nele que Ă© configurado o Babel Plugin Root Import para aceitar imports absolutos na aplicação usando o diretĂłrio src como raiz;

  • dependencies.json - Arquivo contendo apenas um objeto com a lista de dependĂŞncias que devem ser instaladas na aplicação, vale lembrar que as dependĂŞncias que já vem por padrĂŁo no projeto como react e react-native nĂŁo precisam estar nessa lista, a menos que vocĂŞ queira gerenciar a versĂŁo dessas libs;

  • devDependencies.json - Arquivo contendo apenas um objeto com a lista de dependĂŞncias de desenvolvimento que devem ser instaladas na aplicação, vale lembrar que as dependĂŞncias de desenvolvimento que já vem por padrĂŁo no projeto como @babel/core, eslint, entre outras, nĂŁo precisam estar nessa lista, a menos que vocĂŞ queira gerenciar a versĂŁo dessas libs;

  • index.js - Arquivo raiz da aplicação, tambĂ©m chamado de Entry Point, Ă© o primeiro arquivo chamado no momento do build e execução da aplicação, nele Ă© chamado o arquivo src/index.js que por sua vez chama as rotas da aplicação;

  • jsconfig.json - Arquivo de configuração do Javascript no Editor, ele Ă© o responsável por ativar o Auto Complete de cĂłdigos Javascript na aplicação;

  • package.json - Diferente dos projetos comuns, esse arquivo tem as configurações necessárias para a publicação do Template no NPM, para saber mais sobre isso veja a seção abaixo.

Publicação

Para publicar um template como esse o processo bastante simples e rápido.

  1. Crie uma conta no site do NPM;

  2. Com a conta criada execute o comando abaixo e insira suas credenciais;

npm login
  1. Basta abrir o arquivo package.json e modificar as informações de acordo com o seu template, mas as informações mais importantes são duas, o name e o version, que são os únicos que tem restrições, seguem abaixo as restrições:

    1. O name sempre deve começar com o prefixo react-native-template- seguido do nome do seu template;
    2. O template deve ser publicado em uma conta pessoal, pois quando publicado em uma Organization Ă© acrescentado o prefixo @<nome_da_organization> no nome do pacote;
    3. O name deve ser único, não podendo ser igual ao de um template já publicado;
    4. A version deve ser atualizada a cada publicação, se o template está na versão 0.0.1 e é preciso publicar uma atualização no mesmo, a version deve ser diferente e superior a versão atual, por exemplo, 0.0.2;
  2. ApĂłs configurar corretamente o package.json basta executar no terminal/prompt o comando npm publish;

  3. Com a publicação finalizada o template deve ficar disponível através do link https://www.npmjs.com/package/react-native-template-<nome_do_template>.

Contribuição

Contribuições são o que fazem a comunidade open source um lugar incrível para aprender, inspirar e criar. Qualquer contribuição que você fizer será muito apreciada.

  1. Faça um Fork do projeto
  2. Crie uma Branch para sua Feature (git checkout -b feature/FeatureIncrivel)
  3. Adicione suas mudanças (git add .)
  4. Comite suas mudanças (git commit -m 'Adicionando uma Feature incrível!)
  5. Faça o Push da Branch (git push origin feature/FeatureIncrivel)
  6. Abra uma Pull Request

Sobre

Me segue lá no Twitter: @samuelmataraso

About

Template Scalable Redux 📲Template com organização e arquitetura para uma Aplicação Mobile Escalável em React Native utilizando Redux e Redux Saga 🗄. Esse template foi baseado no Template da Rocketseat 👉🏾(https://github.com/Rocketseat/react-native-template-rocketseat-advanced)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published