aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web
diff options
context:
space:
mode:
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>2018-11-06 11:43:15 +0100
committerSonarTech <sonartech@sonarsource.com>2018-11-16 20:21:06 +0100
commit3112801fbe5c8c36e15f52051162d2b6e0828812 (patch)
treea962bd6e8b840c0d6ad1f813eb2a8c8bb513b809 /server/sonar-web
parent382013f780f0ea46c95db090435d3ea0a64e33c5 (diff)
downloadsonarqube-3112801fbe5c8c36e15f52051162d2b6e0828812.tar.gz
sonarqube-3112801fbe5c8c36e15f52051162d2b6e0828812.zip
SONAR-11321 Fallback to generic avatar if the image doesn't load
Diffstat (limited to 'server/sonar-web')
-rw-r--r--server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx57
1 files changed, 37 insertions, 20 deletions
diff --git a/server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx b/server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx
index c4ad360e729..bda1c6774a0 100644
--- a/server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx
+++ b/server/sonar-web/src/main/js/components/common/OrganizationAvatar.tsx
@@ -20,31 +20,48 @@
import * as React from 'react';
import * as classNames from 'classnames';
import GenericAvatar from '../ui/GenericAvatar';
+import { OrganizationBase } from '../../app/types';
import './OrganizationAvatar.css';
interface Props {
className?: string;
- organization: {
- avatar?: string;
- name: string;
- };
+ organization: Pick<OrganizationBase, 'avatar' | 'name'>;
small?: boolean;
}
-export default function OrganizationAvatar({ className, organization, small }: Props) {
- return (
- <div
- className={classNames(
- 'navbar-context-avatar',
- 'rounded',
- { 'no-border': !organization.avatar, 'is-small': small },
- className
- )}>
- {organization.avatar ? (
- <img alt={organization.name} className="rounded" src={organization.avatar} />
- ) : (
- <GenericAvatar name={organization.name} size={small ? 15 : 30} />
- )}
- </div>
- );
+interface State {
+ imgLoadError: boolean;
+}
+
+export default class OrganizationAvatar extends React.PureComponent<Props, State> {
+ state = { imgLoadError: false };
+
+ handleImgError = () => {
+ this.setState({ imgLoadError: true });
+ };
+
+ render() {
+ const { className, organization, small } = this.props;
+ const { imgLoadError } = this.state;
+ return (
+ <div
+ className={classNames(
+ 'navbar-context-avatar',
+ 'rounded',
+ { 'no-border': !organization.avatar, 'is-small': small },
+ className
+ )}>
+ {organization.avatar && !imgLoadError ? (
+ <img
+ alt={organization.name}
+ className="rounded"
+ onError={this.handleImgError}
+ src={organization.avatar}
+ />
+ ) : (
+ <GenericAvatar name={organization.name} size={small ? 15 : 30} />
+ )}
+ </div>
+ );
+ }
}