Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API to add custom actions to state nodes #91

Open
fabienjuif opened this issue Feb 11, 2018 · 10 comments
Open

API to add custom actions to state nodes #91

fabienjuif opened this issue Feb 11, 2018 · 10 comments

Comments

@fabienjuif
Copy link
Member

From @EmrysMyrddin (unirakun/k-ramel#60)


It could be useful to allow users to define their own custom actions along with the ones already generated by k-redux-factory.

The actions could be then decorated with dispatch function, allowing the user to easily call it from the store

const store = createStore({
  data: simpleObject({ 
    actions: {
      load: () => ({ type: 'REQUEST_DATA' }),
      loaded: (data) => ({ type: 'DATA_LOADED', payload: { data } }),
    },
  }),
})

store.data.loaded()
store.data.load({ hello: 'world' })

Since we want to push the use of the redux-saga like API, we want to be able to dispatch very simple action like simple events. For this, our library can also help the user by generating actions for him. You just give a type name for your action and it generate the action creator for you. The action creators can take an optional payload that will be aded to the action.

const store = createStore({
  data: simpleObject({
    actions: {
      load: 'REQUEST_DATA',
      loaded: 'REQUEST_DATA',
      // Also allows to give a custom action creator implementation
      custom: () => ({ type: 'CUSTOM_ACTION' })
    },
  }),
},{
  listeners: [
    when(store.data.load.type, (action, store) => store.data.loaded({ hello: 'world' }))
    // Dispatch { type: 'DATA_LOADED', payload: { hello: 'world' } }
  ]
})

I'm not entirely sure of the API. In particular, I'm not convinced by the store.data.load.type to get the type name of the action. Perhaps by adding a toString implementation to the function ? Allowing to just do when(store.data.loaded, (...) => ...) ?

@fabienjuif
Copy link
Member Author

From @EmrysMyrddin (unirakun/k-ramel#60)


An other idea for the generation of action creators is to give a list of action name and generate an action type based on the path in a mobx-state-tree fashion

const store = createStore({
  data: {
    nested: simpleObject({
      actions: [ 'load', 'loaded' ]
    }),
  },
}

store.data.nested.loaded({ hello: 'world' })
// Dispatch {type: 'data/nested/loaded', payload: { hello: 'world' } }

But I'm not entirely convince... It's difficult then to extend the list of actions to add a custom action creator function.

A solution can be to have both API. If actions is an object, we use the previously defined API, if it's an array, we use this convention.

@guillaumecrespel
Copy link
Member

guillaumecrespel commented Feb 11, 2018

Why define actions ? What do you think about :

const store = createStore({
  data: {
    nested: simpleObject(),
  },
}

store.data.nested.dispatch('load')
// Dispatch { type: 'data/nested/load' }

store.data.nested.dispatch('loaded')({ hello: 'world' })
// Dispatch { type: 'data/nested/loaded', payload: { hello: 'world' } }

// OR - if payload it's not a rule on krf

store.data.nested.dispatch('loaded')({ hello: 'world' })
// Dispatch { type: 'data/nested/loaded', hello: 'world' }

@fabienjuif
Copy link
Member Author

He want to define actions so he can uses its like constants.
And use static access to them (completion, etc).

Out of topic for @guillaumecrespel, how can you make them both works:

store.data.nested.dispatch('load')
// Dispatch { type: 'data/nested/load' }

store.data.nested.dispatch('loaded')({ hello: 'world' })
// Dispatch { type: 'data/nested/loaded', payload: { hello: 'world' } }

@fabienjuif
Copy link
Member Author

@EmrysMyrddin is it something you still need after using the library more often ?

@EmrysMyrddin
Copy link
Collaborator

Yes, I did had the time toake a PR but I have began to make some utility functions on ICES project that implements my first API proposition.

For now, it works pretty well, the only drawback is that our actions are currently defined in a separate file from my model. So yes it could be great to integrate it directly in the model declaration.

@fabienjuif
Copy link
Member Author

Do you want to open a PR or may I think of an implementation myself ?

@EmrysMyrddin
Copy link
Collaborator

EmrysMyrddin commented Jun 11, 2018 via email

@fabienjuif
Copy link
Member Author

Should we wait this issue for the 6.0.0 ?

The questions behind that are:

  • do you think it will break the API ?
  • do you think we can merge the related PR during this week ?

@fabienjuif
Copy link
Member Author

ping @EmrysMyrddin

@EmrysMyrddin
Copy link
Collaborator

I don't currently have the time to do the PR. But I don't think i will break existing API. I will just add things.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

3 participants