diff --git a/src/Avatar.jsx b/src/Avatar.jsx index 2936ce9117..272a88b889 100644 --- a/src/Avatar.jsx +++ b/src/Avatar.jsx @@ -2,18 +2,36 @@ import React from 'react'; import PropTypes from 'prop-types'; import { AvatarIcon } from './Icons'; +import { getAvatarColor, getInitial } from './avatarUtils'; const Avatar = ({ size, src, alt, className, + username, }) => { - const avatar = src ? ( - {alt} - ) : ( - - ); + let avatar; + if (src) { + avatar = {alt}; + } else if (username) { + avatar = ( + + {getInitial(username)} + + ); + } else { + avatar = ; + } return ( { + let hash = 0; + for (let i = 0; i < username.length; i += 1) { + hash = ((hash << 5) - hash + username.charCodeAt(i)) | 0; // eslint-disable-line no-bitwise + } + return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length]; +}; + +/** + * Returns the uppercased first character of the username. + */ +export const getInitial = (username) => username.charAt(0).toUpperCase(); diff --git a/src/desktop-header/DesktopUserMenuToggle.jsx b/src/desktop-header/DesktopUserMenuToggle.jsx index f9057141c3..99e4003781 100644 --- a/src/desktop-header/DesktopUserMenuToggle.jsx +++ b/src/desktop-header/DesktopUserMenuToggle.jsx @@ -5,7 +5,7 @@ import Avatar from '../Avatar'; const DesktopUserMenuToggle = ({ avatar, label }) => ( <> - + {label} ); diff --git a/src/mobile-header/MobileUserMenuToggle.jsx b/src/mobile-header/MobileUserMenuToggle.jsx index 7f2eeb9114..c65c3b2f5d 100644 --- a/src/mobile-header/MobileUserMenuToggle.jsx +++ b/src/mobile-header/MobileUserMenuToggle.jsx @@ -2,11 +2,14 @@ import React from 'react'; import PropTypes from 'prop-types'; import Avatar from '../Avatar'; -const MobileUserMenuToggle = ({ avatar, username }) => ; +const MobileUserMenuToggle = ({ avatar, username, label }) => ( + +); export const MobileUserMenuTogglePropTypes = { avatar: PropTypes.string, username: PropTypes.string, + label: PropTypes.string, }; MobileUserMenuToggle.propTypes = MobileUserMenuTogglePropTypes; diff --git a/src/studio-header/UserMenu.tsx b/src/studio-header/UserMenu.tsx index 66add10cb4..41877b9bab 100644 --- a/src/studio-header/UserMenu.tsx +++ b/src/studio-header/UserMenu.tsx @@ -1,9 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { useIntl } from '@edx/frontend-platform/i18n'; -import { - Avatar, -} from '@openedx/paragon'; +import Avatar from '../Avatar'; import NavDropdownMenu from './NavDropdownMenu'; import getUserMenuItems from './utils'; @@ -24,12 +22,14 @@ const UserMenu = ({ data-testid="avatar-image" /> ) : ( - + + + ); const title = isMobile ? avatar : <>{avatar}{username};