Skip to content

Commit eb52684

Browse files
authored
fix: import emoji-mart dynamically like (#950) (#1491)
1 parent 8d0474e commit eb52684

File tree

2 files changed

+77
-19
lines changed

2 files changed

+77
-19
lines changed

packages/core/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,42 @@ import {
99
} from "../../schema/index.js";
1010
import { DefaultGridSuggestionItem } from "./DefaultGridSuggestionItem.js";
1111

12-
let data:
12+
// Temporary fix for https://github.com/missive/emoji-mart/pull/929
13+
let emojiLoadingPromise:
1314
| Promise<{
14-
default: EmojiMartData;
15+
emojiMart: typeof import("emoji-mart");
16+
emojiData: EmojiMartData;
1517
}>
1618
| undefined;
1719

18-
let emojiMart: typeof import("emoji-mart") | undefined;
20+
async function loadEmojiMart() {
21+
if (emojiLoadingPromise) {
22+
return emojiLoadingPromise;
23+
}
24+
25+
emojiLoadingPromise = (async () => {
26+
// load dynamically because emoji-mart doesn't specify type: module and breaks in nodejs
27+
const [emojiMartModule, emojiDataModule] = await Promise.all([
28+
import("emoji-mart"),
29+
// use a dynamic import to encourage bundle-splitting
30+
// and a smaller initial client bundle size
31+
import("@emoji-mart/data"),
32+
]);
33+
34+
const emojiMart =
35+
"default" in emojiMartModule ? emojiMartModule.default : emojiMartModule;
36+
const emojiData =
37+
"default" in emojiDataModule
38+
? (emojiDataModule.default as EmojiMartData)
39+
: (emojiDataModule as EmojiMartData);
40+
41+
await emojiMart.init({ data: emojiData });
42+
43+
return { emojiMart, emojiData };
44+
})();
45+
46+
return emojiLoadingPromise;
47+
}
1948

2049
export async function getDefaultEmojiPickerItems<
2150
BSchema extends BlockSchema,
@@ -29,23 +58,11 @@ export async function getDefaultEmojiPickerItems<
2958
return [];
3059
}
3160

32-
if (!data) {
33-
// use a dynamic import to encourage bundle-splitting
34-
// and a smaller initial client bundle size
35-
36-
data = import("@emoji-mart/data") as any;
37-
38-
// load dynamically because emoji-mart doesn't specify type: module and breaks in nodejs
39-
emojiMart = await import("emoji-mart");
40-
const emojiMartData = (await data)!.default;
41-
await emojiMart.init({ data: emojiMartData });
42-
}
43-
44-
const emojiMartData = (await data)!.default;
61+
const { emojiData, emojiMart } = await loadEmojiMart();
4562

4663
const emojisToShow =
4764
query.trim() === ""
48-
? Object.values(emojiMartData.emojis)
65+
? Object.values(emojiData.emojis)
4966
: ((await emojiMart!.SearchIndex.search(query)) as Emoji[]);
5067

5168
return emojisToShow.map((emoji) => ({

packages/react/src/components/Comments/EmojiMartPicker.tsx

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,43 @@
11
// From https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-react/react.tsx
2+
import type { EmojiMartData } from "@emoji-mart/data";
23
import React, { useEffect, useRef } from "react";
3-
import { Picker } from "emoji-mart";
4+
5+
// Temporary fix for https://github.com/missive/emoji-mart/pull/929
6+
let emojiLoadingPromise:
7+
| Promise<{
8+
emojiMart: typeof import("emoji-mart");
9+
emojiData: EmojiMartData;
10+
}>
11+
| undefined;
12+
13+
async function loadEmojiMart() {
14+
if (emojiLoadingPromise) {
15+
return emojiLoadingPromise;
16+
}
17+
18+
emojiLoadingPromise = (async () => {
19+
// load dynamically because emoji-mart doesn't specify type: module and breaks in nodejs
20+
const [emojiMartModule, emojiDataModule] = await Promise.all([
21+
import("emoji-mart"),
22+
// use a dynamic import to encourage bundle-splitting
23+
// and a smaller initial client bundle size
24+
import("@emoji-mart/data"),
25+
]);
26+
27+
const emojiMart =
28+
"default" in emojiMartModule ? emojiMartModule.default : emojiMartModule;
29+
const emojiData =
30+
"default" in emojiDataModule
31+
? (emojiDataModule.default as EmojiMartData)
32+
: (emojiDataModule as EmojiMartData);
33+
34+
await emojiMart.init({ data: emojiData });
35+
36+
return { emojiMart, emojiData };
37+
})();
38+
39+
return emojiLoadingPromise;
40+
}
441

542
// eslint-disable-next-line @typescript-eslint/no-explicit-any
643
export default function EmojiPicker(props: any) {
@@ -12,7 +49,11 @@ export default function EmojiPicker(props: any) {
1249
}
1350

1451
useEffect(() => {
15-
instance.current = new Picker({ ...props, ref });
52+
(async () => {
53+
const { emojiMart } = await loadEmojiMart();
54+
55+
instance.current = new emojiMart.Picker({ ...props, ref });
56+
})();
1657

1758
return () => {
1859
instance.current = null;

0 commit comments

Comments
 (0)