skyservice-sdk 0.1.0 → 0.2.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/README.md +98 -209
- package/dist/skyservice-sdk.cjs +1 -1
- package/dist/skyservice-sdk.d.ts +81 -0
- package/dist/skyservice-sdk.js +52 -2
- package/dist/skyservice-sdk.umd.cjs +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,300 +1,189 @@
|
|
|
1
|
-
#
|
|
1
|
+
# skyservice-sdk
|
|
2
2
|
|
|
3
|
-
SDK для
|
|
3
|
+
SDK для міні-додатків Skyservice. Дві частини:
|
|
4
|
+
|
|
5
|
+
1. **Bridge** — `postMessage` комунікація з Dashboard (працює тільки в iframe)
|
|
6
|
+
2. **SkyserviceAPI** — HTTP клієнт до Skyservice API (працює будь-де)
|
|
4
7
|
|
|
5
8
|
## Встановлення
|
|
6
9
|
|
|
7
10
|
```bash
|
|
8
|
-
npm install
|
|
11
|
+
npm install skyservice-sdk
|
|
9
12
|
```
|
|
10
13
|
|
|
11
14
|
### CDN (UMD)
|
|
12
15
|
|
|
13
16
|
```html
|
|
14
|
-
<script src="https://unpkg.com
|
|
17
|
+
<script src="https://unpkg.com/skyservice-sdk"></script>
|
|
15
18
|
<script>
|
|
16
|
-
const { getBack,
|
|
19
|
+
const { getBack, SkyserviceAPI } = SkyserviceSDK;
|
|
17
20
|
</script>
|
|
18
21
|
```
|
|
19
22
|
|
|
20
|
-
##
|
|
23
|
+
## SkyserviceAPI
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
import { getBack, getUser, getToken, notify } from '@skyservice/sdk';
|
|
25
|
+
HTTP клієнт для роботи з Skyservice API. Не залежить від iframe — працює в браузері, Node.js, Edge.
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
console.log(user);
|
|
27
|
+
```ts
|
|
28
|
+
import { SkyserviceAPI } from 'skyservice-sdk';
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
const api = new SkyserviceAPI({
|
|
31
|
+
token: 'your-token',
|
|
32
|
+
domain: 'api.skyservice.online',
|
|
33
|
+
companyId: 'uuid', // опціонально
|
|
34
|
+
});
|
|
35
|
+
```
|
|
31
36
|
|
|
32
|
-
|
|
33
|
-
notify('Успішно збережено!');
|
|
37
|
+
### api.getTradepoints()
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
getBack();
|
|
37
|
-
```
|
|
39
|
+
Отримати список торгових точок. За замовчуванням фільтрує видалені та заморожені.
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
```ts
|
|
42
|
+
const tradepoints = await api.getTradepoints();
|
|
43
|
+
// [{ tradepointId: 1, tradepointName: "Кавярня", contacts: { address: "..." }, ... }]
|
|
40
44
|
|
|
41
|
-
|
|
45
|
+
// Включити видалені/заморожені
|
|
46
|
+
const all = await api.getTradepoints({ includeDeleted: true });
|
|
47
|
+
```
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
### api.getCategoryTree(tradepointId?)
|
|
44
50
|
|
|
45
|
-
|
|
51
|
+
Отримати дерево категорій товарів. Повертає чисту структуру без POS-специфічних полів (`tradepointsShow`, `tradepointShow`).
|
|
46
52
|
|
|
47
53
|
```ts
|
|
48
|
-
|
|
54
|
+
// Всі категорії компанії
|
|
55
|
+
const categories = await api.getCategoryTree();
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
// Тільки категорії видимі для конкретної точки
|
|
58
|
+
const filtered = await api.getCategoryTree(1);
|
|
52
59
|
```
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
Вихід з iframe-додатку назад в Dashboard. `getBack()` — аліас для `exit()`.
|
|
61
|
+
Кожна категорія:
|
|
57
62
|
|
|
58
63
|
```ts
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
interface Category {
|
|
65
|
+
id: number;
|
|
66
|
+
pid: number; // 0 = корінь
|
|
67
|
+
name: string;
|
|
68
|
+
active: 0 | 1;
|
|
69
|
+
background: string; // HEX колір
|
|
70
|
+
show: boolean;
|
|
71
|
+
img?: string; // URL зображення
|
|
72
|
+
children?: Category[];
|
|
73
|
+
}
|
|
62
74
|
```
|
|
63
75
|
|
|
64
76
|
---
|
|
65
77
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
Всі методи отримання даних повертають `Promise` і мають таймаут 5 секунд.
|
|
78
|
+
## Bridge (iframe)
|
|
69
79
|
|
|
70
|
-
|
|
80
|
+
Функції для комунікації з Dashboard через `postMessage`. Працюють тільки коли додаток запущений в iframe всередині Skyservice Dashboard.
|
|
71
81
|
|
|
72
|
-
|
|
82
|
+
### Швидкий старт
|
|
73
83
|
|
|
74
84
|
```ts
|
|
75
|
-
import {
|
|
85
|
+
import { getToken, getUser, notify, getBack } from 'skyservice-sdk';
|
|
76
86
|
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
#### `getLocalStorageData<T>(key: string): Promise<T>`
|
|
82
|
-
|
|
83
|
-
Отримати значення з localStorage Dashboard.
|
|
84
|
-
|
|
85
|
-
```ts
|
|
86
|
-
import { getLocalStorageData } from '@skyservice/sdk';
|
|
87
|
+
const token = await getToken();
|
|
88
|
+
const user = await getUser();
|
|
87
89
|
|
|
88
|
-
|
|
90
|
+
notify('Успішно збережено!');
|
|
91
|
+
getBack();
|
|
89
92
|
```
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
### Навігація
|
|
92
95
|
|
|
93
|
-
|
|
96
|
+
| Метод | Опис |
|
|
97
|
+
|-------|------|
|
|
98
|
+
| `navigate(path)` | Навігація Dashboard на шлях |
|
|
99
|
+
| `exit()` / `getBack()` | Вихід з iframe назад в Dashboard |
|
|
94
100
|
|
|
95
|
-
|
|
96
|
-
import { getWindowData } from '@skyservice/sdk';
|
|
97
|
-
|
|
98
|
-
const origin = await getWindowData<string>('location.origin');
|
|
99
|
-
```
|
|
101
|
+
### Отримання даних
|
|
100
102
|
|
|
101
|
-
|
|
103
|
+
Всі методи повертають `Promise` з таймаутом 5 секунд.
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
| Метод | Джерело | Опис |
|
|
106
|
+
|-------|---------|------|
|
|
107
|
+
| `getStoreData<T>(key)` | Vuex store | Дані за dot-notation ключем |
|
|
108
|
+
| `getLocalStorageData<T>(key)` | localStorage | Значення з localStorage |
|
|
109
|
+
| `getWindowData<T>(key)` | window | Значення з window об'єкта |
|
|
104
110
|
|
|
105
|
-
|
|
111
|
+
**Shortcut-методи:**
|
|
106
112
|
|
|
107
113
|
| Метод | Джерело | Ключ |
|
|
108
|
-
|
|
114
|
+
|-------|---------|------|
|
|
109
115
|
| `getCompany()` | store | `company` |
|
|
110
116
|
| `getUser()` | store | `user` |
|
|
111
117
|
| `getToken()` | localStorage | `token` |
|
|
112
118
|
| `getLang()` | localStorage | `lang` |
|
|
113
119
|
| `getProductCategories()` | store | `productCategories` |
|
|
114
120
|
|
|
115
|
-
```ts
|
|
116
|
-
import { getCompany, getUser, getToken, getLang, getProductCategories } from '@skyservice/sdk';
|
|
117
|
-
|
|
118
|
-
const company = await getCompany();
|
|
119
|
-
const user = await getUser();
|
|
120
|
-
const token = await getToken();
|
|
121
|
-
const lang = await getLang();
|
|
122
|
-
const categories = await getProductCategories();
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
121
|
### Дії
|
|
128
122
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
Записати
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
setLocalStorage('myApp_lastVisit', Date.now());
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
#### `setRocketMode(value: boolean): void`
|
|
140
|
-
|
|
141
|
-
Увімкнути або вимкнути rocket mode в Dashboard.
|
|
142
|
-
|
|
143
|
-
```ts
|
|
144
|
-
import { setRocketMode } from '@skyservice/sdk';
|
|
145
|
-
|
|
146
|
-
setRocketMode(true);
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
#### `trackVisit(name: string, path?: string): void`
|
|
150
|
-
|
|
151
|
-
Трекінг відвідування сторінки для аналітики.
|
|
152
|
-
|
|
153
|
-
```ts
|
|
154
|
-
import { trackVisit } from '@skyservice/sdk';
|
|
155
|
-
|
|
156
|
-
trackVisit('my-app', '/my-app/dashboard');
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
#### `openExternalLink(url: string): void`
|
|
160
|
-
|
|
161
|
-
Відкрити зовнішнє посилання. Коректно працює в Android/iOS WebView та браузері.
|
|
162
|
-
|
|
163
|
-
```ts
|
|
164
|
-
import { openExternalLink } from '@skyservice/sdk';
|
|
165
|
-
|
|
166
|
-
openExternalLink('https://example.com');
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
#### `openCrispChat(): void`
|
|
170
|
-
|
|
171
|
-
Відкрити чат підтримки Crisp.
|
|
172
|
-
|
|
173
|
-
```ts
|
|
174
|
-
import { openCrispChat } from '@skyservice/sdk';
|
|
175
|
-
|
|
176
|
-
openCrispChat();
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
---
|
|
123
|
+
| Метод | Опис |
|
|
124
|
+
|-------|------|
|
|
125
|
+
| `setLocalStorage(key, value)` | Записати в localStorage Dashboard |
|
|
126
|
+
| `setRocketMode(value)` | Увімкнути/вимкнути rocket mode |
|
|
127
|
+
| `trackVisit(name, path?)` | Трекінг відвідування для аналітики |
|
|
128
|
+
| `openExternalLink(url)` | Відкрити посилання (WebView-safe) |
|
|
129
|
+
| `openCrispChat()` | Відкрити чат підтримки Crisp |
|
|
180
130
|
|
|
181
131
|
### Нотифікації
|
|
182
132
|
|
|
183
|
-
#### `notify(text: string): void`
|
|
184
|
-
|
|
185
|
-
Показати success-нотифікацію в Dashboard.
|
|
186
|
-
|
|
187
|
-
```ts
|
|
188
|
-
import { notify } from '@skyservice/sdk';
|
|
189
|
-
|
|
190
|
-
notify('Збережено!');
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
#### `notifyError(text: string): void`
|
|
194
|
-
|
|
195
|
-
Показати error-нотифікацію.
|
|
196
|
-
|
|
197
133
|
```ts
|
|
198
|
-
import { notifyError } from '
|
|
134
|
+
import { notify, notifyError, notifyWarn } from 'skyservice-sdk';
|
|
199
135
|
|
|
200
|
-
|
|
136
|
+
notify('Збережено!'); // success
|
|
137
|
+
notifyError('Помилка'); // error
|
|
138
|
+
notifyWarn('Перевірте поля'); // warning
|
|
201
139
|
```
|
|
202
140
|
|
|
203
|
-
#### `notifyWarn(text: string): void`
|
|
204
|
-
|
|
205
|
-
Показати warning-нотифікацію.
|
|
206
|
-
|
|
207
|
-
```ts
|
|
208
|
-
import { notifyWarn } from '@skyservice/sdk';
|
|
209
|
-
|
|
210
|
-
notifyWarn('Перевірте заповнені поля');
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
141
|
### Утиліти
|
|
216
142
|
|
|
217
|
-
#### `isInsideIframe(): boolean`
|
|
218
|
-
|
|
219
|
-
Перевірити чи додаток запущений всередині iframe.
|
|
220
|
-
|
|
221
143
|
```ts
|
|
222
|
-
import { isInsideIframe } from '
|
|
144
|
+
import { isInsideIframe, onMessage } from 'skyservice-sdk';
|
|
223
145
|
|
|
224
146
|
if (isInsideIframe()) {
|
|
225
|
-
//
|
|
226
|
-
} else {
|
|
227
|
-
// Standalone режим
|
|
147
|
+
// Всередині Dashboard
|
|
228
148
|
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
#### `onMessage(callback: (data: unknown) => void): () => void`
|
|
232
|
-
|
|
233
|
-
Підписатись на сирі повідомлення від Dashboard. Повертає функцію для відписки.
|
|
234
|
-
|
|
235
|
-
```ts
|
|
236
|
-
import { onMessage } from '@skyservice/sdk';
|
|
237
149
|
|
|
238
150
|
const unsubscribe = onMessage((data) => {
|
|
239
|
-
console.log('Message
|
|
151
|
+
console.log('Message:', data);
|
|
240
152
|
});
|
|
241
|
-
|
|
242
|
-
// Пізніше — відписатись
|
|
243
|
-
unsubscribe();
|
|
244
153
|
```
|
|
245
154
|
|
|
246
155
|
---
|
|
247
156
|
|
|
248
|
-
##
|
|
157
|
+
## Повний приклад
|
|
249
158
|
|
|
250
159
|
```ts
|
|
251
|
-
import {
|
|
160
|
+
import { SkyserviceAPI, getToken, getBack, notify, isInsideIframe } from 'skyservice-sdk';
|
|
252
161
|
|
|
253
162
|
async function init() {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
getToken()
|
|
257
|
-
|
|
258
|
-
]);
|
|
259
|
-
|
|
260
|
-
// Використати токен для API
|
|
261
|
-
const res = await fetch('https://api.skyservice.online/v1/products', {
|
|
262
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
263
|
-
});
|
|
264
|
-
const products = await res.json();
|
|
265
|
-
|
|
266
|
-
// Трекнути візит
|
|
267
|
-
trackVisit('my-app', '/my-app');
|
|
268
|
-
|
|
269
|
-
// Зберегти щось
|
|
270
|
-
try {
|
|
271
|
-
await saveData(products);
|
|
272
|
-
notify('Дані завантажено');
|
|
273
|
-
} catch {
|
|
274
|
-
notifyError('Помилка завантаження');
|
|
275
|
-
}
|
|
276
|
-
}
|
|
163
|
+
// Отримати токен з Dashboard (або з URL params)
|
|
164
|
+
const token = isInsideIframe()
|
|
165
|
+
? await getToken()
|
|
166
|
+
: new URLSearchParams(location.search).get('token')!;
|
|
277
167
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
});
|
|
168
|
+
const domain = new URLSearchParams(location.search).get('domain')!;
|
|
169
|
+
|
|
170
|
+
// Створити API клієнт
|
|
171
|
+
const api = new SkyserviceAPI({ token, domain });
|
|
172
|
+
|
|
173
|
+
// Отримати дані
|
|
174
|
+
const tradepoints = await api.getTradepoints();
|
|
175
|
+
const categories = await api.getCategoryTree(tradepoints[0].tradepointId);
|
|
176
|
+
|
|
177
|
+
console.log(tradepoints, categories);
|
|
178
|
+
}
|
|
282
179
|
|
|
283
180
|
init();
|
|
284
181
|
```
|
|
285
182
|
|
|
286
183
|
## TypeScript
|
|
287
184
|
|
|
288
|
-
SDK написаний на TypeScript. Типи включені
|
|
289
|
-
|
|
290
|
-
Дженерики підтримуються для data-методів:
|
|
185
|
+
SDK написаний на TypeScript. Типи включені — додаткових `@types` не потрібно.
|
|
291
186
|
|
|
292
187
|
```ts
|
|
293
|
-
|
|
294
|
-
id: number;
|
|
295
|
-
name: string;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
const company = await getStoreData<Company>('company');
|
|
299
|
-
// company має тип Company
|
|
188
|
+
import type { Tradepoint, Category } from 'skyservice-sdk';
|
|
300
189
|
```
|
package/dist/skyservice-sdk.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=`DASHBOARD`,t=5e3,n=0;function r(){return`sdk_${Date.now()}_${++n}`}function i(e){window.parent.postMessage(e,`*`)}function a(n,a,o=t){return new Promise((t,s)=>{let c=r(),l=setTimeout(()=>{window.removeEventListener(`message`,u),s(Error(`[skyservice-sdk] Request timed out: ${n}.${a}`))},o);function u(e){let{type:n,requestId:r,data:i}=e.data||{};n!==`DATA_RESPONSE`||r!==c||(clearTimeout(l),window.removeEventListener(`message`,u),t(i))}window.addEventListener(`message`,u),i({type:`DATA_REQUEST`,requestId:c,source:n,key:a,target:e})})}function o(t){i({type:`navigate`,path:t,target:e})}function s(){i({type:`exit`,target:e})}var c=s;function l(e){return a(`store`,e)}function u(e){return a(`localStorage`,e)}function d(e){return a(`window`,e)}function f(){return l(`company`)}function p(){return l(`user`)}function m(){return u(`token`)}function h(){return u(`lang`)}function g(){return l(`productCategories`)}function _(t,n){i({type:`setLocalStorage`,key:t,value:n,target:e})}function v(t){i({type:`setRocketMode`,value:t,target:e})}function y(t,n){i({type:`trackVisit`,name:t,path:n,target:e})}function b(t){i({type:`openExternalLink`,url:t,target:e})}function x(){i({type:`openCrispChat`,target:e})}function S(t){i({type:`notification`,text:t,target:e})}function C(t){i({type:`notification`,text:t,variant:`error`,target:e})}function w(t){i({type:`notification`,text:t,variant:`warn`,target:e})}function T(){return window.self!==window.top}function E(t){function n(n){n.data?.sender===e&&t(n.data)}return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}exports.exit=s,exports.getBack=c,exports.getCompany=f,exports.getLang=h,exports.getLocalStorageData=u,exports.getProductCategories=g,exports.getStoreData=l,exports.getToken=m,exports.getUser=p,exports.getWindowData=d,exports.isInsideIframe=T,exports.navigate=o,exports.notify=S,exports.notifyError=C,exports.notifyWarn=w,exports.onMessage=E,exports.openCrispChat=x,exports.openExternalLink=b,exports.setLocalStorage=_,exports.setRocketMode=v,exports.trackVisit=y;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=`DASHBOARD`,t=5e3,n=0;function r(){return`sdk_${Date.now()}_${++n}`}function i(e){window.parent.postMessage(e,`*`)}function a(n,a,o=t){return new Promise((t,s)=>{let c=r(),l=setTimeout(()=>{window.removeEventListener(`message`,u),s(Error(`[skyservice-sdk] Request timed out: ${n}.${a}`))},o);function u(e){let{type:n,requestId:r,data:i}=e.data||{};n!==`DATA_RESPONSE`||r!==c||(clearTimeout(l),window.removeEventListener(`message`,u),t(i))}window.addEventListener(`message`,u),i({type:`DATA_REQUEST`,requestId:c,source:n,key:a,target:e})})}function o(t){i({type:`navigate`,path:t,target:e})}function s(){i({type:`exit`,target:e})}var c=s;function l(e){return a(`store`,e)}function u(e){return a(`localStorage`,e)}function d(e){return a(`window`,e)}function f(){return l(`company`)}function p(){return l(`user`)}function m(){return u(`token`)}function h(){return u(`lang`)}function g(){return l(`productCategories`)}function _(t,n){i({type:`setLocalStorage`,key:t,value:n,target:e})}function v(t){i({type:`setRocketMode`,value:t,target:e})}function y(t,n){i({type:`trackVisit`,name:t,path:n,target:e})}function b(t){i({type:`openExternalLink`,url:t,target:e})}function x(){i({type:`openCrispChat`,target:e})}function S(t){i({type:`notification`,text:t,target:e})}function C(t){i({type:`notification`,text:t,variant:`error`,target:e})}function w(t){i({type:`notification`,text:t,variant:`warn`,target:e})}function T(){return window.self!==window.top}function E(t){function n(n){n.data?.sender===e&&t(n.data)}return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}var D=class{constructor(e){this.token=e.token,this.companyId=e.companyId;let t=e.domain.replace(`dashboard`,`api`);this.baseUrl=t.startsWith(`http`)?t:`https://${t}`}async request(e){let t=new URLSearchParams({token:this.token,...this.companyId?{companyId:this.companyId}:{},...e}),n=await fetch(`${this.baseUrl}/?${t}`);if(!n.ok)throw Error(`Skyservice API error: ${n.status}`);let r=await n.json();if(r.status!==`done`)throw Error(`Skyservice API returned status: ${r.status}`);return r.data}async getTradepoints(e){let t=await this.request({section:`tradepoints`,action:`getTradepoints`});return e?.includeDeleted?t.items:t.items.filter(e=>!e.deleted&&!e.frozen)}async getCategoryTree(e){return O(await this.request({section:`productCategory`,action:`getCategories`,...e?{tradepointId:String(e)}:{}}),e)}};function O(e,t){let n=[];for(let r of e){if(t!=null&&!r.tradepointShow?.[String(t)])continue;let e={id:r.id,pid:r.pid,name:r.name,active:r.active,background:r.background,show:r.show};r.img&&(e.img=r.img),r.children?.length&&(e.children=O(r.children,t)),n.push(e)}return n}exports.SkyserviceAPI=D,exports.exit=s,exports.getBack=c,exports.getCompany=f,exports.getLang=h,exports.getLocalStorageData=u,exports.getProductCategories=g,exports.getStoreData=l,exports.getToken=m,exports.getUser=p,exports.getWindowData=d,exports.isInsideIframe=T,exports.navigate=o,exports.notify=S,exports.notifyError=C,exports.notifyWarn=w,exports.onMessage=E,exports.openCrispChat=x,exports.openExternalLink=b,exports.setLocalStorage=_,exports.setRocketMode=v,exports.trackVisit=y;
|
package/dist/skyservice-sdk.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
export declare interface Category {
|
|
2
|
+
id: number;
|
|
3
|
+
pid: number;
|
|
4
|
+
name: string;
|
|
5
|
+
active: 0 | 1;
|
|
6
|
+
background: string;
|
|
7
|
+
show: boolean;
|
|
8
|
+
img?: string;
|
|
9
|
+
children?: Category[];
|
|
10
|
+
}
|
|
11
|
+
|
|
1
12
|
/** Exit current iframe app and return to Dashboard home */
|
|
2
13
|
export declare function exit(): void;
|
|
3
14
|
|
|
@@ -47,13 +58,83 @@ export declare function openCrispChat(): void;
|
|
|
47
58
|
/** Open an external link (handles webview bridges) */
|
|
48
59
|
export declare function openExternalLink(url: string): void;
|
|
49
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Raw category from Skyservice API — includes per-tradepoint visibility.
|
|
63
|
+
* Stripped down to `Category` by SkyserviceAPI methods.
|
|
64
|
+
*/
|
|
65
|
+
export declare interface RawCategory extends Category {
|
|
66
|
+
tradepointShow: Record<string, boolean>;
|
|
67
|
+
tradepointsShow?: Record<string, unknown>;
|
|
68
|
+
children?: RawCategory[];
|
|
69
|
+
}
|
|
70
|
+
|
|
50
71
|
/** Set a key in Dashboard's localStorage */
|
|
51
72
|
export declare function setLocalStorage(key: string, value: unknown): void;
|
|
52
73
|
|
|
53
74
|
/** Toggle rocket mode in Dashboard */
|
|
54
75
|
export declare function setRocketMode(value: boolean): void;
|
|
55
76
|
|
|
77
|
+
/**
|
|
78
|
+
* HTTP client for Skyservice API.
|
|
79
|
+
*
|
|
80
|
+
* Works anywhere (browser, Node, edge) — no iframe dependency.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const api = new SkyserviceAPI({ token, domain: 'api.skyservice.online' });
|
|
85
|
+
* const tradepoints = await api.getTradepoints();
|
|
86
|
+
* const categories = await api.getCategoryTree(tradepointId);
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export declare class SkyserviceAPI {
|
|
90
|
+
private baseUrl;
|
|
91
|
+
private token;
|
|
92
|
+
private companyId;
|
|
93
|
+
constructor(config: SkyserviceAPIConfig);
|
|
94
|
+
private request;
|
|
95
|
+
/**
|
|
96
|
+
* Get all tradepoints for the current company.
|
|
97
|
+
* Filters out deleted and frozen by default.
|
|
98
|
+
*/
|
|
99
|
+
getTradepoints(options?: {
|
|
100
|
+
includeDeleted?: boolean;
|
|
101
|
+
}): Promise<Tradepoint[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get the full category tree, cleaned from POS-specific bloat.
|
|
104
|
+
*
|
|
105
|
+
* Returns only fields relevant for menu building:
|
|
106
|
+
* `id`, `pid`, `name`, `active`, `background`, `show`, `img`, `children`.
|
|
107
|
+
*
|
|
108
|
+
* If `tradepointId` is provided, filters to categories visible for that tradepoint.
|
|
109
|
+
*/
|
|
110
|
+
getCategoryTree(tradepointId?: number): Promise<Category[]>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export declare interface SkyserviceAPIConfig {
|
|
114
|
+
token: string;
|
|
115
|
+
domain: string;
|
|
116
|
+
companyId?: string;
|
|
117
|
+
}
|
|
118
|
+
|
|
56
119
|
/** Track a page visit for analytics */
|
|
57
120
|
export declare function trackVisit(name: string, path?: string): void;
|
|
58
121
|
|
|
122
|
+
export declare interface Tradepoint {
|
|
123
|
+
tradepointId: number;
|
|
124
|
+
tradepointName: string;
|
|
125
|
+
contacts: {
|
|
126
|
+
address?: string;
|
|
127
|
+
};
|
|
128
|
+
workTime: Record<string, TradepointWorkDay>;
|
|
129
|
+
deleted: boolean;
|
|
130
|
+
frozen: boolean;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export declare interface TradepointWorkDay {
|
|
134
|
+
name: string;
|
|
135
|
+
isOpen: boolean;
|
|
136
|
+
startTiem: string;
|
|
137
|
+
endTiem: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
59
140
|
export { }
|
package/dist/skyservice-sdk.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/
|
|
1
|
+
//#region src/bridge.ts
|
|
2
2
|
var e = "DASHBOARD", t = 5e3, n = 0;
|
|
3
3
|
function r() {
|
|
4
4
|
return `sdk_${Date.now()}_${++n}`;
|
|
@@ -131,4 +131,54 @@ function E(t) {
|
|
|
131
131
|
return window.addEventListener("message", n), () => window.removeEventListener("message", n);
|
|
132
132
|
}
|
|
133
133
|
//#endregion
|
|
134
|
-
|
|
134
|
+
//#region src/api.ts
|
|
135
|
+
var D = class {
|
|
136
|
+
constructor(e) {
|
|
137
|
+
this.token = e.token, this.companyId = e.companyId;
|
|
138
|
+
let t = e.domain.replace("dashboard", "api");
|
|
139
|
+
this.baseUrl = t.startsWith("http") ? t : `https://${t}`;
|
|
140
|
+
}
|
|
141
|
+
async request(e) {
|
|
142
|
+
let t = new URLSearchParams({
|
|
143
|
+
token: this.token,
|
|
144
|
+
...this.companyId ? { companyId: this.companyId } : {},
|
|
145
|
+
...e
|
|
146
|
+
}), n = await fetch(`${this.baseUrl}/?${t}`);
|
|
147
|
+
if (!n.ok) throw Error(`Skyservice API error: ${n.status}`);
|
|
148
|
+
let r = await n.json();
|
|
149
|
+
if (r.status !== "done") throw Error(`Skyservice API returned status: ${r.status}`);
|
|
150
|
+
return r.data;
|
|
151
|
+
}
|
|
152
|
+
async getTradepoints(e) {
|
|
153
|
+
let t = await this.request({
|
|
154
|
+
section: "tradepoints",
|
|
155
|
+
action: "getTradepoints"
|
|
156
|
+
});
|
|
157
|
+
return e?.includeDeleted ? t.items : t.items.filter((e) => !e.deleted && !e.frozen);
|
|
158
|
+
}
|
|
159
|
+
async getCategoryTree(e) {
|
|
160
|
+
return O(await this.request({
|
|
161
|
+
section: "productCategory",
|
|
162
|
+
action: "getCategories",
|
|
163
|
+
...e ? { tradepointId: String(e) } : {}
|
|
164
|
+
}), e);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
function O(e, t) {
|
|
168
|
+
let n = [];
|
|
169
|
+
for (let r of e) {
|
|
170
|
+
if (t != null && !r.tradepointShow?.[String(t)]) continue;
|
|
171
|
+
let e = {
|
|
172
|
+
id: r.id,
|
|
173
|
+
pid: r.pid,
|
|
174
|
+
name: r.name,
|
|
175
|
+
active: r.active,
|
|
176
|
+
background: r.background,
|
|
177
|
+
show: r.show
|
|
178
|
+
};
|
|
179
|
+
r.img && (e.img = r.img), r.children?.length && (e.children = O(r.children, t)), n.push(e);
|
|
180
|
+
}
|
|
181
|
+
return n;
|
|
182
|
+
}
|
|
183
|
+
//#endregion
|
|
184
|
+
export { D as SkyserviceAPI, s as exit, c as getBack, f as getCompany, h as getLang, u as getLocalStorageData, g as getProductCategories, l as getStoreData, m as getToken, p as getUser, d as getWindowData, T as isInsideIframe, o as navigate, S as notify, C as notifyError, w as notifyWarn, E as onMessage, x as openCrispChat, b as openExternalLink, _ as setLocalStorage, v as setRocketMode, y as trackVisit };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.SkyserviceSDK={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=`DASHBOARD`,n=5e3,r=0;function i(){return`sdk_${Date.now()}_${++r}`}function a(e){window.parent.postMessage(e,`*`)}function o(e,r,o=n){return new Promise((n,s)=>{let c=i(),l=setTimeout(()=>{window.removeEventListener(`message`,u),s(Error(`[skyservice-sdk] Request timed out: ${e}.${r}`))},o);function u(e){let{type:t,requestId:r,data:i}=e.data||{};t!==`DATA_RESPONSE`||r!==c||(clearTimeout(l),window.removeEventListener(`message`,u),n(i))}window.addEventListener(`message`,u),a({type:`DATA_REQUEST`,requestId:c,source:e,key:r,target:t})})}function s(e){a({type:`navigate`,path:e,target:t})}function c(){a({type:`exit`,target:t})}var l=c;function u(e){return o(`store`,e)}function d(e){return o(`localStorage`,e)}function f(e){return o(`window`,e)}function p(){return u(`company`)}function m(){return u(`user`)}function h(){return d(`token`)}function g(){return d(`lang`)}function _(){return u(`productCategories`)}function v(e,n){a({type:`setLocalStorage`,key:e,value:n,target:t})}function y(e){a({type:`setRocketMode`,value:e,target:t})}function b(e,n){a({type:`trackVisit`,name:e,path:n,target:t})}function x(e){a({type:`openExternalLink`,url:e,target:t})}function S(){a({type:`openCrispChat`,target:t})}function C(e){a({type:`notification`,text:e,target:t})}function w(e){a({type:`notification`,text:e,variant:`error`,target:t})}function T(e){a({type:`notification`,text:e,variant:`warn`,target:t})}function E(){return window.self!==window.top}function D(e){function n(n){n.data?.sender===t&&e(n.data)}return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}e.exit=c,e.getBack=l,e.getCompany=p,e.getLang=g,e.getLocalStorageData=d,e.getProductCategories=_,e.getStoreData=u,e.getToken=h,e.getUser=m,e.getWindowData=f,e.isInsideIframe=E,e.navigate=s,e.notify=C,e.notifyError=w,e.notifyWarn=T,e.onMessage=D,e.openCrispChat=S,e.openExternalLink=x,e.setLocalStorage=v,e.setRocketMode=y,e.trackVisit=b});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.SkyserviceSDK={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=`DASHBOARD`,n=5e3,r=0;function i(){return`sdk_${Date.now()}_${++r}`}function a(e){window.parent.postMessage(e,`*`)}function o(e,r,o=n){return new Promise((n,s)=>{let c=i(),l=setTimeout(()=>{window.removeEventListener(`message`,u),s(Error(`[skyservice-sdk] Request timed out: ${e}.${r}`))},o);function u(e){let{type:t,requestId:r,data:i}=e.data||{};t!==`DATA_RESPONSE`||r!==c||(clearTimeout(l),window.removeEventListener(`message`,u),n(i))}window.addEventListener(`message`,u),a({type:`DATA_REQUEST`,requestId:c,source:e,key:r,target:t})})}function s(e){a({type:`navigate`,path:e,target:t})}function c(){a({type:`exit`,target:t})}var l=c;function u(e){return o(`store`,e)}function d(e){return o(`localStorage`,e)}function f(e){return o(`window`,e)}function p(){return u(`company`)}function m(){return u(`user`)}function h(){return d(`token`)}function g(){return d(`lang`)}function _(){return u(`productCategories`)}function v(e,n){a({type:`setLocalStorage`,key:e,value:n,target:t})}function y(e){a({type:`setRocketMode`,value:e,target:t})}function b(e,n){a({type:`trackVisit`,name:e,path:n,target:t})}function x(e){a({type:`openExternalLink`,url:e,target:t})}function S(){a({type:`openCrispChat`,target:t})}function C(e){a({type:`notification`,text:e,target:t})}function w(e){a({type:`notification`,text:e,variant:`error`,target:t})}function T(e){a({type:`notification`,text:e,variant:`warn`,target:t})}function E(){return window.self!==window.top}function D(e){function n(n){n.data?.sender===t&&e(n.data)}return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}var O=class{constructor(e){this.token=e.token,this.companyId=e.companyId;let t=e.domain.replace(`dashboard`,`api`);this.baseUrl=t.startsWith(`http`)?t:`https://${t}`}async request(e){let t=new URLSearchParams({token:this.token,...this.companyId?{companyId:this.companyId}:{},...e}),n=await fetch(`${this.baseUrl}/?${t}`);if(!n.ok)throw Error(`Skyservice API error: ${n.status}`);let r=await n.json();if(r.status!==`done`)throw Error(`Skyservice API returned status: ${r.status}`);return r.data}async getTradepoints(e){let t=await this.request({section:`tradepoints`,action:`getTradepoints`});return e?.includeDeleted?t.items:t.items.filter(e=>!e.deleted&&!e.frozen)}async getCategoryTree(e){return k(await this.request({section:`productCategory`,action:`getCategories`,...e?{tradepointId:String(e)}:{}}),e)}};function k(e,t){let n=[];for(let r of e){if(t!=null&&!r.tradepointShow?.[String(t)])continue;let e={id:r.id,pid:r.pid,name:r.name,active:r.active,background:r.background,show:r.show};r.img&&(e.img=r.img),r.children?.length&&(e.children=k(r.children,t)),n.push(e)}return n}e.SkyserviceAPI=O,e.exit=c,e.getBack=l,e.getCompany=p,e.getLang=g,e.getLocalStorageData=d,e.getProductCategories=_,e.getStoreData=u,e.getToken=h,e.getUser=m,e.getWindowData=f,e.isInsideIframe=E,e.navigate=s,e.notify=C,e.notifyError=w,e.notifyWarn=T,e.onMessage=D,e.openCrispChat=S,e.openExternalLink=x,e.setLocalStorage=v,e.setRocketMode=y,e.trackVisit=b});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skyservice-sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "SDK for
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "SDK for Skyservice mini-apps — Bridge (iframe postMessage) + API client (HTTP)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/skyservice-sdk.cjs",
|
|
7
7
|
"module": "dist/skyservice-sdk.js",
|