diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-15 18:38:57 +0100 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-15 18:38:57 +0100 |
commit | 489bd99803cde976d78c312b0079d8de50f3617c (patch) | |
tree | ede8d0905f82850931446bdc5f0320a6dbc375bd /app/assets | |
parent | 4f07fb1f0aee6d37d8b3c5fe0088cf36b3926372 (diff) |
Support emojis in display name, bio
Diffstat (limited to 'app/assets')
5 files changed, 33 insertions, 17 deletions
diff --git a/app/assets/javascripts/components/components/display_name.jsx b/app/assets/javascripts/components/components/display_name.jsx index a6e4ed996..053b5290c 100644 --- a/app/assets/javascripts/components/components/display_name.jsx +++ b/app/assets/javascripts/components/components/display_name.jsx @@ -1,5 +1,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PureRenderMixin from 'react-addons-pure-render-mixin'; +import escapeTextContentForBrowser from 'react/lib/escapeTextContentForBrowser'; +import emojify from '../emoji'; const DisplayName = React.createClass({ @@ -10,15 +12,12 @@ const DisplayName = React.createClass({ mixins: [PureRenderMixin], render () { - let displayName = this.props.account.get('display_name'); - - if (displayName.length === 0) { - displayName = this.props.account.get('username'); - } + const displayName = this.props.account.get('display_name').length === 0 ? this.props.account.get('username') : this.props.account.get('display_name'); + const displayNameHTML = { __html: emojify(escapeTextContentForBrowser(displayName)) }; return ( - <span style={{ display: 'block', maxWidth: '100%', overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }}> - <strong style={{ fontWeight: 'bold' }}>{displayName}</strong> <span style={{ fontSize: '14px' }}>@{this.props.account.get('acct')}</span> + <span style={{ display: 'block', maxWidth: '100%', overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }} className='display-name'> + <strong style={{ fontWeight: '500' }} dangerouslySetInnerHTML={displayNameHTML} /> <span style={{ fontSize: '14px' }}>@{this.props.account.get('acct')}</span> </span> ); } diff --git a/app/assets/javascripts/components/components/status_content.jsx b/app/assets/javascripts/components/components/status_content.jsx index 583f4cec6..eeb43a12c 100644 --- a/app/assets/javascripts/components/components/status_content.jsx +++ b/app/assets/javascripts/components/components/status_content.jsx @@ -1,10 +1,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PureRenderMixin from 'react-addons-pure-render-mixin'; -import emojione from 'emojione'; - -emojione.imageType = 'png'; -emojione.sprites = false; -emojione.imagePathPNG = '/emoji/'; +import emojify from '../emoji'; const StatusContent = React.createClass({ @@ -61,7 +57,7 @@ const StatusContent = React.createClass({ }, render () { - const content = { __html: emojione.unicodeToImage(this.props.status.get('content')) }; + const content = { __html: emojify(this.props.status.get('content')) }; return <div className='status__content' style={{ cursor: 'pointer' }} dangerouslySetInnerHTML={content} onClick={this.props.onClick} />; }, diff --git a/app/assets/javascripts/components/emoji.jsx b/app/assets/javascripts/components/emoji.jsx new file mode 100644 index 000000000..a06c75953 --- /dev/null +++ b/app/assets/javascripts/components/emoji.jsx @@ -0,0 +1,9 @@ +import emojione from 'emojione'; + +emojione.imageType = 'png'; +emojione.sprites = false; +emojione.imagePathPNG = '/emoji/'; + +export default function emojify(text) { + return emojione.unicodeToImage(text); +}; diff --git a/app/assets/javascripts/components/features/account/components/header.jsx b/app/assets/javascripts/components/features/account/components/header.jsx index 062f4a0f2..7a086c99a 100644 --- a/app/assets/javascripts/components/features/account/components/header.jsx +++ b/app/assets/javascripts/components/features/account/components/header.jsx @@ -1,5 +1,7 @@ -import PureRenderMixin from 'react-addons-pure-render-mixin'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import emojify from '../../../emoji'; +import escapeTextContentForBrowser from 'react/lib/escapeTextContentForBrowser'; const Header = React.createClass({ @@ -14,7 +16,7 @@ const Header = React.createClass({ const { account, me } = this.props; let displayName = account.get('display_name'); - let info = ''; + let info = ''; if (displayName.length === 0) { displayName = account.get('username'); @@ -24,7 +26,8 @@ const Header = React.createClass({ info = <span style={{ position: 'absolute', top: '10px', right: '10px', opacity: '0.7', display: 'inline-block', verticalAlign: 'top', background: 'rgba(0, 0, 0, 0.4)', color: '#fff', textTransform: 'uppercase', fontSize: '11px', fontWeight: '500', padding: '4px', borderRadius: '4px' }}>Follows you</span> } - const content = { __html: account.get('note') }; + const content = { __html: emojify(account.get('note')) }; + const displayNameHTML = { __html: emojify(escapeTextContentForBrowser(displayName)) }; return ( <div style={{ flex: '0 0 auto', background: '#2f3441', textAlign: 'center', backgroundImage: `url(${account.get('header')})`, backgroundSize: 'cover', position: 'relative' }}> @@ -34,7 +37,7 @@ const Header = React.createClass({ <img src={account.get('avatar')} alt='' style={{ display: 'block', width: '90px', height: '90px', borderRadius: '90px' }} /> </div> - <span style={{ display: 'inline-block', color: '#fff', fontSize: '20px', lineHeight: '27px', fontWeight: '500' }}>{displayName}</span> + <span style={{ display: 'inline-block', color: '#fff', fontSize: '20px', lineHeight: '27px', fontWeight: '500' }} className='account__header__display-name' dangerouslySetInnerHTML={displayNameHTML} /> </a> <span style={{ fontSize: '14px', fontWeight: '400', display: 'block', color: '#2b90d9', marginBottom: '10px' }}>@{account.get('acct')}</span> diff --git a/app/assets/stylesheets/components.scss b/app/assets/stylesheets/components.scss index 2cd58bb2b..c15a827a4 100644 --- a/app/assets/stylesheets/components.scss +++ b/app/assets/stylesheets/components.scss @@ -76,6 +76,8 @@ font-size: inherit; vertical-align: middle; margin: -.2ex .15em .2ex; + width: 16px; + height: 16px; img { width: auto; @@ -166,6 +168,13 @@ } } +.account__header__display-name { + .emojione { + width: 25px; + height: 25px; + } +} + .status__display-name, .status__relative-time, .detailed-status__display-name, .detailed-status__datetime, .account__display-name { text-decoration: none; } |