Skip to content

Commit a37e1a1

Browse files
committed
feat: ✨ add flags
1 parent 8efb490 commit a37e1a1

File tree

13 files changed

+351
-9
lines changed

13 files changed

+351
-9
lines changed

package-lock.json

+8-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
"echarts-gl": "^2.0.9",
151151
"eruda": "^2.5.0",
152152
"file-saver": "^2.0.5",
153+
"flag-icons": "^7.2.3",
153154
"gl-matrix": "^3.4.3",
154155
"gremlins.js": "^2.2.0",
155156
"i18next": "^23.14.0",
@@ -162,4 +163,4 @@
162163
"uuid": "^9.0.1",
163164
"webgl-obj-loader": "^2.0.8"
164165
}
165-
}
166+
}

public/css/flag-icons.css

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.fi-unknown {
2+
background-image: url(../flags/tbd.png);
3+
}
4+
5+
.fi-nato {
6+
background-image: url(../flags/nato.png);
7+
}
8+
9+
.fi-esa {
10+
background-image: url(../flags/esa.png);
11+
}

public/flags/cis.svg

+7
Loading

public/flags/esa.png

29.6 KB
Loading

public/flags/esa.svg

+15
Loading

public/flags/iss.png

182 KB
Loading

public/flags/nato.png

19.4 KB
Loading

public/flags/tbd.png

4.45 KB
Loading

src/catalogs/countries.ts

