All Projects → pavelivanov → redaction

pavelivanov / redaction

Licence: MIT license
Redux reducers without constants and dispatching!

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to redaction

redux-reducer-async
Create redux reducers for async behaviors of multiple actions.
Stars: ✭ 14 (-76.67%)
Mutual labels:  reducers, reducer-creation
riduce
Get rid of your reducer boilerplate! Zero hassle state management that's typed, flexible and scalable.
Stars: ✭ 14 (-76.67%)
Mutual labels:  reducers, reducer-creation
ReduxSimple
Simple Stupid Redux Store using Reactive Extensions
Stars: ✭ 119 (+98.33%)
Mutual labels:  reducers
vframe
VFRAME: Visual Forensics and Metadata Extraction
Stars: ✭ 41 (-31.67%)
Mutual labels:  redaction
redux-entities
Higher-order reducer for store entities received from normalizr and makes it easy to handle them.
Stars: ✭ 34 (-43.33%)
Mutual labels:  reducers
dont-waste-your-ducking-time
🐓 An opinionated guide on how to test Redux ducks
Stars: ✭ 28 (-53.33%)
Mutual labels:  reducers
i7j-pdfsweep
Remove content from your digital documents irretrievably instead of just covering it up. Redact text, images, parts of images or drawings for complete confidentiality. iText pdfSweep complies with GDPR for data redaction.
Stars: ✭ 25 (-58.33%)
Mutual labels:  redaction
k-redux-factory
Factory of Redux reducers and their associated actions and selectors.
Stars: ✭ 18 (-70%)
Mutual labels:  reducers
data-algorithms-with-spark
O'Reilly Book: [Data Algorithms with Spark] by Mahmoud Parsian
Stars: ✭ 34 (-43.33%)
Mutual labels:  reducers
reducer-class
Boilerplate free class-based reducer creator. Built with TypeScript. Works with Redux and NGRX. Has integration with immer.
Stars: ✭ 25 (-58.33%)
Mutual labels:  reducer-creation

Redux reducers without constants and dispatching!

Redaction is wrapper for reducers. The main purpose is to refuse from using constants and dispatch method in code.

Npm Version Month Downloads Npm Licence

Installation

To install the stable version:

npm install --save redaction

Overview

In large projects usage of the standard Redux approach becomes a headache because of of the huge amount of constants and pushing the dispatch across the entire application logic. Redaction comes to help us solve these problems.

Note: Redaction is just wrapper over Redux, so it's not reinventing the wheel, it's sweet sugar :)

BEWARE: If you use / or planning to use SSR in your project DON'T USE Redaction! Currently there are some approaches inside which prevents from doing with SSR in easy way.. If you still want to use it and get problems with SSR fill free to contact me [email protected].

Redux approach

constants/todos.js
const ADD_TODO = 'ADD_TODO'

export {
  ADD_TODO
}
reducers/todos.js
import { ADD_TODO } from 'constants/todos'

const initialState = {
  todos: []
}

export default (state = initialState, action) => {
  switch (action.type) {

    case ADD_TODO:
      return {
        ...state,
        todos: [
          ...state.todos,
          action.payload
        ]
      }

    default:
      return state
  }
}
actions/todos.js
import { ADD_TODO } from 'constants/todos'

export const addTodo = (text) => (dispatch) => {
  dispatch({
    type: ADD_TODO,
    payload: text
  })
}
App.js
import { connect } from 'react-redux'
import { addTODO } from 'actions/todos' 

const App = ({ todos, addTodo }) => (
  <div>
    {
      todos.map((text, index) => (
        <div key={index}>{text}</div>
      ))
    }
    <button onClick={() => addTodo('new todo name')}>Add</button>
  </div>
)

const mapStateToProps = (state) => ({
  todos: state.todos,
})

const mapDispatchToProps = (dispatch) => ({
  addTodo: (text) => {
    dispatch(addTodo(text))
  }
})

export default connect(mapStateToProps, mapDispatchToProps)(App)

Same with Redaction

reducers/todos.js
export const initialState = {
 todos: []
}

export const addTodo = (state, payload) => ({ 
  ...state, 
  todos: [ 
    ...state.todos, 
    payload 
  ]
})
actions/todos.js
import { reducers } from 'core/reducers' // read docs to understand what core folder means

export const addTodo = (text) => {
  reducers.todos.addTodo(text)
}

App.js

import actions from 'actions'
import { connect } from 'redaction' 

const App = ({ todos }) => (
  <div>
    {
      todos.map((text, index) => (
        <div key={index}>{text}</div>
      ))
    }
    <button onClick={() => actions.addTodo('new todo name')}>Add</button>
  </div>
)

export default connect({
  todos: 'todos'
})(App)
That's it! Nifty :) No constants! No dispatch!

Usage

actions/users.js
import reducers from 'core/reducers'

export const getAll = () => {
  fetch({
    endpoint: '/api/users',
    method: 'GET'
  })
    .then((result) => {
      reducers.users.put(result)
    })
}
reducers/users.js
export const initialState = {
  list: [],
}

export const put = (state, payload) => ({
  ...state,
  list: [
    ...state.list,
    payload,
  ]
}) 
core/store.js
import { createStore, combineReducers } from 'redaction'
import { reducer as form } from 'redux-form'
import reducers from 'reducers'

const initialState = {}

const store = createStore({
  reducers: {
    ...combineReducers(reducers),
    form,
  },
  initialState,
})

export default store
core/reducers.js
import { wrapReducers } from 'redaction'
import reducers from 'reducers'

export default wrapReducers(reducers)
components/Posts.js
import React from 'react'
import { users } from 'actions'

export default class Posts extends React.Component {
  componentWillMount() {
    users.getAll()
  }
}

Features

Connect

There is sugar to connect state to components nifty:

import React, { Component } from 'react'
import { connect } from 'redaction'

// option 1
@connect(state => ({
  todos: state.todos.list,
}))
// option 2
@connect({
  todos: 'todos.list',
})
// option 3
@connect({
  todos: (state) => state.todos.list,
})
export default class TodosList extends Component {}

Examples

Repo examples


Tests

To run tests:

npm test

TODO

  • Support React hooks
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].