A no headache middleware helper for redux-saga.
npm install --save redux-unfold-saga
or
yarn add redux-unfold-saga
If you want a quick demo repo in real life.
- index.js
import React from 'react';
import { createAction } from 'redux-unfold-saga';
const queryPosts = createAction('QUERY_POSTS');
export default class PostList extends React.Component {
state = {
isLoading: false,
posts: [],
};
componentDidMount() {
this.dispatchQueryPosts();
}
dispatchQueryPosts = () => {
this.props.dispatch(
queryPosts(
{
type: 'HOT',
},
{
onBeginning: () => {
// Do something before the query
this.setState({ isLoading: true });
},
onFailure: error => {
// Do something in case of caught error
},
onSuccess: posts => {
// Do something after the query succeeded
this.setState({ posts });
},
onFinished: () => {
// Do something after everything is done
this.setState({ isLoading: false });
},
},
),
);
};
render() {
return (
<View>
{this.state.isLoading && <Text>Loading...</Text>}
{this.state.posts.map(post => (
<Text>{post.title}</Text>
))}
</View>
);
}
}
- saga.js
import { unfoldSaga } from 'redux-unfold-saga';
function* takeQueryPosts({ payload }) {
yield unfoldSaga({
handler: async () => {
const posts = await queryPosts(payload);
return posts;
},
key: 'QUERY_POSTS',
});
}
function* defaultSaga() {
yield takeLatest('QUERY_POSTS', takeQueryPosts);
}
- createActionTypeOnBeginning
- createActionTypeOnFailure
- createActionTypeOnFinish
- createActionTypeOnSuccess
- createAction
- unfoldSaga
Create onBeginning action type
key
string
createActionTypeOnSuccess('DO_SOMETHING') // 'DO_SOMETHING_BEGAN'
Returns string
Create onFailure action type
key
string
createActionTypeOnSuccess('DO_SOMETHING') // 'DO_SOMETHING_FAILED'
Returns string
Create onFinish action type
key
string
createActionTypeOnSuccess('DO_SOMETHING') // 'DO_SOMETHING_FINISHED'
Returns string
Create onSuccess action type
key
string
createActionTypeOnSuccess('DO_SOMETHING') // 'DO_SOMETHING_SUCCEEDED'
Returns string
Create an action for real life usage inside or even outside of a component
type
string
Inside of a component
const queryPosts = createAction('QUERY_POSTS');
this.props.dispatch(
queryPosts(
{
category: 'HOT',
},
{
onBeginning: () => {
// Do something before the query
this.setState({ isLoading: true });
}
onFailure: (error) => {
// Do something in case of caught error
}
onSuccess: (posts) => {
// Do something after the query succeeded
}
onFinished: () => {
// Do something after everything is done
this.setState({ isLoading: false });
}
},
),
);
Outside of a react component
store.dispatch(
queryPosts({
type: 'HOT',
}),
);
Inside another saga
const queryPosts = createAction('QUERY_POSTS');
function* takeQueryPosts() {
yield put(queryPosts());
}
Returns UnfoldSagaActionType
Common saga helper that unifies handling side effects into only one standard form
body
UnfoldSagaHandlerTypecallbacks
UnfoldSagaCallbacksType (optional, default{}
)callbacks.onBeginning
Function This callback will be called after onBeginning action is dispatched.callbacks.onFailure
Function This callback will be called after onFailure action is dispatched. It will only be called in case of error.callbacks.onFinish
Function This callback will be called after onFinish action is dispatched.callbacks.onSuccess
Function This callback will be called after onSuccess action is dispatched. It will not be called in case of error.
options
UnfoldSagaOptionsType (optional, default{}
)options.stateless
boolean This ensures if redux actions will be triggered
function* takeQueryPosts({ payload: { category } }) {
yield unfoldSaga({
handler: async () => {
const posts = await queryPosts({ category });
return posts;
},
key: 'QUERY_POSTS',
});
}
function* takeQueryCategories({ payload: { category } }) {
yield unfoldSaga({
*handler() => {
const categories = yield call(queryPosts, { category });
return categories;
},
key: 'QUERY_CATEGORIES',
});
}
function* defaultSaga() {
yield takeLatest('QUERY_POSTS', takeQueryPosts);
yield takeLatest('QUERY_CATEGORIES, takeQueryCategories);
}
Returns Saga<void>
MIT © Manh Pham - manhpt.com