@@ -116,4 +130,6 @@ const mapDispatchToProps = dispatch => ({
markPostRead: (post, token) => dispatch(markPostRead(post, token)),
});
-export default connect(null, mapDispatchToProps)(PostModal);
+const mapStateToProps = state => ({ isMarkingPost: state.posts.isMarking });
+
+export default connect(mapStateToProps, mapDispatchToProps)(PostModal);
diff --git a/src/newsreader/js/pages/homepage/index.js b/src/newsreader/js/pages/homepage/index.js
index 5279482..b934ad3 100644
--- a/src/newsreader/js/pages/homepage/index.js
+++ b/src/newsreader/js/pages/homepage/index.js
@@ -17,11 +17,12 @@ if (page) {
ReactDOM.render(
,
page
diff --git a/src/newsreader/js/pages/homepage/reducers/posts.js b/src/newsreader/js/pages/homepage/reducers/posts.js
index 220c59b..608deb2 100644
--- a/src/newsreader/js/pages/homepage/reducers/posts.js
+++ b/src/newsreader/js/pages/homepage/reducers/posts.js
@@ -5,6 +5,8 @@ import { CATEGORY_TYPE, RULE_TYPE } from '../constants.js';
import {
SELECT_POST,
+ MARKING_POST,
+ MARK_POST_READ,
RECEIVE_POST,
RECEIVE_POSTS,
REQUEST_POSTS,
@@ -13,7 +15,7 @@ import { SELECT_CATEGORY } from '../actions/categories.js';
import { SELECT_RULE } from '../actions/rules.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) => {
switch (action.type) {
@@ -62,6 +64,10 @@ export const posts = (state = { ...defaultState }, action) => {
...updatedPosts,
},
};
+ case MARKING_POST:
+ return { ...state, isMarking: true };
+ case MARK_POST_READ:
+ return { ...state, isMarking: false };
default:
return state;
}
diff --git a/src/newsreader/js/tests/homepage/actions/post.test.js b/src/newsreader/js/tests/homepage/actions/post.test.js
index e8f84de..ce2ffdc 100644
--- a/src/newsreader/js/tests/homepage/actions/post.test.js
+++ b/src/newsreader/js/tests/homepage/actions/post.test.js
@@ -14,12 +14,18 @@ describe('post actions', () => {
fetchMock.restore();
});
- it('should create an action request posts', () => {
+ it('should create an action to request posts', () => {
const expectedAction = { type: actions.REQUEST_POSTS };
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', () => {
const post = {
id: 2067,
@@ -147,6 +153,7 @@ describe('post actions', () => {
});
const expectedActions = [
+ { type: actions.MARKING_POST },
{
type: actions.RECEIVE_POST,
post: { ...post, read: true },
@@ -362,6 +369,7 @@ describe('post actions', () => {
});
const expectedActions = [
+ { type: actions.MARKING_POST },
{ type: actions.RECEIVE_POST, post: {} },
{ type: errorActions.RECEIVE_API_ERROR, error: TypeError(errorMessage) },
];
diff --git a/src/newsreader/js/tests/homepage/reducers/post.test.js b/src/newsreader/js/tests/homepage/reducers/post.test.js
index ef4234a..6fe728f 100644
--- a/src/newsreader/js/tests/homepage/reducers/post.test.js
+++ b/src/newsreader/js/tests/homepage/reducers/post.test.js
@@ -12,7 +12,7 @@ describe('post actions', () => {
it('should return state after requesting 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);
});
@@ -40,6 +40,7 @@ describe('post actions', () => {
const expectedState = {
...defaultState,
isFetching: false,
+ isMarking: false,
items: { [post.id]: post },
};
@@ -85,6 +86,7 @@ describe('post actions', () => {
const expectedState = {
...defaultState,
isFetching: false,
+ isMarking: false,
items: expectedPosts,
};
diff --git a/src/newsreader/news/core/views.py b/src/newsreader/news/core/views.py
index 18ec95c..c2ff4d5 100644
--- a/src/newsreader/news/core/views.py
+++ b/src/newsreader/news/core/views.py
@@ -27,6 +27,7 @@ class NewsView(TemplateView):
),
"categoriesUrl": reverse_lazy("news:core:category-update", args=(0,)),
"timezone": settings.TIME_ZONE,
+ "autoMarking": self.request.user.auto_mark_read,
},
}
diff --git a/src/newsreader/scss/components/post/_post.scss b/src/newsreader/scss/components/post/_post.scss
index ae94f6c..7a8ea22 100644
--- a/src/newsreader/scss/components/post/_post.scss
+++ b/src/newsreader/scss/components/post/_post.scss
@@ -15,6 +15,15 @@
cursor: initial;
+ &__actions {
+ display: flex;
+ justify-content: flex-end;
+ width: 100%;
+
+ padding: 20px 50px 0;
+ gap: 20px;
+ }
+
&__header {
display: flex;
flex-direction: column;
@@ -81,9 +90,6 @@
}
&__close-button {
- position: relative;
- margin: 1% 2% 0 0;
- align-self: flex-end;
background-color: $blue;
color: $white;
diff --git a/src/newsreader/scss/components/sidebar/_sidebar.scss b/src/newsreader/scss/components/sidebar/_sidebar.scss
index f13faf3..c70594a 100644
--- a/src/newsreader/scss/components/sidebar/_sidebar.scss
+++ b/src/newsreader/scss/components/sidebar/_sidebar.scss
@@ -20,4 +20,8 @@
padding: 2px 10px 5px 10px;
}
}
+
+ .read-button {
+ margin: 20px 0 0 0;
+ }
}
diff --git a/src/newsreader/scss/elements/button/_read-button.scss b/src/newsreader/scss/elements/button/_read-button.scss
index 2c345b5..71e8e75 100644
--- a/src/newsreader/scss/elements/button/_read-button.scss
+++ b/src/newsreader/scss/elements/button/_read-button.scss
@@ -1,8 +1,6 @@
.read-button {
@extend .button;
- margin: 20px 0 0 0;
-
color: $white;
background-color: $green;