about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-11-15 18:38:57 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-11-15 18:38:57 +0100
commit489bd99803cde976d78c312b0079d8de50f3617c (patch)
treeede8d0905f82850931446bdc5f0320a6dbc375bd /app
parent4f07fb1f0aee6d37d8b3c5fe0088cf36b3926372 (diff)
Support emojis in display name, bio
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/components/components/display_name.jsx13
-rw-r--r--app/assets/javascripts/components/components/status_content.jsx8
-rw-r--r--app/assets/javascripts/components/emoji.jsx9
-rw-r--r--app/assets/javascripts/components/features/account/components/header.jsx11
-rw-r--r--app/assets/stylesheets/components.scss9
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;
 }