diff --git a/.eslintrc.js b/.eslintrc.js
index 27afc3b43..6b9ace6d5 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -118,7 +118,7 @@ module.exports = {
},
{
files: ['ts/node/**/*.ts', 'ts/test/**/*.ts'],
- rules: { 'no-console': 'off' },
+ rules: { 'no-console': 'off', 'import/no-extraneous-dependencies': 'off' },
},
],
};
diff --git a/package.json b/package.json
index 40cae5167..c6a941cb8 100644
--- a/package.json
+++ b/package.json
@@ -71,8 +71,8 @@
"worker:libsession": "rimraf 'ts/webworker/workers/node/libsession/*.node' && webpack --config=./libsession.worker.config.js"
},
"dependencies": {
- "@emoji-mart/data": "^1.0.6",
- "@emoji-mart/react": "^1.0.1",
+ "@emoji-mart/data": "^1.1.2",
+ "@emoji-mart/react": "^1.1.1",
"@reduxjs/toolkit": "1.8.5",
"@signalapp/better-sqlite3": "^8.4.3",
"@types/react-mentions": "^4.1.8",
@@ -93,7 +93,7 @@
"dompurify": "^2.0.7",
"electron-localshortcut": "^3.2.1",
"electron-updater": "^4.2.2",
- "emoji-mart": "^5.2.2",
+ "emoji-mart": "^5.5.2",
"filesize": "3.6.1",
"firstline": "1.2.1",
"fs-extra": "9.0.0",
@@ -154,7 +154,6 @@
"@types/config": "0.0.34",
"@types/dompurify": "^2.0.0",
"@types/electron-localshortcut": "^3.1.0",
- "@types/emoji-mart": "3.0.9",
"@types/filesize": "3.6.0",
"@types/firstline": "^2.0.2",
"@types/fs-extra": "5.0.5",
diff --git a/ts/components/conversation/SessionEmojiPanel.tsx b/ts/components/conversation/SessionEmojiPanel.tsx
index 11d0ac9e9..c71af3d87 100644
--- a/ts/components/conversation/SessionEmojiPanel.tsx
+++ b/ts/components/conversation/SessionEmojiPanel.tsx
@@ -1,10 +1,10 @@
import React, { forwardRef } from 'react';
import classNames from 'classnames';
import styled from 'styled-components';
-import Picker from '@emoji-mart/react';
import { useSelector } from 'react-redux';
+import Picker from '@emoji-mart/react';
+
import { getTheme, isDarkTheme } from '../../state/selectors/theme';
-import { FixedBaseEmoji, FixedPickerProps } from '../../types/Reaction';
import {
COLORS,
ColorsType,
@@ -16,6 +16,7 @@ import {
import { hexColorToRGB } from '../../util/hexColorToRGB';
import { getPrimaryColor } from '../../state/selectors/primaryColor';
import { i18nEmojiData } from '../../util/emoji';
+import { FixedBaseEmoji } from '../../types/Reaction';
export const StyledEmojiPanel = styled.div<{
isModal: boolean;
@@ -90,7 +91,7 @@ type Props = {
onKeyDown?: (event: any) => void;
};
-const pickerProps: FixedPickerProps = {
+const pickerProps = {
title: '',
showPreview: true,
autoFocus: true,
diff --git a/ts/components/leftpane/overlay/OverlayCommunity.tsx b/ts/components/leftpane/overlay/OverlayCommunity.tsx
index 093941506..f64d1b3fe 100644
--- a/ts/components/leftpane/overlay/OverlayCommunity.tsx
+++ b/ts/components/leftpane/overlay/OverlayCommunity.tsx
@@ -102,7 +102,7 @@ export const OverlayCommunity = () => {
- void onTryJoinRoom()} alreadyJoining={loading} />
+ void onTryJoinRoom(url)} alreadyJoining={loading} />
);
};
diff --git a/ts/node/sql.ts b/ts/node/sql.ts
index c94186f3b..493339044 100644
--- a/ts/node/sql.ts
+++ b/ts/node/sql.ts
@@ -637,13 +637,13 @@ function getPubkeysInPublicConversation(conversationId: string) {
conversation.capabilities?.includes('blind')
);
- const whereClause = hasBlindOn ? 'AND source LIKE "15%"' : '';
+ const whereClause = hasBlindOn ? "AND source LIKE '15%'" : ''; // the LIKE content has to be ' and not "
const rows = assertGlobalInstance()
.prepare(
`SELECT DISTINCT source FROM ${MESSAGES_TABLE} WHERE
- conversationId = $conversationId ${whereClause}
- ORDER BY received_at DESC LIMIT ${MAX_PUBKEYS_MEMBERS};`
+ conversationId = $conversationId ${whereClause}
+ ORDER BY received_at DESC LIMIT ${MAX_PUBKEYS_MEMBERS};`
)
.all({
conversationId,
diff --git a/ts/session/apis/open_group_api/sogsv3/sogsV3SendReaction.ts b/ts/session/apis/open_group_api/sogsv3/sogsV3SendReaction.ts
index b85f2e88a..e5628febd 100644
--- a/ts/session/apis/open_group_api/sogsv3/sogsV3SendReaction.ts
+++ b/ts/session/apis/open_group_api/sogsv3/sogsV3SendReaction.ts
@@ -2,12 +2,7 @@ import { AbortSignal } from 'abort-controller';
import { getEmojiDataFromNative } from 'emoji-mart';
import { Data } from '../../../../data/data';
import { ConversationModel } from '../../../../models/conversation';
-import {
- Action,
- FixedBaseEmoji,
- OpenGroupReactionResponse,
- Reaction,
-} from '../../../../types/Reaction';
+import { Action, OpenGroupReactionResponse, Reaction } from '../../../../types/Reaction';
import { Reactions } from '../../../../util/reactions';
import { OnionSending } from '../../../onions/onionSend';
import { ToastUtils, UserUtils } from '../../../utils';
@@ -74,7 +69,8 @@ export const sendSogsReactionOnionV4 = async (
// The SOGS endpoint supports any text input so we need to make sure we are sending a valid unicode emoji
// for an invalid input we use https://emojipedia.org/frame-with-an-x/ as a replacement since it cannot rendered as an emoji but is valid unicode
// NOTE emoji-mart v5.2.2 types for getEmojiDataFromNative are broken
- const emoji = (getEmojiDataFromNative(reaction.emoji) as FixedBaseEmoji) ? reaction.emoji : '🖾';
+ // eslint-disable-next-line @typescript-eslint/await-thenable
+ const emoji = (await getEmojiDataFromNative(reaction.emoji)) ? reaction.emoji : '🖾';
const endpoint = `/room/${room}/reaction/${reaction.id}/${emoji}`;
const method = reaction.action === Action.REACT ? 'PUT' : 'DELETE';
const serverPubkey = allValidRoomInfos[0].serverPublicKey;
diff --git a/ts/test/util/blockedNumberController_test.ts b/ts/test/util/blockedNumberController_test.ts
index fca76b8ae..904a3d3a9 100644
--- a/ts/test/util/blockedNumberController_test.ts
+++ b/ts/test/util/blockedNumberController_test.ts
@@ -71,7 +71,7 @@ describe('BlockedNumberController', () => {
const blockedNumbers = BlockedNumberController.getBlockedNumbers();
expect(blockedNumbers.length).to.be.eq(0);
- expect(Object.keys(memoryDB.blocked)).to.be.be.eq(0);
+ expect(Object.keys(memoryDB.blocked).length).to.be.be.eq(0);
});
it('should only unblock if a device was blocked', async () => {
diff --git a/ts/types/Reaction.ts b/ts/types/Reaction.ts
index f2ab687e2..4e0c7a465 100644
--- a/ts/types/Reaction.ts
+++ b/ts/types/Reaction.ts
@@ -1,4 +1,4 @@
-import { EmojiSet, PartialI18n } from 'emoji-mart';
+import { Emoji, EmojiMartData } from '@emoji-mart/data';
export const reactionLimit: number = 6;
@@ -30,14 +30,7 @@ export class RecentReactions {
}
}
-type BaseEmojiSkin = { unified: string; native: string };
-
-export interface FixedBaseEmoji {
- id: string;
- name: string;
- keywords: Array;
- skins: Array;
- version: number;
+export interface FixedBaseEmoji extends Emoji {
search?: string;
// props from emoji panel click event
native?: string;
@@ -46,64 +39,10 @@ export interface FixedBaseEmoji {
unified?: string;
}
-export interface NativeEmojiData {
- categories: Array<{ id: string; emojis: Array }>;
- emojis: Record;
- aliases: Record;
- sheet: { cols: number; rows: number };
+export interface NativeEmojiData extends EmojiMartData {
ariaLabels?: Record;
}
-// Types for EmojiMart 5 are currently broken these are a temporary fixes
-export interface FixedPickerProps {
- autoFocus?: boolean | undefined;
- title?: string | undefined;
- theme?: 'auto' | 'light' | 'dark' | undefined;
- perLine?: number | undefined;
- stickySearch?: boolean | undefined;
- searchPosition?: 'sticky' | 'static' | 'none' | undefined;
- emojiButtonSize?: number | undefined;
- emojiButtonRadius?: number | undefined;
- emojiButtonColors?: string | undefined;
- maxFrequentRows?: number | undefined;
- icons?: 'auto' | 'outline' | 'solid';
- set?: EmojiSet | undefined;
- emoji?: string | undefined;
- navPosition?: 'bottom' | 'top' | 'none' | undefined;
- showPreview?: boolean | undefined;
- previewEmoji?: boolean | undefined;
- noResultsEmoji?: string | undefined;
- previewPosition?: 'bottom' | 'top' | 'none' | undefined;
- skinTonePosition?: 'preview' | 'search' | 'none';
- i18n?: PartialI18n | undefined;
- onEmojiSelect?: (emoji: FixedBaseEmoji) => void;
- onClickOutside?: () => void;
- onKeyDown?: (event: any) => void;
- onAddCustomEmoji?: () => void;
- getImageURL?: () => void;
- getSpritesheetURL?: () => void;
- // Below here I'm currently unsure of usage
- // style?: React.CSSProperties | undefined;
- // color?: string | undefined;
- // skin?: EmojiSkin | undefined;
- // defaultSkin?: EmojiSkin | undefined;
- // backgroundImageFn?: BackgroundImageFn | undefined;
- // sheetSize?: EmojiSheetSize | undefined;
- // emojisToShowFilter?(emoji: EmojiData): boolean;
- // showSkinTones?: boolean | undefined;
- // emojiTooltip?: boolean | undefined;
- // include?: CategoryName[] | undefined;
- // exclude?: CategoryName[] | undefined;
- // recent?: string[] | undefined;
- // /** NOTE: custom emoji are copied into a singleton object on every new mount */
- // custom?: CustomEmoji[] | undefined;
- // skinEmoji?: string | undefined;
- // notFound?(): React.Component;
- // notFoundEmoji?: string | undefined;
- // enableFrequentEmojiSort?: boolean | undefined;
- // useButton?: boolean | undefined;
-}
-
export enum Action {
REACT = 0,
REMOVE = 1,
diff --git a/ts/util/emoji.ts b/ts/util/emoji.ts
index 7892f2583..209498b5f 100644
--- a/ts/util/emoji.ts
+++ b/ts/util/emoji.ts
@@ -2,7 +2,7 @@
/* eslint-disable no-continue */
/* eslint-disable no-param-reassign */
/* eslint-disable import/no-mutable-exports */
-import { PartialI18n, init } from 'emoji-mart';
+import { init, I18n } from 'emoji-mart';
import { FixedBaseEmoji, NativeEmojiData } from '../types/Reaction';
import { loadEmojiPanelI18n } from './i18n';
@@ -47,7 +47,7 @@ export function getEmojiSizeClass(str: string): SizeClassType {
}
export let nativeEmojiData: NativeEmojiData | null = null;
-export let i18nEmojiData: PartialI18n | null = null;
+export let i18nEmojiData: typeof I18n | null = null;
export async function initialiseEmojiData(data: any): Promise {
const ariaLabels: Record = {};
@@ -85,7 +85,7 @@ export async function initialiseEmojiData(data: any): Promise {
i18nEmojiData = await loadEmojiPanelI18n();
// Data needs to be initialised once per page load for the emoji components
// See https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search
- init({ data, i18n: i18nEmojiData });
+ await init({ data, i18n: i18nEmojiData });
}
// Synchronous version of Emoji Mart's SearchIndex.search()
diff --git a/yarn.lock b/yarn.lock
index 746c9bcae..f9a86d35a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -508,15 +508,15 @@
minimatch "^3.0.4"
plist "^3.0.4"
-"@emoji-mart/data@^1.0.6":
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.0.6.tgz#68f71be5e023653a3f9f73f4beadfd50848e2131"
- integrity sha512-8wu3ec/kLCB0Y3K+pOKyY6Ob+xtQu3XhZvntdrpOTUQZ/PO6FW5PpFw7RE1kQ/up1fsVSJBl5mZ8Gs4SPwTYeg==
+"@emoji-mart/data@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.1.2.tgz#777c976f8f143df47cbb23a7077c9ca9fe5fc513"
+ integrity sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==
-"@emoji-mart/react@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@emoji-mart/react/-/react-1.0.1.tgz#46b6a2e92faf16fa9b7f9471f137fa2e3d1e8ac3"
- integrity sha512-ALhLD96BOL5w+a4NI5NpmfqfF1aVjjj2qJE0dLst/OhjBfVmpteWNgn/h8LZy9ulU6AnbeS+13KnPFzDjCvRRw==
+"@emoji-mart/react@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@emoji-mart/react/-/react-1.1.1.tgz#ddad52f93a25baf31c5383c3e7e4c6e05554312a"
+ integrity sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==
"@emotion/is-prop-valid@^0.8.8":
version "0.8.8"
@@ -1010,13 +1010,6 @@
dependencies:
electron "*"
-"@types/emoji-mart@3.0.9":
- version "3.0.9"
- resolved "https://registry.yarnpkg.com/@types/emoji-mart/-/emoji-mart-3.0.9.tgz#2f7ef5d9ec194f28029c46c81a5fc1e5b0efa73c"
- integrity sha512-qdBo/2Y8MXaJ/2spKjDZocuq79GpnOhkwMHnK2GnVFa8WYFgfA+ei6sil3aeWQPCreOKIx9ogPpR5+7MaOqYAA==
- dependencies:
- "@types/react" "*"
-
"@types/eslint-scope@^3.7.3":
version "3.7.4"
resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
@@ -3403,10 +3396,10 @@ electron@*, electron@25.3.0:
"@types/node" "^18.11.18"
extract-zip "^2.0.1"
-emoji-mart@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-5.2.2.tgz#1c093ffc19554dd6edfcfeec9aca43ff38bcc16e"
- integrity sha512-BvcrX+Ps9MxSVEjnvxupclU3MBD6WVC4WZOY26csfC6oFdaWpFhdrzeVNVBmCLPOmzY1SE0aAsqZJRNVbZ1yhQ==
+emoji-mart@^5.5.2:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-5.5.2.tgz#3ddbaf053139cf4aa217650078bc1c50ca8381af"
+ integrity sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A==
emoji-regex@^8.0.0:
version "8.0.0"