import React, { useCallback, useContext, useEffect, useMemo, } from 'react'; import capitalize from 'lodash/capitalize'; import { useDispatch, useSelector } from 'react-redux'; import { useHistory, useLocation } from 'react-router-dom'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Button, Icon, IconButton, Spinner, } from '@edx/paragon'; import { ArrowBack } from '@edx/paragon/icons'; import { RequestStatus, Routes, } from '../../data/constants'; import { DiscussionContext } from '../common/context'; import { selectUserHasModerationPrivileges, selectUserIsStaff } from '../data/selectors'; import { selectAllThreads, selectThreadNextPage, threadsLoadingStatus, } from '../posts/data/selectors'; import { clearPostsPages } from '../posts/data/slices'; import NoResults from '../posts/NoResults'; import { PostLink } from '../posts/post'; import { discussionsPath, filterPosts } from '../utils'; import { fetchUserPosts } from './data/thunks'; import LearnerPostFilterBar from './learner-post-filter-bar/LearnerPostFilterBar'; import messages from './messages'; function LearnerPostsView({ intl }) { const location = useLocation(); const history = useHistory(); const dispatch = useDispatch(); const posts = useSelector(selectAllThreads); const loadingStatus = useSelector(threadsLoadingStatus()); const postFilter = useSelector(state => state.learners.postFilter); const { courseId, learnerUsername: username } = useContext(DiscussionContext); const nextPage = useSelector(selectThreadNextPage()); const userHasModerationPrivileges = useSelector(selectUserHasModerationPrivileges); const userIsStaff = useSelector(selectUserIsStaff); const loadMorePosts = (pageNum = undefined) => { const params = { author: username, page: pageNum, filters: postFilter, orderBy: postFilter.orderBy, countFlagged: (userHasModerationPrivileges || userIsStaff) || undefined, }; dispatch(fetchUserPosts(courseId, params)); }; useEffect(() => { dispatch(clearPostsPages()); loadMorePosts(); }, [courseId, postFilter, username]); const checkIsSelected = (id) => window.location.pathname.includes(id); const pinnedPosts = useMemo(() => filterPosts(posts, 'pinned'), [posts]); const unpinnedPosts = useMemo(() => filterPosts(posts, 'unpinned'), [posts]); const postInstances = useCallback((sortedPosts) => ( sortedPosts.map((post, idx) => ( )) ), []); return (
history.push(discussionsPath(Routes.LEARNERS.PATH, { courseId })(location))} alt={intl.formatMessage(messages.back)} />
{intl.formatMessage(messages.activityForLearner, { username: capitalize(username) })}
{postInstances(pinnedPosts)} {postInstances(unpinnedPosts)} {loadingStatus !== RequestStatus.IN_PROGRESS && posts?.length === 0 && } {loadingStatus === RequestStatus.IN_PROGRESS ? (
) : ( nextPage && loadingStatus === RequestStatus.SUCCESSFUL && ( ) )}
); } LearnerPostsView.propTypes = { intl: intlShape.isRequired, }; export default injectIntl(LearnerPostsView);