@gssfed/vital-ui-kit-react
Version:
Vital UI Kit for React!
135 lines (121 loc) • 2.96 kB
JSX
/**
* @flow
* Copyright © 2018 Galaxy Software Services https://github.com/GSS-FED/vital-ui-kit-react
* MIT license
*/
import React, { type Node } from 'react';
import styled from 'styled-components';
import AvatarBadge from './AvatarBadge';
import { avatarSizes } from './constants';
import DEFAULT_AVATAR from './assets/default-avatar.svg';
import DEFAULT_AVATAR_OUTLINE from './assets/default-avatar-o.svg';
import DEFAULT_AVATAR_M from './assets/default-avatar-m.svg';
import DEFAULT_AVATAR_F from './assets/default-avatar-f.svg';
import DEFAULT_AVATAR_M_O from './assets/default-avatar-m-o.svg';
import DEFAULT_AVATAR_F_O from './assets/default-avatar-f-o.svg';
const Root = styled.div`
position: relative;
display: inline-block;
`;
const Image = styled.img`
width: ${({ size }) => avatarSizes[size].size};
height: ${({ size }) => avatarSizes[size].size};
border-radius: ${({ size, round }) =>
round ? '50%' : avatarSizes[size].borderRadius};
background-color: ${({ theme }) => theme.grey200};
box-sizing: border-box;
`;
type SizeType = 'xlarge' | 'large' | 'medium' | 'small' | 'xsmall';
type Gender = 'male' | 'female';
type Props = {
src?: string,
round?: boolean,
size?: SizeType,
badge?: string,
gender?: Gender,
outline?: boolean,
containerStyle?: CSSStyleDeclaration,
imageStyle?: CSSStyleDeclaration,
badgeStyle?: CSSStyleDeclaration,
};
/**
* @render react
* @name Avatar
* @description Vital UI Kit Avatar Component
* @example
* <Avatar
* badge="99+"
* size="large"
* gender="male"
* round
* />
*/
const Avatar = ({
src,
round,
size,
badge,
outline,
gender,
containerStyle,
imageStyle,
badgeStyle,
...props
}: Props) => {
const renderBadge = (): ?Node => {
if (!badge) {
return null;
}
return (
<AvatarBadge
label={badge}
size={size}
round={round}
style={badgeStyle}
/>
);
};
const renderDefaultAvatar = (): string => {
if (src) {
return src;
}
if (outline && gender) {
if (gender === 'female') return DEFAULT_AVATAR_F_O;
if (gender === 'male') return DEFAULT_AVATAR_M_O;
return DEFAULT_AVATAR_OUTLINE;
}
if (!outline && gender) {
if (gender === 'female') return DEFAULT_AVATAR_F;
if (gender === 'male') return DEFAULT_AVATAR_M;
return DEFAULT_AVATAR;
}
if (outline && !gender) {
return DEFAULT_AVATAR_OUTLINE;
}
return DEFAULT_AVATAR;
};
return (
<Root style={containerStyle} {...props}>
<Image
src={renderDefaultAvatar()}
size={size}
round={round}
style={imageStyle}
{...props}
/>
{renderBadge()}
</Root>
);
};
Avatar.defaultProps = {
badge: null,
src: null,
gender: undefined,
round: false,
size: 'medium',
outline: false,
imageStyle: null,
containerStyle: null,
badgeStyle: null,
};
export default Avatar;