Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 09e8a45

Browse files
committed
Add EmojiText component for emoji replacement.
1 parent dbbea63 commit 09e8a45

File tree

10 files changed

+59
-38
lines changed

10 files changed

+59
-38
lines changed

src/components/structures/RoomStatusBar.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ var sdk = require('../../index');
1919
var dis = require("../../dispatcher");
2020
var WhoIsTyping = require("../../WhoIsTyping");
2121
var MatrixClientPeg = require("../../MatrixClientPeg");
22-
import {emojifyText} from '../../HtmlUtils';
22+
import EmojiText from '../views/elements/EmojiText';
2323

2424
module.exports = React.createClass({
2525
displayName: 'RoomStatusBar',
@@ -260,11 +260,10 @@ module.exports = React.createClass({
260260
}
261261

262262
var typingString = this.state.whoisTypingString;
263-
const typingHtml = emojifyText(typingString);
264263
if (typingString) {
265264
return (
266265
<div className="mx_RoomStatusBar_typingBar">
267-
<span dangerouslySetInnerHTML={typingHtml} />
266+
<EmojiText>{typingString}</EmojiText>
268267
</div>
269268
);
270269
}

src/components/views/avatars/BaseAvatar.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ limitations under the License.
1818

1919
var React = require('react');
2020
var AvatarLogic = require("../../../Avatar");
21-
import {emojifyText} from '../../../HtmlUtils';
21+
import EmojiText from '../../views/elements/EmojiText';
2222

2323
module.exports = React.createClass({
2424
displayName: 'BaseAvatar',
@@ -142,15 +142,13 @@ module.exports = React.createClass({
142142
} = this.props;
143143

144144
if (imageUrl === this.state.defaultImageUrl) {
145-
var initialLetter = emojifyText(this._getInitialLetter(name));
145+
const initialLetter = this._getInitialLetter(name);
146146
return (
147147
<span className="mx_BaseAvatar" {...otherProps}>
148-
<span className="mx_BaseAvatar_initial" aria-hidden="true"
148+
<EmojiText className="mx_BaseAvatar_initial" aria-hidden="true"
149149
style={{ fontSize: (width * 0.65) + "px",
150150
width: width + "px",
151-
lineHeight: height + "px" }}
152-
dangerouslySetInnerHTML={initialLetter}>
153-
</span>
151+
lineHeight: height + "px" }}>{initialLetter}</EmojiText>
154152
<img className="mx_BaseAvatar_image" src={imageUrl}
155153
alt="" title={title} onError={this.onError}
156154
width={width} height={height} />
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
Copyright 2016 Aviral Dasgupta
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import React from 'react';
18+
import {emojifyText} from '../../../HtmlUtils';
19+
20+
export default function EmojiText(props) {
21+
const {element, children, ...restProps} = props;
22+
restProps.dangerouslySetInnerHTML = emojifyText(children);
23+
return React.createElement(element, restProps);
24+
}
25+
26+
EmojiText.propTypes = {
27+
element: React.PropTypes.string,
28+
children: React.PropTypes.string.isRequired,
29+
};
30+
31+
EmojiText.defaultProps = {
32+
element: 'span',
33+
};

src/components/views/messages/SenderProfile.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
'use strict';
1818

1919
import React from 'react';
20-
import {emojifyText} from '../../../HtmlUtils';
20+
import EmojiText from '../elements/EmojiText';
2121

2222
export default function SenderProfile(props) {
2323
const {mxEvent} = props;
@@ -29,10 +29,8 @@ export default function SenderProfile(props) {
2929
}
3030

3131
return (
32-
<span className="mx_SenderProfile"
33-
dangerouslySetInnerHTML={emojifyText(`${name || ''} ${props.aux || ''}`)}
34-
onClick={props.onClick}>
35-
</span>
32+
<EmojiText className="mx_SenderProfile"
33+
onClick={props.onClick}>{`${name || ''} ${props.aux || ''}`}</EmojiText>
3634
);
3735
}
3836

src/components/views/messages/TextualBody.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var linkify = require('linkifyjs');
2323
var linkifyElement = require('linkifyjs/element');
2424
var linkifyMatrix = require('../../../linkify-matrix');
2525
var sdk = require('../../../index');
26-
import {emojifyText} from '../../../HtmlUtils';
26+
import EmojiText from '../../views/elements/EmojiText';
2727

2828
linkifyMatrix(linkify);
2929

@@ -202,10 +202,9 @@ module.exports = React.createClass({
202202
switch (content.msgtype) {
203203
case "m.emote":
204204
const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender();
205-
const nameHtml = emojifyText(name);
206205
return (
207206
<span ref="content" className="mx_MEmoteBody mx_EventTile_content">
208-
* <span dangerouslySetInnerHTML={nameHtml} /> { body }
207+
* <EmojiText>{name}</EmojiText> { body }
209208
{ widgets }
210209
</span>
211210
);

src/components/views/messages/TextualEvent.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ limitations under the License.
1919
var React = require('react');
2020

2121
var TextForEvent = require('../../../TextForEvent');
22-
import {emojifyText} from '../../../HtmlUtils';
22+
import EmojiText from '../elements/EmojiText';
2323

2424
module.exports = React.createClass({
2525
displayName: 'TextualEvent',
@@ -33,11 +33,8 @@ module.exports = React.createClass({
3333
render: function() {
3434
var text = TextForEvent.textForEvent(this.props.mxEvent);
3535
if (text == null || text.length === 0) return null;
36-
let textHTML = emojifyText(TextForEvent.textForEvent(this.props.mxEvent));
37-
3836
return (
39-
<div className="mx_TextualEvent" dangerouslySetInnerHTML={textHTML}>
40-
</div>
37+
<EmojiText element="div" className="mx_TextualEvent">{text}</EmojiText>
4138
);
4239
},
4340
});

src/components/views/rooms/EntityTile.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var React = require('react');
2020

2121
var MatrixClientPeg = require('../../../MatrixClientPeg');
2222
var sdk = require('../../../index');
23-
import {emojifyText} from '../../../HtmlUtils';
23+
import EmojiText from '../elements/EmojiText';
2424

2525

2626
var PRESENCE_CLASS = {
@@ -103,7 +103,7 @@ module.exports = React.createClass({
103103
var mainClassName = "mx_EntityTile ";
104104
mainClassName += presenceClass + (this.props.className ? (" " + this.props.className) : "");
105105
var nameEl;
106-
let nameHTML = emojifyText(this.props.name);
106+
const {name} = this.props;
107107

108108
if (this.state.hover && !this.props.suppressOnHover) {
109109
var activeAgo = this.props.presenceLastActiveAgo ?
@@ -114,7 +114,7 @@ module.exports = React.createClass({
114114
nameEl = (
115115
<div className="mx_EntityTile_details">
116116
<img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12"/>
117-
<div className="mx_EntityTile_name_hover" dangerouslySetInnerHTML={nameHTML}></div>
117+
<EmojiText element="div" className="mx_EntityTile_name_hover">{name}</EmojiText>
118118
<PresenceLabel activeAgo={ activeAgo }
119119
currentlyActive={this.props.presenceCurrentlyActive}
120120
presenceState={this.props.presenceState} />
@@ -123,8 +123,7 @@ module.exports = React.createClass({
123123
}
124124
else {
125125
nameEl = (
126-
<div className="mx_EntityTile_name" dangerouslySetInnerHTML={nameHTML}>
127-
</div>
126+
<EmojiText element="div" className="mx_EntityTile_name">{name}</EmojiText>
128127
);
129128
}
130129

src/components/views/rooms/MemberInfo.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var Modal = require("../../../Modal");
3232
var sdk = require('../../../index');
3333
var UserSettingsStore = require('../../../UserSettingsStore');
3434
var createRoom = require('../../../createRoom');
35-
import {emojifyText} from '../../../HtmlUtils';
35+
import EmojiText from '../elements/EmojiText';
3636

3737
module.exports = React.createClass({
3838
displayName: 'MemberInfo',
@@ -637,7 +637,7 @@ module.exports = React.createClass({
637637
</div>
638638
}
639639

640-
let memberNameHTML = emojifyText(this.props.member.name);
640+
const memberName = this.props.member.name;
641641

642642
var MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
643643
var PowerSelector = sdk.getComponent('elements.PowerSelector');
@@ -648,7 +648,7 @@ module.exports = React.createClass({
648648
<MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} />
649649
</div>
650650

651-
<h2 dangerouslySetInnerHTML={memberNameHTML}></h2>
651+
<EmojiText element="h2">{memberNameHTML}</EmojiText>
652652

653653
<div className="mx_MemberInfo_profile">
654654
<div className="mx_MemberInfo_profileField">

src/components/views/rooms/RoomHeader.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ var Modal = require("../../../Modal");
2424
var linkify = require('linkifyjs');
2525
var linkifyElement = require('linkifyjs/element');
2626
var linkifyMatrix = require('../../../linkify-matrix');
27-
import {emojifyText} from '../../../HtmlUtils';
27+
import EmojiText from '../elements/EmojiText';
2828

2929
linkifyMatrix(linkify);
3030

@@ -212,13 +212,12 @@ module.exports = React.createClass({
212212
roomName = this.props.room.name;
213213
}
214214

215-
let roomNameHTML = emojifyText(roomName);
216215

217216
name =
218217
<div className="mx_RoomHeader_name" onClick={this.props.onSettingsClick}>
219-
<div className={ "mx_RoomHeader_nametext " + (settingsHint ? "mx_RoomHeader_settingsHint" : "") } title={ roomName } dangerouslySetInnerHTML={roomNameHTML}></div>
218+
<EmojiText element="div" className={ "mx_RoomHeader_nametext " + (settingsHint ? "mx_RoomHeader_settingsHint" : "") } title={ roomName }>{roomName}</EmojiText>
220219
{ searchStatus }
221-
</div>
220+
</div>;
222221
}
223222

224223
if (can_set_room_topic) {

src/components/views/rooms/RoomTile.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var dis = require("../../../dispatcher");
2222
var MatrixClientPeg = require('../../../MatrixClientPeg');
2323
var sdk = require('../../../index');
2424
var ContextualMenu = require('../../structures/ContextualMenu');
25-
import {emojifyText} from '../../../HtmlUtils';
25+
import EmojiText from '../elements/EmojiText';
2626

2727
module.exports = React.createClass({
2828
displayName: 'RoomTile',
@@ -196,13 +196,12 @@ module.exports = React.createClass({
196196
'mx_RoomTile_badgeShown': this.props.highlight || (notificationCount > 0 && !this.state.areNotifsMuted) || this.state.badgeHover || this.state.menu,
197197
});
198198

199-
let nameHTML = emojifyText(name);
200199
if (this.props.selected) {
201-
let nameSelected = <span dangerouslySetInnerHTML={nameHTML}></span>;
200+
let nameSelected = <EmojiText>{name}</EmojiText>;
202201

203202
label = <div title={ name } className={ nameClasses }>{ nameSelected }</div>;
204203
} else {
205-
label = <div title={ name } className={ nameClasses } dangerouslySetInnerHTML={nameHTML}></div>;
204+
label = <EmojiText element="div" title={ name } className={ nameClasses }>{name}</EmojiText>;
206205
}
207206
}
208207
else if (this.state.hover) {

0 commit comments

Comments
 (0)