From fecf8dd924a0cf6f02c9cead2314805fe6a71b6d Mon Sep 17 00:00:00 2001 From: Benjamin Reid Date: Wed, 1 Mar 2017 17:32:17 +0000 Subject: [PATCH] Reducers --- README.md | 8 ++++ generators/reducer/index.js | 59 +++++++++++++++++++++++++ generators/reducer/templates/actions.js | 6 +++ generators/reducer/templates/reducer.js | 21 +++++++++ 4 files changed, 94 insertions(+) create mode 100644 generators/reducer/index.js create mode 100644 generators/reducer/templates/actions.js create mode 100644 generators/reducer/templates/reducer.js diff --git a/README.md b/README.md index cbea2f8..b1ba27e 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,14 @@ yo react-native:component MyComponent yo react-native:component MyComponent --stateful ``` +### `reducer` + +An easy way to scaffold a reducer. It creates the reducer itself an example way to keep organise your associated actions. + +``` +yo react-native:reducer MyReducer +``` + ## Manual Notes ### After `react-native:base` diff --git a/generators/reducer/index.js b/generators/reducer/index.js new file mode 100644 index 0000000..95b0bff --- /dev/null +++ b/generators/reducer/index.js @@ -0,0 +1,59 @@ +var Generator = require('yeoman-generator'); +var path = require('path'); + +module.exports = class extends Generator { + constructor(args, opts) { + super(args, opts); + + // name of the app based on the directory name generated by React Native + this.name = process.cwd().split(path.sep).pop(); + + this.argument('reducer', { type: String, required: true }); + } + + writing() { + var reducer = this.options.reducer; + var reducerConst = reducer.toUpperCase(); + var reducerSlug = reducer.toLowerCase(); + + // create entry points for Android and iOS + this.fs.copyTpl( + this.templatePath('reducer.js'), + this.destinationPath(`App/Reducers/${reducer}.js`), + { + name: this.name, + reducer: reducer, + reducerConst: reducerConst, + reducerSlug: reducerSlug, + } + ); + + this.fs.copyTpl( + this.templatePath('actions.js'), + this.destinationPath(`App/Actions/${reducer}.js`), + { + name: this.name, + reducer: reducer, + reducerConst: reducerConst, + reducerSlug: reducerSlug, + } + ); + } + + end() { + var reducer = this.options.reducer; + var reducerConst = reducer.toUpperCase(); + var reducerSlug = reducer.toLowerCase(); + + this.log('Please make sure to add this to your root reducer.'); + this.log('App/Reducers/index.js'); + this.log(` + import ${reducer} from '${this.name}/App/Reducers/${reducer}'; + + const reducers = combineReducers({ + // ...other reducers + ${reducerSlug}: ${reducer}, + }); + `); + } +}; diff --git a/generators/reducer/templates/actions.js b/generators/reducer/templates/actions.js new file mode 100644 index 0000000..e77425c --- /dev/null +++ b/generators/reducer/templates/actions.js @@ -0,0 +1,6 @@ +// @flow +export const <%= reducerConst %>_EXAMPLE = '<%= name %>/<%= reducerConst %>_EXAMPLE'; + +export const <%= reducerSlug %>Example = () => ({ + type: <%= reducerConst %>_EXAMPLE, +}); diff --git a/generators/reducer/templates/reducer.js b/generators/reducer/templates/reducer.js new file mode 100644 index 0000000..b5022f2 --- /dev/null +++ b/generators/reducer/templates/reducer.js @@ -0,0 +1,21 @@ +// @flow +import { <%= reducerConst %>_EXAMPLE } from '<%= name %>/App/Actions/<%= reducer %>'; + +type State = { +}; + +type Action = { + type: string, +}; + +const initialState = { +}; + +const reducer = (state: State = initialState, action: Action): State => { + switch(action.type) { + default: + return state; + } +}; + +export default reducer;