diff --git a/app/soapbox/actions/compose.ts b/app/soapbox/actions/compose.ts index d37330d289..23913de151 100644 --- a/app/soapbox/actions/compose.ts +++ b/app/soapbox/actions/compose.ts @@ -4,7 +4,7 @@ import { defineMessages, IntlShape } from 'react-intl'; import snackbar from 'soapbox/actions/snackbar'; import api from 'soapbox/api'; -import { search as emojiSearch } from 'soapbox/features/emoji/emoji_mart_search_light'; +import emojiSearch from 'soapbox/features/emoji/search'; import { tagHistory } from 'soapbox/settings'; import { isLoggedIn } from 'soapbox/utils/auth'; import { getFeatures, parseVersion } from 'soapbox/utils/features'; @@ -20,8 +20,8 @@ import { getSettings } from './settings'; import { createStatus } from './statuses'; import type { History } from 'history'; -import type { Emoji } from 'soapbox/components/autosuggest_emoji'; import type { AutoSuggestion } from 'soapbox/components/autosuggest_input'; +import type { Emoji } from 'soapbox/features/emoji'; import type { AppDispatch, RootState } from 'soapbox/store'; import type { Account, APIEntity, Status } from 'soapbox/types/entities'; diff --git a/app/soapbox/actions/emojis.ts b/app/soapbox/actions/emojis.ts index 04bda6c899..f3d33ac615 100644 --- a/app/soapbox/actions/emojis.ts +++ b/app/soapbox/actions/emojis.ts @@ -1,6 +1,6 @@ import { saveSettings } from './settings'; -import type { Emoji } from 'soapbox/components/autosuggest_emoji'; +import type { Emoji } from 'soapbox/features/emoji'; import type { AppDispatch } from 'soapbox/store'; const EMOJI_USE = 'EMOJI_USE'; diff --git a/app/soapbox/components/autosuggest_emoji.tsx b/app/soapbox/components/autosuggest_emoji.tsx index 22979d4542..5e3b37ff00 100644 --- a/app/soapbox/components/autosuggest_emoji.tsx +++ b/app/soapbox/components/autosuggest_emoji.tsx @@ -1,17 +1,10 @@ import React from 'react'; -import unicodeMapping from 'soapbox/features/emoji/emoji_unicode_mapping_light'; +import type { Emoji } from 'soapbox/features/emoji'; +import unicodeMapping from 'soapbox/features/emoji/mapping'; import { joinPublicPath } from 'soapbox/utils/static'; -export type Emoji = { - id: string, - custom: boolean, - imageUrl: string, - native: string, - colons: string, -} - -type UnicodeMapping = { +interface UnicodeMapping { filename: string, } @@ -25,14 +18,13 @@ const AutosuggestEmoji: React.FC = ({ emoji }) => { if (emoji.custom) { url = emoji.imageUrl; } else { - // @ts-ignore - const mapping: UnicodeMapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\uFE0F$/, '')]; + const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\uFE0F$/, '')]; if (!mapping) { return null; } - url = joinPublicPath(`packs/emoji/${mapping.filename}.svg`); + url = joinPublicPath(`packs/emoji/${mapping.unified}.svg`); } return ( diff --git a/app/soapbox/components/autosuggest_input.tsx b/app/soapbox/components/autosuggest_input.tsx index cd2c74a07e..a8b334d3fd 100644 --- a/app/soapbox/components/autosuggest_input.tsx +++ b/app/soapbox/components/autosuggest_input.tsx @@ -3,11 +3,12 @@ import { List as ImmutableList } from 'immutable'; import React from 'react'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import AutosuggestEmoji, { Emoji } from 'soapbox/components/autosuggest_emoji'; +import AutosuggestEmoji from 'soapbox/components/autosuggest_emoji'; import Icon from 'soapbox/components/icon'; import AutosuggestAccount from 'soapbox/features/compose/components/autosuggest_account'; import { isRtl } from 'soapbox/rtl'; +import type { Emoji } from 'soapbox/features/emoji'; import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu'; type CursorMatch = [ diff --git a/app/soapbox/components/icon_button.js b/app/soapbox/components/icon_button.js index b6ed8b3d46..b8434018e3 100644 Binary files a/app/soapbox/components/icon_button.js and b/app/soapbox/components/icon_button.js differ diff --git a/app/soapbox/features/chats/components/chat-message-list.tsx b/app/soapbox/features/chats/components/chat-message-list.tsx index 935a3707d7..28e065ccc2 100644 --- a/app/soapbox/features/chats/components/chat-message-list.tsx +++ b/app/soapbox/features/chats/components/chat-message-list.tsx @@ -15,7 +15,7 @@ import { openModal } from 'soapbox/actions/modals'; import { initReportById } from 'soapbox/actions/reports'; import { Text } from 'soapbox/components/ui'; import DropdownMenuContainer from 'soapbox/containers/dropdown_menu_container'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import Bundle from 'soapbox/features/ui/components/bundle'; import { MediaGallery } from 'soapbox/features/ui/util/async-components'; import { useAppSelector, useAppDispatch, useRefEventHandler } from 'soapbox/hooks'; diff --git a/app/soapbox/features/chats/components/chat.tsx b/app/soapbox/features/chats/components/chat.tsx index e2e4e90c19..6eed61fb27 100644 --- a/app/soapbox/features/chats/components/chat.tsx +++ b/app/soapbox/features/chats/components/chat.tsx @@ -5,7 +5,7 @@ import Avatar from 'soapbox/components/avatar'; import DisplayName from 'soapbox/components/display-name'; import Icon from 'soapbox/components/icon'; import { Counter } from 'soapbox/components/ui'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { useAppSelector } from 'soapbox/hooks'; import { makeGetChat } from 'soapbox/selectors'; @@ -30,7 +30,9 @@ const Chat: React.FC = ({ chatId, onClick }) => { const content = chat.getIn(['last_message', 'content']); const attachment = chat.getIn(['last_message', 'attachment']); const image = attachment && (attachment as any).getIn(['pleroma', 'mime_type'], '').startsWith('image/'); - const parsedContent = content ? emojify(content) : ''; + + // TODO: fix chat.getIn typings + const parsedContent = content ? emojify(content as string) : ''; return (
diff --git a/app/soapbox/features/compose/components/compose_form.js b/app/soapbox/features/compose/components/compose_form.js index 69dffd7de2..0bd15ab7ad 100644 Binary files a/app/soapbox/features/compose/components/compose_form.js and b/app/soapbox/features/compose/components/compose_form.js differ diff --git a/app/soapbox/features/compose/components/emoji_picker_dropdown.tsx b/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx similarity index 95% rename from app/soapbox/features/compose/components/emoji_picker_dropdown.tsx rename to app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx index 31722a5335..d47ed3a8bb 100644 --- a/app/soapbox/features/compose/components/emoji_picker_dropdown.tsx +++ b/app/soapbox/features/emoji/components/emoji_picker_dropdown.tsx @@ -8,11 +8,12 @@ import { usePopper } from 'react-popper'; import { IconButton } from 'soapbox/components/ui'; import { useSettings } from 'soapbox/hooks'; -import { buildCustomEmojis } from '../../emoji/emoji'; +import { buildCustomEmojis } from '../../emoji'; import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components'; -// import EmojiPicker from '../../emoji/emoji_picker'; +// import { Picker as EmojiPicker } from '../../emoji/emoji_picker'; import type { List } from 'immutable'; +import type { Emoji } from 'soapbox/features/emoji'; let EmojiPicker: any; // load asynchronously @@ -37,7 +38,7 @@ interface IEmojiPickerDropdown { custom_emojis: List, frequentlyUsedEmojis: string[], intl: any, - onPickEmoji: (emoji: any) => void, + onPickEmoji: (emoji: Emoji) => void, onSkinTone: () => void, skinTone: () => void, } @@ -72,7 +73,8 @@ const EmojiPickerDropdown: React.FC = ({ custom_emojis, fr } }; - const handlePick = (emoji: any) => { + const handlePick = (emoji: Emoji) => { + // TODO: remove me if (!emoji.native) { emoji.native = emoji.shortcodes; } diff --git a/app/soapbox/features/compose/containers/emoji_picker_dropdown_container.js b/app/soapbox/features/emoji/containers/emoji_picker_dropdown_container.js similarity index 100% rename from app/soapbox/features/compose/containers/emoji_picker_dropdown_container.js rename to app/soapbox/features/emoji/containers/emoji_picker_dropdown_container.js diff --git a/app/soapbox/features/emoji/data.ts b/app/soapbox/features/emoji/data.ts new file mode 100644 index 0000000000..ac5d3d0daf --- /dev/null +++ b/app/soapbox/features/emoji/data.ts @@ -0,0 +1,3 @@ +import data from '@emoji-mart/data/sets/14/twitter.json'; + +export default data; diff --git a/app/soapbox/features/emoji/emoji_mart_data_light.ts b/app/soapbox/features/emoji/emoji_mart_data_light.ts deleted file mode 100644 index 16d4107de0..0000000000 --- a/app/soapbox/features/emoji/emoji_mart_data_light.ts +++ /dev/null @@ -1,51 +0,0 @@ -// The output of this module is designed to mimic emoji-mart's -// "data" object, such that we can use it for a light version of emoji-mart's -// emojiIndex.search functionality. -// import emojiCompressed from './emoji_compressed'; -import { unicodeToUnifiedName } from './unicode_to_unified_name'; - -const [ shortCodesToEmojiData, skins, categories, short_names ] = [ - [], - [], - [], - [], -]; - -const emojis: Record = {}; - -// decompress -Object.keys(shortCodesToEmojiData).forEach((shortCode) => { - // @ts-ignore - const [ - _filenameData, // eslint-disable-line @typescript-eslint/no-unused-vars - searchData, - // @ts-ignore - ] = shortCodesToEmojiData[shortCode]; - const [ - native, - short_names, - search, - unified, - ] = searchData; - - emojis[shortCode] = { - native, - search, - short_names: [shortCode].concat(short_names), - unified: unified || unicodeToUnifiedName(native), - }; -}); - -export { - emojis, - skins, - categories, - short_names, -}; - -export default { - emojis, - skins, - categories, - short_names, -}; diff --git a/app/soapbox/features/emoji/emoji_mart_search_light.js b/app/soapbox/features/emoji/emoji_mart_search_light.js deleted file mode 100644 index 89e25785f8..0000000000 Binary files a/app/soapbox/features/emoji/emoji_mart_search_light.js and /dev/null differ diff --git a/app/soapbox/features/emoji/emoji_unicode_mapping_light.js b/app/soapbox/features/emoji/emoji_unicode_mapping_light.js deleted file mode 100644 index e340c34973..0000000000 Binary files a/app/soapbox/features/emoji/emoji_unicode_mapping_light.js and /dev/null differ diff --git a/app/soapbox/features/emoji/emoji_utils.js b/app/soapbox/features/emoji/emoji_utils.js deleted file mode 100644 index 1f4629edf9..0000000000 Binary files a/app/soapbox/features/emoji/emoji_utils.js and /dev/null differ diff --git a/app/soapbox/features/emoji/emoji.ts b/app/soapbox/features/emoji/index.ts similarity index 58% rename from app/soapbox/features/emoji/emoji.ts rename to app/soapbox/features/emoji/index.ts index dbefbdd5d8..676cfbcd73 100644 --- a/app/soapbox/features/emoji/emoji.ts +++ b/app/soapbox/features/emoji/index.ts @@ -1,41 +1,27 @@ -import data from '@emoji-mart/data'; +// import data from '@emoji-mart/data'; import { load as cheerioLoad } from 'cheerio'; import { parseDocument } from 'htmlparser2'; -import type EmojiData from '@emoji-mart/data'; +import unicodeMapping from './mapping'; + import type { Node as CheerioNode } from 'cheerio'; +import type { Emoji as EmojiMartEmoji } from 'emoji-mart'; -interface IUniMap { - [s: string]: { - unified: string, - shortcode: string, - } -} +// export interface Emoji { +// id: string, +// custom: boolean, +// imageUrl: string, +// native: string, +// colons: string, +// } -const generateMappings = (data: typeof EmojiData): IUniMap => { - const result = {}; - const emojis = Object.values(data.emojis ?? {}); - - for (const value of emojis) { - // @ts-ignore - for (const item of value.skins) { - const { unified, native } = item; - - // @ts-ignore - result[native] = { unified, shortcode: value.id }; - } - } - - return result; -}; - -const unicodeMapping = generateMappings(data); +export type Emoji = any; const isAlphaNumeric = (c: string) => { const code = c.charCodeAt(0); - if (!(code > 47 && code < 58) && // numeric (0-9) - !(code > 64 && code < 91) && // upper alpha (A-Z) + if (!(code > 47 && code < 58) && // numeric (0-9) + !(code > 64 && code < 91) && // upper alpha (A-Z) !(code > 96 && code < 123)) { // lower alpha (a-z) return false; } else { @@ -59,11 +45,11 @@ const convertUnicode = (c: string) => { return `${c}`; }; -const convertEmoji = (str: string, customEmojis: any, autoplay: boolean) => { +const convertEmoji = (str: string, customEmojis: any) => { if (str.length < 3) return str; if (str in customEmojis) { const emoji = customEmojis[str]; - const filename = autoplay ? emoji.url : emoji.static_url; + const filename = emoji.static_url; if (filename?.length > 0) { return convertCustom(str, filename); @@ -73,29 +59,33 @@ const convertEmoji = (str: string, customEmojis: any, autoplay: boolean) => { return str; }; -const popStack = (stack: string, open: boolean, res: string) => { - res += stack; +const popStack = (stack: string, open: boolean) => { + const ret = stack; open = false; stack = ''; + return ret; }; -const transmogrify = (str: string, customEmojis = {}, autoplay: boolean) => { +// TODO: handle grouped unicode emojis +export const emojifyText = (str: string, customEmojis = {}) => { let res = ''; let stack = ''; let open = false; - for (const c of Array.from(str)) { // Array.from respects unicode + for (const c of Array.from(str)) { // chunk by unicode codepoint with Array.from if (c in unicodeMapping) { if (open) { // unicode emoji inside colon - popStack(stack, open, res); + res += popStack(stack, open); } res += convertUnicode(c); + } else if (c === ':') { stack += ':'; + // we see another : we convert it and clear the stack buffer if (open) { - res += convertEmoji(stack, customEmojis, autoplay); + res += convertEmoji(stack, customEmojis); stack = ''; } @@ -104,8 +94,10 @@ const transmogrify = (str: string, customEmojis = {}, autoplay: boolean) => { if (open) { stack += c; + // if the stack is non-null and we see invalid chars it's a string not emoji + // so we push it to the return result and clear it if (!validEmojiChar(c)) { - popStack(stack, open, res); + res += popStack(stack, open); } } else { res += c; @@ -113,14 +105,26 @@ const transmogrify = (str: string, customEmojis = {}, autoplay: boolean) => { } } + // never found a closing colon so it's just a raw string + if (open) { + res += stack; + } + return res; }; +// const parseHmtl = (str: string) => { +// const ret = []; +// let depth = 0; +// +// return ret; +// } + const filterTextNodes = (idx: number, el: CheerioNode) => { return el.nodeType === Node.TEXT_NODE; }; -const emojify = (str: string | any, customEmojis = {}, autoplay = false) => { +const emojify = (str: string, customEmojis = {}) => { const dom = parseDocument(str); const $ = cheerioLoad(dom, { xmlMode: true, @@ -128,8 +132,8 @@ const emojify = (str: string | any, customEmojis = {}, autoplay = false) => { }); $.root() - .contents() - .filter(filterTextNodes) + .contents() // iterate over flat map of all html elements + .filter(filterTextNodes) // only iterate over text nodes .each((idx, el) => { // skip common case // @ts-ignore @@ -137,7 +141,7 @@ const emojify = (str: string | any, customEmojis = {}, autoplay = false) => { // mutating el.data is incorrect but we do it to prevent a second dom parse // @ts-ignore - el.data = transmogrify(el.data, customEmojis, autoplay); + el.data = emojifyText(el.data, customEmojis); }); return $.html(); @@ -145,12 +149,12 @@ const emojify = (str: string | any, customEmojis = {}, autoplay = false) => { export default emojify; -export const buildCustomEmojis = (customEmojis: any, autoplay = false) => { - const emojis: any[] = []; +export const buildCustomEmojis = (customEmojis: any) => { + const emojis: EmojiMartEmoji[] = []; customEmojis.forEach((emoji: any) => { const shortcode = emoji.get('shortcode'); - const url = autoplay ? emoji.get('url') : emoji.get('static_url'); + const url = emoji.get('static_url'); const name = shortcode.replace(':', ''); emojis.push({ diff --git a/app/soapbox/features/emoji/mapping.ts b/app/soapbox/features/emoji/mapping.ts new file mode 100644 index 0000000000..413db7e2d3 --- /dev/null +++ b/app/soapbox/features/emoji/mapping.ts @@ -0,0 +1,31 @@ +import emojiData from './data'; + +import type EmojiData from '@emoji-mart/data'; + +interface IUniMap { + [s: string]: { + unified: string, + shortcode: string, + } +} + +export const generateMappings = (data: typeof EmojiData): IUniMap => { + const result = {}; + const emojis = Object.values(data.emojis ?? {}); + + for (const value of emojis) { + // @ts-ignore + for (const item of value.skins) { + const { unified, native } = item; + + // @ts-ignore + result[native] = { unified, shortcode: value.id }; + } + } + + return result; +}; + +const unicodeMapping = generateMappings(emojiData); + +export default unicodeMapping; diff --git a/app/soapbox/features/emoji/search.ts b/app/soapbox/features/emoji/search.ts new file mode 100644 index 0000000000..ef31f1e276 --- /dev/null +++ b/app/soapbox/features/emoji/search.ts @@ -0,0 +1,17 @@ +export interface searchOptions { + maxResults?: number; +} + +export interface Emoji { + +} + +export const addCustomToPool = (customEmojis: Emoji[]) => { +}; + +const search = (str: string, options: searchOptions) => { + console.log(str, options); + return []; +}; + +export default search; diff --git a/app/soapbox/features/emoji/unicode_to_filename.js b/app/soapbox/features/emoji/unicode_to_filename.js deleted file mode 100644 index c75c4cd7d0..0000000000 Binary files a/app/soapbox/features/emoji/unicode_to_filename.js and /dev/null differ diff --git a/app/soapbox/features/emoji/unicode_to_unified_name.js b/app/soapbox/features/emoji/unicode_to_unified_name.js deleted file mode 100644 index d29550f122..0000000000 Binary files a/app/soapbox/features/emoji/unicode_to_unified_name.js and /dev/null differ diff --git a/app/soapbox/features/ui/components/link_footer.tsx b/app/soapbox/features/ui/components/link_footer.tsx index c2104fbcd4..d3ee72eb10 100644 --- a/app/soapbox/features/ui/components/link_footer.tsx +++ b/app/soapbox/features/ui/components/link_footer.tsx @@ -6,7 +6,7 @@ import { Link } from 'react-router-dom'; import { logOut } from 'soapbox/actions/auth'; import { Text } from 'soapbox/components/ui'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { useSoapboxConfig, useOwnAccount, useFeatures } from 'soapbox/hooks'; import sourceCode from 'soapbox/utils/code'; diff --git a/app/soapbox/normalizers/account.ts b/app/soapbox/normalizers/account.ts index 1a519b8a81..948787e4a3 100644 --- a/app/soapbox/normalizers/account.ts +++ b/app/soapbox/normalizers/account.ts @@ -11,7 +11,7 @@ import { fromJS, } from 'immutable'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { normalizeEmoji } from 'soapbox/normalizers/emoji'; import { unescapeHTML } from 'soapbox/utils/html'; import { mergeDefined, makeEmojiMap } from 'soapbox/utils/normalizers'; diff --git a/app/soapbox/normalizers/poll.ts b/app/soapbox/normalizers/poll.ts index 7b98d1354f..ec74071952 100644 --- a/app/soapbox/normalizers/poll.ts +++ b/app/soapbox/normalizers/poll.ts @@ -11,7 +11,7 @@ import { fromJS, } from 'immutable'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { normalizeEmoji } from 'soapbox/normalizers/emoji'; import { makeEmojiMap } from 'soapbox/utils/normalizers'; diff --git a/app/soapbox/normalizers/status_edit.ts b/app/soapbox/normalizers/status_edit.ts index 7bf38adc18..6f5d8d53ae 100644 --- a/app/soapbox/normalizers/status_edit.ts +++ b/app/soapbox/normalizers/status_edit.ts @@ -9,7 +9,7 @@ import { fromJS, } from 'immutable'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { normalizeAttachment } from 'soapbox/normalizers/attachment'; import { normalizeEmoji } from 'soapbox/normalizers/emoji'; import { normalizePoll } from 'soapbox/normalizers/poll'; diff --git a/app/soapbox/reducers/compose.ts b/app/soapbox/reducers/compose.ts index 3b861fb583..26a96a1899 100644 --- a/app/soapbox/reducers/compose.ts +++ b/app/soapbox/reducers/compose.ts @@ -59,7 +59,7 @@ import { normalizeAttachment } from '../normalizers/attachment'; import { unescapeHTML } from '../utils/html'; import type { AnyAction } from 'redux'; -import type { Emoji } from 'soapbox/components/autosuggest_emoji'; +import type { Emoji } from 'soapbox/features/emoji'; import type { Account as AccountEntity, APIEntity, diff --git a/app/soapbox/reducers/custom_emojis.ts b/app/soapbox/reducers/custom_emojis.ts index 477e7cce97..680088805f 100644 --- a/app/soapbox/reducers/custom_emojis.ts +++ b/app/soapbox/reducers/custom_emojis.ts @@ -1,10 +1,10 @@ import { List as ImmutableList, Map as ImmutableMap, fromJS } from 'immutable'; -import { emojis as emojiData } from 'soapbox/features/emoji/emoji_mart_data_light'; -import { addCustomToPool } from 'soapbox/features/emoji/emoji_mart_search_light'; +import { buildCustomEmojis } from 'soapbox/features/emoji'; +import { addCustomToPool } from 'soapbox/features/emoji/search'; +// import emojiData from 'soapbox/features/emoji/data'; import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom_emojis'; -import { buildCustomEmojis } from '../features/emoji/emoji'; import type { AnyAction } from 'redux'; import type { APIEntity } from 'soapbox/types/entities'; @@ -17,14 +17,18 @@ const autosuggestPopulate = (emojis: ImmutableList> }; const importEmojis = (customEmojis: APIEntity[]) => { - const emojis = (fromJS(customEmojis) as ImmutableList>).filter((emoji) => { - // If a custom emoji has the shortcode of a Unicode emoji, skip it. - // Otherwise it breaks EmojiMart. - // https://gitlab.com/soapbox-pub/soapbox-fe/-/issues/610 - const shortcode = emoji.get('shortcode', '').toLowerCase(); - return !emojiData[shortcode]; - }); + // const emojis = (fromJS(customEmojis)).filter((emoji) => { + // // If a custom emoji has the shortcode of a Unicode emoji, skip it. + // // Otherwise it breaks EmojiMart. + // // https://gitlab.com/soapbox-pub/soapbox-fe/-/issues/610 + // const shortcode = emoji.get('shortcode', '').toLowerCase(); + // return !emojiData.emojis[shortcode]; + // }); + // @ts-ignore + const emojis = fromJS(customEmojis); + + // @ts-ignore autosuggestPopulate(emojis); return emojis; }; diff --git a/app/soapbox/reducers/statuses.ts b/app/soapbox/reducers/statuses.ts index 22b9e5ac0a..8f2666db00 100644 --- a/app/soapbox/reducers/statuses.ts +++ b/app/soapbox/reducers/statuses.ts @@ -1,7 +1,7 @@ import escapeTextContentForBrowser from 'escape-html'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; -import emojify from 'soapbox/features/emoji/emoji'; +import emojify from 'soapbox/features/emoji'; import { normalizeStatus } from 'soapbox/normalizers'; import { simulateEmojiReact, simulateUnEmojiReact } from 'soapbox/utils/emoji_reacts'; import { stripCompatibilityFeatures, unescapeHTML } from 'soapbox/utils/html'; diff --git a/package.json b/package.json index ed0aa835a4..240b31ee40 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "emoji-datasource": "5.0.0", "emoji-mart": "^5.1.0", "emoji-mart-old": "npm:emoji-mart-lazyload", - "entities": "^3.0.1", + "entities": "^4.3.1", "es6-symbol": "^3.1.1", "escape-html": "^1.0.3", "exif-js": "^2.3.0", diff --git a/types/emoji-mart/index.d.ts b/types/emoji-mart/index.d.ts index 291e4e7d27..0a9b928554 100644 --- a/types/emoji-mart/index.d.ts +++ b/types/emoji-mart/index.d.ts @@ -1,6 +1,17 @@ declare module 'emoji-mart' { - export type PickerProps = { - custom?: { emojis: any[] }[], + export interface EmojiSkin { + src: string + } + + export interface Emoji { + id: string, + name: string, + keywords: string[], + skins: EmojiSkin[], + } + + export interface PickerProps { + custom?: { emojis: Emoji[] }[], set?: string, title?: string, theme?: string, diff --git a/yarn.lock b/yarn.lock index 9bebc92a1b..4963eb84da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5184,12 +5184,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -entities@^4.2.0, entities@^4.3.0: +entities@^4.2.0, entities@^4.3.0, entities@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==