fix: issue of get icons (#58)

This commit is contained in:
Kilu.He
2025-03-05 10:02:03 +08:00
committed by GitHub
parent 49abe042ef
commit 2c322d1dcc

View File

@@ -2,7 +2,27 @@ import { renderColor } from '@/utils/color';
import { EmojiMartData } from '@emoji-mart/data'; import { EmojiMartData } from '@emoji-mart/data';
import axios from 'axios'; import axios from 'axios';
export async function randomEmoji (skin = 0) { const http = axios.create();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const pendingRequests: Map<string, Promise<any>> = new Map();
async function httpGet(url: string) {
if(pendingRequests.has(url)) {
return pendingRequests.get(url);
}
const request = http.get(url).then((res) => {
pendingRequests.delete(url);
return res;
});
pendingRequests.set(url, request);
return request;
}
export async function randomEmoji(skin = 0) {
const emojiData = await loadEmojiData(); const emojiData = await loadEmojiData();
const emojis = (emojiData as EmojiMartData).emojis; const emojis = (emojiData as EmojiMartData).emojis;
const keys = Object.keys(emojis); const keys = Object.keys(emojis);
@@ -11,11 +31,11 @@ export async function randomEmoji (skin = 0) {
return emojis[randomKey].skins[skin].native; return emojis[randomKey].skins[skin].native;
} }
export async function loadEmojiData () { export async function loadEmojiData() {
return import('@emoji-mart/data/sets/15/native.json'); return import('@emoji-mart/data/sets/15/native.json');
} }
export function isFlagEmoji (emoji: string) { export function isFlagEmoji(emoji: string) {
return /\uD83C[\uDDE6-\uDDFF]/.test(emoji); return /\uD83C[\uDDE6-\uDDFF]/.test(emoji);
} }
@@ -46,7 +66,7 @@ let icons: Record<ICON_CATEGORY,
keywords: string[]; keywords: string[];
}[]> | undefined; }[]> | undefined;
export async function loadIcons (): Promise< export async function loadIcons(): Promise<
Record< Record<
ICON_CATEGORY, ICON_CATEGORY,
{ {
@@ -57,20 +77,21 @@ export async function loadIcons (): Promise<
}[] }[]
> >
> { > {
if (icons) { if(icons) {
return icons; return icons;
} }
return axios.get('/af_icons/icons.json').then((res) => { return httpGet('/af_icons/icons.json').then((res) => {
icons = res.data; icons = res.data;
return res.data; return res.data;
}); });
} }
export async function getIconBase64 (id: string, color: string) { export async function getIconBase64(id: string, color: string) {
try { try {
const response = await fetch(`/af_icons/${id}.svg`); const response = await httpGet(`/af_icons/${id}.svg`);
let svgText = await response.text();
let svgText = response.data as string;
svgText = svgText.replace(/fill="[^"]*"/g, ``); svgText = svgText.replace(/fill="[^"]*"/g, ``);
svgText = svgText.replace('<svg', `<svg fill="${renderColor(color)}"`); svgText = svgText.replace('<svg', `<svg fill="${renderColor(color)}"`);
@@ -78,13 +99,13 @@ export async function getIconBase64 (id: string, color: string) {
const base64String = btoa(svgText); const base64String = btoa(svgText);
return `data:image/svg+xml;base64,${base64String}`; return `data:image/svg+xml;base64,${base64String}`;
} catch (error) { } catch(error) {
console.error('Error setting favicon:', error); console.error('Error setting favicon:', error);
return ''; return '';
} }
} }
export async function randomIcon () { export async function randomIcon() {
const icons = await loadIcons(); const icons = await loadIcons();
const categories = Object.keys(icons); const categories = Object.keys(icons);
const randomCategory = categories[Math.floor(Math.random() * categories.length)] as ICON_CATEGORY; const randomCategory = categories[Math.floor(Math.random() * categories.length)] as ICON_CATEGORY;
@@ -93,12 +114,12 @@ export async function randomIcon () {
return randomIcon; return randomIcon;
} }
export async function getIcon (id: string) { export async function getIcon(id: string) {
const icons = await loadIcons(); const icons = await loadIcons();
for (const category of Object.keys(icons)) { for(const category of Object.keys(icons)) {
for (const icon of icons[category as ICON_CATEGORY]) { for(const icon of icons[category as ICON_CATEGORY]) {
if (icon.id === id) { if(icon.id === id) {
return icon; return icon;
} }
} }