Update actions/reducers

This commit is contained in:
Sonny Bakker 2020-10-30 22:55:21 +01:00
parent 66c8ab1a8c
commit f0a0ad776d
5 changed files with 25 additions and 5 deletions

View file

@ -9,6 +9,7 @@ export const RECEIVE_POST = 'RECEIVE_POST';
export const REQUEST_POSTS = 'REQUEST_POSTS'; export const REQUEST_POSTS = 'REQUEST_POSTS';
export const MARK_POST_READ = 'MARK_POST_READ'; export const MARK_POST_READ = 'MARK_POST_READ';
export const MARKING_POST = 'MARKING_POST';
export const requestPosts = () => ({ type: REQUEST_POSTS }); export const requestPosts = () => ({ type: REQUEST_POSTS });
@ -30,10 +31,14 @@ export const postRead = (post, section) => ({
section, section,
}); });
export const markingPostRead = () => ({ type: MARKING_POST });
export const markPostRead = (post, token) => { export const markPostRead = (post, token) => {
return (dispatch, getState) => { return (dispatch, getState) => {
const { selected } = getState(); const { selected } = getState();
dispatch(markingPostRead());
const url = `/api/posts/${post.id}/`; const url = `/api/posts/${post.id}/`;
const options = { const options = {
method: 'PATCH', method: 'PATCH',

View file

@ -130,7 +130,6 @@ const mapDispatchToProps = dispatch => ({
markPostRead: (post, token) => dispatch(markPostRead(post, token)), markPostRead: (post, token) => dispatch(markPostRead(post, token)),
}); });
// TODO use different boolean for saving mark post as read state const mapStateToProps = state => ({ isMarkingPost: state.posts.isMarking });
const mapStateToProps = state => ({ isMarkingPost: state.posts.isFetching });
export default connect(mapStateToProps, mapDispatchToProps)(PostModal); export default connect(mapStateToProps, mapDispatchToProps)(PostModal);

View file

@ -5,6 +5,8 @@ import { CATEGORY_TYPE, RULE_TYPE } from '../constants.js';
import { import {
SELECT_POST, SELECT_POST,
MARKING_POST,
MARK_POST_READ,
RECEIVE_POST, RECEIVE_POST,
RECEIVE_POSTS, RECEIVE_POSTS,
REQUEST_POSTS, REQUEST_POSTS,
@ -13,7 +15,7 @@ import { SELECT_CATEGORY } from '../actions/categories.js';
import { SELECT_RULE } from '../actions/rules.js'; import { SELECT_RULE } from '../actions/rules.js';
import { MARK_SECTION_READ } from '../actions/selected.js'; import { MARK_SECTION_READ } from '../actions/selected.js';
const defaultState = { items: {}, isFetching: false }; const defaultState = { items: {}, isFetching: false, isMarking: false };
export const posts = (state = { ...defaultState }, action) => { export const posts = (state = { ...defaultState }, action) => {
switch (action.type) { switch (action.type) {
@ -62,6 +64,10 @@ export const posts = (state = { ...defaultState }, action) => {
...updatedPosts, ...updatedPosts,
}, },
}; };
case MARKING_POST:
return { ...state, isMarking: true };
case MARK_POST_READ:
return { ...state, isMarking: false };
default: default:
return state; return state;
} }

View file

@ -14,12 +14,18 @@ describe('post actions', () => {
fetchMock.restore(); fetchMock.restore();
}); });
it('should create an action request posts', () => { it('should create an action to request posts', () => {
const expectedAction = { type: actions.REQUEST_POSTS }; const expectedAction = { type: actions.REQUEST_POSTS };
expect(actions.requestPosts()).toEqual(expectedAction); expect(actions.requestPosts()).toEqual(expectedAction);
}); });
it('should create an action to mark a post read', () => {
const expectedAction = { type: actions.MARKING_POST };
expect(actions.markingPostRead()).toEqual(expectedAction);
});
it('should create an action receive a post', () => { it('should create an action receive a post', () => {
const post = { const post = {
id: 2067, id: 2067,
@ -147,6 +153,7 @@ describe('post actions', () => {
}); });
const expectedActions = [ const expectedActions = [
{ type: actions.MARKING_POST },
{ {
type: actions.RECEIVE_POST, type: actions.RECEIVE_POST,
post: { ...post, read: true }, post: { ...post, read: true },
@ -362,6 +369,7 @@ describe('post actions', () => {
}); });
const expectedActions = [ const expectedActions = [
{ type: actions.MARKING_POST },
{ type: actions.RECEIVE_POST, post: {} }, { type: actions.RECEIVE_POST, post: {} },
{ type: errorActions.RECEIVE_API_ERROR, error: TypeError(errorMessage) }, { type: errorActions.RECEIVE_API_ERROR, error: TypeError(errorMessage) },
]; ];

View file

@ -12,7 +12,7 @@ describe('post actions', () => {
it('should return state after requesting posts', () => { it('should return state after requesting posts', () => {
const action = { type: actions.REQUEST_POSTS }; const action = { type: actions.REQUEST_POSTS };
const expectedState = { ...defaultState, isFetching: true }; const expectedState = { ...defaultState, isFetching: true, isMarking: false };
expect(reducer(undefined, action)).toEqual(expectedState); expect(reducer(undefined, action)).toEqual(expectedState);
}); });
@ -40,6 +40,7 @@ describe('post actions', () => {
const expectedState = { const expectedState = {
...defaultState, ...defaultState,
isFetching: false, isFetching: false,
isMarking: false,
items: { [post.id]: post }, items: { [post.id]: post },
}; };
@ -85,6 +86,7 @@ describe('post actions', () => {
const expectedState = { const expectedState = {
...defaultState, ...defaultState,
isFetching: false, isFetching: false,
isMarking: false,
items: expectedPosts, items: expectedPosts,
}; };