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 CHANGED
@@ -1,300 +1,189 @@
1
- # @skyservice/sdk
1
+ # skyservice-sdk
2
2
 
3
- SDK для iframe-додатків всередині Skyservice Dashboard. Надає зручний API для комунікації з Dashboard через `postMessage` bridge.
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 @skyservice/sdk
11
+ npm install skyservice-sdk
9
12
  ```
10
13
 
11
14
  ### CDN (UMD)
12
15
 
13
16
  ```html
14
- <script src="https://unpkg.com/@skyservice/sdk"></script>
17
+ <script src="https://unpkg.com/skyservice-sdk"></script>
15
18
  <script>
16
- const { getBack, getUser } = SkyserviceSDK;
19
+ const { getBack, SkyserviceAPI } = SkyserviceSDK;
17
20
  </script>
18
21
  ```
19
22
 
20
- ## Швидкий старт
23
+ ## SkyserviceAPI
21
24
 
22
- ```ts
23
- import { getBack, getUser, getToken, notify } from '@skyservice/sdk';
25
+ HTTP клієнт для роботи з Skyservice API. Не залежить від iframe — працює в браузері, Node.js, Edge.
24
26
 
25
- // Отримати поточного юзера
26
- const user = await getUser();
27
- console.log(user);
27
+ ```ts
28
+ import { SkyserviceAPI } from 'skyservice-sdk';
28
29
 
29
- // Отримати токен для API запитів
30
- const token = await getToken();
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
- // Повернутись назад в Dashboard
36
- getBack();
37
- ```
39
+ Отримати список торгових точок. За замовчуванням фільтрує видалені та заморожені.
38
40
 
39
- ## API
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
- #### `navigate(path: string): void`
49
+ ### api.getCategoryTree(tradepointId?)
44
50
 
45
- Навігація Dashboard на вказаний шлях.
51
+ Отримати дерево категорій товарів. Повертає чисту структуру без POS-специфічних полів (`tradepointsShow`, `tradepointShow`).
46
52
 
47
53
  ```ts
48
- import { navigate } from '@skyservice/sdk';
54
+ // Всі категорії компанії
55
+ const categories = await api.getCategoryTree();
49
56
 
50
- navigate('/settings');
51
- navigate('/products/123');
57
+ // Тільки категорії видимі для конкретної точки
58
+ const filtered = await api.getCategoryTree(1);
52
59
  ```
53
60
 
54
- #### `exit(): void` / `getBack(): void`
55
-
56
- Вихід з iframe-додатку назад в Dashboard. `getBack()` — аліас для `exit()`.
61
+ Кожна категорія:
57
62
 
58
63
  ```ts
59
- import { getBack } from '@skyservice/sdk';
60
-
61
- getBack();
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
- #### `getStoreData<T>(key: string): Promise<T>`
80
+ Функції для комунікації з Dashboard через `postMessage`. Працюють тільки коли додаток запущений в iframe всередині Skyservice Dashboard.
71
81
 
72
- Отримати значення з Vuex store Dashboard за dot-notation ключем.
82
+ ### Швидкий старт
73
83
 
74
84
  ```ts
75
- import { getStoreData } from '@skyservice/sdk';
85
+ import { getToken, getUser, notify, getBack } from 'skyservice-sdk';
76
86
 
77
- const company = await getStoreData('company');
78
- const companyName = await getStoreData<string>('company.name');
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
- const token = await getLocalStorageData<string>('token');
90
+ notify('Успішно збережено!');
91
+ getBack();
89
92
  ```
90
93
 
91
- #### `getWindowData<T>(key: string): Promise<T>`
94
+ ### Навігація
92
95
 
93
- Отримати значення з `window` об'єкта Dashboard.
96
+ | Метод | Опис |
97
+ |-------|------|
98
+ | `navigate(path)` | Навігація Dashboard на шлях |
99
+ | `exit()` / `getBack()` | Вихід з iframe назад в Dashboard |
94
100
 
95
- ```ts
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
- ### Shortcut-методи
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
- #### `setLocalStorage(key: string, value: unknown): void`
130
-
131
- Записати значення в localStorage Dashboard.
132
-
133
- ```ts
134
- import { setLocalStorage } from '@skyservice/sdk';
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 '@skyservice/sdk';
134
+ import { notify, notifyError, notifyWarn } from 'skyservice-sdk';
199
135
 
200
- notifyError('Не вдалось зберегти');
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 '@skyservice/sdk';
144
+ import { isInsideIframe, onMessage } from 'skyservice-sdk';
223
145
 
224
146
  if (isInsideIframe()) {
225
- // Ми всередині Dashboard
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 from Dashboard:', data);
151
+ console.log('Message:', data);
240
152
  });
241
-
242
- // Пізніше — відписатись
243
- unsubscribe();
244
153
  ```
245
154
 
246
155
  ---
247
156
 
248
- ## Приклад: iframe mini-app
157
+ ## Повний приклад
249
158
 
250
159
  ```ts
251
- import { getUser, getToken, getLang, getBack, notify, notifyError, trackVisit } from '@skyservice/sdk';
160
+ import { SkyserviceAPI, getToken, getBack, notify, isInsideIframe } from 'skyservice-sdk';
252
161
 
253
162
  async function init() {
254
- const [user, token, lang] = await Promise.all([
255
- getUser(),
256
- getToken(),
257
- getLang(),
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
- document.getElementById('back-btn')?.addEventListener('click', () => {
280
- getBack();
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. Типи включені в пакет — додаткових `@types` не потрібно.
289
-
290
- Дженерики підтримуються для data-методів:
185
+ SDK написаний на TypeScript. Типи включені — додаткових `@types` не потрібно.
291
186
 
292
187
  ```ts
293
- interface Company {
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
  ```
@@ -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;
@@ -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 { }
@@ -1,4 +1,4 @@
1
- //#region src/skyservice-sdk.ts
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
- export { 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 };
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.1.0",
4
- "description": "SDK for iframe apps inside Skyservice Dashboard",
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",