user1803361
user1803361

Reputation: 61

Dynamic combine of reducers

I have a dashboard with widgets and they depend on the current user. So we don't know which all widgets are going to load at compile time. That said , the state will also have dynamic fields for these widgets.I have a reducer for each widget. How do i combine all the reducers of required widgets ?

My state may look like :

{ dashboardId: 12,
  widgetList:{

      w1: {
          widgetTitle:'widget 1'
          data:[]
       },
       w2:{
          widgetTitle:'widget 2'
          data:[]

       }   
  }
}

Now i want to combine Reducers:

combineReducers({
  w1:widget1Reducer,
  w2:widget2Reducer
})

Now, the issue is we dont know which all widgets are going to load for the current dashboard.

Upvotes: 1

Views: 317

Answers (1)

Florent
Florent

Reputation: 12420

You don't need to combine multiple reducers using the helper. Create a widgetList reducer that will update to specified widget using the appropriate widget reducer:

function widgetList(state = {}, action) {
  switch (action.type) {
    case WIDGET_A_FOO:
    case WIDGET_A_BAR:
      return {
        ...state,
        [action.id]: widgetA(state[action.id], action),
      }

    case WIDGET_B_BAZ:
      return {
        ...state,
        [action.id]: widgetB(state[action.id], action),
      }

    case DELETE_WIDGET:
      return _.omit(state, action.id)

    default:
      return state
  }
}

In the above example, action.id holds the widget ID. widgetA and widgetB are the reducers of widget A and widget B.

Upvotes: 2

Related Questions