@expressms/smartapp-sdk 1.4.2-alpha.1 → 1.5.0-alpha.3
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/README.md +1 -651
- package/build/main/index.d.ts +2 -2
- package/build/main/index.js +6 -2
- package/build/main/lib/client/index.d.ts +1 -0
- package/build/main/lib/client/index.js +2 -1
- package/build/main/lib/client/storage.d.ts +33 -0
- package/build/main/lib/client/storage.js +73 -0
- package/build/main/lib/notification/index.js +2 -1
- package/build/main/types/bridge.d.ts +14 -1
- package/build/main/types/bridge.js +5 -1
- package/build/main/types/index.d.ts +1 -0
- package/build/main/types/index.js +2 -1
- package/build/main/types/storage.d.ts +17 -0
- package/build/main/types/storage.js +10 -0
- package/build/module/index.d.ts +2 -2
- package/build/module/index.js +3 -3
- package/build/module/lib/client/index.d.ts +1 -0
- package/build/module/lib/client/index.js +2 -1
- package/build/module/lib/client/storage.d.ts +33 -0
- package/build/module/lib/client/storage.js +64 -0
- package/build/module/lib/notification/index.js +2 -1
- package/build/module/types/bridge.d.ts +14 -1
- package/build/module/types/bridge.js +5 -1
- package/build/module/types/index.d.ts +1 -0
- package/build/module/types/index.js +2 -1
- package/build/module/types/storage.d.ts +17 -0
- package/build/module/types/storage.js +7 -0
- package/build/umd/index.js +77 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,653 +1,3 @@
|
|
|
1
1
|
# SmartApp SDK
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
__Методы SmartApp Bridge__
|
|
6
|
-
|
|
7
|
-
- Отправка ивента клиенту:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
bridge?.sendClientEvent({
|
|
11
|
-
method: string,
|
|
12
|
-
params: object,
|
|
13
|
-
timeout?: number
|
|
14
|
-
})
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
- Отправка ивента боту:
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
bridge?.sendBotEvent({
|
|
21
|
-
method: string,
|
|
22
|
-
params: object,
|
|
23
|
-
timeout?: number
|
|
24
|
-
})
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
- `bridge?.onReceive(callback: Function)` - передать клиенту коллбэк для выполнения при получении входящих ивентов;
|
|
28
|
-
|
|
29
|
-
- `bridge?.enableLogs()` - включить сбор логов SmartApp (выключено по умолчанию);
|
|
30
|
-
|
|
31
|
-
- `bridge?.disableLogs()` - выключить сбор логов SmartApp (выключено по умолчанию);
|
|
32
|
-
|
|
33
|
-
- `bridge?.disableRenameParams()` – выключить переименование полей ивентов SmartApp из `camelCase` в `snake_case` при отправке
|
|
34
|
-
ивента боту или клиенту, и наоборот, при получении (включено по умолчанию);
|
|
35
|
-
|
|
36
|
-
- `bridge?.enableRenameParams()` – включить переименование полей ивентов SmartApp из `camelCase` в `snake_case` при отправке
|
|
37
|
-
ивента боту или клиенту, и наоборот, при получении (включено по умолчанию);
|
|
38
|
-
|
|
39
|
-
__Реализации клиентских методов SmartApp Bridge__
|
|
40
|
-
|
|
41
|
-
- `ready({ timeout?: number })` - отправить клиенту команду `ready`;
|
|
42
|
-
|
|
43
|
-
- `routingChanged(isRoot: boolean)` - отправить клиенту команду `routing_changed`;
|
|
44
|
-
|
|
45
|
-
- `onBackPressed(handleBackPressed: Function)` - передать клиенту коллбэк для выполнения при получении команды `back_pressed`;
|
|
46
|
-
|
|
47
|
-
- `onMoveToRoot(handleMoveToRoot: Function)` - передать клиенту коллбэк для выполнения при получении команды `move_to_root`;
|
|
48
|
-
|
|
49
|
-
- `addContact({ phone: string, name: string })` - скачать `.csv` файл контакта;
|
|
50
|
-
|
|
51
|
-
- `getContact({ phone: string })` – получить контакт по номеру телефона;
|
|
52
|
-
|
|
53
|
-
- `createPersonalChat({ huid: string })` - создать чат с юзером или открыть существующий;
|
|
54
|
-
|
|
55
|
-
- `onNotification(handleNotification: Function)` - передать клиенту коллбэк для выполнения при получении ивента с `type === "notification"`;
|
|
56
|
-
|
|
57
|
-
- ```
|
|
58
|
-
sendMessage({
|
|
59
|
-
userHuid: string | null,
|
|
60
|
-
groupChatId: string | null,
|
|
61
|
-
messageBody: string,
|
|
62
|
-
messageMeta? : Object
|
|
63
|
-
})
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
отправить сообщение юзеру, боту или в групповой чат;
|
|
67
|
-
|
|
68
|
-
- ```
|
|
69
|
-
openSmartApp({
|
|
70
|
-
appId: string,
|
|
71
|
-
meta?: any,
|
|
72
|
-
})
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
открыть смартапп;
|
|
76
|
-
|
|
77
|
-
- ```
|
|
78
|
-
closeSmartApp()
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
закрыть текущий смартапп;
|
|
82
|
-
|
|
83
|
-
- `exitSmartAppToCatalog()` - выйти из смартапп на каталог;
|
|
84
|
-
|
|
85
|
-
- `useQuery()` - получить параметры `url` SmartApp;
|
|
86
|
-
|
|
87
|
-
- `openClientSettings()` - открыть настройки профиля пользователя Express;
|
|
88
|
-
|
|
89
|
-
- `getChats({ filter: string | null })` - запросить чаты;
|
|
90
|
-
|
|
91
|
-
- `requestLocation()` - запросить геолокацию;
|
|
92
|
-
|
|
93
|
-
- `searchCorporatePhonebook({ filter: string | null })` - запросить результаты поиска по корпоративной phonebook и результат трастового поиска ;
|
|
94
|
-
|
|
95
|
-
__Метод onReceive__
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
import { EventChannel, eventChannel } from "redux-saga"
|
|
99
|
-
|
|
100
|
-
function subscribeClientEvents(): EventChannel<any> {
|
|
101
|
-
return eventChannel(emit => {
|
|
102
|
-
bridge?.onReceive((event) => emit(event as any))
|
|
103
|
-
return () => {}
|
|
104
|
-
})
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
__Метод routingChanged__
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
function routerChangedSaga(action: any) {
|
|
112
|
-
const isRoot = action.payload.location.pathname === "/"
|
|
113
|
-
|
|
114
|
-
routingChanged(isRoot)
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
__Метод onBackPressed__
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
function handleClientBackPressedEvent() {
|
|
122
|
-
history.goBack()
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function* watchClientEvents() {
|
|
126
|
-
yield onBackPressed(handleClientBackPressedEvent)
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
__Метод onMoveToRoot__
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
function handleMoveToRoot() {
|
|
134
|
-
history.push('/') - home page
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function* watchClientEvents() {
|
|
138
|
-
yield onMoveToRoot(handleMoveToRoot)
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
__Редирект в другой смартапп__
|
|
143
|
-
|
|
144
|
-
```
|
|
145
|
-
bridge?.sendClientEvent({
|
|
146
|
-
method: "open_smart_app",
|
|
147
|
-
params: {
|
|
148
|
-
appId: string // уникальный идентификатор SmartApp e.g. "017aade3-0f2d-5274-93f2-79607f564dc6",
|
|
149
|
-
}
|
|
150
|
-
})
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
__Редирект в другой смартапп, передача поля `meta`__
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
openSmartApp({
|
|
157
|
-
appId: string // уникальный идентификатор SmartApp e.g. "017aade3-0f2d-5274-93f2-79607f564dc6",
|
|
158
|
-
meta: Object, // "meta" может содержать любую информацию
|
|
159
|
-
})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
__Редирект в другой смартапп и передача информации в поле `meta`__
|
|
163
|
-
|
|
164
|
-
SmartApp 1 отправляет клиенту ивент:
|
|
165
|
-
|
|
166
|
-
```
|
|
167
|
-
openSmartApp({
|
|
168
|
-
appId: "017aade3-0f2d-5274-93f2-79607f564dc6",
|
|
169
|
-
meta: {
|
|
170
|
-
route: "/route-in-feature-smartapp"
|
|
171
|
-
}
|
|
172
|
-
})
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
Клиент получает ивент, сохраняет значение поля `meta`.
|
|
176
|
-
|
|
177
|
-
Клиент открывает SmartApp 2 с `appId === "017aade3-0f2d-5274-93f2-79607f564dc6"`.
|
|
178
|
-
|
|
179
|
-
SmartApp 2 шлет ивент `ready`:
|
|
180
|
-
|
|
181
|
-
`const response = yield ready()`
|
|
182
|
-
|
|
183
|
-
В ответе на `ready` SmartApp 2 проверяет наличие поля `openSmartAppMeta`:
|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
if (response?.payload?.openSmartAppMeta) {
|
|
187
|
-
const meta = response?.payload?.openSmartAppMeta
|
|
188
|
-
history.push(`${openSmartAppMeta?.route}`)
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
SmartApp 2 выполняет необходимые действия с `meta`, которую SmartApp 1 отправляет клиенту, а клиент возвращает в ответе на
|
|
193
|
-
ивент `ready` SmartApp 2.
|
|
194
|
-
|
|
195
|
-
__Получение параметров `url` SmartApp__
|
|
196
|
-
|
|
197
|
-
`const urlParams = useQuery()`
|
|
198
|
-
|
|
199
|
-
Метод возвращает объект типа:
|
|
200
|
-
|
|
201
|
-
```
|
|
202
|
-
{
|
|
203
|
-
platform: "web" | "ios" | "android",
|
|
204
|
-
theme: "default" | "dark"
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
__Открытие настроек профиля__
|
|
209
|
-
|
|
210
|
-
`openClientSettings()`
|
|
211
|
-
|
|
212
|
-
Метод отправляет клиенту запрос типа:
|
|
213
|
-
|
|
214
|
-
```
|
|
215
|
-
{
|
|
216
|
-
"ref": <string>,
|
|
217
|
-
"handler": "express",
|
|
218
|
-
"type": "open_client_settings",
|
|
219
|
-
"payload": {},
|
|
220
|
-
"files": []
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
Ответа от клиента не приходит. Происходит открытие Настроек профиля пользователя Express.
|
|
225
|
-
|
|
226
|
-
__Запрос чатов__
|
|
227
|
-
|
|
228
|
-
`const response = yield getChats({ filter }: { filter: string | null })`
|
|
229
|
-
|
|
230
|
-
Метод отправляет клиенту запрос типа:
|
|
231
|
-
|
|
232
|
-
```
|
|
233
|
-
{
|
|
234
|
-
"ref": <string>,
|
|
235
|
-
"handler": "express",
|
|
236
|
-
"type": "get_chats",
|
|
237
|
-
"payload": {
|
|
238
|
-
"filter": <string|null>,
|
|
239
|
-
},
|
|
240
|
-
"files": []
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
И получает ответ типа:
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
{
|
|
248
|
-
"ref": <string>,
|
|
249
|
-
"status": "success",
|
|
250
|
-
"data": {
|
|
251
|
-
"chats": [
|
|
252
|
-
{
|
|
253
|
-
"group_chat_id": <uuid>,
|
|
254
|
-
"name": <string>,
|
|
255
|
-
"avatar": <string|null>,
|
|
256
|
-
"members_type": "cts|rts|hybrid",
|
|
257
|
-
"is_trusted": <bool>,
|
|
258
|
-
"chat_type": "chat|group_chat|botx|channel",
|
|
259
|
-
},
|
|
260
|
-
],
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
__Запрос геолокации__
|
|
266
|
-
|
|
267
|
-
`const response = yield requestLocation()`
|
|
268
|
-
|
|
269
|
-
Метод отправляет клиенту запрос типа:
|
|
270
|
-
|
|
271
|
-
```
|
|
272
|
-
{
|
|
273
|
-
"ref": <string>,
|
|
274
|
-
"handler": "express",
|
|
275
|
-
"type": "request_location",
|
|
276
|
-
"payload": {},
|
|
277
|
-
"files": []
|
|
278
|
-
}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
И получает ответ типа:
|
|
282
|
-
|
|
283
|
-
```
|
|
284
|
-
{
|
|
285
|
-
"ref": <string>,
|
|
286
|
-
"status": "success",
|
|
287
|
-
"data": {
|
|
288
|
-
"latitude": <string|null>,
|
|
289
|
-
"longitude": <string|null>,
|
|
290
|
-
"timestamp": <"YYYY-MM-DDThh:mm:ss.fZZZZZ"|null>,
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
Ответ клиента в случае ошибки:
|
|
296
|
-
|
|
297
|
-
```
|
|
298
|
-
{
|
|
299
|
-
"ref": <string>,
|
|
300
|
-
"status": "error",
|
|
301
|
-
"error_code": "permission_denied" | "location_undefined"
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
Статус error_code отправляется в следующих случаях:
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
1. Ошибка разрешения на получение геолокации, error_code = "permission_denied"
|
|
309
|
-
2. Ошибка получения данных геолокации, error_code = "location_undefined"
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
__Запрос результатов поиска по корпоративной phonebook и результат трастового поиска__
|
|
313
|
-
|
|
314
|
-
`const response = yield searchCorporatePhonebook({ filter }: { filter: string | null })`
|
|
315
|
-
|
|
316
|
-
Метод отправляет клиенту запрос типа:
|
|
317
|
-
|
|
318
|
-
```
|
|
319
|
-
{
|
|
320
|
-
"ref": <string>,
|
|
321
|
-
"handler": "express",
|
|
322
|
-
"type": "search_corporate_phonebook",
|
|
323
|
-
"payload": {
|
|
324
|
-
"filter": <string|null>,
|
|
325
|
-
},
|
|
326
|
-
"files": []
|
|
327
|
-
}
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
И получает ответ типа:
|
|
331
|
-
|
|
332
|
-
```
|
|
333
|
-
{
|
|
334
|
-
"ref": <string>,
|
|
335
|
-
"status": "success",
|
|
336
|
-
"data": {
|
|
337
|
-
"corp_phonebook_entries": [
|
|
338
|
-
{
|
|
339
|
-
"avatar": <string|null>,
|
|
340
|
-
"name": <string>,
|
|
341
|
-
"company": <string|null>,
|
|
342
|
-
"company_position": <string|null>,
|
|
343
|
-
"office": <string|null>,
|
|
344
|
-
"department": <string|null>,
|
|
345
|
-
"server_name": <string>,
|
|
346
|
-
"contacts": [
|
|
347
|
-
{
|
|
348
|
-
"active": <bool>,
|
|
349
|
-
"contact": <string>,
|
|
350
|
-
"contact_type": <string>,
|
|
351
|
-
"user_huid": <uuid>,
|
|
352
|
-
"user_kind": <string>,
|
|
353
|
-
}
|
|
354
|
-
],
|
|
355
|
-
},
|
|
356
|
-
],
|
|
357
|
-
"trust_search_entries": [
|
|
358
|
-
{
|
|
359
|
-
"avatar": <string|null>,
|
|
360
|
-
"name": <string>,
|
|
361
|
-
"company": <string|null>,
|
|
362
|
-
"company_position": <string|null>,
|
|
363
|
-
"office": <string|null>,
|
|
364
|
-
"department": <string|null>,
|
|
365
|
-
"server_name": <string>,
|
|
366
|
-
"contacts": [
|
|
367
|
-
{
|
|
368
|
-
"active": <bool>,
|
|
369
|
-
"contact": <string>,
|
|
370
|
-
"contact_type": <string>,
|
|
371
|
-
"user_huid": <uuid>,
|
|
372
|
-
"user_kind": <string>,
|
|
373
|
-
}
|
|
374
|
-
],
|
|
375
|
-
},
|
|
376
|
-
],
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
Ответ клиента в случае ошибки:
|
|
382
|
-
|
|
383
|
-
```
|
|
384
|
-
{
|
|
385
|
-
"ref": <string>,
|
|
386
|
-
"status": "error",
|
|
387
|
-
"error_code": <string>
|
|
388
|
-
}
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
Статус error и error_code отправляются в следующих случаях:
|
|
392
|
-
|
|
393
|
-
```
|
|
394
|
-
1. Таймаут одного из REST API, error_code = timeout
|
|
395
|
-
2. Ошибка сервера 4xx, error_code = <reason из ответа сервера>
|
|
396
|
-
3. Запрос менее 3х символов, error_code = filter_too_short
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
__Открытие группового чата__
|
|
400
|
-
|
|
401
|
-
```
|
|
402
|
-
const response = yield openGroupChat({ groupChatId: <uuid> })
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
Метод отправляет клиенту запрос типа:
|
|
406
|
-
```
|
|
407
|
-
{
|
|
408
|
-
"ref": <string>,
|
|
409
|
-
"handler": "express",
|
|
410
|
-
"type": "smartapp_rpc",
|
|
411
|
-
"method": "open_group_chat",
|
|
412
|
-
"payload": {
|
|
413
|
-
"group_chat_id": <uuid>,
|
|
414
|
-
},
|
|
415
|
-
"files": []
|
|
416
|
-
}
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
И получает ответ типа:
|
|
420
|
-
|
|
421
|
-
```
|
|
422
|
-
{
|
|
423
|
-
"ref": <string>,
|
|
424
|
-
"status": "success|error",
|
|
425
|
-
"error_code"?: <string>
|
|
426
|
-
}
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
__Открытие файла__
|
|
430
|
-
|
|
431
|
-
Метод отправляет клиенту запрос типа:
|
|
432
|
-
|
|
433
|
-
```
|
|
434
|
-
const response = yield openFile(file: {
|
|
435
|
-
"type": <string> | null
|
|
436
|
-
"file": <string>
|
|
437
|
-
"fileMimeType": <string> | null
|
|
438
|
-
"fileName": <string> | null
|
|
439
|
-
"filePreview": <string> | null
|
|
440
|
-
"filePreviewHeight": <number> | null
|
|
441
|
-
"filePreviewWidth": <number> | null
|
|
442
|
-
"fileSize": <number>
|
|
443
|
-
"fileHash": <string> | null
|
|
444
|
-
"fileEncryptionAlgo": <string> | null
|
|
445
|
-
"chunkSize": <number> | null
|
|
446
|
-
"fileId": <string> | null
|
|
447
|
-
"key": {} | null
|
|
448
|
-
}
|
|
449
|
-
)
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
И получает ответ типа:
|
|
453
|
-
|
|
454
|
-
```
|
|
455
|
-
{
|
|
456
|
-
"ref": <string>,
|
|
457
|
-
"status": "success|error",
|
|
458
|
-
"error_code"?: <string>
|
|
459
|
-
}
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
__Отправка скрытой команды боту__
|
|
463
|
-
|
|
464
|
-
Команда позволяет только передать боту информацию. Обработка информации должна быть реализована на стороне бота.
|
|
465
|
-
|
|
466
|
-
```
|
|
467
|
-
await sendBotCommand({ userHuid, body, data}: {
|
|
468
|
-
userHuid: <string>
|
|
469
|
-
body: <string>
|
|
470
|
-
data: { command: <string> } | null
|
|
471
|
-
}
|
|
472
|
-
)
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
Метод отправляет клиенту ивент типа:
|
|
476
|
-
|
|
477
|
-
```
|
|
478
|
-
{
|
|
479
|
-
"ref": <string>,
|
|
480
|
-
"type": "smartapp_rpc",
|
|
481
|
-
"handler": "express",
|
|
482
|
-
"payload": {
|
|
483
|
-
"userHuid": <string>,
|
|
484
|
-
"message": {
|
|
485
|
-
"body": "hello",
|
|
486
|
-
"data": {
|
|
487
|
-
"command": "/test"
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
},
|
|
491
|
-
"method": "send_bot_command"
|
|
492
|
-
}
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
В чат с ботом придет значение параметра `{ "body": "hello" }`, бот получит объект `{ "command": "/test" }`.
|
|
496
|
-
|
|
497
|
-
__Запрос профиля текущего пользователя__
|
|
498
|
-
|
|
499
|
-
```
|
|
500
|
-
const response = yield requestSelfProfile()
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
Метод отправляет клиенту запрос типа:
|
|
504
|
-
```
|
|
505
|
-
{
|
|
506
|
-
"ref": <string>,
|
|
507
|
-
"handler": "express",
|
|
508
|
-
"type": "smartapp_rpc",
|
|
509
|
-
"method": "request_self_profile",
|
|
510
|
-
"payload": {},
|
|
511
|
-
"files": []
|
|
512
|
-
}
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
И получает ответ:
|
|
516
|
-
|
|
517
|
-
```
|
|
518
|
-
{
|
|
519
|
-
"ref": <string>,
|
|
520
|
-
"status": "success|error",
|
|
521
|
-
"data": {
|
|
522
|
-
"userHuid": string,
|
|
523
|
-
"name": string,
|
|
524
|
-
"avatar": string | null,
|
|
525
|
-
"avatarPreview": string | null,
|
|
526
|
-
"company": string | null,
|
|
527
|
-
"department": string | null,
|
|
528
|
-
"office": string | null,
|
|
529
|
-
"manager": string | null,
|
|
530
|
-
"managerHuid": string | null,
|
|
531
|
-
"email": string | null,
|
|
532
|
-
"phone": string | null,
|
|
533
|
-
"description": string | null,
|
|
534
|
-
"otherPhone": string | null,
|
|
535
|
-
"ip_phone": string | null,
|
|
536
|
-
"otherIpPhone": string | null,
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
__Открытие карточки контакта__
|
|
542
|
-
|
|
543
|
-
```
|
|
544
|
-
yield openContactCard({ userHuid: "123e4567-e89b-12d3-a456-426655440000" })
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
Метод отправляет клиенту запрос на открытие карточки контакта с указанным huid.
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
__Статус подключения клиента к серверу__
|
|
551
|
-
|
|
552
|
-
```
|
|
553
|
-
const response = yield getConnectionStatus()
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
Метод отправляет клиенту запрос типа:
|
|
557
|
-
```
|
|
558
|
-
{
|
|
559
|
-
"ref": <string>,
|
|
560
|
-
"handler": "express",
|
|
561
|
-
"type": "smartapp_rpc",
|
|
562
|
-
"method": "get_connection_status",
|
|
563
|
-
"payload": {},
|
|
564
|
-
"files": []
|
|
565
|
-
}
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
И получает ответ:
|
|
569
|
-
```
|
|
570
|
-
{
|
|
571
|
-
"ref": <string>,
|
|
572
|
-
"status": "success|error",
|
|
573
|
-
"data": {
|
|
574
|
-
"connectionStatus": "connected" | "disconnected",
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
__Создание ссылки (deeplink)__
|
|
580
|
-
|
|
581
|
-
```
|
|
582
|
-
const response = yield createDeeplink({
|
|
583
|
-
appId: "email-app",
|
|
584
|
-
meta: [
|
|
585
|
-
{
|
|
586
|
-
key: "route",
|
|
587
|
-
value: "/send-email",
|
|
588
|
-
},
|
|
589
|
-
{
|
|
590
|
-
key: "email",
|
|
591
|
-
value: "test@mail.ru",
|
|
592
|
-
},
|
|
593
|
-
]
|
|
594
|
-
})
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
Метод отправляет клиенту запрос типа:
|
|
598
|
-
```
|
|
599
|
-
{
|
|
600
|
-
"ref": <string>,
|
|
601
|
-
"handler": "express",
|
|
602
|
-
"type": "smartapp_rpc",
|
|
603
|
-
"method": "create_deeplink",
|
|
604
|
-
"payload": {
|
|
605
|
-
"app_id": "email-app",
|
|
606
|
-
"meta": [
|
|
607
|
-
{
|
|
608
|
-
"key": "route",
|
|
609
|
-
"value": "/send-email",
|
|
610
|
-
},
|
|
611
|
-
{
|
|
612
|
-
"key": "email",
|
|
613
|
-
"value": "test@mail.ru",
|
|
614
|
-
},
|
|
615
|
-
]
|
|
616
|
-
},
|
|
617
|
-
"files": []
|
|
618
|
-
}
|
|
619
|
-
```
|
|
620
|
-
|
|
621
|
-
И получает ответ:
|
|
622
|
-
```
|
|
623
|
-
{
|
|
624
|
-
"ref": <string>,
|
|
625
|
-
"status": "success|error",
|
|
626
|
-
"data": {
|
|
627
|
-
"deeplink": "https://xlnk.ms/open/smartapp/email-app?route=%2Fsend-email&email=test%40mail.ru",
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
Также можно подписаться на изменение статуса подключения:
|
|
633
|
-
```
|
|
634
|
-
yield subscribeClientEvents('connection_status', (event) => {
|
|
635
|
-
// TODO: обработать event.data.connectionStatus
|
|
636
|
-
})
|
|
637
|
-
```
|
|
638
|
-
|
|
639
|
-
Отписаться от изменения статуса подключения:
|
|
640
|
-
```
|
|
641
|
-
yield unsubscribeClientEvents('connection_status', functionName)
|
|
642
|
-
```
|
|
643
|
-
|
|
644
|
-
__Открытие сообщения в чате__
|
|
645
|
-
|
|
646
|
-
```
|
|
647
|
-
yield openChatMessage({
|
|
648
|
-
groupChatId: "123e4567-e89b-12d3-a456-426655440000",
|
|
649
|
-
syncId: "123e4567-e89b-12d3-a456-426655440000",
|
|
650
|
-
})
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
Метод отправляет клиенту запрос на открытие сообщения в чате. Если сообщение существует, оно будет подсвечено.
|
|
3
|
+
Методы библиотеки описаны в [руководстве разработчика](https://docs.express.ms/smartapps/developer-guide/smartapp-sdk/).
|
package/build/main/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import Bridge from '@expressms/smartapp-bridge';
|
|
2
|
-
import { createDeeplink, getChats, getConnectionStatus, openChatMessage, openClientSettings, openFile, openGroupChat, requestLocation, searchCorporatePhonebook, sendBotCommand, subscribeClientEvents, unsubscribeClientEvents } from './lib/client';
|
|
2
|
+
import { clientStorageClear, clientStorageGet, clientStorageRemove, clientStorageSet, createDeeplink, getChats, getConnectionStatus, openChatMessage, openClientSettings, openFile, openGroupChat, requestLocation, searchCorporatePhonebook, sendBotCommand, subscribeClientEvents, unsubscribeClientEvents } from './lib/client';
|
|
3
3
|
import { addContact, createPersonalChat, getContact, openContactCard, requestSelfProfile, sendMessage } from './lib/contacts';
|
|
4
4
|
import { useQuery } from './lib/helpers/helpers';
|
|
5
5
|
import { ready } from './lib/logging';
|
|
6
6
|
import { onNotification } from './lib/notification';
|
|
7
7
|
import { closeSmartApp, exitSmartAppToCatalog, onBackPressed, onMoveToRoot, openSmartApp, routingChanged } from './lib/routing';
|
|
8
|
-
export { Bridge, ready, routingChanged, onBackPressed, addContact, getContact, createPersonalChat, onNotification, sendMessage, openSmartApp, openFile, exitSmartAppToCatalog, useQuery, openClientSettings, getChats, searchCorporatePhonebook, sendBotCommand, openGroupChat, onMoveToRoot, requestLocation, openContactCard, requestSelfProfile, closeSmartApp, getConnectionStatus, subscribeClientEvents, unsubscribeClientEvents, createDeeplink, openChatMessage, };
|
|
8
|
+
export { Bridge, ready, routingChanged, onBackPressed, addContact, getContact, createPersonalChat, onNotification, sendMessage, openSmartApp, openFile, exitSmartAppToCatalog, useQuery, openClientSettings, getChats, searchCorporatePhonebook, sendBotCommand, openGroupChat, onMoveToRoot, requestLocation, openContactCard, requestSelfProfile, closeSmartApp, getConnectionStatus, subscribeClientEvents, unsubscribeClientEvents, createDeeplink, openChatMessage, clientStorageGet, clientStorageSet, clientStorageRemove, clientStorageClear, };
|
package/build/main/index.js
CHANGED
|
@@ -3,10 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.openChatMessage = exports.createDeeplink = exports.unsubscribeClientEvents = exports.subscribeClientEvents = exports.getConnectionStatus = exports.closeSmartApp = exports.requestSelfProfile = exports.openContactCard = exports.requestLocation = exports.onMoveToRoot = exports.openGroupChat = exports.sendBotCommand = exports.searchCorporatePhonebook = exports.getChats = exports.openClientSettings = exports.useQuery = exports.exitSmartAppToCatalog = exports.openFile = exports.openSmartApp = exports.sendMessage = exports.onNotification = exports.createPersonalChat = exports.getContact = exports.addContact = exports.onBackPressed = exports.routingChanged = exports.ready = exports.Bridge = void 0;
|
|
6
|
+
exports.clientStorageClear = exports.clientStorageRemove = exports.clientStorageSet = exports.clientStorageGet = exports.openChatMessage = exports.createDeeplink = exports.unsubscribeClientEvents = exports.subscribeClientEvents = exports.getConnectionStatus = exports.closeSmartApp = exports.requestSelfProfile = exports.openContactCard = exports.requestLocation = exports.onMoveToRoot = exports.openGroupChat = exports.sendBotCommand = exports.searchCorporatePhonebook = exports.getChats = exports.openClientSettings = exports.useQuery = exports.exitSmartAppToCatalog = exports.openFile = exports.openSmartApp = exports.sendMessage = exports.onNotification = exports.createPersonalChat = exports.getContact = exports.addContact = exports.onBackPressed = exports.routingChanged = exports.ready = exports.Bridge = void 0;
|
|
7
7
|
const smartapp_bridge_1 = __importDefault(require("@expressms/smartapp-bridge"));
|
|
8
8
|
exports.Bridge = smartapp_bridge_1.default;
|
|
9
9
|
const client_1 = require("./lib/client");
|
|
10
|
+
Object.defineProperty(exports, "clientStorageClear", { enumerable: true, get: function () { return client_1.clientStorageClear; } });
|
|
11
|
+
Object.defineProperty(exports, "clientStorageGet", { enumerable: true, get: function () { return client_1.clientStorageGet; } });
|
|
12
|
+
Object.defineProperty(exports, "clientStorageRemove", { enumerable: true, get: function () { return client_1.clientStorageRemove; } });
|
|
13
|
+
Object.defineProperty(exports, "clientStorageSet", { enumerable: true, get: function () { return client_1.clientStorageSet; } });
|
|
10
14
|
Object.defineProperty(exports, "createDeeplink", { enumerable: true, get: function () { return client_1.createDeeplink; } });
|
|
11
15
|
Object.defineProperty(exports, "getChats", { enumerable: true, get: function () { return client_1.getChats; } });
|
|
12
16
|
Object.defineProperty(exports, "getConnectionStatus", { enumerable: true, get: function () { return client_1.getConnectionStatus; } });
|
|
@@ -39,4 +43,4 @@ Object.defineProperty(exports, "onBackPressed", { enumerable: true, get: functio
|
|
|
39
43
|
Object.defineProperty(exports, "onMoveToRoot", { enumerable: true, get: function () { return routing_1.onMoveToRoot; } });
|
|
40
44
|
Object.defineProperty(exports, "openSmartApp", { enumerable: true, get: function () { return routing_1.openSmartApp; } });
|
|
41
45
|
Object.defineProperty(exports, "routingChanged", { enumerable: true, get: function () { return routing_1.routingChanged; } });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUZBQStDO0FBd0M3QyxpQkF4Q0sseUJBQU0sQ0F3Q0w7QUF2Q1IseUNBaUJxQjtBQXFEbkIsbUdBckVBLDJCQUFrQixPQXFFQTtBQUhsQixpR0FqRUEseUJBQWdCLE9BaUVBO0FBRWhCLG9HQWxFQSw0QkFBbUIsT0FrRUE7QUFEbkIsaUdBaEVBLHlCQUFnQixPQWdFQTtBQUhoQiwrRkE1REEsdUJBQWMsT0E0REE7QUFaZCx5RkEvQ0EsaUJBQVEsT0ErQ0E7QUFTUixvR0F2REEsNEJBQW1CLE9BdURBO0FBSW5CLGdHQTFEQSx3QkFBZSxPQTBEQTtBQWRmLG1HQTNDQSwyQkFBa0IsT0EyQ0E7QUFIbEIseUZBdkNBLGlCQUFRLE9BdUNBO0FBT1IsOEZBN0NBLHNCQUFhLE9BNkNBO0FBRWIsZ0dBOUNBLHdCQUFlLE9BOENBO0FBSmYseUdBekNBLGlDQUF3QixPQXlDQTtBQUN4QiwrRkF6Q0EsdUJBQWMsT0F5Q0E7QUFRZCxzR0FoREEsOEJBQXFCLE9BZ0RBO0FBQ3JCLHdHQWhEQSxnQ0FBdUIsT0FnREE7QUE5Q3pCLDZDQU91QjtBQWtCckIsMkZBeEJBLHFCQUFVLE9Bd0JBO0FBRVYsbUdBekJBLDZCQUFrQixPQXlCQTtBQURsQiwyRkF2QkEscUJBQVUsT0F1QkE7QUFlVixnR0FyQ0EsMEJBQWUsT0FxQ0E7QUFDZixtR0FyQ0EsNkJBQWtCLE9BcUNBO0FBYmxCLDRGQXZCQSxzQkFBVyxPQXVCQTtBQXJCYixtREFBOEM7QUF5QjVDLHlGQXpCTSxrQkFBUSxPQXlCTjtBQXhCViwyQ0FBbUM7QUFhakMsc0ZBYk0sZUFBSyxPQWFOO0FBWlAscURBQWlEO0FBa0IvQywrRkFsQk0sNkJBQWMsT0FrQk47QUFqQmhCLDJDQU9zQjtBQXlCcEIsOEZBL0JBLHVCQUFhLE9BK0JBO0FBWGIsc0dBbkJBLCtCQUFxQixPQW1CQTtBQVJyQiw4RkFWQSx1QkFBYSxPQVVBO0FBZWIsNkZBeEJBLHNCQUFZLE9Bd0JBO0FBVFosNkZBZEEsc0JBQVksT0FjQTtBQVBaLCtGQU5BLHdCQUFjLE9BTUEifQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EmitterEventPayload } from '@expressms/smartapp-bridge/build/main/types/eventEmitter';
|
|
2
2
|
import { CreateDeeplinkResponse, File, GetConnectionStatusResponse } from '../../types';
|
|
3
3
|
export * from './events';
|
|
4
|
+
export * from './storage';
|
|
4
5
|
declare const openClientSettings: () => Promise<EmitterEventPayload> | undefined;
|
|
5
6
|
declare const getChats: ({ filter }: {
|
|
6
7
|
filter: string | null;
|