From edd3f73211b74786df280b8edaf7526f18945c59 Mon Sep 17 00:00:00 2001 From: Eemaan Amir <57627710+eemaanamir@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:18:53 +0500 Subject: [PATCH] feat: made user profile image visible (#778) * feat: made user profile image visible * refactor: updated selector name * refactor: updated selector name --- src/discussions/learners/data/selectors.js | 4 +++ .../learners/learner/LearnerAvatar.jsx | 31 ++++++++++++------- .../comments/comment/CommentHeader.jsx | 4 +++ .../post-comments/comments/comment/Reply.jsx | 3 ++ src/discussions/posts/data/selectors.js | 4 +++ src/discussions/posts/post/PostHeader.jsx | 4 +++ 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/discussions/learners/data/selectors.js b/src/discussions/learners/data/selectors.js index 8b439e0f..bf3ea98e 100644 --- a/src/discussions/learners/data/selectors.js +++ b/src/discussions/learners/data/selectors.js @@ -12,3 +12,7 @@ export const selectUsernameSearch = () => state => state.learners.usernameSearch export const selectLearnerSorting = () => state => state.learners.sortedBy; export const selectLearnerNextPage = () => state => state.learners.nextPage; + +export const selectLearnerAvatar = author => state => ( + state.learners.learnerProfiles[author]?.profileImage?.imageUrlLarge +); diff --git a/src/discussions/learners/learner/LearnerAvatar.jsx b/src/discussions/learners/learner/LearnerAvatar.jsx index 567cc8e4..72bee0ff 100644 --- a/src/discussions/learners/learner/LearnerAvatar.jsx +++ b/src/discussions/learners/learner/LearnerAvatar.jsx @@ -2,19 +2,26 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Avatar } from '@openedx/paragon'; +import { useSelector } from 'react-redux'; -const LearnerAvatar = ({ username }) => ( -
- -
-); +import { selectLearnerAvatar } from '../data/selectors'; + +const LearnerAvatar = ({ username }) => { + const learnerAvatar = useSelector(selectLearnerAvatar(username)); + return ( +
+ +
+ ); +}; LearnerAvatar.propTypes = { username: PropTypes.string.isRequired, diff --git a/src/discussions/post-comments/comments/comment/CommentHeader.jsx b/src/discussions/post-comments/comments/comment/CommentHeader.jsx index 4da4483e..7877043b 100644 --- a/src/discussions/post-comments/comments/comment/CommentHeader.jsx +++ b/src/discussions/post-comments/comments/comment/CommentHeader.jsx @@ -3,10 +3,12 @@ import PropTypes from 'prop-types'; import { Avatar } from '@openedx/paragon'; import classNames from 'classnames'; +import { useSelector } from 'react-redux'; import { AvatarOutlineAndLabelColors } from '../../../../data/constants'; import { AuthorLabel } from '../../../common'; import { useAlertBannerVisible } from '../../../data/hooks'; +import { selectAuthorAvatar } from '../../../posts/data/selectors'; const CommentHeader = ({ author, @@ -23,6 +25,7 @@ const CommentHeader = ({ lastEdit, closed, }); + const authorAvatar = useSelector(selectAuthorAvatar(author)); return (
{ lastEdit, closed, }); + const authorAvatar = useSelector(selectAuthorAvatar(author)); const handleDeleteConfirmation = useCallback(() => { dispatch(removeComment(id)); @@ -121,6 +123,7 @@ const Reply = ({ responseId }) => { state => state.threads.sortedBy; export const selectThreadFilters = () => state => state.threads.filters; export const selectThreadNextPage = () => state => state.threads.nextPage; + +export const selectAuthorAvatar = author => state => ( + state.threads.avatars?.[author]?.profile.image +); diff --git a/src/discussions/posts/post/PostHeader.jsx b/src/discussions/posts/post/PostHeader.jsx index eeb38878..a3b000c2 100644 --- a/src/discussions/posts/post/PostHeader.jsx +++ b/src/discussions/posts/post/PostHeader.jsx @@ -4,18 +4,21 @@ import PropTypes from 'prop-types'; import { Avatar, Badge, Icon } from '@openedx/paragon'; import { Question } from '@openedx/paragon/icons'; import classNames from 'classnames'; +import { useSelector } from 'react-redux'; import { useIntl } from '@edx/frontend-platform/i18n'; import { AvatarOutlineAndLabelColors, ThreadType } from '../../../data/constants'; import { AuthorLabel } from '../../common'; import { useAlertBannerVisible } from '../../data/hooks'; +import { selectAuthorAvatar } from '../data/selectors'; import messages from './messages'; export const PostAvatar = React.memo(({ author, postType, authorLabel, fromPostLink, read, }) => { const outlineColor = AvatarOutlineAndLabelColors[authorLabel]; + const authorAvatars = useSelector(selectAuthorAvatar(author)); const avatarSize = useMemo(() => { let size = '2rem'; @@ -60,6 +63,7 @@ export const PostAvatar = React.memo(({ width: avatarSize, }} alt={author} + src={authorAvatars?.imageUrlSmall} />
);