notionsoft-ui 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/index.cjs +89 -7
- package/package.json +2 -1
- package/src/notion-ui/button/button.tsx +1 -1
- package/src/notion-ui/date-picker/DatePicker.stories.tsx +99 -0
- package/src/notion-ui/date-picker/date-picker.tsx +271 -0
- package/src/notion-ui/date-picker/index.ts +3 -0
- package/src/notion-ui/input/input.tsx +19 -12
- package/src/notion-ui/multi-date-picker/MultiDatePicker.stories.tsx +94 -0
- package/src/notion-ui/multi-date-picker/index.ts +3 -0
- package/src/notion-ui/multi-date-picker/multi-date-picker.tsx +265 -0
- package/src/notion-ui/multi-select-input/multi-select-input.tsx +202 -54
- package/src/notion-ui/password-input/password-input.tsx +39 -34
- package/src/notion-ui/phone-input/country-data.ts +420 -0
- package/src/notion-ui/phone-input/lazy-flag.tsx +83 -0
- package/src/notion-ui/phone-input/phone-input.tsx +400 -0
- package/src/notion-ui/phone-input/type.ts +227 -0
- package/src/notion-ui/phone-input/utils.ts +23 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import type { ParsedCountry } from "./type";
|
|
2
|
+
|
|
3
|
+
export const defaultCountries: ParsedCountry[] = [
|
|
4
|
+
{ name: "Afghanistan", iso2: "af", dialCode: "93" },
|
|
5
|
+
{ name: "Albania", iso2: "al", dialCode: "355" },
|
|
6
|
+
{ name: "Algeria", iso2: "dz", dialCode: "213" },
|
|
7
|
+
{ name: "Andorra", iso2: "ad", dialCode: "376" },
|
|
8
|
+
{ name: "Angola", iso2: "ao", dialCode: "244" },
|
|
9
|
+
{ name: "Antigua and Barbuda", iso2: "ag", dialCode: "1268" },
|
|
10
|
+
{
|
|
11
|
+
name: "Argentina",
|
|
12
|
+
iso2: "ar",
|
|
13
|
+
dialCode: "54",
|
|
14
|
+
format: {
|
|
15
|
+
default: "(..) .... ....",
|
|
16
|
+
"/^11/": "(..) .... ....",
|
|
17
|
+
"/^15/": "(..) ... ....",
|
|
18
|
+
"/^(2|3|4|5)/": "(.) .... ....",
|
|
19
|
+
"/^9/": "(.) .... .....",
|
|
20
|
+
},
|
|
21
|
+
priority: 0,
|
|
22
|
+
},
|
|
23
|
+
{ name: "Armenia", iso2: "am", dialCode: "374", format: ".. ......" },
|
|
24
|
+
{ name: "Aruba", iso2: "aw", dialCode: "297" },
|
|
25
|
+
{
|
|
26
|
+
name: "Australia",
|
|
27
|
+
iso2: "au",
|
|
28
|
+
dialCode: "61",
|
|
29
|
+
format: {
|
|
30
|
+
default: ". .... ....",
|
|
31
|
+
"/^4/": "... ... ...",
|
|
32
|
+
"/^5(?!50)/": "... ... ...",
|
|
33
|
+
"/^1(3|8)00/": ".... ... ...",
|
|
34
|
+
"/^13/": ".. .. ..",
|
|
35
|
+
"/^180/": "... ....",
|
|
36
|
+
},
|
|
37
|
+
priority: 0,
|
|
38
|
+
areaCodes: [],
|
|
39
|
+
},
|
|
40
|
+
{ name: "Austria", iso2: "at", dialCode: "43" },
|
|
41
|
+
{ name: "Azerbaijan", iso2: "az", dialCode: "994", format: "(..) ... .. .." },
|
|
42
|
+
{ name: "Bahamas", iso2: "bs", dialCode: "1242" },
|
|
43
|
+
{ name: "Bahrain", iso2: "bh", dialCode: "973" },
|
|
44
|
+
{ name: "Bangladesh", iso2: "bd", dialCode: "880" },
|
|
45
|
+
{ name: "Barbados", iso2: "bb", dialCode: "1246" },
|
|
46
|
+
{ name: "Belarus", iso2: "by", dialCode: "375", format: "(..) ... .. .." },
|
|
47
|
+
{ name: "Belgium", iso2: "be", dialCode: "32", format: "... .. .. .." },
|
|
48
|
+
{ name: "Belize", iso2: "bz", dialCode: "501" },
|
|
49
|
+
{ name: "Benin", iso2: "bj", dialCode: "229" },
|
|
50
|
+
{ name: "Bhutan", iso2: "bt", dialCode: "975" },
|
|
51
|
+
{ name: "Bolivia", iso2: "bo", dialCode: "591" },
|
|
52
|
+
{ name: "Bosnia and Herzegovina", iso2: "ba", dialCode: "387" },
|
|
53
|
+
{ name: "Botswana", iso2: "bw", dialCode: "267" },
|
|
54
|
+
{ name: "Brazil", iso2: "br", dialCode: "55", format: "(..) .....-...." },
|
|
55
|
+
{ name: "British Indian Ocean Territory", iso2: "io", dialCode: "246" },
|
|
56
|
+
{ name: "Brunei", iso2: "bn", dialCode: "673" },
|
|
57
|
+
{ name: "Bulgaria", iso2: "bg", dialCode: "359" },
|
|
58
|
+
{ name: "Burkina Faso", iso2: "bf", dialCode: "226" },
|
|
59
|
+
{ name: "Burundi", iso2: "bi", dialCode: "257" },
|
|
60
|
+
{ name: "Cambodia", iso2: "kh", dialCode: "855" },
|
|
61
|
+
{ name: "Cameroon", iso2: "cm", dialCode: "237" },
|
|
62
|
+
{
|
|
63
|
+
name: "Canada",
|
|
64
|
+
iso2: "ca",
|
|
65
|
+
dialCode: "1",
|
|
66
|
+
format: "(...) ...-....",
|
|
67
|
+
priority: 1,
|
|
68
|
+
areaCodes: [
|
|
69
|
+
"204",
|
|
70
|
+
"226",
|
|
71
|
+
"236",
|
|
72
|
+
"249",
|
|
73
|
+
"250",
|
|
74
|
+
"289",
|
|
75
|
+
"306",
|
|
76
|
+
"343",
|
|
77
|
+
"365",
|
|
78
|
+
"387",
|
|
79
|
+
"403",
|
|
80
|
+
"416",
|
|
81
|
+
"418",
|
|
82
|
+
"431",
|
|
83
|
+
"437",
|
|
84
|
+
"438",
|
|
85
|
+
"450",
|
|
86
|
+
"506",
|
|
87
|
+
"514",
|
|
88
|
+
"519",
|
|
89
|
+
"548",
|
|
90
|
+
"579",
|
|
91
|
+
"581",
|
|
92
|
+
"587",
|
|
93
|
+
"604",
|
|
94
|
+
"613",
|
|
95
|
+
"639",
|
|
96
|
+
"647",
|
|
97
|
+
"672",
|
|
98
|
+
"705",
|
|
99
|
+
"709",
|
|
100
|
+
"742",
|
|
101
|
+
"778",
|
|
102
|
+
"780",
|
|
103
|
+
"782",
|
|
104
|
+
"807",
|
|
105
|
+
"819",
|
|
106
|
+
"825",
|
|
107
|
+
"867",
|
|
108
|
+
"873",
|
|
109
|
+
"902",
|
|
110
|
+
"905",
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
{ name: "Cape Verde", iso2: "cv", dialCode: "238" },
|
|
114
|
+
{ name: "Caribbean Netherlands", iso2: "bq", dialCode: "599", priority: 1 },
|
|
115
|
+
{
|
|
116
|
+
name: "Cayman Islands",
|
|
117
|
+
iso2: "ky",
|
|
118
|
+
dialCode: "1",
|
|
119
|
+
format: "... ... ....",
|
|
120
|
+
priority: 4,
|
|
121
|
+
areaCodes: ["345"],
|
|
122
|
+
},
|
|
123
|
+
{ name: "Central African Republic", iso2: "cf", dialCode: "236" },
|
|
124
|
+
{ name: "Chad", iso2: "td", dialCode: "235" },
|
|
125
|
+
{ name: "Chile", iso2: "cl", dialCode: "56" },
|
|
126
|
+
{ name: "China", iso2: "cn", dialCode: "86", format: "... .... ...." },
|
|
127
|
+
{ name: "Colombia", iso2: "co", dialCode: "57", format: "... ... ...." },
|
|
128
|
+
{ name: "Comoros", iso2: "km", dialCode: "269" },
|
|
129
|
+
{ name: "Congo", iso2: "cd", dialCode: "243" },
|
|
130
|
+
{ name: "Congo", iso2: "cg", dialCode: "242" },
|
|
131
|
+
{ name: "Costa Rica", iso2: "cr", dialCode: "506", format: "....-...." },
|
|
132
|
+
{
|
|
133
|
+
name: "Côte d'Ivoire",
|
|
134
|
+
iso2: "ci",
|
|
135
|
+
dialCode: "225",
|
|
136
|
+
format: ".. .. .. .. ..",
|
|
137
|
+
},
|
|
138
|
+
{ name: "Croatia", iso2: "hr", dialCode: "385" },
|
|
139
|
+
{ name: "Cuba", iso2: "cu", dialCode: "53" },
|
|
140
|
+
{ name: "Curaçao", iso2: "cw", dialCode: "599", priority: 0 },
|
|
141
|
+
{ name: "Cyprus", iso2: "cy", dialCode: "357", format: ".. ......" },
|
|
142
|
+
{
|
|
143
|
+
name: "Czech Republic",
|
|
144
|
+
iso2: "cz",
|
|
145
|
+
dialCode: "420",
|
|
146
|
+
format: "... ... ...",
|
|
147
|
+
},
|
|
148
|
+
{ name: "Denmark", iso2: "dk", dialCode: "45", format: ".. .. .. .." },
|
|
149
|
+
{ name: "Djibouti", iso2: "dj", dialCode: "253", format: ".. .. ...." },
|
|
150
|
+
{ name: "Dominica", iso2: "dm", dialCode: "1767" },
|
|
151
|
+
{
|
|
152
|
+
name: "Dominican Republic",
|
|
153
|
+
iso2: "do",
|
|
154
|
+
dialCode: "1",
|
|
155
|
+
format: "(...) ...-....",
|
|
156
|
+
priority: 2,
|
|
157
|
+
areaCodes: ["809", "829", "849"],
|
|
158
|
+
},
|
|
159
|
+
{ name: "Ecuador", iso2: "ec", dialCode: "593" },
|
|
160
|
+
{ name: "Egypt", iso2: "eg", dialCode: "20" },
|
|
161
|
+
{ name: "El Salvador", iso2: "sv", dialCode: "503", format: "....-...." },
|
|
162
|
+
{ name: "Equatorial Guinea", iso2: "gq", dialCode: "240" },
|
|
163
|
+
{ name: "Eritrea", iso2: "er", dialCode: "291" },
|
|
164
|
+
{ name: "Estonia", iso2: "ee", dialCode: "372", format: ".... ......" },
|
|
165
|
+
{ name: "Ethiopia", iso2: "et", dialCode: "251", format: ".. ... ...." },
|
|
166
|
+
{ name: "Faroe Islands", iso2: "fo", dialCode: "298", format: ".. .. .." },
|
|
167
|
+
{ name: "Fiji", iso2: "fj", dialCode: "679" },
|
|
168
|
+
{ name: "Finland", iso2: "fi", dialCode: "358", format: ".. ... .. .." },
|
|
169
|
+
{ name: "France", iso2: "fr", dialCode: "33", format: ". .. .. .. .." },
|
|
170
|
+
{
|
|
171
|
+
name: "French Guiana",
|
|
172
|
+
iso2: "gf",
|
|
173
|
+
dialCode: "594",
|
|
174
|
+
format: "... .. .. ..",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: "French Polynesia",
|
|
178
|
+
iso2: "pf",
|
|
179
|
+
dialCode: "689",
|
|
180
|
+
format: {
|
|
181
|
+
"/^44/": ".. .. ..",
|
|
182
|
+
"/^80[0-5]/": "... .. .. ..",
|
|
183
|
+
default: ".. .. .. ..",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
{ name: "Gabon", iso2: "ga", dialCode: "241" },
|
|
187
|
+
{ name: "Gambia", iso2: "gm", dialCode: "220" },
|
|
188
|
+
{ name: "Georgia", iso2: "ge", dialCode: "995" },
|
|
189
|
+
{ name: "Germany", iso2: "de", dialCode: "49", format: "... ........." },
|
|
190
|
+
{ name: "Ghana", iso2: "gh", dialCode: "233" },
|
|
191
|
+
{ name: "Greece", iso2: "gr", dialCode: "30" },
|
|
192
|
+
{ name: "Greenland", iso2: "gl", dialCode: "299", format: ".. .. .." },
|
|
193
|
+
{ name: "Grenada", iso2: "gd", dialCode: "1473" },
|
|
194
|
+
{
|
|
195
|
+
name: "Guadeloupe",
|
|
196
|
+
iso2: "gp",
|
|
197
|
+
dialCode: "590",
|
|
198
|
+
format: "... .. .. ..",
|
|
199
|
+
priority: 0,
|
|
200
|
+
},
|
|
201
|
+
{ name: "Guam", iso2: "gu", dialCode: "1671" },
|
|
202
|
+
{ name: "Guatemala", iso2: "gt", dialCode: "502", format: "....-...." },
|
|
203
|
+
{ name: "Guinea", iso2: "gn", dialCode: "224" },
|
|
204
|
+
{ name: "Guinea-Bissau", iso2: "gw", dialCode: "245" },
|
|
205
|
+
{ name: "Guyana", iso2: "gy", dialCode: "592" },
|
|
206
|
+
{ name: "Haiti", iso2: "ht", dialCode: "509", format: "....-...." },
|
|
207
|
+
{ name: "Honduras", iso2: "hn", dialCode: "504" },
|
|
208
|
+
{ name: "Hong Kong", iso2: "hk", dialCode: "852", format: ".... ...." },
|
|
209
|
+
{ name: "Hungary", iso2: "hu", dialCode: "36" },
|
|
210
|
+
{ name: "Iceland", iso2: "is", dialCode: "354", format: "... ...." },
|
|
211
|
+
{ name: "India", iso2: "in", dialCode: "91", format: ".....-....." },
|
|
212
|
+
{ name: "Indonesia", iso2: "id", dialCode: "62" },
|
|
213
|
+
{ name: "Iran", iso2: "ir", dialCode: "98", format: "... ... ...." },
|
|
214
|
+
{ name: "Iraq", iso2: "iq", dialCode: "964" },
|
|
215
|
+
{ name: "Ireland", iso2: "ie", dialCode: "353", format: ".. ......." },
|
|
216
|
+
{ name: "Israel", iso2: "il", dialCode: "972", format: "... ... ...." },
|
|
217
|
+
{
|
|
218
|
+
name: "Italy",
|
|
219
|
+
iso2: "it",
|
|
220
|
+
dialCode: "39",
|
|
221
|
+
format: "... .......",
|
|
222
|
+
priority: 0,
|
|
223
|
+
},
|
|
224
|
+
{ name: "Jamaica", iso2: "jm", dialCode: "1876" },
|
|
225
|
+
{ name: "Japan", iso2: "jp", dialCode: "81", format: ".. .... ...." },
|
|
226
|
+
{ name: "Jordan", iso2: "jo", dialCode: "962" },
|
|
227
|
+
{
|
|
228
|
+
name: "Kazakhstan",
|
|
229
|
+
iso2: "kz",
|
|
230
|
+
dialCode: "7",
|
|
231
|
+
format: "... ...-..-..",
|
|
232
|
+
priority: 0,
|
|
233
|
+
},
|
|
234
|
+
{ name: "Kenya", iso2: "ke", dialCode: "254" },
|
|
235
|
+
{ name: "Kiribati", iso2: "ki", dialCode: "686" },
|
|
236
|
+
{ name: "Kosovo", iso2: "xk", dialCode: "383" },
|
|
237
|
+
{ name: "Kuwait", iso2: "kw", dialCode: "965" },
|
|
238
|
+
{ name: "Kyrgyzstan", iso2: "kg", dialCode: "996", format: "... ... ..." },
|
|
239
|
+
{ name: "Laos", iso2: "la", dialCode: "856" },
|
|
240
|
+
{ name: "Latvia", iso2: "lv", dialCode: "371", format: ".. ... ..." },
|
|
241
|
+
{ name: "Lebanon", iso2: "lb", dialCode: "961" },
|
|
242
|
+
{ name: "Lesotho", iso2: "ls", dialCode: "266" },
|
|
243
|
+
{ name: "Liberia", iso2: "lr", dialCode: "231" },
|
|
244
|
+
{ name: "Libya", iso2: "ly", dialCode: "218" },
|
|
245
|
+
{ name: "Liechtenstein", iso2: "li", dialCode: "423" },
|
|
246
|
+
{ name: "Lithuania", iso2: "lt", dialCode: "370" },
|
|
247
|
+
{ name: "Luxembourg", iso2: "lu", dialCode: "352" },
|
|
248
|
+
{ name: "Macau", iso2: "mo", dialCode: "853" },
|
|
249
|
+
{ name: "Macedonia", iso2: "mk", dialCode: "389" },
|
|
250
|
+
{ name: "Madagascar", iso2: "mg", dialCode: "261" },
|
|
251
|
+
{ name: "Malawi", iso2: "mw", dialCode: "265" },
|
|
252
|
+
{ name: "Malaysia", iso2: "my", dialCode: "60", format: "..-....-...." },
|
|
253
|
+
{ name: "Maldives", iso2: "mv", dialCode: "960" },
|
|
254
|
+
{ name: "Mali", iso2: "ml", dialCode: "223" },
|
|
255
|
+
{ name: "Malta", iso2: "mt", dialCode: "356" },
|
|
256
|
+
{ name: "Marshall Islands", iso2: "mh", dialCode: "692" },
|
|
257
|
+
{ name: "Martinique", iso2: "mq", dialCode: "596", format: "... .. .. .." },
|
|
258
|
+
{ name: "Mauritania", iso2: "mr", dialCode: "222" },
|
|
259
|
+
{ name: "Mauritius", iso2: "mu", dialCode: "230" },
|
|
260
|
+
{
|
|
261
|
+
name: "Mayotte",
|
|
262
|
+
iso2: "yt",
|
|
263
|
+
dialCode: "262",
|
|
264
|
+
format: "... .. .. ..",
|
|
265
|
+
priority: 1,
|
|
266
|
+
areaCodes: ["269", "639"],
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "Mexico",
|
|
270
|
+
iso2: "mx",
|
|
271
|
+
dialCode: "52",
|
|
272
|
+
format: "... ... ....",
|
|
273
|
+
priority: 0,
|
|
274
|
+
},
|
|
275
|
+
{ name: "Micronesia", iso2: "fm", dialCode: "691" },
|
|
276
|
+
{ name: "Moldova", iso2: "md", dialCode: "373", format: "(..) ..-..-.." },
|
|
277
|
+
{ name: "Monaco", iso2: "mc", dialCode: "377" },
|
|
278
|
+
{ name: "Mongolia", iso2: "mn", dialCode: "976" },
|
|
279
|
+
{ name: "Montenegro", iso2: "me", dialCode: "382" },
|
|
280
|
+
{ name: "Morocco", iso2: "ma", dialCode: "212" },
|
|
281
|
+
{ name: "Mozambique", iso2: "mz", dialCode: "258" },
|
|
282
|
+
{ name: "Myanmar", iso2: "mm", dialCode: "95" },
|
|
283
|
+
{ name: "Namibia", iso2: "na", dialCode: "264" },
|
|
284
|
+
{ name: "Nauru", iso2: "nr", dialCode: "674" },
|
|
285
|
+
{ name: "Nepal", iso2: "np", dialCode: "977" },
|
|
286
|
+
{
|
|
287
|
+
name: "Netherlands",
|
|
288
|
+
iso2: "nl",
|
|
289
|
+
dialCode: "31",
|
|
290
|
+
format: {
|
|
291
|
+
"/^06/": "(.). .........",
|
|
292
|
+
"/^6/": ". .........",
|
|
293
|
+
"/^0(10|13|14|15|20|23|24|26|30|33|35|36|38|40|43|44|45|46|50|53|55|58|70|71|72|73|74|75|76|77|78|79|82|84|85|87|88|91)/":
|
|
294
|
+
"(.).. ........",
|
|
295
|
+
"/^(10|13|14|15|20|23|24|26|30|33|35|36|38|40|43|44|45|46|50|53|55|58|70|71|72|73|74|75|76|77|78|79|82|84|85|87|88|91)/":
|
|
296
|
+
".. ........",
|
|
297
|
+
"/^0/": "(.)... .......",
|
|
298
|
+
default: "... .......",
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
{ name: "New Caledonia", iso2: "nc", dialCode: "687" },
|
|
302
|
+
{ name: "New Zealand", iso2: "nz", dialCode: "64", format: "...-...-...." },
|
|
303
|
+
{ name: "Nicaragua", iso2: "ni", dialCode: "505" },
|
|
304
|
+
{ name: "Niger", iso2: "ne", dialCode: "227" },
|
|
305
|
+
{ name: "Nigeria", iso2: "ng", dialCode: "234" },
|
|
306
|
+
{ name: "North Korea", iso2: "kp", dialCode: "850" },
|
|
307
|
+
{ name: "Norway", iso2: "no", dialCode: "47", format: "... .. ..." },
|
|
308
|
+
{ name: "Oman", iso2: "om", dialCode: "968" },
|
|
309
|
+
{ name: "Pakistan", iso2: "pk", dialCode: "92", format: "...-......." },
|
|
310
|
+
{ name: "Palau", iso2: "pw", dialCode: "680" },
|
|
311
|
+
{ name: "Palestine", iso2: "ps", dialCode: "970" },
|
|
312
|
+
{ name: "Panama", iso2: "pa", dialCode: "507" },
|
|
313
|
+
{ name: "Papua New Guinea", iso2: "pg", dialCode: "675" },
|
|
314
|
+
{ name: "Paraguay", iso2: "py", dialCode: "595" },
|
|
315
|
+
{ name: "Peru", iso2: "pe", dialCode: "51" },
|
|
316
|
+
{ name: "Philippines", iso2: "ph", dialCode: "63", format: "... ... ...." },
|
|
317
|
+
{ name: "Poland", iso2: "pl", dialCode: "48", format: "...-...-..." },
|
|
318
|
+
{ name: "Portugal", iso2: "pt", dialCode: "351" },
|
|
319
|
+
{
|
|
320
|
+
name: "Puerto Rico",
|
|
321
|
+
iso2: "pr",
|
|
322
|
+
dialCode: "1",
|
|
323
|
+
format: "(...) ...-....",
|
|
324
|
+
priority: 3,
|
|
325
|
+
areaCodes: ["787", "939"],
|
|
326
|
+
},
|
|
327
|
+
{ name: "Qatar", iso2: "qa", dialCode: "974" },
|
|
328
|
+
{
|
|
329
|
+
name: "Réunion",
|
|
330
|
+
iso2: "re",
|
|
331
|
+
dialCode: "262",
|
|
332
|
+
format: "... .. .. ..",
|
|
333
|
+
priority: 0,
|
|
334
|
+
},
|
|
335
|
+
{ name: "Romania", iso2: "ro", dialCode: "40" },
|
|
336
|
+
{
|
|
337
|
+
name: "Russia",
|
|
338
|
+
iso2: "ru",
|
|
339
|
+
dialCode: "7",
|
|
340
|
+
format: "(...) ...-..-..",
|
|
341
|
+
priority: 1,
|
|
342
|
+
},
|
|
343
|
+
{ name: "Rwanda", iso2: "rw", dialCode: "250" },
|
|
344
|
+
{ name: "Saint Kitts and Nevis", iso2: "kn", dialCode: "1869" },
|
|
345
|
+
{ name: "Saint Lucia", iso2: "lc", dialCode: "1758" },
|
|
346
|
+
{
|
|
347
|
+
name: "Saint Pierre & Miquelon",
|
|
348
|
+
iso2: "pm",
|
|
349
|
+
dialCode: "508",
|
|
350
|
+
format: {
|
|
351
|
+
"/^708/": "... ... ...",
|
|
352
|
+
"/^8/": "... .. .. ..",
|
|
353
|
+
default: ".. .. ..",
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
{ name: "Saint Vincent and the Grenadines", iso2: "vc", dialCode: "1784" },
|
|
357
|
+
{ name: "Samoa", iso2: "ws", dialCode: "685" },
|
|
358
|
+
{ name: "San Marino", iso2: "sm", dialCode: "378" },
|
|
359
|
+
{ name: "São Tomé and Príncipe", iso2: "st", dialCode: "239" },
|
|
360
|
+
{ name: "Saudi Arabia", iso2: "sa", dialCode: "966" },
|
|
361
|
+
{ name: "Senegal", iso2: "sn", dialCode: "221" },
|
|
362
|
+
{ name: "Serbia", iso2: "rs", dialCode: "381" },
|
|
363
|
+
{ name: "Seychelles", iso2: "sc", dialCode: "248" },
|
|
364
|
+
{ name: "Sierra Leone", iso2: "sl", dialCode: "232" },
|
|
365
|
+
{ name: "Singapore", iso2: "sg", dialCode: "65", format: "....-...." },
|
|
366
|
+
{ name: "Slovakia", iso2: "sk", dialCode: "421" },
|
|
367
|
+
{ name: "Slovenia", iso2: "si", dialCode: "386" },
|
|
368
|
+
{ name: "Solomon Islands", iso2: "sb", dialCode: "677" },
|
|
369
|
+
{ name: "Somalia", iso2: "so", dialCode: "252" },
|
|
370
|
+
{ name: "South Africa", iso2: "za", dialCode: "27" },
|
|
371
|
+
{ name: "South Korea", iso2: "kr", dialCode: "82", format: "... .... ...." },
|
|
372
|
+
{ name: "South Sudan", iso2: "ss", dialCode: "211" },
|
|
373
|
+
{ name: "Spain", iso2: "es", dialCode: "34", format: "... ... ..." },
|
|
374
|
+
{ name: "Sri Lanka", iso2: "lk", dialCode: "94" },
|
|
375
|
+
{ name: "Sudan", iso2: "sd", dialCode: "249" },
|
|
376
|
+
{ name: "Suriname", iso2: "sr", dialCode: "597" },
|
|
377
|
+
{ name: "Swaziland", iso2: "sz", dialCode: "268" },
|
|
378
|
+
{ name: "Sweden", iso2: "se", dialCode: "46", format: "... ... ..." },
|
|
379
|
+
{ name: "Switzerland", iso2: "ch", dialCode: "41", format: ".. ... .. .." },
|
|
380
|
+
{ name: "Syria", iso2: "sy", dialCode: "963" },
|
|
381
|
+
{ name: "Taiwan", iso2: "tw", dialCode: "886" },
|
|
382
|
+
{ name: "Tajikistan", iso2: "tj", dialCode: "992" },
|
|
383
|
+
{ name: "Tanzania", iso2: "tz", dialCode: "255" },
|
|
384
|
+
{ name: "Thailand", iso2: "th", dialCode: "66" },
|
|
385
|
+
{ name: "Timor-Leste", iso2: "tl", dialCode: "670" },
|
|
386
|
+
{ name: "Togo", iso2: "tg", dialCode: "228" },
|
|
387
|
+
{ name: "Tonga", iso2: "to", dialCode: "676" },
|
|
388
|
+
{ name: "Trinidad and Tobago", iso2: "tt", dialCode: "1868" },
|
|
389
|
+
{ name: "Tunisia", iso2: "tn", dialCode: "216" },
|
|
390
|
+
{ name: "Turkey", iso2: "tr", dialCode: "90", format: "... ... .. .." },
|
|
391
|
+
{ name: "Turkmenistan", iso2: "tm", dialCode: "993" },
|
|
392
|
+
{ name: "Tuvalu", iso2: "tv", dialCode: "688" },
|
|
393
|
+
{ name: "Uganda", iso2: "ug", dialCode: "256" },
|
|
394
|
+
{ name: "Ukraine", iso2: "ua", dialCode: "380", format: "(..) ... .. .." },
|
|
395
|
+
{ name: "United Arab Emirates", iso2: "ae", dialCode: "971" },
|
|
396
|
+
{ name: "United Kingdom", iso2: "gb", dialCode: "44", format: ".... ......" },
|
|
397
|
+
{
|
|
398
|
+
name: "United States",
|
|
399
|
+
iso2: "us",
|
|
400
|
+
dialCode: "1",
|
|
401
|
+
format: "(...) ...-....",
|
|
402
|
+
priority: 0,
|
|
403
|
+
},
|
|
404
|
+
{ name: "Uruguay", iso2: "uy", dialCode: "598" },
|
|
405
|
+
{ name: "Uzbekistan", iso2: "uz", dialCode: "998", format: ".. ... .. .." },
|
|
406
|
+
{ name: "Vanuatu", iso2: "vu", dialCode: "678" },
|
|
407
|
+
{
|
|
408
|
+
name: "Vatican City",
|
|
409
|
+
iso2: "va",
|
|
410
|
+
dialCode: "39",
|
|
411
|
+
format: ".. .... ....",
|
|
412
|
+
priority: 1,
|
|
413
|
+
},
|
|
414
|
+
{ name: "Venezuela", iso2: "ve", dialCode: "58" },
|
|
415
|
+
{ name: "Vietnam", iso2: "vn", dialCode: "84" },
|
|
416
|
+
{ name: "Wallis & Futuna", iso2: "wf", dialCode: "681", format: ".. .. .." },
|
|
417
|
+
{ name: "Yemen", iso2: "ye", dialCode: "967" },
|
|
418
|
+
{ name: "Zambia", iso2: "zm", dialCode: "260" },
|
|
419
|
+
{ name: "Zimbabwe", iso2: "zw", dialCode: "263" },
|
|
420
|
+
];
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { getFlagCodepoint } from "./utils";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
|
|
4
|
+
export const LazyFlag: React.FC<{
|
|
5
|
+
iso2: string;
|
|
6
|
+
className?: string | string;
|
|
7
|
+
}> = ({ iso2, className }) => {
|
|
8
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
9
|
+
const [svgContent, setSvgContent] = useState<string | undefined>(undefined);
|
|
10
|
+
const codepoint = getFlagCodepoint(iso2);
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const el = ref.current;
|
|
14
|
+
if (!el) return;
|
|
15
|
+
|
|
16
|
+
const io = new IntersectionObserver(
|
|
17
|
+
(entries) => {
|
|
18
|
+
if (entries[0].isIntersecting) {
|
|
19
|
+
const fullUrl = `https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/${codepoint}.svg`;
|
|
20
|
+
|
|
21
|
+
const fetchAndCacheSvg = async () => {
|
|
22
|
+
try {
|
|
23
|
+
let response = await fetch(fullUrl);
|
|
24
|
+
if (response.ok) {
|
|
25
|
+
const responseClone = response.clone(); // clone BEFORE consuming body
|
|
26
|
+
const svgText = await response.text();
|
|
27
|
+
|
|
28
|
+
setSvgContent(svgText);
|
|
29
|
+
|
|
30
|
+
if ("caches" in window) {
|
|
31
|
+
const cache = await caches.open("flags-cache");
|
|
32
|
+
await cache.put(codepoint, responseClone);
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
console.error("Failed to fetch SVG", response.statusText);
|
|
36
|
+
}
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("Error fetching SVG:", error);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const checkCache = async () => {
|
|
42
|
+
if (!("caches" in window)) {
|
|
43
|
+
fetchAndCacheSvg();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const cache = await caches.open("flags-cache");
|
|
48
|
+
const cachedResponse = await cache.match(codepoint);
|
|
49
|
+
|
|
50
|
+
if (cachedResponse) {
|
|
51
|
+
const svgText = await cachedResponse.text();
|
|
52
|
+
|
|
53
|
+
setSvgContent(svgText);
|
|
54
|
+
} else {
|
|
55
|
+
fetchAndCacheSvg();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
checkCache();
|
|
59
|
+
|
|
60
|
+
io.disconnect();
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{ rootMargin: "550px" }
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
io.observe(el);
|
|
67
|
+
return () => io.disconnect();
|
|
68
|
+
}, [codepoint]);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<div ref={ref}>
|
|
72
|
+
{!svgContent ? (
|
|
73
|
+
<div className={`bg-primary rounded-full size-4 animate-pulse`} />
|
|
74
|
+
) : (
|
|
75
|
+
<div
|
|
76
|
+
ref={ref}
|
|
77
|
+
className={className}
|
|
78
|
+
dangerouslySetInnerHTML={{ __html: svgContent }}
|
|
79
|
+
/>
|
|
80
|
+
)}
|
|
81
|
+
</div>
|
|
82
|
+
);
|
|
83
|
+
};
|