skyservice-sdk 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/README.md ADDED
@@ -0,0 +1,300 @@
1
+ # @skyservice/sdk
2
+
3
+ SDK для iframe-додатків всередині Skyservice Dashboard. Надає зручний API для комунікації з Dashboard через `postMessage` bridge.
4
+
5
+ ## Встановлення
6
+
7
+ ```bash
8
+ npm install @skyservice/sdk
9
+ ```
10
+
11
+ ### CDN (UMD)
12
+
13
+ ```html
14
+ <script src="https://unpkg.com/@skyservice/sdk"></script>
15
+ <script>
16
+ const { getBack, getUser } = SkyserviceSDK;
17
+ </script>
18
+ ```
19
+
20
+ ## Швидкий старт
21
+
22
+ ```ts
23
+ import { getBack, getUser, getToken, notify } from '@skyservice/sdk';
24
+
25
+ // Отримати поточного юзера
26
+ const user = await getUser();
27
+ console.log(user);
28
+
29
+ // Отримати токен для API запитів
30
+ const token = await getToken();
31
+
32
+ // Показати нотифікацію
33
+ notify('Успішно збережено!');
34
+
35
+ // Повернутись назад в Dashboard
36
+ getBack();
37
+ ```
38
+
39
+ ## API
40
+
41
+ ### Навігація
42
+
43
+ #### `navigate(path: string): void`
44
+
45
+ Навігація Dashboard на вказаний шлях.
46
+
47
+ ```ts
48
+ import { navigate } from '@skyservice/sdk';
49
+
50
+ navigate('/settings');
51
+ navigate('/products/123');
52
+ ```
53
+
54
+ #### `exit(): void` / `getBack(): void`
55
+
56
+ Вихід з iframe-додатку назад в Dashboard. `getBack()` — аліас для `exit()`.
57
+
58
+ ```ts
59
+ import { getBack } from '@skyservice/sdk';
60
+
61
+ getBack();
62
+ ```
63
+
64
+ ---
65
+
66
+ ### Отримання даних
67
+
68
+ Всі методи отримання даних повертають `Promise` і мають таймаут 5 секунд.
69
+
70
+ #### `getStoreData<T>(key: string): Promise<T>`
71
+
72
+ Отримати значення з Vuex store Dashboard за dot-notation ключем.
73
+
74
+ ```ts
75
+ import { getStoreData } from '@skyservice/sdk';
76
+
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
+
88
+ const token = await getLocalStorageData<string>('token');
89
+ ```
90
+
91
+ #### `getWindowData<T>(key: string): Promise<T>`
92
+
93
+ Отримати значення з `window` об'єкта Dashboard.
94
+
95
+ ```ts
96
+ import { getWindowData } from '@skyservice/sdk';
97
+
98
+ const origin = await getWindowData<string>('location.origin');
99
+ ```
100
+
101
+ ---
102
+
103
+ ### Shortcut-методи
104
+
105
+ Зручні обгортки для найчастіших запитів.
106
+
107
+ | Метод | Джерело | Ключ |
108
+ |---|---|---|
109
+ | `getCompany()` | store | `company` |
110
+ | `getUser()` | store | `user` |
111
+ | `getToken()` | localStorage | `token` |
112
+ | `getLang()` | localStorage | `lang` |
113
+ | `getProductCategories()` | store | `productCategories` |
114
+
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
+ ### Дії
128
+
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
+ ---
180
+
181
+ ### Нотифікації
182
+
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
+ ```ts
198
+ import { notifyError } from '@skyservice/sdk';
199
+
200
+ notifyError('Не вдалось зберегти');
201
+ ```
202
+
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
+ ### Утиліти
216
+
217
+ #### `isInsideIframe(): boolean`
218
+
219
+ Перевірити чи додаток запущений всередині iframe.
220
+
221
+ ```ts
222
+ import { isInsideIframe } from '@skyservice/sdk';
223
+
224
+ if (isInsideIframe()) {
225
+ // Ми всередині Dashboard
226
+ } else {
227
+ // Standalone режим
228
+ }
229
+ ```
230
+
231
+ #### `onMessage(callback: (data: unknown) => void): () => void`
232
+
233
+ Підписатись на сирі повідомлення від Dashboard. Повертає функцію для відписки.
234
+
235
+ ```ts
236
+ import { onMessage } from '@skyservice/sdk';
237
+
238
+ const unsubscribe = onMessage((data) => {
239
+ console.log('Message from Dashboard:', data);
240
+ });
241
+
242
+ // Пізніше — відписатись
243
+ unsubscribe();
244
+ ```
245
+
246
+ ---
247
+
248
+ ## Приклад: iframe mini-app
249
+
250
+ ```ts
251
+ import { getUser, getToken, getLang, getBack, notify, notifyError, trackVisit } from '@skyservice/sdk';
252
+
253
+ 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
+ }
277
+
278
+ // Кнопка "Назад"
279
+ document.getElementById('back-btn')?.addEventListener('click', () => {
280
+ getBack();
281
+ });
282
+
283
+ init();
284
+ ```
285
+
286
+ ## TypeScript
287
+
288
+ SDK написаний на TypeScript. Типи включені в пакет — додаткових `@types` не потрібно.
289
+
290
+ Дженерики підтримуються для data-методів:
291
+
292
+ ```ts
293
+ interface Company {
294
+ id: number;
295
+ name: string;
296
+ }
297
+
298
+ const company = await getStoreData<Company>('company');
299
+ // company має тип Company
300
+ ```
@@ -0,0 +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;
@@ -0,0 +1,59 @@
1
+ /** Exit current iframe app and return to Dashboard home */
2
+ export declare function exit(): void;
3
+
4
+ /** Alias for exit() */
5
+ export declare const getBack: typeof exit;
6
+
7
+ export declare function getCompany(): Promise<Record<string, unknown>>;
8
+
9
+ export declare function getLang(): Promise<string>;
10
+
11
+ /** Get a value from Dashboard's localStorage */
12
+ export declare function getLocalStorageData<T = unknown>(key: string): Promise<T>;
13
+
14
+ export declare function getProductCategories(): Promise<unknown[]>;
15
+
16
+ /** Get a value from Dashboard's Vuex store by dot-notated key */
17
+ export declare function getStoreData<T = unknown>(key: string): Promise<T>;
18
+
19
+ export declare function getToken(): Promise<string>;
20
+
21
+ export declare function getUser(): Promise<Record<string, unknown>>;
22
+
23
+ /** Get a value from Dashboard's window object */
24
+ export declare function getWindowData<T = unknown>(key: string): Promise<T>;
25
+
26
+ /** Check if running inside an iframe */
27
+ export declare function isInsideIframe(): boolean;
28
+
29
+ /** Navigate Dashboard to a given path */
30
+ export declare function navigate(path: string): void;
31
+
32
+ /** Show a success notification in Dashboard */
33
+ export declare function notify(text: string): void;
34
+
35
+ /** Show an error notification in Dashboard */
36
+ export declare function notifyError(text: string): void;
37
+
38
+ /** Show a warning notification in Dashboard */
39
+ export declare function notifyWarn(text: string): void;
40
+
41
+ /** Listen for raw messages from Dashboard */
42
+ export declare function onMessage(callback: (data: unknown) => void): () => void;
43
+
44
+ /** Open Crisp support chat */
45
+ export declare function openCrispChat(): void;
46
+
47
+ /** Open an external link (handles webview bridges) */
48
+ export declare function openExternalLink(url: string): void;
49
+
50
+ /** Set a key in Dashboard's localStorage */
51
+ export declare function setLocalStorage(key: string, value: unknown): void;
52
+
53
+ /** Toggle rocket mode in Dashboard */
54
+ export declare function setRocketMode(value: boolean): void;
55
+
56
+ /** Track a page visit for analytics */
57
+ export declare function trackVisit(name: string, path?: string): void;
58
+
59
+ export { }
@@ -0,0 +1,134 @@
1
+ //#region src/skyservice-sdk.ts
2
+ var e = "DASHBOARD", t = 5e3, n = 0;
3
+ function r() {
4
+ return `sdk_${Date.now()}_${++n}`;
5
+ }
6
+ function i(e) {
7
+ window.parent.postMessage(e, "*");
8
+ }
9
+ function a(n, a, o = t) {
10
+ return new Promise((t, s) => {
11
+ let c = r(), l = setTimeout(() => {
12
+ window.removeEventListener("message", u), s(/* @__PURE__ */ Error(`[skyservice-sdk] Request timed out: ${n}.${a}`));
13
+ }, o);
14
+ function u(e) {
15
+ let { type: n, requestId: r, data: i } = e.data || {};
16
+ n !== "DATA_RESPONSE" || r !== c || (clearTimeout(l), window.removeEventListener("message", u), t(i));
17
+ }
18
+ window.addEventListener("message", u), i({
19
+ type: "DATA_REQUEST",
20
+ requestId: c,
21
+ source: n,
22
+ key: a,
23
+ target: e
24
+ });
25
+ });
26
+ }
27
+ function o(t) {
28
+ i({
29
+ type: "navigate",
30
+ path: t,
31
+ target: e
32
+ });
33
+ }
34
+ function s() {
35
+ i({
36
+ type: "exit",
37
+ target: e
38
+ });
39
+ }
40
+ var c = s;
41
+ function l(e) {
42
+ return a("store", e);
43
+ }
44
+ function u(e) {
45
+ return a("localStorage", e);
46
+ }
47
+ function d(e) {
48
+ return a("window", e);
49
+ }
50
+ function f() {
51
+ return l("company");
52
+ }
53
+ function p() {
54
+ return l("user");
55
+ }
56
+ function m() {
57
+ return u("token");
58
+ }
59
+ function h() {
60
+ return u("lang");
61
+ }
62
+ function g() {
63
+ return l("productCategories");
64
+ }
65
+ function _(t, n) {
66
+ i({
67
+ type: "setLocalStorage",
68
+ key: t,
69
+ value: n,
70
+ target: e
71
+ });
72
+ }
73
+ function v(t) {
74
+ i({
75
+ type: "setRocketMode",
76
+ value: t,
77
+ target: e
78
+ });
79
+ }
80
+ function y(t, n) {
81
+ i({
82
+ type: "trackVisit",
83
+ name: t,
84
+ path: n,
85
+ target: e
86
+ });
87
+ }
88
+ function b(t) {
89
+ i({
90
+ type: "openExternalLink",
91
+ url: t,
92
+ target: e
93
+ });
94
+ }
95
+ function x() {
96
+ i({
97
+ type: "openCrispChat",
98
+ target: e
99
+ });
100
+ }
101
+ function S(t) {
102
+ i({
103
+ type: "notification",
104
+ text: t,
105
+ target: e
106
+ });
107
+ }
108
+ function C(t) {
109
+ i({
110
+ type: "notification",
111
+ text: t,
112
+ variant: "error",
113
+ target: e
114
+ });
115
+ }
116
+ function w(t) {
117
+ i({
118
+ type: "notification",
119
+ text: t,
120
+ variant: "warn",
121
+ target: e
122
+ });
123
+ }
124
+ function T() {
125
+ return window.self !== window.top;
126
+ }
127
+ function E(t) {
128
+ function n(n) {
129
+ n.data?.sender === e && t(n.data);
130
+ }
131
+ return window.addEventListener("message", n), () => window.removeEventListener("message", n);
132
+ }
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 };
@@ -0,0 +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});
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "skyservice-sdk",
3
+ "version": "0.1.0",
4
+ "description": "SDK for iframe apps inside Skyservice Dashboard",
5
+ "type": "module",
6
+ "main": "dist/skyservice-sdk.cjs",
7
+ "module": "dist/skyservice-sdk.js",
8
+ "types": "dist/skyservice-sdk.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/skyservice-sdk.js",
12
+ "require": "./dist/skyservice-sdk.cjs",
13
+ "types": "./dist/skyservice-sdk.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "vite build",
21
+ "dev": "vite build --watch"
22
+ },
23
+ "keywords": [
24
+ "skyservice",
25
+ "iframe",
26
+ "sdk",
27
+ "dashboard"
28
+ ],
29
+ "author": "",
30
+ "license": "ISC",
31
+ "devDependencies": {
32
+ "typescript": "^6.0.2",
33
+ "vite": "^8.0.8",
34
+ "vite-plugin-dts": "^4.5.4"
35
+ }
36
+ }