diff --git a/src/discussions/posts/PostsList.jsx b/src/discussions/posts/PostsList.jsx
index 40c721b7..7de3bc88 100644
--- a/src/discussions/posts/PostsList.jsx
+++ b/src/discussions/posts/PostsList.jsx
@@ -22,7 +22,9 @@ import { fetchThreads } from './data/thunks';
import NoResults from './NoResults';
import { PostLink } from './post';
-function PostsList({ posts, topics, intl }) {
+function PostsList({
+ posts, topics, intl, isTopicTab,
+}) {
const dispatch = useDispatch();
const {
courseId,
@@ -38,7 +40,7 @@ function PostsList({ posts, topics, intl }) {
const userIsStaff = useSelector(selectUserIsStaff);
const configStatus = useSelector(selectconfigLoadingStatus);
- const loadThreads = (topicIds, pageNum = undefined) => {
+ const loadThreads = (topicIds, pageNum = undefined, isFilterChanged = false) => {
const params = {
orderBy,
filters,
@@ -46,6 +48,7 @@ function PostsList({ posts, topics, intl }) {
author: showOwnPosts ? authenticatedUser.username : null,
countFlagged: (userHasModerationPrivileges || userIsStaff) || undefined,
topicIds,
+ isFilterChanged,
};
if (showOwnPosts) {
@@ -59,7 +62,11 @@ function PostsList({ posts, topics, intl }) {
if (topics !== undefined && configStatus === RequestStatus.SUCCESSFUL) {
loadThreads(topics);
}
- }, [courseId, orderBy, filters, page, JSON.stringify(topics), configStatus]);
+ }, [courseId, filters, orderBy, page, JSON.stringify(topics), configStatus]);
+
+ useEffect(() => {
+ if (isTopicTab) { loadThreads(topics, 1, true); }
+ }, [filters]);
const checkIsSelected = (id) => window.location.pathname.includes(id);
const pinnedPosts = useMemo(() => filterPosts(posts, 'pinned'), [posts]);
@@ -103,12 +110,14 @@ PostsList.propTypes = {
id: PropTypes.string.isRequired,
})),
topics: PropTypes.arrayOf(PropTypes.string),
+ isTopicTab: PropTypes.bool,
intl: intlShape.isRequired,
};
PostsList.defaultProps = {
posts: [],
topics: undefined,
+ isTopicTab: false,
};
export default injectIntl(PostsList);
diff --git a/src/discussions/posts/PostsView.jsx b/src/discussions/posts/PostsView.jsx
index 3b2da3fb..b63b677f 100644
--- a/src/discussions/posts/PostsView.jsx
+++ b/src/discussions/posts/PostsView.jsx
@@ -21,7 +21,7 @@ function AllPostsList() {
function TopicPostsList({ topicId }) {
const posts = useSelector(selectTopicThreads([topicId]));
- return ;
+ return ;
}
TopicPostsList.propTypes = {
diff --git a/src/discussions/posts/data/slices.js b/src/discussions/posts/data/slices.js
index 4d543490..c9666e2f 100644
--- a/src/discussions/posts/data/slices.js
+++ b/src/discussions/posts/data/slices.js
@@ -94,7 +94,13 @@ const threadsSlice = createSlice({
}
state.status = RequestStatus.SUCCESSFUL;
state.threadsById = { ...state.threadsById, ...payload.threadsById };
- state.threadsInTopic = mergeThreadsInTopics(state.threadsInTopic, payload.threadsInTopic);
+ // filter
+ if (payload.isFilterChanged) {
+ state.threadsInTopic = { ...payload.threadsInTopic };
+ } else {
+ state.threadsInTopic = mergeThreadsInTopics(state.threadsInTopic, payload.threadsInTopic);
+ }
+
state.avatars = { ...state.avatars, ...payload.avatars };
state.nextPage = (payload.page < payload.pagination.numPages) ? payload.page + 1 : null;
state.totalPages = payload.pagination.numPages;
diff --git a/src/discussions/posts/data/thunks.js b/src/discussions/posts/data/thunks.js
index 7b3f2665..86f939f8 100644
--- a/src/discussions/posts/data/thunks.js
+++ b/src/discussions/posts/data/thunks.js
@@ -102,6 +102,7 @@ export function fetchThreads(courseId, {
author = null,
filters = {},
page = 1,
+ isFilterChanged,
countFlagged,
} = {}) {
const options = {
@@ -141,7 +142,7 @@ export function fetchThreads(courseId, {
const data = await getThreads(courseId, options);
const normalisedData = normaliseThreads(camelCaseObject(data), topicIds);
dispatch(fetchThreadsSuccess({
- ...normalisedData, page, author, textSearchRewrite: data.text_search_rewrite,
+ ...normalisedData, page, author, textSearchRewrite: data.text_search_rewrite, isFilterChanged,
}));
} catch (error) {
if (getHttpErrorStatus(error) === 403) {