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) {