From e58d844e5bd237725daa9b929753341d613d80db Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 20 May 2019 14:20:36 +0200 Subject: [PATCH] move getInitialLetter to Avatar so we can reuse it for editor pills --- src/Avatar.js | 32 ++++++++++++++++++++++ src/components/views/avatars/BaseAvatar.js | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Avatar.js b/src/Avatar.js index 99b558fa93..67608da53d 100644 --- a/src/Avatar.js +++ b/src/Avatar.js @@ -58,4 +58,36 @@ module.exports = { } return require('../res/img/' + images[total % images.length] + '.png'); }, + + /** + * returns the first (non-sigil) character of 'name', + * converted to uppercase + */ + getInitialLetter(name) { + if (name.length < 1) { + return undefined; + } + + let idx = 0; + const initial = name[0]; + if ((initial === '@' || initial === '#' || initial === '+') && name[1]) { + idx++; + } + + // string.codePointAt(0) would do this, but that isn't supported by + // some browsers (notably PhantomJS). + let chars = 1; + const first = name.charCodeAt(idx); + + // check if it’s the start of a surrogate pair + if (first >= 0xD800 && first <= 0xDBFF && name[idx+1]) { + const second = name.charCodeAt(idx+1); + if (second >= 0xDC00 && second <= 0xDFFF) { + chars++; + } + } + + const firstChar = name.substring(idx, idx+chars); + return firstChar.toUpperCase(); + }, }; diff --git a/src/components/views/avatars/BaseAvatar.js b/src/components/views/avatars/BaseAvatar.js index 47de7c9dc4..10fb4f824a 100644 --- a/src/components/views/avatars/BaseAvatar.js +++ b/src/components/views/avatars/BaseAvatar.js @@ -176,7 +176,7 @@ module.exports = React.createClass({ } = this.props; if (imageUrl === this.state.defaultImageUrl) { - const initialLetter = this._getInitialLetter(name); + const initialLetter = AvatarLogic.getInitialLetter(name); const textNode = (