@stapel/chat-react 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/CHANGELOG.md +1 -0
- package/MODULE.md +118 -0
- package/README.md +126 -0
- package/dist/api/chatApi.d.ts +49 -0
- package/dist/api/chatApi.d.ts.map +1 -0
- package/dist/api/chatApi.js +46 -0
- package/dist/api/chatApi.js.map +1 -0
- package/dist/api/extensions.d.ts +19 -0
- package/dist/api/extensions.d.ts.map +1 -0
- package/dist/api/extensions.js +19 -0
- package/dist/api/extensions.js.map +1 -0
- package/dist/api/generated/schema.d.ts +547 -0
- package/dist/api/generated/schema.d.ts.map +1 -0
- package/dist/api/generated/schema.js +2 -0
- package/dist/api/generated/schema.js.map +1 -0
- package/dist/api/types.d.ts +75 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/default/ConversationListPanel.d.ts +22 -0
- package/dist/default/ConversationListPanel.d.ts.map +1 -0
- package/dist/default/ConversationListPanel.js +49 -0
- package/dist/default/ConversationListPanel.js.map +1 -0
- package/dist/default/ConversationThreadPanel.d.ts +21 -0
- package/dist/default/ConversationThreadPanel.d.ts.map +1 -0
- package/dist/default/ConversationThreadPanel.js +51 -0
- package/dist/default/ConversationThreadPanel.js.map +1 -0
- package/dist/default/ErrorAlert.d.ts +8 -0
- package/dist/default/ErrorAlert.d.ts.map +1 -0
- package/dist/default/ErrorAlert.js +26 -0
- package/dist/default/ErrorAlert.js.map +1 -0
- package/dist/default/StartChatButton.d.ts +17 -0
- package/dist/default/StartChatButton.d.ts.map +1 -0
- package/dist/default/StartChatButton.js +18 -0
- package/dist/default/StartChatButton.js.map +1 -0
- package/dist/default/index.d.ts +21 -0
- package/dist/default/index.d.ts.map +1 -0
- package/dist/default/index.js +18 -0
- package/dist/default/index.js.map +1 -0
- package/dist/flows/errors.d.ts +12 -0
- package/dist/flows/errors.d.ts.map +1 -0
- package/dist/flows/errors.js +13 -0
- package/dist/flows/errors.js.map +1 -0
- package/dist/flows/freshness.d.ts +69 -0
- package/dist/flows/freshness.d.ts.map +1 -0
- package/dist/flows/freshness.js +227 -0
- package/dist/flows/freshness.js.map +1 -0
- package/dist/flows/registry.d.ts +26 -0
- package/dist/flows/registry.d.ts.map +1 -0
- package/dist/flows/registry.js +24 -0
- package/dist/flows/registry.js.map +1 -0
- package/dist/headless/ChatProvider.d.ts +22 -0
- package/dist/headless/ChatProvider.d.ts.map +1 -0
- package/dist/headless/ChatProvider.js +18 -0
- package/dist/headless/ChatProvider.js.map +1 -0
- package/dist/headless/ConversationList.d.ts +51 -0
- package/dist/headless/ConversationList.d.ts.map +1 -0
- package/dist/headless/ConversationList.js +47 -0
- package/dist/headless/ConversationList.js.map +1 -0
- package/dist/headless/ConversationThread.d.ts +50 -0
- package/dist/headless/ConversationThread.d.ts.map +1 -0
- package/dist/headless/ConversationThread.js +64 -0
- package/dist/headless/ConversationThread.js.map +1 -0
- package/dist/headless/MessageComposer.d.ts +39 -0
- package/dist/headless/MessageComposer.d.ts.map +1 -0
- package/dist/headless/MessageComposer.js +45 -0
- package/dist/headless/MessageComposer.js.map +1 -0
- package/dist/headless/StartDirectChat.d.ts +40 -0
- package/dist/headless/StartDirectChat.d.ts.map +1 -0
- package/dist/headless/StartDirectChat.js +46 -0
- package/dist/headless/StartDirectChat.js.map +1 -0
- package/dist/i18n/errorsMap.d.ts +10 -0
- package/dist/i18n/errorsMap.d.ts.map +1 -0
- package/dist/i18n/errorsMap.js +20 -0
- package/dist/i18n/errorsMap.js.map +1 -0
- package/dist/i18n/es.d.ts +23 -0
- package/dist/i18n/es.d.ts.map +1 -0
- package/dist/i18n/es.js +75 -0
- package/dist/i18n/es.js.map +1 -0
- package/dist/i18n/generated/errors.es.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.es.gen.js +58 -0
- package/dist/i18n/generated/errors.es.gen.js.map +1 -0
- package/dist/i18n/generated/errors.gen.d.ts +359 -0
- package/dist/i18n/generated/errors.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.gen.js +183 -0
- package/dist/i18n/generated/errors.gen.js.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts +16 -0
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -0
- package/dist/i18n/generated/errors.ru.gen.js +58 -0
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -0
- package/dist/i18n/keys.d.ts +78 -0
- package/dist/i18n/keys.d.ts.map +1 -0
- package/dist/i18n/keys.js +130 -0
- package/dist/i18n/keys.js.map +1 -0
- package/dist/i18n/ru.d.ts +28 -0
- package/dist/i18n/ru.d.ts.map +1 -0
- package/dist/i18n/ru.js +80 -0
- package/dist/i18n/ru.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/model/context.d.ts +11 -0
- package/dist/model/context.d.ts.map +1 -0
- package/dist/model/context.js +16 -0
- package/dist/model/context.js.map +1 -0
- package/dist/model/limits.d.ts +12 -0
- package/dist/model/limits.d.ts.map +1 -0
- package/dist/model/limits.js +12 -0
- package/dist/model/limits.js.map +1 -0
- package/dist/model/mutations.d.ts +66 -0
- package/dist/model/mutations.d.ts.map +1 -0
- package/dist/model/mutations.js +156 -0
- package/dist/model/mutations.js.map +1 -0
- package/dist/model/queries.d.ts +33 -0
- package/dist/model/queries.d.ts.map +1 -0
- package/dist/model/queries.js +93 -0
- package/dist/model/queries.js.map +1 -0
- package/dist/model/queryKeys.d.ts +8 -0
- package/dist/model/queryKeys.d.ts.map +1 -0
- package/dist/model/queryKeys.js +26 -0
- package/dist/model/queryKeys.js.map +1 -0
- package/dist/model/readMarker.d.ts +25 -0
- package/dist/model/readMarker.d.ts.map +1 -0
- package/dist/model/readMarker.js +31 -0
- package/dist/model/readMarker.js.map +1 -0
- package/dist/model/runtime.d.ts +50 -0
- package/dist/model/runtime.d.ts.map +1 -0
- package/dist/model/runtime.js +27 -0
- package/dist/model/runtime.js.map +1 -0
- package/dist/model/threadWindow.d.ts +95 -0
- package/dist/model/threadWindow.d.ts.map +1 -0
- package/dist/model/threadWindow.js +100 -0
- package/dist/model/threadWindow.js.map +1 -0
- package/dist/nav/manifest.d.ts +23 -0
- package/dist/nav/manifest.d.ts.map +1 -0
- package/dist/nav/manifest.js +15 -0
- package/dist/nav/manifest.js.map +1 -0
- package/dist/realtime/chatSocket.d.ts +93 -0
- package/dist/realtime/chatSocket.d.ts.map +1 -0
- package/dist/realtime/chatSocket.js +199 -0
- package/dist/realtime/chatSocket.js.map +1 -0
- package/dist/realtime/frames.d.ts +123 -0
- package/dist/realtime/frames.d.ts.map +1 -0
- package/dist/realtime/frames.js +123 -0
- package/dist/realtime/frames.js.map +1 -0
- package/dist/realtime/streams.d.ts +49 -0
- package/dist/realtime/streams.d.ts.map +1 -0
- package/dist/realtime/streams.js +52 -0
- package/dist/realtime/streams.js.map +1 -0
- package/llms.txt +89 -0
- package/manifest.json +733 -0
- package/nav-manifest.json +25 -0
- package/package.json +114 -0
- package/src/analytics/generated/events.json +7 -0
- package/src/api/chatApi.ts +142 -0
- package/src/api/extensions.ts +18 -0
- package/src/api/generated/schema.ts +549 -0
- package/src/api/types.ts +87 -0
- package/src/default/ConversationListPanel.tsx +163 -0
- package/src/default/ConversationThreadPanel.tsx +245 -0
- package/src/default/ErrorAlert.tsx +43 -0
- package/src/default/StartChatButton.tsx +78 -0
- package/src/default/index.ts +20 -0
- package/src/flows/errors.ts +16 -0
- package/src/flows/freshness.ts +315 -0
- package/src/flows/registry.ts +36 -0
- package/src/headless/ChatProvider.tsx +23 -0
- package/src/headless/ConversationList.tsx +92 -0
- package/src/headless/ConversationThread.tsx +107 -0
- package/src/headless/MessageComposer.tsx +86 -0
- package/src/headless/StartDirectChat.tsx +75 -0
- package/src/i18n/errorsMap.ts +31 -0
- package/src/i18n/es.ts +95 -0
- package/src/i18n/generated/errors.es.gen.ts +64 -0
- package/src/i18n/generated/errors.gen.ts +214 -0
- package/src/i18n/generated/errors.json +408 -0
- package/src/i18n/generated/errors.ru.gen.ts +64 -0
- package/src/i18n/keys.ts +152 -0
- package/src/i18n/ru.ts +98 -0
- package/src/index.ts +189 -0
- package/src/model/context.tsx +25 -0
- package/src/model/limits.ts +11 -0
- package/src/model/mutations.ts +208 -0
- package/src/model/queries.ts +120 -0
- package/src/model/queryKeys.ts +32 -0
- package/src/model/readMarker.ts +32 -0
- package/src/model/runtime.ts +90 -0
- package/src/model/threadWindow.ts +173 -0
- package/src/nav/manifest.ts +36 -0
- package/src/realtime/chatSocket.ts +304 -0
- package/src/realtime/frames.ts +229 -0
- package/src/realtime/streams.ts +85 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"code": "error.400.bad_request",
|
|
4
|
+
"status": 400,
|
|
5
|
+
"params": [],
|
|
6
|
+
"remediation": "fix_input",
|
|
7
|
+
"en": "Bad request"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"code": "error.400.captcha_invalid",
|
|
11
|
+
"status": 400,
|
|
12
|
+
"params": [],
|
|
13
|
+
"remediation": "retry",
|
|
14
|
+
"en": "Captcha verification failed. Please try again."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"code": "error.400.captcha_required",
|
|
18
|
+
"status": 400,
|
|
19
|
+
"params": [],
|
|
20
|
+
"remediation": "retry",
|
|
21
|
+
"en": "Captcha token is required."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"code": "error.400.chat_attachments_disabled",
|
|
25
|
+
"status": 400,
|
|
26
|
+
"params": [],
|
|
27
|
+
"remediation": "fix_input",
|
|
28
|
+
"en": "Attachments are not enabled in this deployment"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"code": "error.400.chat_body_too_long",
|
|
32
|
+
"status": 400,
|
|
33
|
+
"params": [],
|
|
34
|
+
"remediation": "fix_input",
|
|
35
|
+
"en": "Message body exceeds the maximum allowed length"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"code": "error.400.chat_empty_message",
|
|
39
|
+
"status": 400,
|
|
40
|
+
"params": [],
|
|
41
|
+
"remediation": "fix_input",
|
|
42
|
+
"en": "A message must carry a body or at least one attachment"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"code": "error.400.chat_invalid_direct",
|
|
46
|
+
"status": 400,
|
|
47
|
+
"params": [],
|
|
48
|
+
"remediation": "fix_input",
|
|
49
|
+
"en": "A direct conversation needs exactly one other participant"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"code": "error.400.chat_invalid_kind",
|
|
53
|
+
"status": 400,
|
|
54
|
+
"params": [],
|
|
55
|
+
"remediation": "fix_input",
|
|
56
|
+
"en": "Unknown conversation kind"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"code": "error.400.chat_invalid_reply",
|
|
60
|
+
"status": 400,
|
|
61
|
+
"params": [],
|
|
62
|
+
"remediation": "fix_input",
|
|
63
|
+
"en": "The replied-to message does not belong to this conversation"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"code": "error.400.chat_kind_disabled",
|
|
67
|
+
"status": 400,
|
|
68
|
+
"params": [],
|
|
69
|
+
"remediation": "fix_input",
|
|
70
|
+
"en": "This conversation kind is not enabled in this deployment"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"code": "error.400.chat_not_support",
|
|
74
|
+
"status": 400,
|
|
75
|
+
"params": [],
|
|
76
|
+
"remediation": "fix_input",
|
|
77
|
+
"en": "This operation applies only to support conversations"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"code": "error.400.expected_list",
|
|
81
|
+
"status": 400,
|
|
82
|
+
"params": [],
|
|
83
|
+
"remediation": "fix_input",
|
|
84
|
+
"en": "Expected a list of items"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"code": "error.400.field.blank",
|
|
88
|
+
"status": 400,
|
|
89
|
+
"params": [
|
|
90
|
+
"field"
|
|
91
|
+
],
|
|
92
|
+
"remediation": "fix_input",
|
|
93
|
+
"en": "{field} may not be blank"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"code": "error.400.field.does_not_exist",
|
|
97
|
+
"status": 400,
|
|
98
|
+
"params": [
|
|
99
|
+
"field"
|
|
100
|
+
],
|
|
101
|
+
"remediation": "fix_input",
|
|
102
|
+
"en": "{field} does not exist"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"code": "error.400.field.invalid",
|
|
106
|
+
"status": 400,
|
|
107
|
+
"params": [
|
|
108
|
+
"field"
|
|
109
|
+
],
|
|
110
|
+
"remediation": "fix_input",
|
|
111
|
+
"en": "{field} is invalid"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"code": "error.400.field.invalid_choice",
|
|
115
|
+
"status": 400,
|
|
116
|
+
"params": [
|
|
117
|
+
"field"
|
|
118
|
+
],
|
|
119
|
+
"remediation": "fix_input",
|
|
120
|
+
"en": "{field} is not a valid choice"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"code": "error.400.field.max_length",
|
|
124
|
+
"status": 400,
|
|
125
|
+
"params": [
|
|
126
|
+
"field",
|
|
127
|
+
"max_length"
|
|
128
|
+
],
|
|
129
|
+
"remediation": "fix_input",
|
|
130
|
+
"en": "{field} must be at most {max_length} characters"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"code": "error.400.field.max_value",
|
|
134
|
+
"status": 400,
|
|
135
|
+
"params": [
|
|
136
|
+
"field",
|
|
137
|
+
"max_value"
|
|
138
|
+
],
|
|
139
|
+
"remediation": "fix_input",
|
|
140
|
+
"en": "{field} must be at most {max_value}"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"code": "error.400.field.min_length",
|
|
144
|
+
"status": 400,
|
|
145
|
+
"params": [
|
|
146
|
+
"field",
|
|
147
|
+
"min_length"
|
|
148
|
+
],
|
|
149
|
+
"remediation": "fix_input",
|
|
150
|
+
"en": "{field} must be at least {min_length} characters"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"code": "error.400.field.min_value",
|
|
154
|
+
"status": 400,
|
|
155
|
+
"params": [
|
|
156
|
+
"field",
|
|
157
|
+
"min_value"
|
|
158
|
+
],
|
|
159
|
+
"remediation": "fix_input",
|
|
160
|
+
"en": "{field} must be at least {min_value}"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"code": "error.400.field.null",
|
|
164
|
+
"status": 400,
|
|
165
|
+
"params": [
|
|
166
|
+
"field"
|
|
167
|
+
],
|
|
168
|
+
"remediation": "fix_input",
|
|
169
|
+
"en": "{field} may not be null"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"code": "error.400.field.required",
|
|
173
|
+
"status": 400,
|
|
174
|
+
"params": [
|
|
175
|
+
"field"
|
|
176
|
+
],
|
|
177
|
+
"remediation": "fix_input",
|
|
178
|
+
"en": "{field} is required"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"code": "error.400.field.unique",
|
|
182
|
+
"status": 400,
|
|
183
|
+
"params": [
|
|
184
|
+
"field"
|
|
185
|
+
],
|
|
186
|
+
"remediation": "fix_input",
|
|
187
|
+
"en": "{field} must be unique"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"code": "error.400.invalid_ad_id",
|
|
191
|
+
"status": 400,
|
|
192
|
+
"params": [],
|
|
193
|
+
"remediation": "fix_input",
|
|
194
|
+
"en": "Invalid advertisement ID"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"code": "error.400.validation_error",
|
|
198
|
+
"status": 400,
|
|
199
|
+
"params": [],
|
|
200
|
+
"remediation": "fix_input",
|
|
201
|
+
"en": "Validation error"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"code": "error.400.verification_failed",
|
|
205
|
+
"status": 400,
|
|
206
|
+
"params": [],
|
|
207
|
+
"remediation": "verify",
|
|
208
|
+
"en": "Verification failed"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"code": "error.400.verification_invalid_factor",
|
|
212
|
+
"status": 400,
|
|
213
|
+
"params": [],
|
|
214
|
+
"remediation": "verify",
|
|
215
|
+
"en": "This verification factor is not available"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"code": "error.401.unauthorized",
|
|
219
|
+
"status": 401,
|
|
220
|
+
"params": [],
|
|
221
|
+
"remediation": "reauthenticate",
|
|
222
|
+
"en": "Authentication required"
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"code": "error.402.payment_required",
|
|
226
|
+
"status": 402,
|
|
227
|
+
"params": [],
|
|
228
|
+
"remediation": "retry",
|
|
229
|
+
"en": "Payment required"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"code": "error.403.chat_not_operator",
|
|
233
|
+
"status": 403,
|
|
234
|
+
"params": [],
|
|
235
|
+
"remediation": "retry",
|
|
236
|
+
"en": "Only a support operator may perform this action"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"code": "error.403.chat_not_participant",
|
|
240
|
+
"status": 403,
|
|
241
|
+
"params": [],
|
|
242
|
+
"remediation": "retry",
|
|
243
|
+
"en": "You are not a participant of this conversation"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"code": "error.403.forbidden",
|
|
247
|
+
"status": 403,
|
|
248
|
+
"params": [],
|
|
249
|
+
"remediation": "retry",
|
|
250
|
+
"en": "You do not have permission to perform this action"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"code": "error.403.network_blocked",
|
|
254
|
+
"status": 403,
|
|
255
|
+
"params": [],
|
|
256
|
+
"remediation": "contact_support",
|
|
257
|
+
"en": "Requests from this network are not allowed"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"code": "error.403.verification_enrollment_required",
|
|
261
|
+
"status": 403,
|
|
262
|
+
"params": [],
|
|
263
|
+
"remediation": "verify",
|
|
264
|
+
"en": "Verification factor enrollment required"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"code": "error.403.verification_required",
|
|
268
|
+
"status": 403,
|
|
269
|
+
"params": [],
|
|
270
|
+
"remediation": "verify",
|
|
271
|
+
"en": "Additional verification required"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"code": "error.404.ad_not_found",
|
|
275
|
+
"status": 404,
|
|
276
|
+
"params": [],
|
|
277
|
+
"remediation": "retry",
|
|
278
|
+
"en": "Listing not found"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"code": "error.404.chat_conversation_not_found",
|
|
282
|
+
"status": 404,
|
|
283
|
+
"params": [],
|
|
284
|
+
"remediation": "retry",
|
|
285
|
+
"en": "Conversation not found"
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"code": "error.404.not_found",
|
|
289
|
+
"status": 404,
|
|
290
|
+
"params": [],
|
|
291
|
+
"remediation": "retry",
|
|
292
|
+
"en": "Requested resource not found"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"code": "error.404.verification_challenge_not_found",
|
|
296
|
+
"status": 404,
|
|
297
|
+
"params": [],
|
|
298
|
+
"remediation": "verify",
|
|
299
|
+
"en": "Verification challenge not found or expired"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"code": "error.405.method_not_allowed",
|
|
303
|
+
"status": 405,
|
|
304
|
+
"params": [],
|
|
305
|
+
"remediation": "retry",
|
|
306
|
+
"en": "Method not allowed"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"code": "error.406.not_acceptable",
|
|
310
|
+
"status": 406,
|
|
311
|
+
"params": [],
|
|
312
|
+
"remediation": "retry",
|
|
313
|
+
"en": "Not acceptable"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"code": "error.408.request_timeout",
|
|
317
|
+
"status": 408,
|
|
318
|
+
"params": [],
|
|
319
|
+
"remediation": "retry",
|
|
320
|
+
"en": "Request timeout"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"code": "error.409.chat_already_assigned",
|
|
324
|
+
"status": 409,
|
|
325
|
+
"params": [],
|
|
326
|
+
"remediation": "fix_input",
|
|
327
|
+
"en": "This support conversation is already assigned"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
"code": "error.409.conflict",
|
|
331
|
+
"status": 409,
|
|
332
|
+
"params": [],
|
|
333
|
+
"remediation": "fix_input",
|
|
334
|
+
"en": "Resource already exists"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"code": "error.410.gone",
|
|
338
|
+
"status": 410,
|
|
339
|
+
"params": [],
|
|
340
|
+
"remediation": "retry",
|
|
341
|
+
"en": "Resource has been permanently removed"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"code": "error.413.payload_too_large",
|
|
345
|
+
"status": 413,
|
|
346
|
+
"params": [],
|
|
347
|
+
"remediation": "retry",
|
|
348
|
+
"en": "Request body is too large"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"code": "error.415.unsupported_media_type",
|
|
352
|
+
"status": 415,
|
|
353
|
+
"params": [],
|
|
354
|
+
"remediation": "retry",
|
|
355
|
+
"en": "Unsupported media type"
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"code": "error.422.unprocessable_entity",
|
|
359
|
+
"status": 422,
|
|
360
|
+
"params": [],
|
|
361
|
+
"remediation": "wait_and_retry",
|
|
362
|
+
"en": "Unprocessable entity"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"code": "error.423.locked",
|
|
366
|
+
"status": 423,
|
|
367
|
+
"params": [],
|
|
368
|
+
"remediation": "wait_and_retry",
|
|
369
|
+
"en": "Resource is locked"
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
"code": "error.423.verification_locked",
|
|
373
|
+
"status": 423,
|
|
374
|
+
"params": [],
|
|
375
|
+
"remediation": "wait_and_retry",
|
|
376
|
+
"en": "Too many failed attempts — verification locked"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"code": "error.429.rate_limit",
|
|
380
|
+
"status": 429,
|
|
381
|
+
"params": [
|
|
382
|
+
"retry_after_minutes"
|
|
383
|
+
],
|
|
384
|
+
"remediation": "wait_and_retry",
|
|
385
|
+
"en": "Too many attempts. Try again in {retry_after_minutes} minutes."
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"code": "error.429.too_many_requests",
|
|
389
|
+
"status": 429,
|
|
390
|
+
"params": [],
|
|
391
|
+
"remediation": "wait_and_retry",
|
|
392
|
+
"en": "Too many requests. Please try again later."
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"code": "error.500.internal",
|
|
396
|
+
"status": 500,
|
|
397
|
+
"params": [],
|
|
398
|
+
"remediation": "contact_support",
|
|
399
|
+
"en": "Something went wrong"
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"code": "error.503.mandate_unavailable",
|
|
403
|
+
"status": 503,
|
|
404
|
+
"params": [],
|
|
405
|
+
"remediation": "retry",
|
|
406
|
+
"en": "Cannot verify workspace mandate right now"
|
|
407
|
+
}
|
|
408
|
+
]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/gen-errors.mjs — do not edit by hand.
|
|
2
|
+
// Source: stapel-auth canonical errors.json (backend codegen artifact).
|
|
3
|
+
// Regenerate: pnpm gen:errors · Drift gate: pnpm gen:errors:check
|
|
4
|
+
// Locale source: backend translations/errors.ru.json (locale catalog
|
|
5
|
+
// beside the canonical errors.json — i18n-shipping.md §1).
|
|
6
|
+
import type { ChatErrorCode } from "./errors.gen.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `ru` texts for the backend error codes this catalog carries.
|
|
10
|
+
*
|
|
11
|
+
* PARTIAL, and deliberately typed to say so: 12 key(s) owned by
|
|
12
|
+
* stapel_chat are absent, because that owner ships no locale catalog
|
|
13
|
+
* (ERRORS_LOCALE_EXEMPT_OWNERS). English for them still comes from the registry
|
|
14
|
+
* artifact via the en bundle; the pair layers its own authored `ru`
|
|
15
|
+
* strings over this one until upstream ships translations. `Partial` is what
|
|
16
|
+
* makes the gap visible to TypeScript instead of a silent English fallback.
|
|
17
|
+
*
|
|
18
|
+
* Import from the pair's `./i18n/ru` subpath, NOT the main entry, so
|
|
19
|
+
* the locale stays out of hosts that don't ship it.
|
|
20
|
+
*/
|
|
21
|
+
export const chatErrorBundleRu: Partial<Record<ChatErrorCode, string>> = {
|
|
22
|
+
"error.400.bad_request": "Некорректный запрос",
|
|
23
|
+
"error.400.captcha_invalid": "Проверка капчи не пройдена. Пожалуйста, попробуйте ещё раз.",
|
|
24
|
+
"error.400.captcha_required": "Требуется токен капчи.",
|
|
25
|
+
"error.400.expected_list": "Ожидался список элементов",
|
|
26
|
+
"error.400.field.blank": "Поле «{field}» не может быть пустым",
|
|
27
|
+
"error.400.field.does_not_exist": "«{field}» не существует",
|
|
28
|
+
"error.400.field.invalid": "Поле «{field}» содержит недопустимое значение",
|
|
29
|
+
"error.400.field.invalid_choice": "Недопустимый вариант для поля «{field}»",
|
|
30
|
+
"error.400.field.max_length": "Поле «{field}» должно содержать не более {max_length} символов",
|
|
31
|
+
"error.400.field.max_value": "Значение поля «{field}» должно быть не больше {max_value}",
|
|
32
|
+
"error.400.field.min_length": "Поле «{field}» должно содержать не менее {min_length} символов",
|
|
33
|
+
"error.400.field.min_value": "Значение поля «{field}» должно быть не меньше {min_value}",
|
|
34
|
+
"error.400.field.null": "Поле «{field}» не может быть null",
|
|
35
|
+
"error.400.field.required": "Поле «{field}» обязательно",
|
|
36
|
+
"error.400.field.unique": "Значение поля «{field}» должно быть уникальным",
|
|
37
|
+
"error.400.invalid_ad_id": "Недопустимый идентификатор объявления",
|
|
38
|
+
"error.400.validation_error": "Ошибка валидации",
|
|
39
|
+
"error.400.verification_failed": "Проверка не пройдена",
|
|
40
|
+
"error.400.verification_invalid_factor": "Этот способ подтверждения недоступен",
|
|
41
|
+
"error.401.unauthorized": "Требуется аутентификация",
|
|
42
|
+
"error.402.payment_required": "Требуется оплата",
|
|
43
|
+
"error.403.forbidden": "У вас нет прав для выполнения этого действия",
|
|
44
|
+
"error.403.network_blocked": "Запросы из этой сети не разрешены.",
|
|
45
|
+
"error.403.verification_enrollment_required": "Требуется регистрация фактора подтверждения.",
|
|
46
|
+
"error.403.verification_required": "Требуется дополнительная проверка",
|
|
47
|
+
"error.404.ad_not_found": "Объявление не найдено",
|
|
48
|
+
"error.404.not_found": "Запрошенный ресурс не найден",
|
|
49
|
+
"error.404.verification_challenge_not_found": "Запрос на подтверждение не найден или истёк",
|
|
50
|
+
"error.405.method_not_allowed": "Метод не разрешён",
|
|
51
|
+
"error.406.not_acceptable": "Недопустимый формат ответа",
|
|
52
|
+
"error.408.request_timeout": "Время ожидания запроса истекло",
|
|
53
|
+
"error.409.conflict": "Ресурс уже существует",
|
|
54
|
+
"error.410.gone": "Ресурс был безвозвратно удалён",
|
|
55
|
+
"error.413.payload_too_large": "Тело запроса слишком большое",
|
|
56
|
+
"error.415.unsupported_media_type": "Неподдерживаемый тип данных",
|
|
57
|
+
"error.422.unprocessable_entity": "Невозможно обработать данные запроса",
|
|
58
|
+
"error.423.locked": "Ресурс заблокирован",
|
|
59
|
+
"error.423.verification_locked": "Слишком много неудачных попыток — подтверждение заблокировано",
|
|
60
|
+
"error.429.rate_limit": "Слишком много попыток. Повторите попытку через {retry_after_minutes} мин.",
|
|
61
|
+
"error.429.too_many_requests": "Слишком много запросов. Пожалуйста, повторите попытку позже.",
|
|
62
|
+
"error.500.internal": "Что-то пошло не так",
|
|
63
|
+
"error.503.mandate_unavailable": "Не удалось проверить доступ к рабочему пространству",
|
|
64
|
+
};
|
package/src/i18n/keys.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { I18nDictionary, I18nEngine } from "@stapel/core";
|
|
2
|
+
import { chatErrorBundleEn } from "./generated/errors.gen.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* chat-react's own translation KEYS (frontend-standard §4.2): headless
|
|
6
|
+
* components never render literal strings — hosts resolve these via core's
|
|
7
|
+
* i18n engine (`useT`). Backend error codes flow through the SAME contour: a
|
|
8
|
+
* `StapelApiError.code` is already a key, so the default bundle below ships
|
|
9
|
+
* English fallbacks for both the backend error codes (generated) and the
|
|
10
|
+
* pair's own UI keys.
|
|
11
|
+
*/
|
|
12
|
+
export const CHAT_I18N_KEYS = {
|
|
13
|
+
unknownError: "chat.error.unknown",
|
|
14
|
+
|
|
15
|
+
// Conversation list
|
|
16
|
+
listTitle: "chat.list.title",
|
|
17
|
+
listEmpty: "chat.list.empty",
|
|
18
|
+
listLoading: "chat.list.loading",
|
|
19
|
+
listLoadMore: "chat.list.load_more",
|
|
20
|
+
listEnd: "chat.list.end",
|
|
21
|
+
listRetry: "chat.list.retry",
|
|
22
|
+
listUnread: "chat.list.unread",
|
|
23
|
+
listOpen: "chat.list.open",
|
|
24
|
+
|
|
25
|
+
// Conversation kinds (the response carries no title — the kind and the
|
|
26
|
+
// participants are all a row can honestly say)
|
|
27
|
+
kindDirect: "chat.kind.direct",
|
|
28
|
+
kindGroup: "chat.kind.group",
|
|
29
|
+
kindSupport: "chat.kind.support",
|
|
30
|
+
|
|
31
|
+
// Thread
|
|
32
|
+
threadLoading: "chat.thread.loading",
|
|
33
|
+
threadEmpty: "chat.thread.empty",
|
|
34
|
+
threadRetry: "chat.thread.retry",
|
|
35
|
+
threadLoadOlder: "chat.thread.load_older",
|
|
36
|
+
threadBeginning: "chat.thread.beginning",
|
|
37
|
+
threadSystem: "chat.thread.system",
|
|
38
|
+
|
|
39
|
+
// Composer
|
|
40
|
+
composerPlaceholder: "chat.composer.placeholder",
|
|
41
|
+
composerSend: "chat.composer.send",
|
|
42
|
+
composerSending: "chat.composer.sending",
|
|
43
|
+
composerBlockedEmpty: "chat.composer.blocked.empty",
|
|
44
|
+
composerBlockedTooLong: "chat.composer.blocked.too_long",
|
|
45
|
+
|
|
46
|
+
// "Message the seller"
|
|
47
|
+
startButton: "chat.start.button",
|
|
48
|
+
startStarting: "chat.start.starting",
|
|
49
|
+
startBlockedSelf: "chat.start.blocked.self",
|
|
50
|
+
startBlockedUnknownSeller: "chat.start.blocked.unknown_seller",
|
|
51
|
+
|
|
52
|
+
// Transport (the seam is invisible to the UI's BEHAVIOUR, but a person may
|
|
53
|
+
// still be told whether the thread is live or on a timer)
|
|
54
|
+
transportLive: "chat.transport.live",
|
|
55
|
+
transportPolling: "chat.transport.polling",
|
|
56
|
+
transportIdle: "chat.transport.idle",
|
|
57
|
+
|
|
58
|
+
// Backend error keys the pair OWNS the localization of. stapel-chat ships
|
|
59
|
+
// English only (it has no `translations/` directory), so its 12 keys are
|
|
60
|
+
// absent from the generated ru/es bundles and are authored here instead —
|
|
61
|
+
// the stapel-forms/stapel_attributes precedent. Listed as keys so the
|
|
62
|
+
// i18n-key-exists lint knows them and `test/i18n.test.ts` can prove all
|
|
63
|
+
// three locales carry them.
|
|
64
|
+
errorEmptyMessage: "error.400.chat_empty_message",
|
|
65
|
+
errorBodyTooLong: "error.400.chat_body_too_long",
|
|
66
|
+
errorAttachmentsDisabled: "error.400.chat_attachments_disabled",
|
|
67
|
+
errorInvalidDirect: "error.400.chat_invalid_direct",
|
|
68
|
+
errorInvalidKind: "error.400.chat_invalid_kind",
|
|
69
|
+
errorKindDisabled: "error.400.chat_kind_disabled",
|
|
70
|
+
errorInvalidReply: "error.400.chat_invalid_reply",
|
|
71
|
+
errorNotSupport: "error.400.chat_not_support",
|
|
72
|
+
errorNotOperator: "error.403.chat_not_operator",
|
|
73
|
+
errorNotParticipant: "error.403.chat_not_participant",
|
|
74
|
+
errorConversationNotFound: "error.404.chat_conversation_not_found",
|
|
75
|
+
errorAlreadyAssigned: "error.409.chat_already_assigned",
|
|
76
|
+
|
|
77
|
+
// Nav-manifest label (`../nav/manifest.ts`) — read by a shell via
|
|
78
|
+
// `t(entry.labelKey)`.
|
|
79
|
+
navConversations: "chat.nav.conversations",
|
|
80
|
+
} as const;
|
|
81
|
+
|
|
82
|
+
export type ChatI18nKey = (typeof CHAT_I18N_KEYS)[keyof typeof CHAT_I18N_KEYS];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* English fallback bundle for chat-react UI keys + backend error codes. The
|
|
86
|
+
* generated `chatErrorBundleEn` (from stapel-chat's error registry, `pnpm
|
|
87
|
+
* gen:errors`) is spread FIRST so every backend `error.*` key has a fallback —
|
|
88
|
+
* a `StapelApiError.code` never renders as a raw key. Hand-polished copy below
|
|
89
|
+
* then OVERRIDES the generated English for the keys users see most.
|
|
90
|
+
*/
|
|
91
|
+
export const chatI18nBundleEn: I18nDictionary = {
|
|
92
|
+
// Backend error codes — generated en fallbacks (coverage by construction).
|
|
93
|
+
...chatErrorBundleEn,
|
|
94
|
+
|
|
95
|
+
// chat-react UI
|
|
96
|
+
"chat.error.unknown": "Something went wrong. Please try again.",
|
|
97
|
+
|
|
98
|
+
"chat.list.title": "Messages",
|
|
99
|
+
"chat.list.empty": "No conversations yet.",
|
|
100
|
+
"chat.list.loading": "Loading conversations…",
|
|
101
|
+
"chat.list.load_more": "Load more",
|
|
102
|
+
"chat.list.end": "That's everything.",
|
|
103
|
+
"chat.list.retry": "Try again",
|
|
104
|
+
"chat.list.unread": "{count} unread",
|
|
105
|
+
"chat.list.open": "Open",
|
|
106
|
+
|
|
107
|
+
"chat.kind.direct": "Direct message",
|
|
108
|
+
"chat.kind.group": "Group",
|
|
109
|
+
"chat.kind.support": "Support",
|
|
110
|
+
|
|
111
|
+
"chat.thread.loading": "Loading messages…",
|
|
112
|
+
"chat.thread.empty": "No messages yet. Say hello.",
|
|
113
|
+
"chat.thread.retry": "Try again",
|
|
114
|
+
"chat.thread.load_older": "Show earlier messages",
|
|
115
|
+
"chat.thread.beginning": "This is the beginning of the conversation.",
|
|
116
|
+
"chat.thread.system": "System",
|
|
117
|
+
|
|
118
|
+
"chat.composer.placeholder": "Write a message…",
|
|
119
|
+
"chat.composer.send": "Send",
|
|
120
|
+
"chat.composer.sending": "Sending…",
|
|
121
|
+
"chat.composer.blocked.empty": "Write something first.",
|
|
122
|
+
"chat.composer.blocked.too_long":
|
|
123
|
+
"That is longer than {max} characters — shorten it a little.",
|
|
124
|
+
|
|
125
|
+
"chat.start.button": "Message the seller",
|
|
126
|
+
"chat.start.starting": "Opening…",
|
|
127
|
+
"chat.start.blocked.self": "This is your own listing.",
|
|
128
|
+
"chat.start.blocked.unknown_seller": "This listing has no seller to write to.",
|
|
129
|
+
|
|
130
|
+
"chat.transport.live": "Live",
|
|
131
|
+
"chat.transport.polling": "Refreshing every few seconds",
|
|
132
|
+
"chat.transport.idle": "Paused",
|
|
133
|
+
|
|
134
|
+
"chat.nav.conversations": "Messages",
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Register chat-react's key bundle into a core i18n engine (call once at
|
|
139
|
+
* startup). Registers under the given locale (default `"en"`).
|
|
140
|
+
*
|
|
141
|
+
* MERGE-PRIORITY CONVENTION (i18n-shipping.md §3 — every `@stapel/*-react`
|
|
142
|
+
* pair follows it): registration order IS override priority, later wins per
|
|
143
|
+
* key. Within a locale, layers register bottom-up:
|
|
144
|
+
*
|
|
145
|
+
* 1. generated en floor (`chatErrorBundleEn` — coverage by construction),
|
|
146
|
+
* 2. the pair's polish / UI copy (this bundle spreads 1 then overrides),
|
|
147
|
+
* 3. the pair's locale bundle from the `./i18n/<locale>` subpath,
|
|
148
|
+
* 4. the HOST's own bundle — always registered LAST.
|
|
149
|
+
*/
|
|
150
|
+
export function registerChatI18n(engine: I18nEngine, locale = "en"): void {
|
|
151
|
+
engine.registerBundle(locale, chatI18nBundleEn);
|
|
152
|
+
}
|