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.');