import React, { useRef, useEffect, useState } from 'react'; import classNames from 'classnames'; import Icon from '../icon'; import { BaseProps } from '../_utils/props'; export type AvatarShape = 'circle' | 'square'; export type AvatarPresence = 'online' | 'busy' | 'away' | 'offline'; export interface AvatarProps extends BaseProps { icon?: string; shape?: AvatarShape; size?: number; src?: string; presence?: AvatarPresence; alt?: string; onClick?: React.MouseEventHandler; children?: React.ReactNode; } const Avatar: React.FC & { Group?: any } = (props: AvatarProps) => { const { prefixCls = 'ty-avatar', size = 38, shape = 'circle', icon = 'user', presence = undefined, src, alt, onClick, children, className, style, } = props; const outerEl = useRef(null); const textEl = useRef(null); const [scale, setScale] = useState(1); const cls = classNames(prefixCls, className, `${prefixCls}_${shape}`, { [`${prefixCls}_clickable`]: onClick, }); const renderChildren = () => { if (typeof children === 'string') { let textStyle: React.CSSProperties = {}; if (textEl.current) { const transformString = `scale(${scale}) translateX(-50%)`; textStyle = { msTransform: transformString, WebkitTransform: transformString, transform: transformString, }; } return ( {children} ); } else { return children; } }; const renderItem = (): React.ReactNode => { if (children) { return renderChildren(); } else if (src) { return {alt}; } else { return ; } }; const renderPresence = (): React.ReactElement => { return ; }; const styles: React.CSSProperties = { width: size!, height: size!, fontSize: size! / 2, lineHeight: `${size! - 4}px`, ...style, }; useEffect(() => { if (outerEl.current && textEl.current && textEl.current!.className === `${prefixCls}__text`) { const textElWidth = textEl.current!.offsetWidth; const outerElWidth = outerEl.current!.offsetWidth; // leave 4px padding for left and right side if (outerElWidth - 8 < textElWidth) { setScale((outerElWidth - 8) / textElWidth); } else { setScale(1); } } }); return ( {renderItem()} {presence && renderPresence()} ); }; export default Avatar;