From 8281886aca9706fc6c9145d69eb598fce866c196 Mon Sep 17 00:00:00 2001 From: Guilherme Muller Date: Thu, 10 Oct 2019 14:53:56 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20script=20para=20configura=C3=A7?= =?UTF-8?q?=C3=A3o=20inicial=20do=20template,=20esse=20script=20remove=20a?= =?UTF-8?q?rquivos=20e=20pastas=20que=20n=C3=A3o=20usamos=20e=20automatiza?= =?UTF-8?q?=20a=20configura=C3=A7=C3=A3o=20adicional=20do=20Android?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++- template-config.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 template-config.js diff --git a/README.md b/README.md index 0c6dd5f..ba20f6c 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,14 @@ Serão explicados os arquivos e diretórios na seção de [Edição](#edição). react-native init AwesomeExample --template rocketseat-basic ``` -2. Depois do projeto criado você pode deletar o arquivo `App.js` da raiz, pois o arquivo `index.js` agora aponta para a pasta **src**. +2. Depois do projeto criado você pode utilizar o comando abaixo para remover automaticamente alguns arquivos e diretórios que não usamos e configurar a *lib* de gestos no Android. + +```sh +node template-config.js +``` + +Caso você **não** queira realizar as configurações automaticamente, você pode deletar o arquivo `App.js` da raiz, pois o arquivo `index.js` agora aponta para a pasta **src** e seguir para o [Passo Adicional no Android](#passo-adicional-no-android). + 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. diff --git a/template-config.js b/template-config.js new file mode 100644 index 0000000..3b13f43 --- /dev/null +++ b/template-config.js @@ -0,0 +1,86 @@ +const fs = require('fs'); +const path = require('path'); + +const deleteFile = filename => { + try { + return fs.unlinkSync(path.join(__dirname, filename)); + } catch (error) {} +}; +const deleteFolder = path => { + try { + if (fs.existsSync(path)) { + fs.readdirSync(path).forEach(function(file, index) { + const currentPath = `${path}/${file}`; + if (fs.lstatSync(currentPath).isDirectory()) { + deleteFolder(currentPath); + } else { + deleteFile(currentPath); + } + }); + fs.rmdirSync(path); + } + } catch (error) {} +}; + +const packagePath = path.join(__dirname, 'package.json'); +const packageJSON = JSON.parse(fs.readFileSync(packagePath, 'utf8')); +const name = packageJSON.name; +const mainActivityPath = path.join( + __dirname, + `android/app/src/main/java/com/${name.toLowerCase()}/MainActivity.java`, +); + +console.log('\n 📝 Adicionando configurações no arquivo MainActivity.java'); + +// Write imports and methods in the file. +try { + fs.writeFileSync( + mainActivityPath, + ` +package com.${name.toLowerCase()}; + +import com.facebook.react.ReactActivity; + +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactRootView; +import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "${name}"; + } + + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new ReactActivityDelegate(this, getMainComponentName()) { + @Override + protected ReactRootView createRootView() { + return new RNGestureHandlerEnabledRootView(MainActivity.this); + } + }; + } +}`, + ); + + console.log('\n ✅ Configurações adicionadas.'); +} catch (error) { + console.log( + '\nFalha ao adicionar configurações no arquivo MainActivity.java\n', + ); + console.error(error); +} + +console.log('\n 🧹 Limpando diretórios e arquivos desnecessários.'); + +// Delete folder and files +deleteFolder('__tests__'); +deleteFile('App.js'); +deleteFile('template-config.js'); + +console.log('\n ✅ Tudo pronto.');