ui-svelte 0.1.0
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/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/charts/ArcChart.svelte +320 -0
- package/dist/charts/ArcChart.svelte.d.ts +26 -0
- package/dist/charts/AreaChart.svelte +495 -0
- package/dist/charts/AreaChart.svelte.d.ts +32 -0
- package/dist/charts/BarChart.svelte +504 -0
- package/dist/charts/BarChart.svelte.d.ts +38 -0
- package/dist/charts/Candlestick.svelte +527 -0
- package/dist/charts/Candlestick.svelte.d.ts +38 -0
- package/dist/charts/LineChart.svelte +365 -0
- package/dist/charts/LineChart.svelte.d.ts +36 -0
- package/dist/charts/PieChart.svelte +311 -0
- package/dist/charts/PieChart.svelte.d.ts +28 -0
- package/dist/charts/css/arc-chart.css +237 -0
- package/dist/charts/css/area-chart.css +289 -0
- package/dist/charts/css/bar-chart.css +167 -0
- package/dist/charts/css/candlestick.css +197 -0
- package/dist/charts/css/line-chart.css +202 -0
- package/dist/charts/css/pie-chart.css +199 -0
- package/dist/control/Audio.svelte +212 -0
- package/dist/control/Audio.svelte.d.ts +8 -0
- package/dist/control/Button.svelte +116 -0
- package/dist/control/Button.svelte.d.ts +22 -0
- package/dist/control/IconButton.svelte +104 -0
- package/dist/control/IconButton.svelte.d.ts +17 -0
- package/dist/control/Record.svelte +430 -0
- package/dist/control/Record.svelte.d.ts +11 -0
- package/dist/control/ToggleTheme.svelte +21 -0
- package/dist/control/ToggleTheme.svelte.d.ts +8 -0
- package/dist/control/Video.svelte +222 -0
- package/dist/control/Video.svelte.d.ts +10 -0
- package/dist/control/css/btn.css +206 -0
- package/dist/control/css/media.css +78 -0
- package/dist/control/css/video.css +58 -0
- package/dist/css/animations.css +27 -0
- package/dist/css/base.css +192 -0
- package/dist/css/utilities.css +136 -0
- package/dist/display/Accordion.svelte +98 -0
- package/dist/display/Accordion.svelte.d.ts +20 -0
- package/dist/display/Alert.svelte +65 -0
- package/dist/display/Alert.svelte.d.ts +15 -0
- package/dist/display/Avatar.svelte +80 -0
- package/dist/display/Avatar.svelte.d.ts +13 -0
- package/dist/display/Badge.svelte +46 -0
- package/dist/display/Badge.svelte.d.ts +11 -0
- package/dist/display/Card.svelte +94 -0
- package/dist/display/Card.svelte.d.ts +21 -0
- package/dist/display/Carousel.svelte +359 -0
- package/dist/display/Carousel.svelte.d.ts +25 -0
- package/dist/display/ChatBox.svelte +249 -0
- package/dist/display/ChatBox.svelte.d.ts +18 -0
- package/dist/display/Chip.svelte +67 -0
- package/dist/display/Chip.svelte.d.ts +17 -0
- package/dist/display/Code.svelte +56 -0
- package/dist/display/Code.svelte.d.ts +9 -0
- package/dist/display/Collapsible.svelte +71 -0
- package/dist/display/Collapsible.svelte.d.ts +15 -0
- package/dist/display/Divider.svelte +32 -0
- package/dist/display/Divider.svelte.d.ts +10 -0
- package/dist/display/Empty.svelte +462 -0
- package/dist/display/Empty.svelte.d.ts +11 -0
- package/dist/display/Icon.svelte +20 -0
- package/dist/display/Icon.svelte.d.ts +11 -0
- package/dist/display/Item.svelte +119 -0
- package/dist/display/Item.svelte.d.ts +24 -0
- package/dist/display/Loading.svelte +8 -0
- package/dist/display/Loading.svelte.d.ts +26 -0
- package/dist/display/Marquee.svelte +164 -0
- package/dist/display/Marquee.svelte.d.ts +21 -0
- package/dist/display/Section.svelte +63 -0
- package/dist/display/Section.svelte.d.ts +16 -0
- package/dist/display/Table.svelte +407 -0
- package/dist/display/Table.svelte.d.ts +32 -0
- package/dist/display/TypeWriter.svelte +23 -0
- package/dist/display/TypeWriter.svelte.d.ts +11 -0
- package/dist/display/User.svelte +0 -0
- package/dist/display/User.svelte.d.ts +26 -0
- package/dist/display/css/accordion.css +98 -0
- package/dist/display/css/alert.css +51 -0
- package/dist/display/css/avatar.css +158 -0
- package/dist/display/css/badge.css +47 -0
- package/dist/display/css/card.css +231 -0
- package/dist/display/css/carousel.css +156 -0
- package/dist/display/css/chat-box.css +188 -0
- package/dist/display/css/chip.css +91 -0
- package/dist/display/css/code.css +19 -0
- package/dist/display/css/collapsible.css +86 -0
- package/dist/display/css/divider.css +54 -0
- package/dist/display/css/empty.css +8 -0
- package/dist/display/css/item.css +149 -0
- package/dist/display/css/listbox.css +24 -0
- package/dist/display/css/marquee.css +138 -0
- package/dist/display/css/section.css +85 -0
- package/dist/display/css/table.css +361 -0
- package/dist/form/Checkbox.svelte +45 -0
- package/dist/form/Checkbox.svelte.d.ts +13 -0
- package/dist/form/ComboBox.svelte +448 -0
- package/dist/form/ComboBox.svelte.d.ts +29 -0
- package/dist/form/CsvField.svelte +389 -0
- package/dist/form/CsvField.svelte.d.ts +21 -0
- package/dist/form/DateField.svelte +292 -0
- package/dist/form/DateField.svelte.d.ts +18 -0
- package/dist/form/Dropzone.svelte +196 -0
- package/dist/form/Dropzone.svelte.d.ts +30 -0
- package/dist/form/ImageCropper.svelte +254 -0
- package/dist/form/ImageCropper.svelte.d.ts +14 -0
- package/dist/form/PasswordField.svelte +170 -0
- package/dist/form/PasswordField.svelte.d.ts +28 -0
- package/dist/form/PhoneField.svelte +485 -0
- package/dist/form/PhoneField.svelte.d.ts +25 -0
- package/dist/form/PinField.svelte +139 -0
- package/dist/form/PinField.svelte.d.ts +17 -0
- package/dist/form/RadioGroup.svelte +70 -0
- package/dist/form/RadioGroup.svelte.d.ts +19 -0
- package/dist/form/Select.svelte +350 -0
- package/dist/form/Select.svelte.d.ts +26 -0
- package/dist/form/Slider.svelte +60 -0
- package/dist/form/Slider.svelte.d.ts +15 -0
- package/dist/form/TextField.svelte +154 -0
- package/dist/form/TextField.svelte.d.ts +31 -0
- package/dist/form/Textarea.svelte +137 -0
- package/dist/form/Textarea.svelte.d.ts +27 -0
- package/dist/form/Toggle.svelte +45 -0
- package/dist/form/Toggle.svelte.d.ts +13 -0
- package/dist/form/css/checkbox.css +46 -0
- package/dist/form/css/combo-box.css +69 -0
- package/dist/form/css/control.css +177 -0
- package/dist/form/css/csv-field.css +0 -0
- package/dist/form/css/date.css +56 -0
- package/dist/form/css/dropzone.css +133 -0
- package/dist/form/css/field.css +17 -0
- package/dist/form/css/image-cropper.css +155 -0
- package/dist/form/css/password.css +35 -0
- package/dist/form/css/radio-group.css +57 -0
- package/dist/form/css/select.css +18 -0
- package/dist/form/css/slider.css +80 -0
- package/dist/form/css/textarea.css +130 -0
- package/dist/form/css/toggle.css +27 -0
- package/dist/form/js/countries.d.ts +13 -0
- package/dist/form/js/countries.js +307 -0
- package/dist/form/js/phone-examples.d.ts +248 -0
- package/dist/form/js/phone-examples.js +247 -0
- package/dist/hooks/use-auth.svelte.d.ts +11 -0
- package/dist/hooks/use-auth.svelte.js +59 -0
- package/dist/hooks/use-chat.svelte.d.ts +40 -0
- package/dist/hooks/use-chat.svelte.js +265 -0
- package/dist/hooks/use-clipboard.svelte.d.ts +9 -0
- package/dist/hooks/use-clipboard.svelte.js +52 -0
- package/dist/hooks/use-fetch.svelte.d.ts +11 -0
- package/dist/hooks/use-fetch.svelte.js +38 -0
- package/dist/hooks/use-form.svelte.d.ts +31 -0
- package/dist/hooks/use-form.svelte.js +110 -0
- package/dist/hooks/use-localstorage.svelte.d.ts +3 -0
- package/dist/hooks/use-localstorage.svelte.js +26 -0
- package/dist/hooks/use-scroll.svelte.d.ts +6 -0
- package/dist/hooks/use-scroll.svelte.js +34 -0
- package/dist/hooks/use-search.svelte.d.ts +49 -0
- package/dist/hooks/use-search.svelte.js +229 -0
- package/dist/hooks/use-table.svelte.d.ts +85 -0
- package/dist/hooks/use-table.svelte.js +362 -0
- package/dist/hooks/use-websocket.svelte.d.ts +18 -0
- package/dist/hooks/use-websocket.svelte.js +79 -0
- package/dist/icons/index.d.ts +132 -0
- package/dist/icons/index.js +132 -0
- package/dist/index.css +115 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.js +76 -0
- package/dist/layout/AppBar.svelte +94 -0
- package/dist/layout/AppBar.svelte.d.ts +17 -0
- package/dist/layout/Footer.svelte +94 -0
- package/dist/layout/Footer.svelte.d.ts +17 -0
- package/dist/layout/FooterLinks.svelte +28 -0
- package/dist/layout/FooterLinks.svelte.d.ts +11 -0
- package/dist/layout/Provider.svelte +52 -0
- package/dist/layout/Provider.svelte.d.ts +10 -0
- package/dist/layout/Scaffold.svelte +46 -0
- package/dist/layout/Scaffold.svelte.d.ts +15 -0
- package/dist/layout/Sidebar.svelte +40 -0
- package/dist/layout/Sidebar.svelte.d.ts +13 -0
- package/dist/layout/css/app-bar.css +35 -0
- package/dist/layout/css/bottom-bar.css +12 -0
- package/dist/layout/css/footer-links.css +17 -0
- package/dist/layout/css/footer.css +35 -0
- package/dist/layout/css/scaffold.css +15 -0
- package/dist/layout/css/sidebar.css +17 -0
- package/dist/navigation/BottomNav.svelte +0 -0
- package/dist/navigation/BottomNav.svelte.d.ts +26 -0
- package/dist/navigation/NavMenu.svelte +254 -0
- package/dist/navigation/SideNav.svelte +249 -0
- package/dist/navigation/Tabs.svelte +79 -0
- package/dist/navigation/Tabs.svelte.d.ts +19 -0
- package/dist/navigation/css/bottom-nav.css +0 -0
- package/dist/navigation/css/nav-menu.css +168 -0
- package/dist/navigation/css/side-nav.css +244 -0
- package/dist/navigation/css/tabs.css +118 -0
- package/dist/overlay/AlertDialog.svelte +0 -0
- package/dist/overlay/AlertDialog.svelte.d.ts +26 -0
- package/dist/overlay/Command.svelte +0 -0
- package/dist/overlay/Command.svelte.d.ts +26 -0
- package/dist/overlay/Drawer.svelte +129 -0
- package/dist/overlay/Drawer.svelte.d.ts +20 -0
- package/dist/overlay/Dropdown.svelte +140 -0
- package/dist/overlay/Modal.svelte +102 -0
- package/dist/overlay/Modal.svelte.d.ts +19 -0
- package/dist/overlay/PopoverStack.svelte +0 -0
- package/dist/overlay/PopoverStack.svelte.d.ts +26 -0
- package/dist/overlay/Toast.svelte +83 -0
- package/dist/overlay/Toast.svelte.d.ts +9 -0
- package/dist/overlay/Tooltip.svelte +140 -0
- package/dist/overlay/Tooltip.svelte.d.ts +12 -0
- package/dist/overlay/css/drawer.css +75 -0
- package/dist/overlay/css/dropdown.css +24 -0
- package/dist/overlay/css/hovercard.css +11 -0
- package/dist/overlay/css/modal.css +51 -0
- package/dist/overlay/css/toast.css +80 -0
- package/dist/overlay/css/tooltip.css +89 -0
- package/dist/stores/i18n.svelte.d.ts +16 -0
- package/dist/stores/i18n.svelte.js +137 -0
- package/dist/stores/theme.svelte.d.ts +5 -0
- package/dist/stores/theme.svelte.js +55 -0
- package/dist/stores/toast.svelte.d.ts +19 -0
- package/dist/stores/toast.svelte.js +38 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.js +1 -0
- package/dist/utils/charts.d.ts +27 -0
- package/dist/utils/charts.js +140 -0
- package/dist/utils/class-names.d.ts +1 -0
- package/dist/utils/class-names.js +3 -0
- package/dist/utils/click-outside.d.ts +3 -0
- package/dist/utils/click-outside.js +9 -0
- package/dist/utils/popover.d.ts +3 -0
- package/dist/utils/popover.js +17 -0
- package/dist/utils/ulid.d.ts +1 -0
- package/dist/utils/ulid.js +22 -0
- package/dist/utils/validate-schema.d.ts +2 -0
- package/dist/utils/validate-schema.js +97 -0
- package/package.json +69 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
AC: '40123',
|
|
3
|
+
AD: '312345',
|
|
4
|
+
AE: '501234567',
|
|
5
|
+
AF: '701234567',
|
|
6
|
+
AG: '2684641234',
|
|
7
|
+
AI: '2642351234',
|
|
8
|
+
AL: '672123456',
|
|
9
|
+
AM: '77123456',
|
|
10
|
+
AO: '923123456',
|
|
11
|
+
AR: '91123456789',
|
|
12
|
+
AS: '6847331234',
|
|
13
|
+
AT: '664123456',
|
|
14
|
+
AU: '412345678',
|
|
15
|
+
AW: '5601234',
|
|
16
|
+
AX: '412345678',
|
|
17
|
+
AZ: '401234567',
|
|
18
|
+
BA: '61123456',
|
|
19
|
+
BB: '2462501234',
|
|
20
|
+
BD: '1812345678',
|
|
21
|
+
BE: '470123456',
|
|
22
|
+
BF: '70123456',
|
|
23
|
+
BG: '43012345',
|
|
24
|
+
BH: '36001234',
|
|
25
|
+
BI: '79561234',
|
|
26
|
+
BJ: '90011234',
|
|
27
|
+
BL: '690001234',
|
|
28
|
+
BM: '4413701234',
|
|
29
|
+
BN: '7123456',
|
|
30
|
+
BO: '71234567',
|
|
31
|
+
BQ: '3181234',
|
|
32
|
+
BR: '11961234567',
|
|
33
|
+
BS: '2423591234',
|
|
34
|
+
BT: '17123456',
|
|
35
|
+
BW: '71123456',
|
|
36
|
+
BY: '294911911',
|
|
37
|
+
BZ: '6221234',
|
|
38
|
+
CA: '5062345678',
|
|
39
|
+
CC: '412345678',
|
|
40
|
+
CD: '991234567',
|
|
41
|
+
CF: '70012345',
|
|
42
|
+
CG: '061234567',
|
|
43
|
+
CH: '781234567',
|
|
44
|
+
CI: '0123456789',
|
|
45
|
+
CK: '71234',
|
|
46
|
+
CL: '221234567',
|
|
47
|
+
CM: '671234567',
|
|
48
|
+
CN: '13123456789',
|
|
49
|
+
CO: '3211234567',
|
|
50
|
+
CR: '83123456',
|
|
51
|
+
CU: '51234567',
|
|
52
|
+
CV: '9911234',
|
|
53
|
+
CW: '95181234',
|
|
54
|
+
CX: '412345678',
|
|
55
|
+
CY: '96123456',
|
|
56
|
+
CZ: '601123456',
|
|
57
|
+
DE: '15123456789',
|
|
58
|
+
DJ: '77831001',
|
|
59
|
+
DK: '32123456',
|
|
60
|
+
DM: '7672251234',
|
|
61
|
+
DO: '8092345678',
|
|
62
|
+
DZ: '551234567',
|
|
63
|
+
EC: '991234567',
|
|
64
|
+
EE: '51234567',
|
|
65
|
+
EG: '1001234567',
|
|
66
|
+
EH: '650123456',
|
|
67
|
+
ER: '7123456',
|
|
68
|
+
ES: '612345678',
|
|
69
|
+
ET: '911234567',
|
|
70
|
+
FI: '412345678',
|
|
71
|
+
FJ: '7012345',
|
|
72
|
+
FK: '51234',
|
|
73
|
+
FM: '3501234',
|
|
74
|
+
FO: '211234',
|
|
75
|
+
FR: '612345678',
|
|
76
|
+
GA: '06031234',
|
|
77
|
+
GB: '7400123456',
|
|
78
|
+
GD: '4734031234',
|
|
79
|
+
GE: '555123456',
|
|
80
|
+
GF: '694201234',
|
|
81
|
+
GG: '7781123456',
|
|
82
|
+
GH: '231234567',
|
|
83
|
+
GI: '57123456',
|
|
84
|
+
GL: '221234',
|
|
85
|
+
GM: '3012345',
|
|
86
|
+
GN: '601123456',
|
|
87
|
+
GP: '690001234',
|
|
88
|
+
GQ: '222123456',
|
|
89
|
+
GR: '6912345678',
|
|
90
|
+
GT: '51234567',
|
|
91
|
+
GU: '6713001234',
|
|
92
|
+
GW: '955012345',
|
|
93
|
+
GY: '6091234',
|
|
94
|
+
HK: '51234567',
|
|
95
|
+
HN: '91234567',
|
|
96
|
+
HR: '921234567',
|
|
97
|
+
HT: '34101234',
|
|
98
|
+
HU: '201234567',
|
|
99
|
+
ID: '812345678',
|
|
100
|
+
IE: '850123456',
|
|
101
|
+
IL: '502345678',
|
|
102
|
+
IM: '7924123456',
|
|
103
|
+
IN: '8123456789',
|
|
104
|
+
IO: '3801234',
|
|
105
|
+
IQ: '7912345678',
|
|
106
|
+
IR: '9123456789',
|
|
107
|
+
IS: '6111234',
|
|
108
|
+
IT: '3123456789',
|
|
109
|
+
JE: '7797712345',
|
|
110
|
+
JM: '8762101234',
|
|
111
|
+
JO: '790123456',
|
|
112
|
+
JP: '9012345678',
|
|
113
|
+
KE: '712123456',
|
|
114
|
+
KG: '700123456',
|
|
115
|
+
KH: '91234567',
|
|
116
|
+
KI: '72001234',
|
|
117
|
+
KM: '3212345',
|
|
118
|
+
KN: '8697652917',
|
|
119
|
+
KP: '1921234567',
|
|
120
|
+
KR: '1020000000',
|
|
121
|
+
KW: '50012345',
|
|
122
|
+
KY: '3453231234',
|
|
123
|
+
KZ: '7710009998',
|
|
124
|
+
LA: '2023123456',
|
|
125
|
+
LB: '71123456',
|
|
126
|
+
LC: '7582845678',
|
|
127
|
+
LI: '660234567',
|
|
128
|
+
LK: '712345678',
|
|
129
|
+
LR: '770123456',
|
|
130
|
+
LS: '50123456',
|
|
131
|
+
LT: '61234567',
|
|
132
|
+
LU: '628123456',
|
|
133
|
+
LV: '21234567',
|
|
134
|
+
LY: '912345678',
|
|
135
|
+
MA: '650123456',
|
|
136
|
+
MC: '612345678',
|
|
137
|
+
MD: '62112345',
|
|
138
|
+
ME: '67622901',
|
|
139
|
+
MF: '690001234',
|
|
140
|
+
MG: '321234567',
|
|
141
|
+
MH: '2351234',
|
|
142
|
+
MK: '72345678',
|
|
143
|
+
ML: '65012345',
|
|
144
|
+
MM: '92123456',
|
|
145
|
+
MN: '88123456',
|
|
146
|
+
MO: '66123456',
|
|
147
|
+
MP: '6702345678',
|
|
148
|
+
MQ: '696201234',
|
|
149
|
+
MR: '22123456',
|
|
150
|
+
MS: '6644923456',
|
|
151
|
+
MT: '96961234',
|
|
152
|
+
MU: '52512345',
|
|
153
|
+
MV: '7712345',
|
|
154
|
+
MW: '991234567',
|
|
155
|
+
MX: '12221234567',
|
|
156
|
+
MY: '123456789',
|
|
157
|
+
MZ: '821234567',
|
|
158
|
+
NA: '811234567',
|
|
159
|
+
NC: '751234',
|
|
160
|
+
NE: '93123456',
|
|
161
|
+
NF: '381234',
|
|
162
|
+
NG: '8021234567',
|
|
163
|
+
NI: '81234567',
|
|
164
|
+
NL: '612345678',
|
|
165
|
+
NO: '40612345',
|
|
166
|
+
NP: '9841234567',
|
|
167
|
+
NR: '5551234',
|
|
168
|
+
NU: '8884012',
|
|
169
|
+
NZ: '211234567',
|
|
170
|
+
OM: '92123456',
|
|
171
|
+
PA: '61234567',
|
|
172
|
+
PE: '912345678',
|
|
173
|
+
PF: '87123456',
|
|
174
|
+
PG: '70123456',
|
|
175
|
+
PH: '9051234567',
|
|
176
|
+
PK: '3012345678',
|
|
177
|
+
PL: '512345678',
|
|
178
|
+
PM: '551234',
|
|
179
|
+
PR: '7872345678',
|
|
180
|
+
PS: '599123456',
|
|
181
|
+
PT: '912345678',
|
|
182
|
+
PW: '6201234',
|
|
183
|
+
PY: '961456789',
|
|
184
|
+
QA: '33123456',
|
|
185
|
+
RE: '692123456',
|
|
186
|
+
RO: '712034567',
|
|
187
|
+
RS: '601234567',
|
|
188
|
+
RU: '9123456789',
|
|
189
|
+
RW: '720123456',
|
|
190
|
+
SA: '512345678',
|
|
191
|
+
SB: '7421234',
|
|
192
|
+
SC: '2510123',
|
|
193
|
+
SD: '911231234',
|
|
194
|
+
SE: '701234567',
|
|
195
|
+
SG: '81234567',
|
|
196
|
+
SH: '51234',
|
|
197
|
+
SI: '31234567',
|
|
198
|
+
SJ: '41234567',
|
|
199
|
+
SK: '912123456',
|
|
200
|
+
SL: '25123456',
|
|
201
|
+
SM: '66661212',
|
|
202
|
+
SN: '701234567',
|
|
203
|
+
SO: '71123456',
|
|
204
|
+
SR: '7412345',
|
|
205
|
+
SS: '977123456',
|
|
206
|
+
ST: '9812345',
|
|
207
|
+
SV: '70123456',
|
|
208
|
+
SX: '7215205678',
|
|
209
|
+
SY: '944567890',
|
|
210
|
+
SZ: '76123456',
|
|
211
|
+
TA: '8999',
|
|
212
|
+
TC: '6492311234',
|
|
213
|
+
TD: '63012345',
|
|
214
|
+
TG: '90112345',
|
|
215
|
+
TH: '812345678',
|
|
216
|
+
TJ: '917123456',
|
|
217
|
+
TK: '7290',
|
|
218
|
+
TL: '77212345',
|
|
219
|
+
TM: '66123456',
|
|
220
|
+
TN: '20123456',
|
|
221
|
+
TO: '7715123',
|
|
222
|
+
TR: '5012345678',
|
|
223
|
+
TT: '8682911234',
|
|
224
|
+
TV: '901234',
|
|
225
|
+
TW: '912345678',
|
|
226
|
+
TZ: '621234567',
|
|
227
|
+
UA: '501234567',
|
|
228
|
+
UG: '712345678',
|
|
229
|
+
US: '2015550123',
|
|
230
|
+
UY: '94231234',
|
|
231
|
+
UZ: '912345678',
|
|
232
|
+
VA: '3123456789',
|
|
233
|
+
VC: '7844301234',
|
|
234
|
+
VE: '4121234567',
|
|
235
|
+
VG: '2843001234',
|
|
236
|
+
VI: '3406421234',
|
|
237
|
+
VN: '912345678',
|
|
238
|
+
VU: '5912345',
|
|
239
|
+
WF: '821234',
|
|
240
|
+
WS: '7212345',
|
|
241
|
+
XK: '43201234',
|
|
242
|
+
YE: '712345678',
|
|
243
|
+
YT: '639012345',
|
|
244
|
+
ZA: '711234567',
|
|
245
|
+
ZM: '955123456',
|
|
246
|
+
ZW: '712345678'
|
|
247
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { goto } from '$app/navigation';
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
export const useAuth = (config) => {
|
|
4
|
+
let isLoading = $state(true);
|
|
5
|
+
let isAuthorized = $state(false);
|
|
6
|
+
onMount(async () => {
|
|
7
|
+
try {
|
|
8
|
+
const token = localStorage.getItem('token');
|
|
9
|
+
if (!token) {
|
|
10
|
+
isAuthorized = false;
|
|
11
|
+
if (config.urlError) {
|
|
12
|
+
await goto(config.urlError);
|
|
13
|
+
}
|
|
14
|
+
isLoading = false;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let url = config.endpoint;
|
|
18
|
+
if (config.routeAccess) {
|
|
19
|
+
const separator = url.includes('?') ? '&' : '?';
|
|
20
|
+
url = `${url}${separator}routeAccess=${encodeURIComponent(config.routeAccess)}`;
|
|
21
|
+
}
|
|
22
|
+
const res = await fetch(url, {
|
|
23
|
+
method: 'GET',
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
Authorization: `Bearer ${token}`
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
throw new Error(`Error de autenticación: ${res.status}`);
|
|
31
|
+
}
|
|
32
|
+
const data = await res.json();
|
|
33
|
+
if (!data || !data.user) {
|
|
34
|
+
throw new Error('Respuesta inválida del servidor');
|
|
35
|
+
}
|
|
36
|
+
isAuthorized = true;
|
|
37
|
+
if (config.urlSuccess) {
|
|
38
|
+
await goto(config.urlSuccess);
|
|
39
|
+
}
|
|
40
|
+
isLoading = false;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
if (config.urlError) {
|
|
44
|
+
localStorage.removeItem('token');
|
|
45
|
+
await goto(config.urlError);
|
|
46
|
+
}
|
|
47
|
+
isAuthorized = false;
|
|
48
|
+
isLoading = false;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
get isLoading() {
|
|
53
|
+
return isLoading;
|
|
54
|
+
},
|
|
55
|
+
get isAuthorized() {
|
|
56
|
+
return isAuthorized;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface Message {
|
|
2
|
+
id: string;
|
|
3
|
+
content: string;
|
|
4
|
+
senderId: string;
|
|
5
|
+
timestamp: Date | string;
|
|
6
|
+
status?: 'sending' | 'sent' | 'delivered' | 'read' | 'error';
|
|
7
|
+
type?: 'text' | 'image' | 'file';
|
|
8
|
+
metadata?: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
export interface ChatConfig {
|
|
11
|
+
chatId: string;
|
|
12
|
+
userId: string;
|
|
13
|
+
apiUrl: string;
|
|
14
|
+
wsUrl: string;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
initialLimit?: number;
|
|
17
|
+
onMessageReceived?: (message: Message) => void;
|
|
18
|
+
onMessageSent?: (message: Message) => void;
|
|
19
|
+
onError?: (error: any) => void;
|
|
20
|
+
onConnected?: () => void;
|
|
21
|
+
onDisconnected?: () => void;
|
|
22
|
+
transformMessage?: (data: any) => Message;
|
|
23
|
+
autoConnect?: boolean;
|
|
24
|
+
reconnectInterval?: number;
|
|
25
|
+
maxReconnectAttempts?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ChatState {
|
|
28
|
+
messages: Message[];
|
|
29
|
+
isLoading: boolean;
|
|
30
|
+
isConnected: boolean;
|
|
31
|
+
error: any;
|
|
32
|
+
sendMessage: (content: string, type?: string, metadata?: Record<string, any>) => Promise<void>;
|
|
33
|
+
loadMore: () => Promise<void>;
|
|
34
|
+
markAsRead: (messageId: string) => void;
|
|
35
|
+
connect: () => void;
|
|
36
|
+
disconnect: () => void;
|
|
37
|
+
hasMore: boolean;
|
|
38
|
+
isSending: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare const useChat: (config: ChatConfig) => ChatState;
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
export const useChat = (config) => {
|
|
2
|
+
let messages = $state([]);
|
|
3
|
+
let isLoading = $state(false);
|
|
4
|
+
let isConnected = $state(false);
|
|
5
|
+
let error = $state(null);
|
|
6
|
+
let hasMore = $state(true);
|
|
7
|
+
let isSending = $state(false);
|
|
8
|
+
let ws = null;
|
|
9
|
+
let reconnectAttempts = 0;
|
|
10
|
+
let reconnectTimeout;
|
|
11
|
+
let oldestMessageId = null;
|
|
12
|
+
const maxReconnectAttempts = config.maxReconnectAttempts ?? 5;
|
|
13
|
+
const reconnectInterval = config.reconnectInterval ?? 3000;
|
|
14
|
+
const loadInitialMessages = async () => {
|
|
15
|
+
isLoading = true;
|
|
16
|
+
error = null;
|
|
17
|
+
try {
|
|
18
|
+
const token = localStorage.getItem('token');
|
|
19
|
+
const headers = {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
...config.headers
|
|
22
|
+
};
|
|
23
|
+
if (token) {
|
|
24
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
25
|
+
}
|
|
26
|
+
const limit = config.initialLimit ?? 50;
|
|
27
|
+
const response = await fetch(`${config.apiUrl}/chats/${config.chatId}/messages?limit=${limit}`, {
|
|
28
|
+
method: 'GET',
|
|
29
|
+
headers
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
33
|
+
}
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
const loadedMessages = config.transformMessage
|
|
36
|
+
? data.messages.map(config.transformMessage)
|
|
37
|
+
: data.messages;
|
|
38
|
+
messages = loadedMessages.reverse(); // Asumiendo que vienen del más reciente al más antiguo
|
|
39
|
+
hasMore = data.hasMore ?? false;
|
|
40
|
+
if (messages.length > 0) {
|
|
41
|
+
oldestMessageId = messages[0].id;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
error = err;
|
|
46
|
+
config.onError?.(err);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
isLoading = false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const loadMore = async () => {
|
|
53
|
+
if (!hasMore || isLoading)
|
|
54
|
+
return;
|
|
55
|
+
isLoading = true;
|
|
56
|
+
try {
|
|
57
|
+
const token = localStorage.getItem('token');
|
|
58
|
+
const headers = {
|
|
59
|
+
'Content-Type': 'application/json',
|
|
60
|
+
...config.headers
|
|
61
|
+
};
|
|
62
|
+
if (token) {
|
|
63
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
64
|
+
}
|
|
65
|
+
const limit = config.initialLimit ?? 50;
|
|
66
|
+
const response = await fetch(`${config.apiUrl}/chats/${config.chatId}/messages?limit=${limit}&before=${oldestMessageId}`, {
|
|
67
|
+
method: 'GET',
|
|
68
|
+
headers
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
const data = await response.json();
|
|
74
|
+
const loadedMessages = config.transformMessage
|
|
75
|
+
? data.messages.map(config.transformMessage)
|
|
76
|
+
: data.messages;
|
|
77
|
+
messages = [...loadedMessages.reverse(), ...messages];
|
|
78
|
+
hasMore = data.hasMore ?? false;
|
|
79
|
+
if (loadedMessages.length > 0) {
|
|
80
|
+
oldestMessageId = loadedMessages[0].id;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
error = err;
|
|
85
|
+
config.onError?.(err);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
isLoading = false;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const connect = () => {
|
|
92
|
+
if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const token = localStorage.getItem('token');
|
|
97
|
+
const wsUrl = token
|
|
98
|
+
? `${config.wsUrl}?token=${token}&chatId=${config.chatId}&userId=${config.userId}`
|
|
99
|
+
: `${config.wsUrl}?chatId=${config.chatId}&userId=${config.userId}`;
|
|
100
|
+
ws = new WebSocket(wsUrl);
|
|
101
|
+
ws.onopen = () => {
|
|
102
|
+
isConnected = true;
|
|
103
|
+
reconnectAttempts = 0;
|
|
104
|
+
config.onConnected?.();
|
|
105
|
+
};
|
|
106
|
+
ws.onmessage = (event) => {
|
|
107
|
+
try {
|
|
108
|
+
const data = JSON.parse(event.data);
|
|
109
|
+
switch (data.type) {
|
|
110
|
+
case 'message':
|
|
111
|
+
const newMessage = config.transformMessage
|
|
112
|
+
? config.transformMessage(data.message)
|
|
113
|
+
: data.message;
|
|
114
|
+
if (!messages.some((m) => m.id === newMessage.id)) {
|
|
115
|
+
messages = [...messages, newMessage];
|
|
116
|
+
config.onMessageReceived?.(newMessage);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case 'status':
|
|
120
|
+
messages = messages.map((m) => m.id === data.messageId ? { ...m, status: data.status } : m);
|
|
121
|
+
break;
|
|
122
|
+
case 'typing':
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.error('Error parsing WebSocket message:', err);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
ws.onerror = (event) => {
|
|
131
|
+
error = event;
|
|
132
|
+
config.onError?.(event);
|
|
133
|
+
};
|
|
134
|
+
ws.onclose = () => {
|
|
135
|
+
isConnected = false;
|
|
136
|
+
config.onDisconnected?.();
|
|
137
|
+
if (reconnectAttempts < maxReconnectAttempts) {
|
|
138
|
+
reconnectAttempts++;
|
|
139
|
+
reconnectTimeout = setTimeout(() => {
|
|
140
|
+
connect();
|
|
141
|
+
}, reconnectInterval);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
error = err;
|
|
147
|
+
config.onError?.(err);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const disconnect = () => {
|
|
151
|
+
clearTimeout(reconnectTimeout);
|
|
152
|
+
reconnectAttempts = maxReconnectAttempts;
|
|
153
|
+
if (ws) {
|
|
154
|
+
ws.close();
|
|
155
|
+
ws = null;
|
|
156
|
+
}
|
|
157
|
+
isConnected = false;
|
|
158
|
+
};
|
|
159
|
+
const sendMessage = async (content, type = 'text', metadata) => {
|
|
160
|
+
if (!content.trim() || isSending)
|
|
161
|
+
return;
|
|
162
|
+
const tempId = `temp-${Date.now()}`;
|
|
163
|
+
const tempMessage = {
|
|
164
|
+
id: tempId,
|
|
165
|
+
content,
|
|
166
|
+
senderId: config.userId,
|
|
167
|
+
timestamp: new Date(),
|
|
168
|
+
status: 'sending',
|
|
169
|
+
type: type,
|
|
170
|
+
metadata
|
|
171
|
+
};
|
|
172
|
+
messages = [...messages, tempMessage];
|
|
173
|
+
isSending = true;
|
|
174
|
+
try {
|
|
175
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
176
|
+
ws.send(JSON.stringify({
|
|
177
|
+
type: 'message',
|
|
178
|
+
chatId: config.chatId,
|
|
179
|
+
content,
|
|
180
|
+
messageType: type,
|
|
181
|
+
metadata
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const token = localStorage.getItem('token');
|
|
186
|
+
const headers = {
|
|
187
|
+
'Content-Type': 'application/json',
|
|
188
|
+
...config.headers
|
|
189
|
+
};
|
|
190
|
+
if (token) {
|
|
191
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
192
|
+
}
|
|
193
|
+
const response = await fetch(`${config.apiUrl}/chats/${config.chatId}/messages`, {
|
|
194
|
+
method: 'POST',
|
|
195
|
+
headers,
|
|
196
|
+
body: JSON.stringify({
|
|
197
|
+
content,
|
|
198
|
+
type,
|
|
199
|
+
metadata
|
|
200
|
+
})
|
|
201
|
+
});
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
204
|
+
}
|
|
205
|
+
const data = await response.json();
|
|
206
|
+
const sentMessage = config.transformMessage
|
|
207
|
+
? config.transformMessage(data.message)
|
|
208
|
+
: data.message;
|
|
209
|
+
messages = messages.map((m) => (m.id === tempId ? sentMessage : m));
|
|
210
|
+
config.onMessageSent?.(sentMessage);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
messages = messages.map((m) => (m.id === tempId ? { ...m, status: 'error' } : m));
|
|
215
|
+
error = err;
|
|
216
|
+
config.onError?.(err);
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
isSending = false;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
const markAsRead = (messageId) => {
|
|
223
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
224
|
+
ws.send(JSON.stringify({
|
|
225
|
+
type: 'read',
|
|
226
|
+
messageId,
|
|
227
|
+
chatId: config.chatId
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
$effect(() => {
|
|
232
|
+
loadInitialMessages();
|
|
233
|
+
if (config.autoConnect !== false) {
|
|
234
|
+
connect();
|
|
235
|
+
}
|
|
236
|
+
return () => {
|
|
237
|
+
disconnect();
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
return {
|
|
241
|
+
get messages() {
|
|
242
|
+
return messages;
|
|
243
|
+
},
|
|
244
|
+
get isLoading() {
|
|
245
|
+
return isLoading;
|
|
246
|
+
},
|
|
247
|
+
get isConnected() {
|
|
248
|
+
return isConnected;
|
|
249
|
+
},
|
|
250
|
+
get error() {
|
|
251
|
+
return error;
|
|
252
|
+
},
|
|
253
|
+
get hasMore() {
|
|
254
|
+
return hasMore;
|
|
255
|
+
},
|
|
256
|
+
get isSending() {
|
|
257
|
+
return isSending;
|
|
258
|
+
},
|
|
259
|
+
sendMessage,
|
|
260
|
+
loadMore,
|
|
261
|
+
markAsRead,
|
|
262
|
+
connect,
|
|
263
|
+
disconnect
|
|
264
|
+
};
|
|
265
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const copyMethods = [
|
|
2
|
+
async (str) => {
|
|
3
|
+
await navigator.clipboard.writeText(str);
|
|
4
|
+
},
|
|
5
|
+
async (str) => {
|
|
6
|
+
const textarea = document.createElement('textarea');
|
|
7
|
+
textarea.value = str;
|
|
8
|
+
textarea.style.position = 'fixed';
|
|
9
|
+
textarea.style.opacity = '0';
|
|
10
|
+
document.body.appendChild(textarea);
|
|
11
|
+
textarea.focus();
|
|
12
|
+
textarea.select();
|
|
13
|
+
document.execCommand('copy');
|
|
14
|
+
document.body.removeChild(textarea);
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
export const useClipboard = (config = {}) => {
|
|
18
|
+
const { delay = 6000 } = config;
|
|
19
|
+
let lastCopied = $state(null);
|
|
20
|
+
let copied = $derived(lastCopied !== null);
|
|
21
|
+
const copyToClipboard = async (overwriteCopyStr) => {
|
|
22
|
+
const strToCopy = String(overwriteCopyStr);
|
|
23
|
+
for (const method of copyMethods) {
|
|
24
|
+
try {
|
|
25
|
+
await method(strToCopy);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error('Copy method failed:', error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
throw new Error('Copy failed, browser not supported.');
|
|
33
|
+
};
|
|
34
|
+
const copy = async (newCopyString) => {
|
|
35
|
+
if (!['string', 'number'].includes(typeof newCopyString)) {
|
|
36
|
+
throw new Error('Invalid copy type: Only string and number are supported.');
|
|
37
|
+
}
|
|
38
|
+
const time = Date.now();
|
|
39
|
+
lastCopied = time;
|
|
40
|
+
await copyToClipboard(newCopyString);
|
|
41
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
42
|
+
if (time !== lastCopied)
|
|
43
|
+
return;
|
|
44
|
+
lastCopied = null;
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
get copied() {
|
|
48
|
+
return copied;
|
|
49
|
+
},
|
|
50
|
+
copy
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface FetchConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
onSuccess?: (data: Object) => void;
|
|
6
|
+
onError?: (error: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const useFetch: (config: FetchConfig) => {
|
|
9
|
+
readonly loading: boolean;
|
|
10
|
+
request: (body: Object) => Promise<void>;
|
|
11
|
+
};
|