Skip to content

Commit 3d9af59

Browse files
committed
fix: issue of get icons
1 parent 49abe04 commit 3d9af59

File tree

1 file changed

+36
-15
lines changed

1 file changed

+36
-15
lines changed

src/utils/emoji.ts

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,27 @@ import { renderColor } from '@/utils/color';
22
import { EmojiMartData } from '@emoji-mart/data';
33
import axios from 'axios';
44

5-
export async function randomEmoji (skin = 0) {
5+
const http = axios.create();
6+
7+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
8+
const pendingRequests: Map<string, Promise<any>> = new Map();
9+
10+
async function httpGet(url: string) {
11+
if(pendingRequests.has(url)) {
12+
return pendingRequests.get(url);
13+
}
14+
15+
const request = http.get(url).then((res) => {
16+
pendingRequests.delete(url);
17+
return res;
18+
});
19+
20+
pendingRequests.set(url, request);
21+
22+
return request;
23+
}
24+
25+
export async function randomEmoji(skin = 0) {
626
const emojiData = await loadEmojiData();
727
const emojis = (emojiData as EmojiMartData).emojis;
828
const keys = Object.keys(emojis);
@@ -11,11 +31,11 @@ export async function randomEmoji (skin = 0) {
1131
return emojis[randomKey].skins[skin].native;
1232
}
1333

14-
export async function loadEmojiData () {
34+
export async function loadEmojiData() {
1535
return import('@emoji-mart/data/sets/15/native.json');
1636
}
1737

18-
export function isFlagEmoji (emoji: string) {
38+
export function isFlagEmoji(emoji: string) {
1939
return /\uD83C[\uDDE6-\uDDFF]/.test(emoji);
2040
}
2141

@@ -46,7 +66,7 @@ let icons: Record<ICON_CATEGORY,
4666
keywords: string[];
4767
}[]> | undefined;
4868

49-
export async function loadIcons (): Promise<
69+
export async function loadIcons(): Promise<
5070
Record<
5171
ICON_CATEGORY,
5272
{
@@ -57,34 +77,35 @@ export async function loadIcons (): Promise<
5777
}[]
5878
>
5979
> {
60-
if (icons) {
80+
if(icons) {
6181
return icons;
6282
}
6383

64-
return axios.get('/af_icons/icons.json').then((res) => {
84+
return httpGet('/af_icons/icons.json').then((res) => {
6585
icons = res.data;
6686
return res.data;
6787
});
6888
}
6989

70-
export async function getIconBase64 (id: string, color: string) {
90+
export async function getIconBase64(id: string, color: string) {
7191
try {
72-
const response = await fetch(`/af_icons/${id}.svg`);
73-
let svgText = await response.text();
92+
const response = await httpGet(`/af_icons/${id}.svg`);
93+
94+
let svgText = response.data as string;
7495

7596
svgText = svgText.replace(/fill="[^"]*"/g, ``);
7697
svgText = svgText.replace('<svg', `<svg fill="${renderColor(color)}"`);
7798

7899
const base64String = btoa(svgText);
79100

80101
return `data:image/svg+xml;base64,${base64String}`;
81-
} catch (error) {
102+
} catch(error) {
82103
console.error('Error setting favicon:', error);
83104
return '';
84105
}
85106
}
86107

87-
export async function randomIcon () {
108+
export async function randomIcon() {
88109
const icons = await loadIcons();
89110
const categories = Object.keys(icons);
90111
const randomCategory = categories[Math.floor(Math.random() * categories.length)] as ICON_CATEGORY;
@@ -93,12 +114,12 @@ export async function randomIcon () {
93114
return randomIcon;
94115
}
95116

96-
export async function getIcon (id: string) {
117+
export async function getIcon(id: string) {
97118
const icons = await loadIcons();
98119

99-
for (const category of Object.keys(icons)) {
100-
for (const icon of icons[category as ICON_CATEGORY]) {
101-
if (icon.id === id) {
120+
for(const category of Object.keys(icons)) {
121+
for(const icon of icons[category as ICON_CATEGORY]) {
122+
if(icon.id === id) {
102123
return icon;
103124
}
104125
}

0 commit comments

Comments
 (0)