From dbbea6322747420bc50ab7d83f9ca6883ddcee07 Mon Sep 17 00:00:00 2001 From: Aviral Dasgupta Date: Tue, 9 Aug 2016 21:40:05 +0530 Subject: [PATCH 1/4] Various fixes and improvements to emojification. - Use locally hosted emoji - Emojify SenderProfile and m.emote - Add emoji shortcodes as titles --- src/HtmlUtils.js | 35 +++++++++++++-- src/component-index.js | 1 + src/components/structures/RoomStatusBar.js | 4 +- .../views/messages/SenderProfile.js | 43 +++++++++++++++++++ src/components/views/messages/TextualBody.js | 6 ++- 5 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/components/views/messages/SenderProfile.js diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index 2ab635081f..c0792e6d14 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -24,8 +24,39 @@ import escape from 'lodash/escape'; import emojione from 'emojione'; import classNames from 'classnames'; +emojione.imagePathSVG = 'emojione/svg/'; +emojione.imageType = 'svg'; + const EMOJI_REGEX = new RegExp(emojione.unicodeRegexp+"+", "gi"); +/* modified from https://github.com/Ranks/emojione/blob/master/lib/js/emojione.js + * because we want to include emoji shortnames in title text + */ +export function unicodeToImage(str) { + let replaceWith, unicode, alt; + const mappedUnicode = emojione.mapUnicodeToShort(); + + str = str.replace(emojione.regUnicode, function(unicodeChar) { + if ( (typeof unicodeChar === 'undefined') || (unicodeChar === '') || (!(unicodeChar in emojione.jsEscapeMap)) ) { + // if the unicodeChar doesnt exist just return the entire match + return unicodeChar; + } + else { + // get the unicode codepoint from the actual char + unicode = emojione.jsEscapeMap[unicodeChar]; + + // depending on the settings, we'll either add the native unicode as the alt tag, otherwise the shortname + alt = (emojione.unicodeAlt) ? emojione.convert(unicode.toUpperCase()) : mappedUnicode[unicode]; + const title = mappedUnicode[unicode]; + + replaceWith = `${alt}`; + return replaceWith; + } + }); + + return str; +}; + var sanitizeHtmlParams = { allowedTags: [ 'font', // custom to matrix for IRC-style font coloring @@ -211,8 +242,7 @@ module.exports = { }; } safeBody = sanitizeHtml(body, sanitizeHtmlParams); - emojione.imageType = 'svg'; - safeBody = emojione.unicodeToImage(safeBody); + safeBody = unicodeToImage(safeBody); } finally { delete sanitizeHtmlParams.textFilter; @@ -239,7 +269,6 @@ module.exports = { }, emojifyText: function(text) { - emojione.imageType = 'svg'; return { __html: emojione.unicodeToImage(escape(text)), }; diff --git a/src/component-index.js b/src/component-index.js index 97f8882b82..d4bf2a7aab 100644 --- a/src/component-index.js +++ b/src/component-index.js @@ -72,6 +72,7 @@ module.exports.components['views.messages.MFileBody'] = require('./components/vi module.exports.components['views.messages.MImageBody'] = require('./components/views/messages/MImageBody'); module.exports.components['views.messages.MVideoBody'] = require('./components/views/messages/MVideoBody'); module.exports.components['views.messages.MessageEvent'] = require('./components/views/messages/MessageEvent'); +module.exports.components['views.messages.SenderProfile'] = require('./components/views/messages/SenderProfile'); module.exports.components['views.messages.TextualBody'] = require('./components/views/messages/TextualBody'); module.exports.components['views.messages.TextualEvent'] = require('./components/views/messages/TextualEvent'); module.exports.components['views.messages.UnknownBody'] = require('./components/views/messages/UnknownBody'); diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 9a0d3dbbdd..245117387e 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -19,6 +19,7 @@ var sdk = require('../../index'); var dis = require("../../dispatcher"); var WhoIsTyping = require("../../WhoIsTyping"); var MatrixClientPeg = require("../../MatrixClientPeg"); +import {emojifyText} from '../../HtmlUtils'; module.exports = React.createClass({ displayName: 'RoomStatusBar', @@ -259,10 +260,11 @@ module.exports = React.createClass({ } var typingString = this.state.whoisTypingString; + const typingHtml = emojifyText(typingString); if (typingString) { return (
- {typingString} +
); } diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js new file mode 100644 index 0000000000..e331e9843c --- /dev/null +++ b/src/components/views/messages/SenderProfile.js @@ -0,0 +1,43 @@ +/* + Copyright 2015, 2016 OpenMarket Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +'use strict'; + +import React from 'react'; +import {emojifyText} from '../../../HtmlUtils'; + +export default function SenderProfile(props) { + const {mxEvent} = props; + const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); + const {msgtype} = mxEvent.getContent(); + + if (msgtype === 'm.emote') { + return ; // emote message must include the name so don't duplicate it + } + + return ( + + + ); +} + +SenderProfile.propTypes = { + mxEvent: React.PropTypes.object.isRequired, // event whose sender we're showing + aux: React.PropTypes.string, // stuff to go after the sender name, if anything + onClick: React.PropTypes.func, +}; diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 8c6cf455dc..3c5d173e33 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -23,6 +23,7 @@ var linkify = require('linkifyjs'); var linkifyElement = require('linkifyjs/element'); var linkifyMatrix = require('../../../linkify-matrix'); var sdk = require('../../../index'); +import {emojifyText} from '../../../HtmlUtils'; linkifyMatrix(linkify); @@ -200,10 +201,11 @@ module.exports = React.createClass({ switch (content.msgtype) { case "m.emote": - var name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); + const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); + const nameHtml = emojifyText(name); return ( - * { name } { body } + * { body } { widgets } ); From 09e8a45cde5478b4bb53b9c82acc7bdb1e39a593 Mon Sep 17 00:00:00 2001 From: Aviral Dasgupta Date: Wed, 10 Aug 2016 00:31:51 +0530 Subject: [PATCH 2/4] Add EmojiText component for emoji replacement. --- src/components/structures/RoomStatusBar.js | 5 ++- src/components/views/avatars/BaseAvatar.js | 10 +++--- src/components/views/elements/EmojiText.js | 33 +++++++++++++++++++ .../views/messages/SenderProfile.js | 8 ++--- src/components/views/messages/TextualBody.js | 5 ++- src/components/views/messages/TextualEvent.js | 7 ++-- src/components/views/rooms/EntityTile.js | 9 +++-- src/components/views/rooms/MemberInfo.js | 6 ++-- src/components/views/rooms/RoomHeader.js | 7 ++-- src/components/views/rooms/RoomTile.js | 7 ++-- 10 files changed, 59 insertions(+), 38 deletions(-) create mode 100644 src/components/views/elements/EmojiText.js diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 245117387e..670fbe44da 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -19,7 +19,7 @@ var sdk = require('../../index'); var dis = require("../../dispatcher"); var WhoIsTyping = require("../../WhoIsTyping"); var MatrixClientPeg = require("../../MatrixClientPeg"); -import {emojifyText} from '../../HtmlUtils'; +import EmojiText from '../views/elements/EmojiText'; module.exports = React.createClass({ displayName: 'RoomStatusBar', @@ -260,11 +260,10 @@ module.exports = React.createClass({ } var typingString = this.state.whoisTypingString; - const typingHtml = emojifyText(typingString); if (typingString) { return (
- + {typingString}
); } diff --git a/src/components/views/avatars/BaseAvatar.js b/src/components/views/avatars/BaseAvatar.js index f0a36c6608..ef20c46461 100644 --- a/src/components/views/avatars/BaseAvatar.js +++ b/src/components/views/avatars/BaseAvatar.js @@ -18,7 +18,7 @@ limitations under the License. var React = require('react'); var AvatarLogic = require("../../../Avatar"); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../../views/elements/EmojiText'; module.exports = React.createClass({ displayName: 'BaseAvatar', @@ -142,15 +142,13 @@ module.exports = React.createClass({ } = this.props; if (imageUrl === this.state.defaultImageUrl) { - var initialLetter = emojifyText(this._getInitialLetter(name)); + const initialLetter = this._getInitialLetter(name); return ( - + lineHeight: height + "px" }}>{initialLetter} diff --git a/src/components/views/elements/EmojiText.js b/src/components/views/elements/EmojiText.js new file mode 100644 index 0000000000..cb6cd2ef5e --- /dev/null +++ b/src/components/views/elements/EmojiText.js @@ -0,0 +1,33 @@ +/* + Copyright 2016 Aviral Dasgupta + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import React from 'react'; +import {emojifyText} from '../../../HtmlUtils'; + +export default function EmojiText(props) { + const {element, children, ...restProps} = props; + restProps.dangerouslySetInnerHTML = emojifyText(children); + return React.createElement(element, restProps); +} + +EmojiText.propTypes = { + element: React.PropTypes.string, + children: React.PropTypes.string.isRequired, +}; + +EmojiText.defaultProps = { + element: 'span', +}; diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index e331e9843c..10957f87a9 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -17,7 +17,7 @@ 'use strict'; import React from 'react'; -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; export default function SenderProfile(props) { const {mxEvent} = props; @@ -29,10 +29,8 @@ export default function SenderProfile(props) { } return ( - - + {`${name || ''} ${props.aux || ''}`} ); } diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 3c5d173e33..1ed41b025a 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -23,7 +23,7 @@ var linkify = require('linkifyjs'); var linkifyElement = require('linkifyjs/element'); var linkifyMatrix = require('../../../linkify-matrix'); var sdk = require('../../../index'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../../views/elements/EmojiText'; linkifyMatrix(linkify); @@ -202,10 +202,9 @@ module.exports = React.createClass({ switch (content.msgtype) { case "m.emote": const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); - const nameHtml = emojifyText(name); return ( - * { body } + * {name} { body } { widgets } ); diff --git a/src/components/views/messages/TextualEvent.js b/src/components/views/messages/TextualEvent.js index 251a44a30a..32870f5dd4 100644 --- a/src/components/views/messages/TextualEvent.js +++ b/src/components/views/messages/TextualEvent.js @@ -19,7 +19,7 @@ limitations under the License. var React = require('react'); var TextForEvent = require('../../../TextForEvent'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; module.exports = React.createClass({ displayName: 'TextualEvent', @@ -33,11 +33,8 @@ module.exports = React.createClass({ render: function() { var text = TextForEvent.textForEvent(this.props.mxEvent); if (text == null || text.length === 0) return null; - let textHTML = emojifyText(TextForEvent.textForEvent(this.props.mxEvent)); - return ( -
-
+ {text} ); }, }); diff --git a/src/components/views/rooms/EntityTile.js b/src/components/views/rooms/EntityTile.js index 8a99b4c565..9e03e18d79 100644 --- a/src/components/views/rooms/EntityTile.js +++ b/src/components/views/rooms/EntityTile.js @@ -20,7 +20,7 @@ var React = require('react'); var MatrixClientPeg = require('../../../MatrixClientPeg'); var sdk = require('../../../index'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; var PRESENCE_CLASS = { @@ -103,7 +103,7 @@ module.exports = React.createClass({ var mainClassName = "mx_EntityTile "; mainClassName += presenceClass + (this.props.className ? (" " + this.props.className) : ""); var nameEl; - let nameHTML = emojifyText(this.props.name); + const {name} = this.props; if (this.state.hover && !this.props.suppressOnHover) { var activeAgo = this.props.presenceLastActiveAgo ? @@ -114,7 +114,7 @@ module.exports = React.createClass({ nameEl = (
-
+ {name} @@ -123,8 +123,7 @@ module.exports = React.createClass({ } else { nameEl = ( -
-
+ {name} ); } diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index c087e7dc71..77a0aae1d9 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -32,7 +32,7 @@ var Modal = require("../../../Modal"); var sdk = require('../../../index'); var UserSettingsStore = require('../../../UserSettingsStore'); var createRoom = require('../../../createRoom'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; module.exports = React.createClass({ displayName: 'MemberInfo', @@ -637,7 +637,7 @@ module.exports = React.createClass({
} - let memberNameHTML = emojifyText(this.props.member.name); + const memberName = this.props.member.name; var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); var PowerSelector = sdk.getComponent('elements.PowerSelector'); @@ -648,7 +648,7 @@ module.exports = React.createClass({ -

+ {memberNameHTML}
diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 8c1b2aaff8..7c842da97a 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -24,7 +24,7 @@ var Modal = require("../../../Modal"); var linkify = require('linkifyjs'); var linkifyElement = require('linkifyjs/element'); var linkifyMatrix = require('../../../linkify-matrix'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; linkifyMatrix(linkify); @@ -212,13 +212,12 @@ module.exports = React.createClass({ roomName = this.props.room.name; } - let roomNameHTML = emojifyText(roomName); name =
-
+ {roomName} { searchStatus } -
+
; } if (can_set_room_topic) { diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 111ead05b7..95a5981eb0 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -22,7 +22,7 @@ var dis = require("../../../dispatcher"); var MatrixClientPeg = require('../../../MatrixClientPeg'); var sdk = require('../../../index'); var ContextualMenu = require('../../structures/ContextualMenu'); -import {emojifyText} from '../../../HtmlUtils'; +import EmojiText from '../elements/EmojiText'; module.exports = React.createClass({ displayName: 'RoomTile', @@ -196,13 +196,12 @@ module.exports = React.createClass({ 'mx_RoomTile_badgeShown': this.props.highlight || (notificationCount > 0 && !this.state.areNotifsMuted) || this.state.badgeHover || this.state.menu, }); - let nameHTML = emojifyText(name); if (this.props.selected) { - let nameSelected = ; + let nameSelected = {name}; label =
{ nameSelected }
; } else { - label =
; + label = {name}; } } else if (this.state.hover) { From 1b414cad18519ee40d623732af256215e0459a74 Mon Sep 17 00:00:00 2001 From: Aviral Dasgupta Date: Wed, 10 Aug 2016 00:52:55 +0530 Subject: [PATCH 3/4] Add max-width to emoji completions. --- src/autocomplete/EmojiProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/autocomplete/EmojiProvider.js b/src/autocomplete/EmojiProvider.js index 574144e95b..37a50ee8d8 100644 --- a/src/autocomplete/EmojiProvider.js +++ b/src/autocomplete/EmojiProvider.js @@ -26,7 +26,7 @@ export default class EmojiProvider extends AutocompleteProvider { completion: shortnameToUnicode(shortname), component: (
- {shortname} +   {shortname}
), range, From 4c1dcb924be717f4955544f594df9b71c5f93de0 Mon Sep 17 00:00:00 2001 From: Aviral Dasgupta Date: Thu, 11 Aug 2016 07:55:12 +0530 Subject: [PATCH 4/4] reskindex and use sdk.getComponent for EmojiText --- src/component-index.js | 1 + src/components/structures/RoomStatusBar.js | 2 +- src/components/views/avatars/BaseAvatar.js | 3 ++- src/components/views/messages/SenderProfile.js | 3 ++- src/components/views/messages/TextualBody.js | 2 +- src/components/views/messages/TextualEvent.js | 3 ++- src/components/views/rooms/EntityTile.js | 2 +- src/components/views/rooms/MemberInfo.js | 2 +- src/components/views/rooms/RoomHeader.js | 2 +- src/components/views/rooms/RoomTile.js | 2 +- 10 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/component-index.js b/src/component-index.js index d4bf2a7aab..c7355b5b4c 100644 --- a/src/component-index.js +++ b/src/component-index.js @@ -54,6 +54,7 @@ module.exports.components['views.dialogs.SetDisplayNameDialog'] = require('./com module.exports.components['views.dialogs.TextInputDialog'] = require('./components/views/dialogs/TextInputDialog'); module.exports.components['views.elements.EditableText'] = require('./components/views/elements/EditableText'); module.exports.components['views.elements.EditableTextContainer'] = require('./components/views/elements/EditableTextContainer'); +module.exports.components['views.elements.EmojiText'] = require('./components/views/elements/EmojiText'); module.exports.components['views.elements.PowerSelector'] = require('./components/views/elements/PowerSelector'); module.exports.components['views.elements.ProgressBar'] = require('./components/views/elements/ProgressBar'); module.exports.components['views.elements.TintableSvg'] = require('./components/views/elements/TintableSvg'); diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 670fbe44da..c6f2d6500b 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -19,7 +19,6 @@ var sdk = require('../../index'); var dis = require("../../dispatcher"); var WhoIsTyping = require("../../WhoIsTyping"); var MatrixClientPeg = require("../../MatrixClientPeg"); -import EmojiText from '../views/elements/EmojiText'; module.exports = React.createClass({ displayName: 'RoomStatusBar', @@ -190,6 +189,7 @@ module.exports = React.createClass({ _getContent: function() { var TabCompleteBar = sdk.getComponent('rooms.TabCompleteBar'); var TintableSvg = sdk.getComponent("elements.TintableSvg"); + const EmojiText = sdk.getComponent('elements.EmojiText'); // no conn bar trumps unread count since you can't get unread messages // without a connection! (technically may already have some but meh) diff --git a/src/components/views/avatars/BaseAvatar.js b/src/components/views/avatars/BaseAvatar.js index ef20c46461..47f0a76891 100644 --- a/src/components/views/avatars/BaseAvatar.js +++ b/src/components/views/avatars/BaseAvatar.js @@ -18,7 +18,7 @@ limitations under the License. var React = require('react'); var AvatarLogic = require("../../../Avatar"); -import EmojiText from '../../views/elements/EmojiText'; +import sdk from '../../../index'; module.exports = React.createClass({ displayName: 'BaseAvatar', @@ -133,6 +133,7 @@ module.exports = React.createClass({ }, render: function() { + const EmojiText = sdk.getComponent('elements.EmojiText'); var imageUrl = this.state.imageUrls[this.state.urlsIndex]; const { diff --git a/src/components/views/messages/SenderProfile.js b/src/components/views/messages/SenderProfile.js index 10957f87a9..9e6fba2127 100644 --- a/src/components/views/messages/SenderProfile.js +++ b/src/components/views/messages/SenderProfile.js @@ -17,9 +17,10 @@ 'use strict'; import React from 'react'; -import EmojiText from '../elements/EmojiText'; +import sdk from '../../../index'; export default function SenderProfile(props) { + const EmojiText = sdk.getComponent('elements.EmojiText'); const {mxEvent} = props; const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender(); const {msgtype} = mxEvent.getContent(); diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 1ed41b025a..19ca9657c2 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -23,7 +23,6 @@ var linkify = require('linkifyjs'); var linkifyElement = require('linkifyjs/element'); var linkifyMatrix = require('../../../linkify-matrix'); var sdk = require('../../../index'); -import EmojiText from '../../views/elements/EmojiText'; linkifyMatrix(linkify); @@ -178,6 +177,7 @@ module.exports = React.createClass({ }, render: function() { + const EmojiText = sdk.getComponent('elements.EmojiText'); var mxEvent = this.props.mxEvent; var content = mxEvent.getContent(); var body = HtmlUtils.bodyToHtml(content, this.props.highlights, {}); diff --git a/src/components/views/messages/TextualEvent.js b/src/components/views/messages/TextualEvent.js index 32870f5dd4..7cab98ea84 100644 --- a/src/components/views/messages/TextualEvent.js +++ b/src/components/views/messages/TextualEvent.js @@ -19,7 +19,7 @@ limitations under the License. var React = require('react'); var TextForEvent = require('../../../TextForEvent'); -import EmojiText from '../elements/EmojiText'; +import sdk from '../../../index'; module.exports = React.createClass({ displayName: 'TextualEvent', @@ -31,6 +31,7 @@ module.exports = React.createClass({ }, render: function() { + const EmojiText = sdk.getComponent('elements.EmojiText'); var text = TextForEvent.textForEvent(this.props.mxEvent); if (text == null || text.length === 0) return null; return ( diff --git a/src/components/views/rooms/EntityTile.js b/src/components/views/rooms/EntityTile.js index 9e03e18d79..d29137ffc2 100644 --- a/src/components/views/rooms/EntityTile.js +++ b/src/components/views/rooms/EntityTile.js @@ -20,7 +20,6 @@ var React = require('react'); var MatrixClientPeg = require('../../../MatrixClientPeg'); var sdk = require('../../../index'); -import EmojiText from '../elements/EmojiText'; var PRESENCE_CLASS = { @@ -105,6 +104,7 @@ module.exports = React.createClass({ var nameEl; const {name} = this.props; + const EmojiText = sdk.getComponent('elements.EmojiText'); if (this.state.hover && !this.props.suppressOnHover) { var activeAgo = this.props.presenceLastActiveAgo ? (Date.now() - (this.props.presenceLastTs - this.props.presenceLastActiveAgo)) : -1; diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index 77a0aae1d9..0cca402be6 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -32,7 +32,6 @@ var Modal = require("../../../Modal"); var sdk = require('../../../index'); var UserSettingsStore = require('../../../UserSettingsStore'); var createRoom = require('../../../createRoom'); -import EmojiText from '../elements/EmojiText'; module.exports = React.createClass({ displayName: 'MemberInfo', @@ -641,6 +640,7 @@ module.exports = React.createClass({ var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); var PowerSelector = sdk.getComponent('elements.PowerSelector'); + const EmojiText = sdk.getComponent('elements.EmojiText'); return (
diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index 7c842da97a..ff023ee043 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -24,7 +24,6 @@ var Modal = require("../../../Modal"); var linkify = require('linkifyjs'); var linkifyElement = require('linkifyjs/element'); var linkifyMatrix = require('../../../linkify-matrix'); -import EmojiText from '../elements/EmojiText'; linkifyMatrix(linkify); @@ -145,6 +144,7 @@ module.exports = React.createClass({ var RoomAvatar = sdk.getComponent("avatars.RoomAvatar"); var ChangeAvatar = sdk.getComponent("settings.ChangeAvatar"); var TintableSvg = sdk.getComponent("elements.TintableSvg"); + const EmojiText = sdk.getComponent('elements.EmojiText'); var header; var name = null; diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 95a5981eb0..07b4f2618b 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -22,7 +22,6 @@ var dis = require("../../../dispatcher"); var MatrixClientPeg = require('../../../MatrixClientPeg'); var sdk = require('../../../index'); var ContextualMenu = require('../../structures/ContextualMenu'); -import EmojiText from '../elements/EmojiText'; module.exports = React.createClass({ displayName: 'RoomTile', @@ -187,6 +186,7 @@ module.exports = React.createClass({ badge =
{ badgeContent }
; + const EmojiText = sdk.getComponent('elements.EmojiText'); var label; var tooltip; if (!this.props.collapsed) {