+294
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import 'flag-icons/css/flag-icons.min.css';
2+
import '../../public/css/flag-icons.css';
3+
14
export const countryCodeList = {
25
'Afghanistan': 'AF',
36
'Algeria': 'ALG',
@@ -78,6 +81,297 @@ export const countryCodeList = {
7881
'Vietnam': 'VN|VTNM',
7982
};
8083

84+
export const countryFlagIconMap = {
85+
'AAT': 'AAT', // No matching code, kept original
86+
'ADG': 'RU', // Adygea is part of Russia
87+
'AF': 'AF',
88+
'AG': 'AG',
89+
'AGUK': 'AG',
90+
'AM': 'AM',
91+
'ANTN': 'ANTN', // No matching code, kept original
92+
'AO': 'AO',
93+
'AQ': 'AQ', // Added new code for Antarctica
94+
'AR': 'AR',
95+
'ARV': 'AR', // Argentine Antarctic is part of Argentina
96+
'AT': 'AT',
97+
'AU': 'AU',
98+
'AZ': 'AZ',
99+
'B': 'BE', // Belgium
100+
'BASH': 'RU', // Bashkiria is part of Russia
101+
'BAT': 'BAT', // No matching code, kept original
102+
'BB': 'BB',
103+
'BBUK': 'BB',
104+
'BD': 'BD',
105+
'BG': 'BG',
106+
'BGN': 'BG', // PR Bulgaria is now Bulgaria
107+
'BM': 'BM',
108+
'BO': 'BO',
109+
'BR': 'BR',
110+
'BS': 'BS',
111+
'BT': 'BT',
112+
'BY': 'BY',
113+
'CA': 'CA',
114+
'CD': 'CD',
115+
'CH': 'CH',
116+
'CI': 'CI',
117+
'CK': 'CK',
118+
'CL': 'CL',
119+
'CM': 'CM',
120+
'CN': 'CN',
121+
'CO': 'CO',
122+
'COLP': 'CG', // Congo
123+
'CR': 'CR',
124+
'CSFR': 'CSFR', // No matching code, kept original (historical Czechoslovakia)
125+
'CSSR': 'CSSR', // No matching code, kept original (historical Czechoslovakia)
126+
'CU': 'CU',
127+
'CYM': 'KY', // Cayman Islands
128+
'CYMRU': 'GB-WLS', // Wales
129+
'CZ': 'CZ',
130+
'D': 'DE', // Germany
131+
'DAG': 'RU', // Dagestan is part of Russia
132+
'DD': 'DD', // No matching code, kept original (historical East Germany)
133+
'DK': 'DK',
134+
'DML': 'DML', // No matching code, kept original
135+
'DR': 'DR', // No matching code, kept original (historical Germany)
136+
'DX': 'DX', // No matching code, kept original (historical occupied Germany)
137+
'DZ': 'DZ',
138+
'E': 'ES', // Spain
139+
'EC': 'EC',
140+
'EE': 'EE',
141+
'EG': 'EG',
142+
'ENG': 'GB-ENG', // England
143+
'ESCN': 'ES', // Canary Islands are part of Spain
144+
'ET': 'ET',
145+
'F': 'FR', // France
146+
'FI': 'FI',
147+
'GE': 'GE',
148+
'GH': 'GH',
149+
'GI': 'GI',
150+
'GL': 'GL',
151+
'GR': 'GR',
152+
'': 'GD', // Grenada (fixed empty key)
153+
'GT': 'GT',
154+
'GU': 'GU',
155+
'GUF': 'GF', // French Guiana
156+
'HK': 'HK',
157+
'HKUK': 'HK',
158+
'HU': 'HU',
159+
'I': 'IT', // Italy
160+
'I-ARAB': 'I-ARAB', // No matching code, kept original
161+
'I-CSC1': 'I-CSC1', // No matching code, kept original
162+
'I-ELDO': 'I-ELDO', // No matching code, kept original
163+
'I-ESRO': 'I-ESRO', // No matching code, kept original
164+
'I-EUM': 'I-EUM', // No matching code, kept original
165+
'I-EU': 'I-EU', // No matching code, kept original
166+
'I-EUT': 'I-EUT', // No matching code, kept original
167+
'I-INM': 'I-INM', // No matching code, kept original
168+
'I-INT': 'I-INT', // No matching code, kept original
169+
'I-ISS': 'I-ISS', // No matching code, kept original
170+
'I-NATO': 'I-NATO', // No matching code, kept original
171+
'I-RASC': 'I-RASC', // No matching code, kept original
172+
'ID': 'ID',
173+
'IE': 'IE',
174+
'IL': 'IL',
175+
'IN': 'IN',
176+
'IQ': 'IQ',
177+
'IR': 'IR',
178+
'IS': 'IS',
179+
'J': 'JP', // Japan
180+
'JO': 'JO',
181+
'KE': 'KE',
182+
'KI': 'KI',
183+
'KG': 'KG',
184+
'KGSR': 'KG', // Kyrgyz SSR is now Kyrgyzstan
185+
'KH': 'KH',
186+
'KORS': 'KORS', // No matching code, kept original
187+
'KORSA': 'KORSA', // No matching code, kept original
188+
'KP': 'KP',
189+
'KR': 'KR',
190+
'KW': 'KW',
191+
'KZ': 'KZ',
192+
'L': 'LU', // Luxembourg
193+
'LA': 'LA',
194+
'LB': 'LB',
195+
'LK': 'LK',
196+
'LT': 'LT',
197+
'LV': 'LV',
198+
'LY': 'LY',
199+
'MA': 'MA',
200+
'MC': 'MC',
201+
'MD': 'MD',
202+
'MH': 'MH',
203+
'MN': 'MN',
204+
'MR': 'MR',
205+
'MU': 'MU',
206+
'MV': 'MV',
207+
'MX': 'MX',
208+
'MY': 'MY',
209+
'MYM': 'MM', // Myanmar
210+
'N': 'NO', // Norway
211+
'NG': 'NG',
212+
'NL': 'NL',
213+
'NP': 'NP',
214+
'NZ': 'NZ',
215+
'NZRD': 'NZRD', // No matching code, kept original
216+
'P': 'PT', // Portugal
217+
'PAR': 'PA', // Panama
218+
'PCZ': 'PCZ', // No matching code, kept original
219+
'PE': 'PE',
220+
'PG': 'PG',
221+
'PK': 'PK',
222+
'PH': 'PH',
223+
'PL': 'PL',
224+
'PLRL': 'PL',
225+
'PR': 'PR',
226+
'PT': 'PT',
227+
'PY': 'PY',
228+
'QA': 'QA',
229+
'RO': 'RO',
230+
'RU': 'RU',
231+
'RW': 'RW',
232+
'S': 'SE', // Sweden
233+
'SA': 'SA',
234+
'SCOT': 'GB-SCT', // Scotland
235+
'SD': 'SD',
236+
'SG': 'SG',
237+
'SH': 'SH',
238+
'SI': 'SI',
239+
'SK': 'SK',
240+
'SR': 'SR',
241+
'SU': 'SU', // No matching code, kept original (historical USSR)
242+
'SY': 'SY',
243+
'T': 'TH', // Thailand
244+
'TC': 'TC',
245+
'TF': 'TF',
246+
'TJ': 'TJ',
247+
'TM': 'TM',
248+
'TN': 'TN',
249+
'TO': 'TO',
250+
'TR': 'TR',
251+
'TTPI': 'TTPI', // No matching code, kept original
252+
'TUVA': 'RU', // Tuva is part of Russia
253+
'TW': 'TW',
254+
'UA': 'UA',
255+
'UAE': 'AE', // United Arab Emirates
256+
'UK': 'GB', // United Kingdom
257+
'UM': 'UM',
258+
'US': 'US',
259+
'UY': 'UY',
260+
'UZ': 'UZ',
261+
'VE': 'VE',
262+
'VN': 'VN',
263+
'YE': 'YE',
264+
'ZA': 'ZA',
265+
'ZR': 'CD', // Zaire is now Democratic Republic of the Congo
266+
'ANALSAT': 'ANALSAT', // No matching code, kept original
267+
'SAUD': 'SA', // Saudi Arabia
268+
'AB': 'SA', // Saudi Arabia
269+
'AC': 'AC', // No matching code, kept original
270+
'ALG': 'DZ', // Algeria
271+
'ALL': 'ALL', // No matching code, kept original
272+
'ARGN': 'AR', // Argentina
273+
'ASRA': 'AT', // Austria
274+
'AUS': 'AU',
275+
'AZER': 'AZ',
276+
'BEL': 'BE',
277+
'BELA': 'BY',
278+
'BERM': 'BM',
279+
'BOL': 'BO',
280+
'BRAZ': 'BR',
281+
'CHBZ': 'CHBZ', // No matching code, kept original
282+
'CHLE': 'CL', // Chile
283+
'CIS': 'CIS', // No matching code, kept original
284+
'COL': 'CO',
285+
'CZCH': 'CZ', // Czech Republic (formerly Czechoslovakia)
286+
'DEN': 'DK',
287+
'ECU': 'EC',
288+
'EGYP': 'EG',
289+
'ESA': 'ESA', // No matching code, kept original
290+
'I-ESA': 'I-ESA', // No matching code, kept original
291+
'EST': 'EE',
292+
'EUME': 'EUME', // No matching code, kept original
293+
'EUTE': 'EUTE', // No matching code, kept original
294+
'FIN': 'FI',
295+
'FGER': 'FGER', // No matching code, kept original
296+
'FR': 'FR',
297+
'FRIT': 'FRIT', // No matching code, kept original
298+
'GER': 'DE',
299+
'GLOB': 'US',
300+
'GREC': 'GR',
301+
'HUN': 'HU',
302+
'IM': 'IM',
303+
'IND': 'IN',
304+
'INDO': 'ID',
305+
'IRAN': 'IR',
306+
'IRAQ': 'IQ',
307+
'ISRA': 'IL',
308+
'ISS': 'ISS', // No matching code, kept original
309+
'IT': 'IT',
310+
'ITSO': 'LU', // Luxembourg
311+
'JPN': 'JP',
312+
'KAZ': 'KZ',
313+
'LAOS': 'LA',
314+
'LTU': 'LT',
315+
'LUXE': 'LU',
316+
'MALA': 'MY',
317+
'MEX': 'MX',
318+
'NATO': 'NATO', // No matching code, kept original
319+
'NETH': 'NL',
320+
'NICO': 'US',
321+
'NIG': 'NG',
322+
'NKOR': 'KP',
323+
'NOR': 'NO',
324+
'O3B': 'LU',
325+
'ORB': 'US',
326+
'PAKI': 'PK',
327+
'PERU': 'PE',
328+
'POL': 'PL',
329+
'POR': 'PT',
330+
'PRC': 'CN',
331+
'RASC': 'MU', // Mauritius
332+
'ROC': 'TW',
333+
'Taiwan': 'TW',
334+
'ROM': 'RO',
335+
'SAFR': 'ZA',
336+
'SEAL': 'RU',
337+
'RP': 'PH',
338+
'SES': 'LU',
339+
'SING': 'SG',
340+
'SKOR': 'KR',
341+
'SPN': 'ES',
342+
'STCT': 'STCT', // No matching code, kept original
343+
'SWED': 'SE',
344+
'SWTZ': 'CH',
345+
'THAI': 'TH',
346+
'TMMC': 'TMMC', // No matching code, kept original
347+
'TURK': 'TR',
348+
'UKR': 'UA',
349+
'URY': 'UY',
350+
'USA': 'US',
351+
'USBZ': 'USBZ', // No matching code, kept original
352+
'VENZ': 'VE',
353+
'VTNM': 'VN',
354+
'TBD': 'TBD', // No matching code, kept original
355+
};
356+
357+
export const country2flagIcon = (country: string): string => {
358+
// Get the country code from the list
359+
const countryCode = countryCodeList[country] ?? countryCodeList[countryMapList[country]] ?? country;
360+
361+
// Flag codes look like this: fi-us (for United States) or fi-uk (for United Kingdom)
362+
363+
// If there is more than one then we will use both
364+
if (countryCode) {
365+
const codes = countryCode.split('|').map((code: string) => countryFlagIconMap[code] ?? code.toLowerCase());
366+
367+
return codes.map((code) => `fi-${code.toLowerCase()}`).join(' ');
368+
}
369+
370+
console.warn(`Country code not found for ${country}`);
371+
372+
return 'fi-unknown';
373+
};
374+
81375
/**
82376
* An array of country names with satellites.
83377
*/

0 commit comments

Comments
 (0)