diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js index a49703bb11af13c612b110efbbb70d9ac0fe92f7..d91b4849754e1c54715d2ad32b9eb871c86bbda0 100644 --- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js +++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js @@ -51,7 +51,7 @@ describe('emoji', () => { }); it('does an emoji that has no shortcode', () => { - expect(emojify('🕉ï¸')).toEqual('<img draggable="false" class="emojione" alt="🕉ï¸" title="" src="/emoji/1f549.svg" />'); + expect(emojify('ðŸ‘â€ðŸ—¨')).toEqual('<img draggable="false" class="emojione" alt="ðŸ‘â€ðŸ—¨" title="" src="/emoji/1f441-200d-1f5e8.svg" />'); }); it('does an emoji whose filename is irregular', () => { diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji_index-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji_index-test.js index 53efa57434ccfb858de46ef93c4c8f8e73bb7783..bd63d91b350f56a8d07ef08d9b9109ecb6a14122 100644 --- a/app/javascript/mastodon/features/emoji/__tests__/emoji_index-test.js +++ b/app/javascript/mastodon/features/emoji/__tests__/emoji_index-test.js @@ -44,6 +44,26 @@ describe('emoji_index', () => { expect(emojiIndex.search('apple').map(trimEmojis)).toEqual(expected); }); + it('erases custom emoji if not passed again', () => { + const custom = [ + { + id: 'mastodon', + name: 'mastodon', + short_names: ['mastodon'], + text: '', + emoticons: [], + keywords: ['mastodon'], + imageUrl: 'http://example.com', + custom: true, + }, + ]; + search('', { custom }); + emojiIndex.search('', { custom }); + const expected = []; + expect(search('masto').map(trimEmojis)).toEqual(expected); + expect(emojiIndex.search('masto').map(trimEmojis)).toEqual(expected); + }); + it('handles custom emoji', () => { const custom = [ { @@ -65,12 +85,12 @@ describe('emoji_index', () => { custom: true, }, ]; - expect(search('masto').map(trimEmojis)).toEqual(expected); - expect(emojiIndex.search('masto').map(trimEmojis)).toEqual(expected); + expect(search('masto', { custom }).map(trimEmojis)).toEqual(expected); + expect(emojiIndex.search('masto', { custom }).map(trimEmojis)).toEqual(expected); }); it('should filter only emojis we care about, exclude pineapple', () => { - const emojisToShowFilter = unified => unified !== '1F34D'; + const emojisToShowFilter = emoji => emoji.unified !== '1F34D'; expect(search('apple', { emojisToShowFilter }).map((obj) => obj.id)) .not.toContain('pineapple'); expect(emojiIndex.search('apple', { emojisToShowFilter }).map((obj) => obj.id)) diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js index e5b834a74e555e0aa477ae4bef1c450c4ee393f2..a8a5cff94955a2d536ee9a94ceafd8cc6c5a192a 100644 --- a/app/javascript/mastodon/features/emoji/emoji_compressed.js +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js @@ -9,7 +9,13 @@ const { unicodeToFilename } = require('./unicode_to_filename'); const { unicodeToUnifiedName } = require('./unicode_to_unified_name'); const emojiMap = require('./emoji_map.json'); const { emojiIndex } = require('emoji-mart'); -const { default: emojiMartData } = require('emoji-mart/dist/data'); +const { uncompress: emojiMartUncompress } = require('emoji-mart/dist/utils/data'); +let data = require('emoji-mart/data/all.json'); + +if(data.compressed) { + data = emojiMartUncompress(data); +} +const emojiMartData = data; const excluded = ['®', '©', 'â„¢']; const skins = ['ðŸ»', 'ðŸ¼', 'ðŸ½', 'ðŸ¾', 'ðŸ¿']; @@ -88,6 +94,6 @@ module.exports = JSON.parse(JSON.stringify([ shortCodesToEmojiData, emojiMartData.skins, emojiMartData.categories, - emojiMartData.short_names, + emojiMartData.aliases, emojisWithoutShortCodes, ])); diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js index 5755bf1c4c197318d0e4ead736dc093ced63e894..bf511d290303525238fa8dd0c6e3be109d892e6c 100644 --- a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js +++ b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js @@ -8,6 +8,7 @@ let originalPool = {}; let index = {}; let emojisList = {}; let emoticonsList = {}; +let customEmojisList = []; for (let emoji in data.emojis) { let emojiData = data.emojis[emoji]; @@ -28,7 +29,18 @@ for (let emoji in data.emojis) { originalPool[id] = emojiData; } +function clearCustomEmojis(pool) { + customEmojisList.forEach((emoji) => { + let emojiId = emoji.id || emoji.short_names[0]; + + delete pool[emojiId]; + delete emojisList[emojiId]; + }); +} + function addCustomToPool(custom, pool) { + if (customEmojisList.length) clearCustomEmojis(pool); + custom.forEach((emoji) => { let emojiId = emoji.id || emoji.short_names[0]; @@ -37,10 +49,14 @@ function addCustomToPool(custom, pool) { emojisList[emojiId] = getSanitizedData(emoji); } }); + + customEmojisList = custom; + index = {}; } function search(value, { emojisToShowFilter, maxResults, include, exclude, custom = [] } = {}) { - addCustomToPool(custom, originalPool); + if (customEmojisList !== custom) + addCustomToPool(custom, originalPool); maxResults = maxResults || 75; include = include || []; @@ -143,7 +159,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo if (results) { if (emojisToShowFilter) { - results = results.filter((result) => emojisToShowFilter(data.emojis[result.id].unified)); + results = results.filter((result) => emojisToShowFilter(data.emojis[result.id])); } if (results && results.length > maxResults) { diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.js b/app/javascript/mastodon/features/emoji/emoji_picker.js index 7e145381ea09be39caf49c24d00578863d4c5a91..044d38cb2b7c342dcab03655cd9e7e3b2a15086b 100644 --- a/app/javascript/mastodon/features/emoji/emoji_picker.js +++ b/app/javascript/mastodon/features/emoji/emoji_picker.js @@ -1,5 +1,5 @@ -import Picker from 'emoji-mart/dist-es/components/picker'; -import Emoji from 'emoji-mart/dist-es/components/emoji'; +import Picker from 'emoji-mart/dist-es/components/picker/picker'; +import Emoji from 'emoji-mart/dist-es/components/emoji/emoji'; export { Picker, diff --git a/public/emoji/sheet.png b/public/emoji/sheet.png index e9a3f23f86155b9cb51ac53a3bcd86b5332be930..3ee92a1f10a132005285825cc0168f5c48032a07 100644 Binary files a/public/emoji/sheet.png and b/public/emoji/sheet.png differ diff --git a/yarn.lock b/yarn.lock index 097e7706dfb44178727dfbde8aaad4b96eaec026..853e61b3767f967058fbe571dbcc9d78dc95456d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2304,8 +2304,8 @@ elliptic@^6.0.0: minimalistic-crypto-utils "^1.0.0" emoji-mart@Gargron/emoji-mart#build: - version "2.1.4" - resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/a5e1afe5ebcf2841e611d20d261b029581cbe051" + version "2.6.1" + resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/227c56c8a1cd89a475d4cf8d9605096555e12484" emoji-regex@^6.1.0: version "6.5.1"