You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.9 KiB
121 lines
2.9 KiB
import React from 'react'; |
|
|
|
import type { List } from 'immutable'; |
|
|
|
import type { Account } from '../../types/resources'; |
|
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> |
|
); |
|
} |
|
}
|
|
|