@@ -2,7 +2,27 @@ import { renderColor } from '@/utils/color';
22import { EmojiMartData } from '@emoji-mart/data' ;
33import 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 ( / f i l l = " [ ^ " ] * " / 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