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 ? (
-
- ) : (
-
- );
+ let avatar;
+ if (src) {
+ avatar =
;
+ } 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}>;