123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import React from 'react';
 | |
| 
 | |
| import type { List } from 'immutable';
 | |
| 
 | |
| import type { Account } from 'mastodon/models/account';
 | |
| 
 | |
| import { autoPlayGif } from '../initial_state';
 | |
| 
 | |
| import { Skeleton } from './skeleton';
 | |
| 
 | |
| interface Props {
 | |
|   account?: Account;
 | |
|   others?: List<Account>;
 | |
|   localDomain?: string;
 | |
| }
 | |
| 
 | |
| export class DisplayName extends React.PureComponent<Props> {
 | |
|   handleMouseEnter: React.ReactEventHandler<HTMLSpanElement> = ({
 | |
|     currentTarget,
 | |
|   }) => {
 | |
|     if (autoPlayGif) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     const emojis =
 | |
|       currentTarget.querySelectorAll<HTMLImageElement>('img.custom-emoji');
 | |
| 
 | |
|     emojis.forEach((emoji) => {
 | |
|       const originalSrc = emoji.getAttribute('data-original');
 | |
|       if (originalSrc != null) emoji.src = originalSrc;
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   handleMouseLeave: React.ReactEventHandler<HTMLSpanElement> = ({
 | |
|     currentTarget,
 | |
|   }) => {
 | |
|     if (autoPlayGif) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     const emojis =
 | |
|       currentTarget.querySelectorAll<HTMLImageElement>('img.custom-emoji');
 | |
| 
 | |
|     emojis.forEach((emoji) => {
 | |
|       const staticSrc = emoji.getAttribute('data-static');
 | |
|       if (staticSrc != null) emoji.src = staticSrc;
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   render() {
 | |
|     const { others, localDomain } = this.props;
 | |
| 
 | |
|     let displayName: React.ReactNode,
 | |
|       suffix: React.ReactNode,
 | |
|       account: Account | undefined;
 | |
| 
 | |
|     if (others && others.size > 0) {
 | |
|       account = others.first();
 | |
|     } else if (this.props.account) {
 | |
|       account = this.props.account;
 | |
|     }
 | |
| 
 | |
|     if (others && others.size > 1) {
 | |
|       displayName = others
 | |
|         .take(2)
 | |
|         .map((a) => (
 | |
|           <bdi key={a.get('id')}>
 | |
|             <strong
 | |
|               className='display-name__html'
 | |
|               dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }}
 | |
|             />
 | |
|           </bdi>
 | |
|         ))
 | |
|         .reduce((prev, cur) => [prev, ', ', cur]);
 | |
| 
 | |
|       if (others.size - 2 > 0) {
 | |
|         suffix = `+${others.size - 2}`;
 | |
|       }
 | |
|     } else if (account) {
 | |
|       let acct = account.get('acct');
 | |
| 
 | |
|       if (!acct.includes('@') && localDomain) {
 | |
|         acct = `${acct}@${localDomain}`;
 | |
|       }
 | |
| 
 | |
|       displayName = (
 | |
|         <bdi>
 | |
|           <strong
 | |
|             className='display-name__html'
 | |
|             dangerouslySetInnerHTML={{
 | |
|               __html: account.get('display_name_html'),
 | |
|             }}
 | |
|           />
 | |
|         </bdi>
 | |
|       );
 | |
|       suffix = <span className='display-name__account'>@{acct}</span>;
 | |
|     } else {
 | |
|       displayName = (
 | |
|         <bdi>
 | |
|           <strong className='display-name__html'>
 | |
|             <Skeleton width='10ch' />
 | |
|           </strong>
 | |
|         </bdi>
 | |
|       );
 | |
|       suffix = (
 | |
|         <span className='display-name__account'>
 | |
|           <Skeleton width='7ch' />
 | |
|         </span>
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return (
 | |
|       <span
 | |
|         className='display-name'
 | |
|         onMouseEnter={this.handleMouseEnter}
 | |
|         onMouseLeave={this.handleMouseLeave}
 | |
|       >
 | |
|         {displayName} {suffix}
 | |
|       </span>
 | |
|     );
 | |
|   }
 | |
| }
 |