@tma.js/sdk-solid 0.1.3 → 0.1.5

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.
@@ -3,4 +3,4 @@ import type { SDKInitOptions } from './types.js';
3
3
  export type SDKProviderProps = ParentProps<{
4
4
  initOptions?: SDKInitOptions;
5
5
  }>;
6
- export declare function SDKProvider(props: SDKProviderProps): import("solid-js").JSX.Element;
6
+ export declare function SDKProvider(props: SDKProviderProps): any;
@@ -0,0 +1 @@
1
+ export declare const SDKContext: any;
@@ -0,0 +1,21 @@
1
+ import { Accessor } from 'solid-js';
2
+ import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';
3
+ interface Trackable {
4
+ on: (event: any, ...args: any[]) => void;
5
+ off: (event: any, ...args: any[]) => void;
6
+ }
7
+ type EventName<T extends Trackable> = T extends {
8
+ on(event: infer E, ...args: any[]): any;
9
+ } ? E : never;
10
+ type DynamicComponentKey = {
11
+ [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable ? K : never;
12
+ }[SDKInitResultKey];
13
+ /**
14
+ * Extracts value from the SDK init result by specified key and listens to its all specified
15
+ * events, making the returned value to update.
16
+ * @param initResult - SDK init result.
17
+ * @param key - SDK init result key.
18
+ * @param events - tracked events list.
19
+ */
20
+ export declare function useDynamicInitResultValue<K extends DynamicComponentKey>(initResult: Accessor<SDKInitResult>, key: K, events: EventName<SDKInitResultValue<K>>[]): Accessor<SDKInitResultValue<K>>;
21
+ export {};
@@ -0,0 +1,8 @@
1
+ import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';
2
+ import { Accessor } from 'solid-js';
3
+ /**
4
+ * Extracts value from the SDK init result by key.
5
+ * @param result - init result accessor.
6
+ * @param key - key to extract.
7
+ */
8
+ export declare function useInitResultValue<K extends SDKInitResultKey>(result: Accessor<SDKInitResult>, key: K): Accessor<SDKInitResultValue<K>>;
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ import { createContext as g, useContext as C, createMemo as r, createResource as p, createComponent as f, createSignal as m, createEffect as v, onCleanup as D } from "solid-js";
2
+ import { init as S } from "@tma.js/sdk";
3
+ import { classNames as k, mergeClassNames as B } from "@tma.js/utils";
4
+ const h = g(void 0, { name: "SDKContext" });
5
+ function b() {
6
+ const t = C(h);
7
+ if (t === void 0)
8
+ throw new Error("useSDKContext hook was used outside of SDKProvider.");
9
+ return t;
10
+ }
11
+ function E(t) {
12
+ const e = r(() => t.initOptions || {}), [n] = p(e, S), s = r(() => n.state === "ready" ? n() : null), u = r(() => n.loading), c = r(() => n.error === void 0 ? null : n.error);
13
+ return f(h.Provider, {
14
+ value: {
15
+ initResult: s,
16
+ loading: u,
17
+ error: c
18
+ },
19
+ get children() {
20
+ return t.children;
21
+ }
22
+ });
23
+ }
24
+ function a(t, e) {
25
+ return r(() => t()[e]);
26
+ }
27
+ function o(t, e, n) {
28
+ const s = a(t, e), [u, c] = m(s(), { equals: !1 });
29
+ return v(() => {
30
+ const d = s(), l = () => {
31
+ c((i) => i);
32
+ };
33
+ n.forEach((i) => d.on(i, l)), D(() => {
34
+ n.forEach((i) => d.off(i, l));
35
+ });
36
+ }), u;
37
+ }
38
+ function K() {
39
+ const { initResult: t } = b(), e = r(() => {
40
+ const n = t();
41
+ if (n === null)
42
+ throw new Error("Unable to use SDK as it is not ready.");
43
+ return n;
44
+ });
45
+ return {
46
+ backButton: o(e, "backButton", ["isVisibleChanged"]),
47
+ closingBehavior: o(e, "closingBehavior", ["isConfirmationNeededChanged"]),
48
+ cloudStorage: a(e, "cloudStorage"),
49
+ haptic: a(e, "haptic"),
50
+ initData: a(e, "initData"),
51
+ initDataRaw: a(e, "initDataRaw"),
52
+ mainButton: o(e, "mainButton", [
53
+ "backgroundColorChanged",
54
+ "isVisibleChanged",
55
+ "isProgressVisibleChanged",
56
+ "isEnabledChanged",
57
+ "textChanged",
58
+ "textColorChanged"
59
+ ]),
60
+ popup: o(e, "popup", ["isOpenedChanged"]),
61
+ postEvent: a(e, "postEvent"),
62
+ qrScanner: o(e, "qrScanner", ["isOpenedChanged"]),
63
+ themeParams: o(e, "themeParams", ["changed"]),
64
+ viewport: o(e, "viewport", [
65
+ "heightChanged",
66
+ "isExpandedChanged",
67
+ "stableHeightChanged",
68
+ "widthChanged"
69
+ ]),
70
+ webApp: o(e, "webApp", ["backgroundColorChanged", "headerColorChanged"])
71
+ };
72
+ }
73
+ export {
74
+ h as SDKContext,
75
+ E as SDKProvider,
76
+ k as classNames,
77
+ B as mergeClassNames,
78
+ K as useSDK,
79
+ b as useSDKContext
80
+ };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/context.ts","../src/hooks.ts","../src/SDKProvider.tsx","../src/useInitResultValue.ts","../src/useDynamicInitResultValue.ts","../src/useSDK.ts"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>(undefined, { name: 'SDKContext' });\n","import { useContext } from 'solid-js';\n\nimport { SDKContext } from './context.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Uses SDKContext context.\n */\nexport function useSDKContext(): SDKContextType {\n const context = useContext(SDKContext);\n\n if (context === undefined) {\n throw new Error('useSDKContext hook was used outside of SDKProvider.');\n }\n return context;\n}\n","import { createMemo, createResource, ParentProps } from 'solid-js';\nimport { init } from '@tma.js/sdk';\n\nimport { SDKContext } from './context.js';\nimport type { SDKInitOptions } from './types.js';\n\nexport type SDKProviderProps = ParentProps<{ initOptions?: SDKInitOptions }>;\n\nexport function SDKProvider(props: SDKProviderProps) {\n const initOptions = createMemo(() => props.initOptions || {});\n const [data] = createResource(initOptions, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : null;\n });\n const loading = createMemo(() => data.loading);\n const error = createMemo(() => data.error === undefined ? null : data.error);\n\n return (\n <SDKContext.Provider value={{ initResult, loading, error }}>\n {props.children}\n </SDKContext.Provider>\n );\n}\n","import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { Accessor, createMemo } from 'solid-js';\n\n/**\n * Extracts value from the SDK init result by key.\n * @param result - init result accessor.\n * @param key - key to extract.\n */\nexport function useInitResultValue<K extends SDKInitResultKey>(\n result: Accessor<SDKInitResult>,\n key: K\n): Accessor<SDKInitResultValue<K>> {\n return createMemo(() => result()[key]);\n}","import { Accessor, createEffect, createSignal, onCleanup } from 'solid-js';\nimport { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { useInitResultValue } from './useInitResultValue.js';\n\ninterface Trackable {\n on: (event: any, ...args: any[]) => void;\n off: (event: any, ...args: any[]) => void;\n}\n\ntype EventName<T extends Trackable> = T extends {\n on(event: infer E, ...args: any[]): any\n} ? E : never;\n\ntype DynamicComponentKey = {\n [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable ? K : never;\n}[SDKInitResultKey];\n\n/**\n * Extracts value from the SDK init result by specified key and listens to its all specified\n * events, making the returned value to update.\n * @param initResult - SDK init result.\n * @param key - SDK init result key.\n * @param events - tracked events list.\n */\nexport function useDynamicInitResultValue<K extends DynamicComponentKey>(\n initResult: Accessor<SDKInitResult>,\n key: K,\n events: EventName<SDKInitResultValue<K>>[],\n): Accessor<SDKInitResultValue<K>> {\n // Get original value from init result.\n const initResultValue = useInitResultValue(initResult, key);\n\n // Here we store value, which should always update it in case, some of its props\n // were changed/\n const [value, setValue] = createSignal(initResultValue(), { equals: false });\n\n createEffect(() => {\n const value = initResultValue();\n const listener = () => {\n // We use prev => prev on purpose. This will make Solid sure, something inside\n // dynamic value changed.\n setValue(prev => prev);\n };\n\n events.forEach(event => value.on(event, listener));\n onCleanup(() => {\n events.forEach(event => value.off(event, listener));\n });\n });\n\n return value;\n}","import { createMemo, type Accessor } from 'solid-js';\n\nimport { useSDKContext } from './hooks.js';\nimport { useInitResultValue } from './useInitResultValue.js';\nimport { useDynamicInitResultValue } from './useDynamicInitResultValue.js';\nimport type { SDKInitResultKey, SDKInitResultValue } from './types.js';\n\nexport type SDK = {\n [K in SDKInitResultKey]: Accessor<SDKInitResultValue<K>>\n};\n\n/**\n * Returns ready to use SDK components.\n */\nexport function useSDK(): SDK {\n const { initResult } = useSDKContext();\n\n const sdk = createMemo(() => {\n const result = initResult();\n\n if (result === null) {\n throw new Error('Unable to use SDK as it is not ready.');\n }\n return result;\n });\n\n return {\n backButton: useDynamicInitResultValue(sdk, 'backButton', ['isVisibleChanged']),\n closingBehavior: useDynamicInitResultValue(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),\n cloudStorage: useInitResultValue(sdk, 'cloudStorage'),\n haptic: useInitResultValue(sdk, 'haptic'),\n initData: useInitResultValue(sdk, 'initData'),\n initDataRaw: useInitResultValue(sdk, 'initDataRaw'),\n mainButton: useDynamicInitResultValue(sdk, 'mainButton', [\n 'backgroundColorChanged',\n 'isVisibleChanged',\n 'isProgressVisibleChanged',\n 'isEnabledChanged',\n 'textChanged',\n 'textColorChanged',\n ]),\n popup: useDynamicInitResultValue(sdk, 'popup', ['isOpenedChanged']),\n postEvent: useInitResultValue(sdk, 'postEvent'),\n qrScanner: useDynamicInitResultValue(sdk, 'qrScanner', ['isOpenedChanged']),\n themeParams: useDynamicInitResultValue(sdk, 'themeParams', ['changed']),\n viewport: useDynamicInitResultValue(sdk, 'viewport', [\n 'heightChanged',\n 'isExpandedChanged',\n 'stableHeightChanged',\n 'widthChanged',\n ]),\n webApp: useDynamicInitResultValue(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),\n };\n}"],"names":["SDKContext","createContext","useSDKContext","context","useContext","SDKProvider","props","initOptions","createMemo","data","createResource","init","initResult","state","loading","error","undefined","_$createComponent","Provider","value","children","useInitResultValue","result","key","useDynamicInitResultValue","events","initResultValue","setValue","createSignal","createEffect","listener","prev","event","onCleanup","useSDK","sdk"],"mappings":";;;AAIO,MAAMA,IAAaC,EAA8B,QAAW,EAAE,MAAM,aAAc,CAAA;ACIlF,SAASC,IAAgC;AACxC,QAAAC,IAAUC,EAAWJ,CAAU;AAErC,MAAIG,MAAY;AACR,UAAA,IAAI,MAAM,qDAAqD;AAEhE,SAAAA;AACT;ACPO,SAASE,EAAYC,GAAyB;AACnD,QAAMC,IAAcC,EAAW,MAAMF,EAAMC,eAAe,CAAE,CAAA,GACtD,CAACE,CAAI,IAAIC,EAAeH,GAAaI,CAAI,GAEzCC,IAAaJ,EAAW,MACrBC,EAAKI,UAAU,UAAUJ,EAAI,IAAK,IAC1C,GACKK,IAAUN,EAAW,MAAMC,EAAKK,OAAO,GACvCC,IAAQP,EAAW,MAAMC,EAAKM,UAAUC,SAAY,OAAOP,EAAKM,KAAK;AAE3E,SAAAE,EACGjB,EAAWkB,UAAQ;AAAA,IAACC,OAAO;AAAA,MAAEP,YAAAA;AAAAA,MAAYE,SAAAA;AAAAA,MAASC,OAAAA;AAAAA,IAAO;AAAA,IAAA,IAAAK,WAAA;AAAA,aACvDd,EAAMc;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;ACfgB,SAAAC,EACdC,GACAC,GACiC;AACjC,SAAOf,EAAW,MAAMc,IAASC,CAAG,CAAC;AACvC;ACWgB,SAAAC,EACdZ,GACAW,GACAE,GACiC;AAE3B,QAAAC,IAAkBL,EAAmBT,GAAYW,CAAG,GAIpD,CAACJ,GAAOQ,CAAQ,IAAIC,EAAaF,KAAmB,EAAE,QAAQ,GAAA,CAAO;AAE3E,SAAAG,EAAa,MAAM;AACjB,UAAMV,IAAQO,KACRI,IAAW,MAAM;AAGrB,MAAAH,EAAS,OAAQI,CAAI;AAAA,IAAA;AAGvB,IAAAN,EAAO,QAAQ,CAASN,MAAAA,EAAM,GAAGa,GAAOF,CAAQ,CAAC,GACjDG,EAAU,MAAM;AACd,MAAAR,EAAO,QAAQ,CAASN,MAAAA,EAAM,IAAIa,GAAOF,CAAQ,CAAC;AAAA,IAAA,CACnD;AAAA,EAAA,CACF,GAEMX;AACT;ACrCO,SAASe,IAAc;AACtB,QAAA,EAAE,YAAAtB,MAAeV,KAEjBiC,IAAM3B,EAAW,MAAM;AAC3B,UAAMc,IAASV;AAEf,QAAIU,MAAW;AACP,YAAA,IAAI,MAAM,uCAAuC;AAElD,WAAAA;AAAA,EAAA,CACR;AAEM,SAAA;AAAA,IACL,YAAYE,EAA0BW,GAAK,cAAc,CAAC,kBAAkB,CAAC;AAAA,IAC7E,iBAAiBX,EAA0BW,GAAK,mBAAmB,CAAC,6BAA6B,CAAC;AAAA,IAClG,cAAcd,EAAmBc,GAAK,cAAc;AAAA,IACpD,QAAQd,EAAmBc,GAAK,QAAQ;AAAA,IACxC,UAAUd,EAAmBc,GAAK,UAAU;AAAA,IAC5C,aAAad,EAAmBc,GAAK,aAAa;AAAA,IAClD,YAAYX,EAA0BW,GAAK,cAAc;AAAA,MACvD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,IACD,OAAOX,EAA0BW,GAAK,SAAS,CAAC,iBAAiB,CAAC;AAAA,IAClE,WAAWd,EAAmBc,GAAK,WAAW;AAAA,IAC9C,WAAWX,EAA0BW,GAAK,aAAa,CAAC,iBAAiB,CAAC;AAAA,IAC1E,aAAaX,EAA0BW,GAAK,eAAe,CAAC,SAAS,CAAC;AAAA,IACtE,UAAUX,EAA0BW,GAAK,YAAY;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,IACD,QAAQX,EAA0BW,GAAK,UAAU,CAAC,0BAA0B,oBAAoB,CAAC;AAAA,EAAA;AAErG;"}
@@ -0,0 +1,2 @@
1
+ (function(n,t){typeof exports=="object"&&typeof module<"u"?t(exports,require("solid-js"),require("@tma.js/sdk"),require("@tma.js/utils")):typeof define=="function"&&define.amd?define(["exports","solid-js","@tma.js/sdk","@tma.js/utils"],t):(n=typeof globalThis<"u"?globalThis:n||self,t((n["@tma"]=n["@tma"]||{},n["@tma"]["js/sdk-solid"]={}),n["solid-js"],n["@tma"]["js/sdk"],n["@tma"]["js/utils"]))})(this,function(n,t,g,l){"use strict";const c=t.createContext(void 0,{name:"SDKContext"});function m(){const a=t.useContext(c);if(a===void 0)throw new Error("useSDKContext hook was used outside of SDKProvider.");return a}function p(a){const e=t.createMemo(()=>a.initOptions||{}),[r]=t.createResource(e,g.init),u=t.createMemo(()=>r.state==="ready"?r():null),d=t.createMemo(()=>r.loading),h=t.createMemo(()=>r.error===void 0?null:r.error);return t.createComponent(c.Provider,{value:{initResult:u,loading:d,error:h},get children(){return a.children}})}function i(a,e){return t.createMemo(()=>a()[e])}function o(a,e,r){const u=i(a,e),[d,h]=t.createSignal(u(),{equals:!1});return t.createEffect(()=>{const C=u(),f=()=>{h(s=>s)};r.forEach(s=>C.on(s,f)),t.onCleanup(()=>{r.forEach(s=>C.off(s,f))})}),d}function S(){const{initResult:a}=m(),e=t.createMemo(()=>{const r=a();if(r===null)throw new Error("Unable to use SDK as it is not ready.");return r});return{backButton:o(e,"backButton",["isVisibleChanged"]),closingBehavior:o(e,"closingBehavior",["isConfirmationNeededChanged"]),cloudStorage:i(e,"cloudStorage"),haptic:i(e,"haptic"),initData:i(e,"initData"),initDataRaw:i(e,"initDataRaw"),mainButton:o(e,"mainButton",["backgroundColorChanged","isVisibleChanged","isProgressVisibleChanged","isEnabledChanged","textChanged","textColorChanged"]),popup:o(e,"popup",["isOpenedChanged"]),postEvent:i(e,"postEvent"),qrScanner:o(e,"qrScanner",["isOpenedChanged"]),themeParams:o(e,"themeParams",["changed"]),viewport:o(e,"viewport",["heightChanged","isExpandedChanged","stableHeightChanged","widthChanged"]),webApp:o(e,"webApp",["backgroundColorChanged","headerColorChanged"])}}Object.defineProperty(n,"classNames",{enumerable:!0,get:()=>l.classNames}),Object.defineProperty(n,"mergeClassNames",{enumerable:!0,get:()=>l.mergeClassNames}),n.SDKContext=c,n.SDKProvider=p,n.useSDK=S,n.useSDKContext=m,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
2
+ //# sourceMappingURL=index.umd.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/context.ts","../src/hooks.ts","../src/SDKProvider.tsx","../src/useInitResultValue.ts","../src/useDynamicInitResultValue.ts","../src/useSDK.ts"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>(undefined, { name: 'SDKContext' });\n","import { useContext } from 'solid-js';\n\nimport { SDKContext } from './context.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Uses SDKContext context.\n */\nexport function useSDKContext(): SDKContextType {\n const context = useContext(SDKContext);\n\n if (context === undefined) {\n throw new Error('useSDKContext hook was used outside of SDKProvider.');\n }\n return context;\n}\n","import { createMemo, createResource, ParentProps } from 'solid-js';\nimport { init } from '@tma.js/sdk';\n\nimport { SDKContext } from './context.js';\nimport type { SDKInitOptions } from './types.js';\n\nexport type SDKProviderProps = ParentProps<{ initOptions?: SDKInitOptions }>;\n\nexport function SDKProvider(props: SDKProviderProps) {\n const initOptions = createMemo(() => props.initOptions || {});\n const [data] = createResource(initOptions, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : null;\n });\n const loading = createMemo(() => data.loading);\n const error = createMemo(() => data.error === undefined ? null : data.error);\n\n return (\n <SDKContext.Provider value={{ initResult, loading, error }}>\n {props.children}\n </SDKContext.Provider>\n );\n}\n","import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { Accessor, createMemo } from 'solid-js';\n\n/**\n * Extracts value from the SDK init result by key.\n * @param result - init result accessor.\n * @param key - key to extract.\n */\nexport function useInitResultValue<K extends SDKInitResultKey>(\n result: Accessor<SDKInitResult>,\n key: K\n): Accessor<SDKInitResultValue<K>> {\n return createMemo(() => result()[key]);\n}","import { Accessor, createEffect, createSignal, onCleanup } from 'solid-js';\nimport { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { useInitResultValue } from './useInitResultValue.js';\n\ninterface Trackable {\n on: (event: any, ...args: any[]) => void;\n off: (event: any, ...args: any[]) => void;\n}\n\ntype EventName<T extends Trackable> = T extends {\n on(event: infer E, ...args: any[]): any\n} ? E : never;\n\ntype DynamicComponentKey = {\n [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable ? K : never;\n}[SDKInitResultKey];\n\n/**\n * Extracts value from the SDK init result by specified key and listens to its all specified\n * events, making the returned value to update.\n * @param initResult - SDK init result.\n * @param key - SDK init result key.\n * @param events - tracked events list.\n */\nexport function useDynamicInitResultValue<K extends DynamicComponentKey>(\n initResult: Accessor<SDKInitResult>,\n key: K,\n events: EventName<SDKInitResultValue<K>>[],\n): Accessor<SDKInitResultValue<K>> {\n // Get original value from init result.\n const initResultValue = useInitResultValue(initResult, key);\n\n // Here we store value, which should always update it in case, some of its props\n // were changed/\n const [value, setValue] = createSignal(initResultValue(), { equals: false });\n\n createEffect(() => {\n const value = initResultValue();\n const listener = () => {\n // We use prev => prev on purpose. This will make Solid sure, something inside\n // dynamic value changed.\n setValue(prev => prev);\n };\n\n events.forEach(event => value.on(event, listener));\n onCleanup(() => {\n events.forEach(event => value.off(event, listener));\n });\n });\n\n return value;\n}","import { createMemo, type Accessor } from 'solid-js';\n\nimport { useSDKContext } from './hooks.js';\nimport { useInitResultValue } from './useInitResultValue.js';\nimport { useDynamicInitResultValue } from './useDynamicInitResultValue.js';\nimport type { SDKInitResultKey, SDKInitResultValue } from './types.js';\n\nexport type SDK = {\n [K in SDKInitResultKey]: Accessor<SDKInitResultValue<K>>\n};\n\n/**\n * Returns ready to use SDK components.\n */\nexport function useSDK(): SDK {\n const { initResult } = useSDKContext();\n\n const sdk = createMemo(() => {\n const result = initResult();\n\n if (result === null) {\n throw new Error('Unable to use SDK as it is not ready.');\n }\n return result;\n });\n\n return {\n backButton: useDynamicInitResultValue(sdk, 'backButton', ['isVisibleChanged']),\n closingBehavior: useDynamicInitResultValue(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),\n cloudStorage: useInitResultValue(sdk, 'cloudStorage'),\n haptic: useInitResultValue(sdk, 'haptic'),\n initData: useInitResultValue(sdk, 'initData'),\n initDataRaw: useInitResultValue(sdk, 'initDataRaw'),\n mainButton: useDynamicInitResultValue(sdk, 'mainButton', [\n 'backgroundColorChanged',\n 'isVisibleChanged',\n 'isProgressVisibleChanged',\n 'isEnabledChanged',\n 'textChanged',\n 'textColorChanged',\n ]),\n popup: useDynamicInitResultValue(sdk, 'popup', ['isOpenedChanged']),\n postEvent: useInitResultValue(sdk, 'postEvent'),\n qrScanner: useDynamicInitResultValue(sdk, 'qrScanner', ['isOpenedChanged']),\n themeParams: useDynamicInitResultValue(sdk, 'themeParams', ['changed']),\n viewport: useDynamicInitResultValue(sdk, 'viewport', [\n 'heightChanged',\n 'isExpandedChanged',\n 'stableHeightChanged',\n 'widthChanged',\n ]),\n webApp: useDynamicInitResultValue(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),\n };\n}"],"names":["SDKContext","createContext","useSDKContext","context","useContext","SDKProvider","props","initOptions","createMemo","data","createResource","init","initResult","state","loading","error","undefined","_$createComponent","Provider","value","children","useInitResultValue","result","key","useDynamicInitResultValue","events","initResultValue","setValue","createSignal","createEffect","listener","prev","event","onCleanup","useSDK","sdk"],"mappings":"obAIa,MAAAA,EAAaC,EAAAA,cAA8B,OAAW,CAAE,KAAM,YAAc,CAAA,ECIlF,SAASC,GAAgC,CACxC,MAAAC,EAAUC,aAAWJ,CAAU,EAErC,GAAIG,IAAY,OACR,MAAA,IAAI,MAAM,qDAAqD,EAEhE,OAAAA,CACT,CCPO,SAASE,EAAYC,EAAyB,CACnD,MAAMC,EAAcC,EAAAA,WAAW,IAAMF,EAAMC,aAAe,CAAE,CAAA,EACtD,CAACE,CAAI,EAAIC,EAAc,eAACH,EAAaI,EAAI,IAAA,EAEzCC,EAAaJ,EAAAA,WAAW,IACrBC,EAAKI,QAAU,QAAUJ,EAAI,EAAK,IAC1C,EACKK,EAAUN,EAAU,WAAC,IAAMC,EAAKK,OAAO,EACvCC,EAAQP,aAAW,IAAMC,EAAKM,QAAUC,OAAY,KAAOP,EAAKM,KAAK,EAE3E,OAAAE,EAAA,gBACGjB,EAAWkB,SAAQ,CAACC,MAAO,CAAEP,WAAAA,EAAYE,QAAAA,EAASC,MAAAA,CAAO,EAAA,IAAAK,UAAA,CAAA,OACvDd,EAAMc,QAAQ,CAAA,CAAA,CAGrB,CCfgB,SAAAC,EACdC,EACAC,EACiC,CACjC,OAAOf,EAAW,WAAA,IAAMc,IAASC,CAAG,CAAC,CACvC,CCWgB,SAAAC,EACdZ,EACAW,EACAE,EACiC,CAE3B,MAAAC,EAAkBL,EAAmBT,EAAYW,CAAG,EAIpD,CAACJ,EAAOQ,CAAQ,EAAIC,EAAA,aAAaF,IAAmB,CAAE,OAAQ,EAAA,CAAO,EAE3EG,OAAAA,EAAAA,aAAa,IAAM,CACjB,MAAMV,EAAQO,IACRI,EAAW,IAAM,CAGrBH,KAAiBI,CAAI,CAAA,EAGvBN,EAAO,QAAiBN,GAAAA,EAAM,GAAGa,EAAOF,CAAQ,CAAC,EACjDG,EAAAA,UAAU,IAAM,CACdR,EAAO,QAAiBN,GAAAA,EAAM,IAAIa,EAAOF,CAAQ,CAAC,CAAA,CACnD,CAAA,CACF,EAEMX,CACT,CCrCO,SAASe,GAAc,CACtB,KAAA,CAAE,WAAAtB,GAAeV,IAEjBiC,EAAM3B,EAAAA,WAAW,IAAM,CAC3B,MAAMc,EAASV,IAEf,GAAIU,IAAW,KACP,MAAA,IAAI,MAAM,uCAAuC,EAElD,OAAAA,CAAA,CACR,EAEM,MAAA,CACL,WAAYE,EAA0BW,EAAK,aAAc,CAAC,kBAAkB,CAAC,EAC7E,gBAAiBX,EAA0BW,EAAK,kBAAmB,CAAC,6BAA6B,CAAC,EAClG,aAAcd,EAAmBc,EAAK,cAAc,EACpD,OAAQd,EAAmBc,EAAK,QAAQ,EACxC,SAAUd,EAAmBc,EAAK,UAAU,EAC5C,YAAad,EAAmBc,EAAK,aAAa,EAClD,WAAYX,EAA0BW,EAAK,aAAc,CACvD,yBACA,mBACA,2BACA,mBACA,cACA,kBAAA,CACD,EACD,MAAOX,EAA0BW,EAAK,QAAS,CAAC,iBAAiB,CAAC,EAClE,UAAWd,EAAmBc,EAAK,WAAW,EAC9C,UAAWX,EAA0BW,EAAK,YAAa,CAAC,iBAAiB,CAAC,EAC1E,YAAaX,EAA0BW,EAAK,cAAe,CAAC,SAAS,CAAC,EACtE,SAAUX,EAA0BW,EAAK,WAAY,CACnD,gBACA,oBACA,sBACA,cAAA,CACD,EACD,OAAQX,EAA0BW,EAAK,SAAU,CAAC,yBAA0B,oBAAoB,CAAC,CAAA,CAErG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tma.js/sdk-solid",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Solid JS bindings for Web Apps client SDK.",
5
5
  "author": "Vladislav Kibenko <wolfram.deus@gmail.com>",
6
6
  "homepage": "https://github.com/Telegram-Mini-Apps/tma.js#readme",
@@ -25,44 +25,35 @@
25
25
  "dist",
26
26
  "src"
27
27
  ],
28
- "source": "src/index.ts",
29
- "main": "dist/cjs/index.js",
30
- "module": "dist/esm/index.js",
31
- "types": "dist/types/index.d.ts",
28
+ "main": "./dist/index.umd.cjs",
29
+ "browser": "./dist/index.umd.cjs",
30
+ "module": "./dist/index.js",
31
+ "types": "./dist/dts/index.d.ts",
32
32
  "exports": {
33
33
  ".": {
34
- "types": "./dist/types/index.d.ts",
35
- "solid": "./dist/source/index.js",
36
- "import": "./dist/esm/index.js",
37
- "require": "./dist/cjs/index.js",
38
- "node": "./dist/cjs/index.js",
39
- "default": "./dist/cjs/index.js"
40
- },
41
- "./*": {
42
- "types": "./dist/types/*.d.ts",
43
- "solid": "./dist/source/*.js",
44
- "import": "./dist/esm/*.js",
45
- "require": "./dist/cjs/*.js",
46
- "node": "./dist/cjs/*.js",
47
- "default": "./dist/cjs/*.js"
34
+ "types": "./dist/dts/index.d.ts",
35
+ "import": "./dist/index.js",
36
+ "require": "./dist/index.umd.cjs",
37
+ "default": "./dist/index.umd.cjs"
48
38
  }
49
39
  },
50
40
  "dependencies": {
51
- "@tma.js/utils": "0.5.2",
52
- "@tma.js/sdk": "0.11.3"
41
+ "@tma.js/utils": "0.5.3",
42
+ "@tma.js/sdk": "0.11.5"
53
43
  },
54
44
  "peerDependencies": {
55
45
  "solid-js": "^1.0.0"
56
46
  },
57
47
  "devDependencies": {
58
48
  "eslint-config-custom": "0.1.0",
59
- "tsconfig": "0.0.2"
49
+ "tsconfig": "0.0.2",
50
+ "build-utils": "0.0.0"
60
51
  },
61
52
  "publishConfig": {
62
53
  "access": "public"
63
54
  },
64
55
  "scripts": {
65
56
  "lint": "eslint -c .eslintrc.cjs src/**/*",
66
- "build": "rimraf dist && rollup --config rollup.config.js"
57
+ "build": "vite build"
67
58
  }
68
59
  }
@@ -0,0 +1,52 @@
1
+ import { Accessor, createEffect, createSignal, onCleanup } from 'solid-js';
2
+ import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';
3
+ import { useInitResultValue } from './useInitResultValue.js';
4
+
5
+ interface Trackable {
6
+ on: (event: any, ...args: any[]) => void;
7
+ off: (event: any, ...args: any[]) => void;
8
+ }
9
+
10
+ type EventName<T extends Trackable> = T extends {
11
+ on(event: infer E, ...args: any[]): any
12
+ } ? E : never;
13
+
14
+ type DynamicComponentKey = {
15
+ [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable ? K : never;
16
+ }[SDKInitResultKey];
17
+
18
+ /**
19
+ * Extracts value from the SDK init result by specified key and listens to its all specified
20
+ * events, making the returned value to update.
21
+ * @param initResult - SDK init result.
22
+ * @param key - SDK init result key.
23
+ * @param events - tracked events list.
24
+ */
25
+ export function useDynamicInitResultValue<K extends DynamicComponentKey>(
26
+ initResult: Accessor<SDKInitResult>,
27
+ key: K,
28
+ events: EventName<SDKInitResultValue<K>>[],
29
+ ): Accessor<SDKInitResultValue<K>> {
30
+ // Get original value from init result.
31
+ const initResultValue = useInitResultValue(initResult, key);
32
+
33
+ // Here we store value, which should always update it in case, some of its props
34
+ // were changed/
35
+ const [value, setValue] = createSignal(initResultValue(), { equals: false });
36
+
37
+ createEffect(() => {
38
+ const value = initResultValue();
39
+ const listener = () => {
40
+ // We use prev => prev on purpose. This will make Solid sure, something inside
41
+ // dynamic value changed.
42
+ setValue(prev => prev);
43
+ };
44
+
45
+ events.forEach(event => value.on(event, listener));
46
+ onCleanup(() => {
47
+ events.forEach(event => value.off(event, listener));
48
+ });
49
+ });
50
+
51
+ return value;
52
+ }
@@ -0,0 +1,14 @@
1
+ import { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';
2
+ import { Accessor, createMemo } from 'solid-js';
3
+
4
+ /**
5
+ * Extracts value from the SDK init result by key.
6
+ * @param result - init result accessor.
7
+ * @param key - key to extract.
8
+ */
9
+ export function useInitResultValue<K extends SDKInitResultKey>(
10
+ result: Accessor<SDKInitResult>,
11
+ key: K
12
+ ): Accessor<SDKInitResultValue<K>> {
13
+ return createMemo(() => result()[key]);
14
+ }
package/src/useSDK.ts CHANGED
@@ -1,57 +1,14 @@
1
- import { type Accessor, createEffect, createMemo, createSignal, onCleanup } from 'solid-js';
1
+ import { createMemo, type Accessor } from 'solid-js';
2
2
 
3
- import type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';
4
3
  import { useSDKContext } from './hooks.js';
5
-
6
- interface Trackable {
7
- on: (event: any, ...args: any[]) => void;
8
- off: (event: any, ...args: any[]) => void;
9
- }
10
-
11
- type EventName<T extends Trackable> = T extends {
12
- on(event: infer E, ...args: any[]): any
13
- } ? E : never;
14
-
15
- type DynamicComponentKey = {
16
- [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable
17
- ? K
18
- : never;
19
- }[SDKInitResultKey];
4
+ import { useInitResultValue } from './useInitResultValue.js';
5
+ import { useDynamicInitResultValue } from './useDynamicInitResultValue.js';
6
+ import type { SDKInitResultKey, SDKInitResultValue } from './types.js';
20
7
 
21
8
  export type SDK = {
22
9
  [K in SDKInitResultKey]: Accessor<SDKInitResultValue<K>>
23
10
  };
24
11
 
25
- function useDynamicComponent<K extends DynamicComponentKey>(
26
- initResult: Accessor<SDKInitResult>,
27
- key: K,
28
- events: EventName<SDKInitResultValue<K>>[],
29
- ): Accessor<SDKInitResultValue<K>> {
30
- const [component, setComponent] = createSignal(initResult()[key], { equals: false });
31
-
32
- createEffect(() => {
33
- const obj = component();
34
-
35
- events.forEach(event => {
36
- (obj as any).on(event, () => setComponent(() => obj));
37
- });
38
-
39
- onCleanup(() => {
40
- events.forEach(event => {
41
- (obj as any).off(event, () => setComponent(() => obj));
42
- });
43
- });
44
- });
45
-
46
- return component;
47
- }
48
-
49
- function useInitResultValue<K extends SDKInitResultKey>(initResult: Accessor<SDKInitResult>, key: K) {
50
- const value = createMemo<SDKInitResultValue<K>>(() => initResult()[key]);
51
-
52
- return value;
53
- }
54
-
55
12
  /**
56
13
  * Returns ready to use SDK components.
57
14
  */
@@ -68,13 +25,13 @@ export function useSDK(): SDK {
68
25
  });
69
26
 
70
27
  return {
71
- backButton: useDynamicComponent(sdk, 'backButton', ['isVisibleChanged']),
72
- closingBehavior: useDynamicComponent(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),
28
+ backButton: useDynamicInitResultValue(sdk, 'backButton', ['isVisibleChanged']),
29
+ closingBehavior: useDynamicInitResultValue(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),
73
30
  cloudStorage: useInitResultValue(sdk, 'cloudStorage'),
74
31
  haptic: useInitResultValue(sdk, 'haptic'),
75
32
  initData: useInitResultValue(sdk, 'initData'),
76
33
  initDataRaw: useInitResultValue(sdk, 'initDataRaw'),
77
- mainButton: useDynamicComponent(sdk, 'mainButton', [
34
+ mainButton: useDynamicInitResultValue(sdk, 'mainButton', [
78
35
  'backgroundColorChanged',
79
36
  'isVisibleChanged',
80
37
  'isProgressVisibleChanged',
@@ -82,16 +39,16 @@ export function useSDK(): SDK {
82
39
  'textChanged',
83
40
  'textColorChanged',
84
41
  ]),
85
- popup: useDynamicComponent(sdk, 'popup', ['isOpenedChanged']),
42
+ popup: useDynamicInitResultValue(sdk, 'popup', ['isOpenedChanged']),
86
43
  postEvent: useInitResultValue(sdk, 'postEvent'),
87
- qrScanner: useDynamicComponent(sdk, 'qrScanner', ['isOpenedChanged']),
88
- themeParams: useDynamicComponent(sdk, 'themeParams', ['changed']),
89
- viewport: useDynamicComponent(sdk, 'viewport', [
44
+ qrScanner: useDynamicInitResultValue(sdk, 'qrScanner', ['isOpenedChanged']),
45
+ themeParams: useDynamicInitResultValue(sdk, 'themeParams', ['changed']),
46
+ viewport: useDynamicInitResultValue(sdk, 'viewport', [
90
47
  'heightChanged',
91
48
  'isExpandedChanged',
92
49
  'stableHeightChanged',
93
50
  'widthChanged',
94
51
  ]),
95
- webApp: useDynamicComponent(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),
52
+ webApp: useDynamicInitResultValue(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),
96
53
  };
97
54
  }
package/dist/cjs/index.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("solid-js"),t=require("solid-js/web"),n=require("@tma.js/sdk"),r=require("@tma.js/utils");const o=e.createContext(void 0,{name:"SDKContext"});function a(){const t=e.useContext(o);if(void 0===t)throw new Error("useSDKContext hook was used outside of SDKProvider.");return t}function i(t,n,r){const[o,a]=e.createSignal(t()[n],{equals:!1});return e.createEffect((()=>{const t=o();r.forEach((e=>{t.on(e,(()=>a((()=>t))))})),e.onCleanup((()=>{r.forEach((e=>{t.off(e,(()=>a((()=>t))))}))}))})),o}function s(t,n){return e.createMemo((()=>t()[n]))}Object.defineProperty(exports,"classNames",{enumerable:!0,get:function(){return r.classNames}}),Object.defineProperty(exports,"mergeClassNames",{enumerable:!0,get:function(){return r.mergeClassNames}}),exports.SDKContext=o,exports.SDKProvider=function(r){const a=e.createMemo((()=>r.initOptions||{})),[i]=e.createResource(a,n.init),s=e.createMemo((()=>"ready"===i.state?i():null)),u=e.createMemo((()=>i.loading)),c=e.createMemo((()=>void 0===i.error?null:i.error));return t.createComponent(o.Provider,{value:{initResult:s,loading:u,error:c},get children(){return r.children}})},exports.useSDK=function(){const{initResult:t}=a(),n=e.createMemo((()=>{const e=t();if(null===e)throw new Error("Unable to use SDK as it is not ready.");return e}));return{backButton:i(n,"backButton",["isVisibleChanged"]),closingBehavior:i(n,"closingBehavior",["isConfirmationNeededChanged"]),cloudStorage:s(n,"cloudStorage"),haptic:s(n,"haptic"),initData:s(n,"initData"),initDataRaw:s(n,"initDataRaw"),mainButton:i(n,"mainButton",["backgroundColorChanged","isVisibleChanged","isProgressVisibleChanged","isEnabledChanged","textChanged","textColorChanged"]),popup:i(n,"popup",["isOpenedChanged"]),postEvent:s(n,"postEvent"),qrScanner:i(n,"qrScanner",["isOpenedChanged"]),themeParams:i(n,"themeParams",["changed"]),viewport:i(n,"viewport",["heightChanged","isExpandedChanged","stableHeightChanged","widthChanged"]),webApp:i(n,"webApp",["backgroundColorChanged","headerColorChanged"])}},exports.useSDKContext=a;
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/context.ts","../../src/hooks.ts","../../src/useSDK.ts","../../src/SDKProvider.tsx"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>(undefined, { name: 'SDKContext' });\n","import { useContext } from 'solid-js';\n\nimport { SDKContext } from './context.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Uses SDKContext context.\n */\nexport function useSDKContext(): SDKContextType {\n const context = useContext(SDKContext);\n\n if (context === undefined) {\n throw new Error('useSDKContext hook was used outside of SDKProvider.');\n }\n return context;\n}\n","import { type Accessor, createEffect, createMemo, createSignal, onCleanup } from 'solid-js';\n\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { useSDKContext } from './hooks.js';\n\ninterface Trackable {\n on: (event: any, ...args: any[]) => void;\n off: (event: any, ...args: any[]) => void;\n}\n\ntype EventName<T extends Trackable> = T extends {\n on(event: infer E, ...args: any[]): any\n} ? E : never;\n\ntype DynamicComponentKey = {\n [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable\n ? K\n : never;\n}[SDKInitResultKey];\n\nexport type SDK = {\n [K in SDKInitResultKey]: Accessor<SDKInitResultValue<K>>\n};\n\nfunction useDynamicComponent<K extends DynamicComponentKey>(\n initResult: Accessor<SDKInitResult>,\n key: K,\n events: EventName<SDKInitResultValue<K>>[],\n): Accessor<SDKInitResultValue<K>> {\n const [component, setComponent] = createSignal(initResult()[key], { equals: false });\n\n createEffect(() => {\n const obj = component();\n\n events.forEach(event => {\n (obj as any).on(event, () => setComponent(() => obj));\n });\n\n onCleanup(() => {\n events.forEach(event => {\n (obj as any).off(event, () => setComponent(() => obj));\n });\n });\n });\n\n return component;\n}\n\nfunction useInitResultValue<K extends SDKInitResultKey>(initResult: Accessor<SDKInitResult>, key: K) {\n const value = createMemo<SDKInitResultValue<K>>(() => initResult()[key]);\n\n return value;\n}\n\n/**\n * Returns ready to use SDK components.\n */\nexport function useSDK(): SDK {\n const { initResult } = useSDKContext();\n\n const sdk = createMemo(() => {\n const result = initResult();\n\n if (result === null) {\n throw new Error('Unable to use SDK as it is not ready.');\n }\n return result;\n });\n\n return {\n backButton: useDynamicComponent(sdk, 'backButton', ['isVisibleChanged']),\n closingBehavior: useDynamicComponent(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),\n cloudStorage: useInitResultValue(sdk, 'cloudStorage'),\n haptic: useInitResultValue(sdk, 'haptic'),\n initData: useInitResultValue(sdk, 'initData'),\n initDataRaw: useInitResultValue(sdk, 'initDataRaw'),\n mainButton: useDynamicComponent(sdk, 'mainButton', [\n 'backgroundColorChanged',\n 'isVisibleChanged',\n 'isProgressVisibleChanged',\n 'isEnabledChanged',\n 'textChanged',\n 'textColorChanged',\n ]),\n popup: useDynamicComponent(sdk, 'popup', ['isOpenedChanged']),\n postEvent: useInitResultValue(sdk, 'postEvent'),\n qrScanner: useDynamicComponent(sdk, 'qrScanner', ['isOpenedChanged']),\n themeParams: useDynamicComponent(sdk, 'themeParams', ['changed']),\n viewport: useDynamicComponent(sdk, 'viewport', [\n 'heightChanged',\n 'isExpandedChanged',\n 'stableHeightChanged',\n 'widthChanged',\n ]),\n webApp: useDynamicComponent(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),\n };\n}","import { createMemo, createResource, ParentProps } from 'solid-js';\nimport { init } from '@tma.js/sdk';\n\nimport { SDKContext } from './context.js';\nimport type { SDKInitOptions } from './types.js';\n\nexport type SDKProviderProps = ParentProps<{ initOptions?: SDKInitOptions }>;\n\nexport function SDKProvider(props: SDKProviderProps) {\n const initOptions = createMemo(() => props.initOptions || {});\n const [data] = createResource(initOptions, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : null;\n });\n const loading = createMemo(() => data.loading);\n const error = createMemo(() => data.error === undefined ? null : data.error);\n\n return (\n <SDKContext.Provider value={{ initResult, loading, error }}>\n {props.children}\n </SDKContext.Provider>\n );\n}\n"],"names":["SDKContext","createContext","undefined","name","useSDKContext","context","useContext","Error","useDynamicComponent","initResult","key","events","component","setComponent","createSignal","equals","createEffect","obj","forEach","event","on","onCleanup","off","useInitResultValue","createMemo","props","initOptions","data","createResource","init","state","loading","error","_$createComponent","createComponent","Provider","value","children","sdk","result","backButton","closingBehavior","cloudStorage","haptic","initData","initDataRaw","mainButton","popup","postEvent","qrScanner","themeParams","viewport","webApp"],"mappings":"2HAIaA,EAAaC,EAAaA,mBAAiBC,EAAW,CAAEC,KAAM,eCIpE,SAASC,IACd,MAAMC,EAAUC,aAAWN,GAE3B,QAAgBE,IAAZG,EACF,MAAM,IAAIE,MAAM,uDAElB,OAAOF,CACT,CCSA,SAASG,EACPC,EACAC,EACAC,GAEA,MAAOC,EAAWC,GAAgBC,EAAYA,aAACL,IAAaC,GAAM,CAAEK,QAAQ,IAgB5E,OAdAC,EAAAA,cAAa,KACX,MAAMC,EAAML,IAEZD,EAAOO,SAAQC,IACZF,EAAYG,GAAGD,GAAO,IAAMN,GAAa,IAAMI,KAAK,IAGvDI,EAAAA,WAAU,KACRV,EAAOO,SAAQC,IACZF,EAAYK,IAAIH,GAAO,IAAMN,GAAa,IAAMI,KAAK,GACtD,GACF,IAGGL,CACT,CAEA,SAASW,EAA+Cd,EAAqCC,GAG3F,OAFcc,EAAAA,YAAkC,IAAMf,IAAaC,IAGrE,oPC5CO,SAAqBe,GAC1B,MAAMC,EAAcF,EAAAA,YAAW,IAAMC,EAAMC,aAAe,CAAE,KACrDC,GAAQC,EAAcA,eAACF,EAAaG,EAAIA,MAEzCpB,EAAae,EAAAA,YAAW,IACN,UAAfG,EAAKG,MAAoBH,IAAS,OAErCI,EAAUP,EAAUA,YAAC,IAAMG,EAAKI,UAChCC,EAAQR,cAAW,SAAqBtB,IAAfyB,EAAKK,MAAsB,KAAOL,EAAKK,QAEtE,OAAAC,EAAAC,gBACGlC,EAAWmC,SAAQ,CAACC,MAAO,CAAE3B,aAAYsB,UAASC,SAAOK,eAAA,OACvDZ,EAAMY,QAAQ,GAGrB,iBDkCO,WACL,MAAM5B,WAAEA,GAAeL,IAEjBkC,EAAMd,EAAAA,YAAW,KACrB,MAAMe,EAAS9B,IAEf,GAAe,OAAX8B,EACF,MAAM,IAAIhC,MAAM,yCAElB,OAAOgC,CAAM,IAGf,MAAO,CACLC,WAAYhC,EAAoB8B,EAAK,aAAc,CAAC,qBACpDG,gBAAiBjC,EAAoB8B,EAAK,kBAAmB,CAAC,gCAC9DI,aAAcnB,EAAmBe,EAAK,gBACtCK,OAAQpB,EAAmBe,EAAK,UAChCM,SAAUrB,EAAmBe,EAAK,YAClCO,YAAatB,EAAmBe,EAAK,eACrCQ,WAAYtC,EAAoB8B,EAAK,aAAc,CACjD,yBACA,mBACA,2BACA,mBACA,cACA,qBAEFS,MAAOvC,EAAoB8B,EAAK,QAAS,CAAC,oBAC1CU,UAAWzB,EAAmBe,EAAK,aACnCW,UAAWzC,EAAoB8B,EAAK,YAAa,CAAC,oBAClDY,YAAa1C,EAAoB8B,EAAK,cAAe,CAAC,YACtDa,SAAU3C,EAAoB8B,EAAK,WAAY,CAC7C,gBACA,oBACA,sBACA,iBAEFc,OAAQ5C,EAAoB8B,EAAK,SAAU,CAAC,yBAA0B,uBAE1E"}
package/dist/esm/index.js DELETED
@@ -1,2 +0,0 @@
1
- import{createContext as e,useContext as n,createMemo as t,createResource as o,createSignal as r,createEffect as a,onCleanup as i}from"solid-js";import{createComponent as s}from"solid-js/web";import{init as d}from"@tma.js/sdk";export{classNames,mergeClassNames}from"@tma.js/utils";const h=e(void 0,{name:"SDKContext"});function u(){const e=n(h);if(void 0===e)throw new Error("useSDKContext hook was used outside of SDKProvider.");return e}function l(e){const n=t((()=>e.initOptions||{})),[r]=o(n,d),a=t((()=>"ready"===r.state?r():null)),i=t((()=>r.loading)),u=t((()=>void 0===r.error?null:r.error));return s(h.Provider,{value:{initResult:a,loading:i,error:u},get children(){return e.children}})}function c(e,n,t){const[o,s]=r(e()[n],{equals:!1});return a((()=>{const e=o();t.forEach((n=>{e.on(n,(()=>s((()=>e))))})),i((()=>{t.forEach((n=>{e.off(n,(()=>s((()=>e))))}))}))})),o}function g(e,n){return t((()=>e()[n]))}function p(){const{initResult:e}=u(),n=t((()=>{const n=e();if(null===n)throw new Error("Unable to use SDK as it is not ready.");return n}));return{backButton:c(n,"backButton",["isVisibleChanged"]),closingBehavior:c(n,"closingBehavior",["isConfirmationNeededChanged"]),cloudStorage:g(n,"cloudStorage"),haptic:g(n,"haptic"),initData:g(n,"initData"),initDataRaw:g(n,"initDataRaw"),mainButton:c(n,"mainButton",["backgroundColorChanged","isVisibleChanged","isProgressVisibleChanged","isEnabledChanged","textChanged","textColorChanged"]),popup:c(n,"popup",["isOpenedChanged"]),postEvent:g(n,"postEvent"),qrScanner:c(n,"qrScanner",["isOpenedChanged"]),themeParams:c(n,"themeParams",["changed"]),viewport:c(n,"viewport",["heightChanged","isExpandedChanged","stableHeightChanged","widthChanged"]),webApp:c(n,"webApp",["backgroundColorChanged","headerColorChanged"])}}export{h as SDKContext,l as SDKProvider,p as useSDK,u as useSDKContext};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/context.ts","../../src/hooks.ts","../../src/SDKProvider.tsx","../../src/useSDK.ts"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>(undefined, { name: 'SDKContext' });\n","import { useContext } from 'solid-js';\n\nimport { SDKContext } from './context.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Uses SDKContext context.\n */\nexport function useSDKContext(): SDKContextType {\n const context = useContext(SDKContext);\n\n if (context === undefined) {\n throw new Error('useSDKContext hook was used outside of SDKProvider.');\n }\n return context;\n}\n","import { createMemo, createResource, ParentProps } from 'solid-js';\nimport { init } from '@tma.js/sdk';\n\nimport { SDKContext } from './context.js';\nimport type { SDKInitOptions } from './types.js';\n\nexport type SDKProviderProps = ParentProps<{ initOptions?: SDKInitOptions }>;\n\nexport function SDKProvider(props: SDKProviderProps) {\n const initOptions = createMemo(() => props.initOptions || {});\n const [data] = createResource(initOptions, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : null;\n });\n const loading = createMemo(() => data.loading);\n const error = createMemo(() => data.error === undefined ? null : data.error);\n\n return (\n <SDKContext.Provider value={{ initResult, loading, error }}>\n {props.children}\n </SDKContext.Provider>\n );\n}\n","import { type Accessor, createEffect, createMemo, createSignal, onCleanup } from 'solid-js';\n\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.js';\nimport { useSDKContext } from './hooks.js';\n\ninterface Trackable {\n on: (event: any, ...args: any[]) => void;\n off: (event: any, ...args: any[]) => void;\n}\n\ntype EventName<T extends Trackable> = T extends {\n on(event: infer E, ...args: any[]): any\n} ? E : never;\n\ntype DynamicComponentKey = {\n [K in SDKInitResultKey]: SDKInitResultValue<K> extends Trackable\n ? K\n : never;\n}[SDKInitResultKey];\n\nexport type SDK = {\n [K in SDKInitResultKey]: Accessor<SDKInitResultValue<K>>\n};\n\nfunction useDynamicComponent<K extends DynamicComponentKey>(\n initResult: Accessor<SDKInitResult>,\n key: K,\n events: EventName<SDKInitResultValue<K>>[],\n): Accessor<SDKInitResultValue<K>> {\n const [component, setComponent] = createSignal(initResult()[key], { equals: false });\n\n createEffect(() => {\n const obj = component();\n\n events.forEach(event => {\n (obj as any).on(event, () => setComponent(() => obj));\n });\n\n onCleanup(() => {\n events.forEach(event => {\n (obj as any).off(event, () => setComponent(() => obj));\n });\n });\n });\n\n return component;\n}\n\nfunction useInitResultValue<K extends SDKInitResultKey>(initResult: Accessor<SDKInitResult>, key: K) {\n const value = createMemo<SDKInitResultValue<K>>(() => initResult()[key]);\n\n return value;\n}\n\n/**\n * Returns ready to use SDK components.\n */\nexport function useSDK(): SDK {\n const { initResult } = useSDKContext();\n\n const sdk = createMemo(() => {\n const result = initResult();\n\n if (result === null) {\n throw new Error('Unable to use SDK as it is not ready.');\n }\n return result;\n });\n\n return {\n backButton: useDynamicComponent(sdk, 'backButton', ['isVisibleChanged']),\n closingBehavior: useDynamicComponent(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),\n cloudStorage: useInitResultValue(sdk, 'cloudStorage'),\n haptic: useInitResultValue(sdk, 'haptic'),\n initData: useInitResultValue(sdk, 'initData'),\n initDataRaw: useInitResultValue(sdk, 'initDataRaw'),\n mainButton: useDynamicComponent(sdk, 'mainButton', [\n 'backgroundColorChanged',\n 'isVisibleChanged',\n 'isProgressVisibleChanged',\n 'isEnabledChanged',\n 'textChanged',\n 'textColorChanged',\n ]),\n popup: useDynamicComponent(sdk, 'popup', ['isOpenedChanged']),\n postEvent: useInitResultValue(sdk, 'postEvent'),\n qrScanner: useDynamicComponent(sdk, 'qrScanner', ['isOpenedChanged']),\n themeParams: useDynamicComponent(sdk, 'themeParams', ['changed']),\n viewport: useDynamicComponent(sdk, 'viewport', [\n 'heightChanged',\n 'isExpandedChanged',\n 'stableHeightChanged',\n 'widthChanged',\n ]),\n webApp: useDynamicComponent(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),\n };\n}"],"names":["SDKContext","createContext","undefined","name","useSDKContext","context","useContext","Error","SDKProvider","props","initOptions","createMemo","data","createResource","init","initResult","state","loading","error","_$createComponent","Provider","value","children","useDynamicComponent","key","events","component","setComponent","createSignal","equals","createEffect","obj","forEach","event","on","onCleanup","off","useInitResultValue","useSDK","sdk","result","backButton","closingBehavior","cloudStorage","haptic","initData","initDataRaw","mainButton","popup","postEvent","qrScanner","themeParams","viewport","webApp"],"mappings":"8RAIaA,EAAaC,OAA8BC,EAAW,CAAEC,KAAM,eCIpE,SAASC,IACd,MAAMC,EAAUC,EAAWN,GAE3B,QAAgBE,IAAZG,EACF,MAAM,IAAIE,MAAM,uDAElB,OAAOF,CACT,CCPO,SAASG,EAAYC,GAC1B,MAAMC,EAAcC,GAAW,IAAMF,EAAMC,aAAe,CAAE,KACrDE,GAAQC,EAAeH,EAAaI,GAErCC,EAAaJ,GAAW,IACN,UAAfC,EAAKI,MAAoBJ,IAAS,OAErCK,EAAUN,GAAW,IAAMC,EAAKK,UAChCC,EAAQP,GAAW,SAAqBT,IAAfU,EAAKM,MAAsB,KAAON,EAAKM,QAEtE,OAAAC,EACGnB,EAAWoB,SAAQ,CAACC,MAAO,CAAEN,aAAYE,UAASC,SAAOI,eAAA,OACvDb,EAAMa,QAAQ,GAGrB,CCCA,SAASC,EACPR,EACAS,EACAC,GAEA,MAAOC,EAAWC,GAAgBC,EAAab,IAAaS,GAAM,CAAEK,QAAQ,IAgB5E,OAdAC,GAAa,KACX,MAAMC,EAAML,IAEZD,EAAOO,SAAQC,IACZF,EAAYG,GAAGD,GAAO,IAAMN,GAAa,IAAMI,KAAK,IAGvDI,GAAU,KACRV,EAAOO,SAAQC,IACZF,EAAYK,IAAIH,GAAO,IAAMN,GAAa,IAAMI,KAAK,GACtD,GACF,IAGGL,CACT,CAEA,SAASW,EAA+CtB,EAAqCS,GAG3F,OAFcb,GAAkC,IAAMI,IAAaS,IAGrE,CAKO,SAASc,IACd,MAAMvB,WAAEA,GAAeX,IAEjBmC,EAAM5B,GAAW,KACrB,MAAM6B,EAASzB,IAEf,GAAe,OAAXyB,EACF,MAAM,IAAIjC,MAAM,yCAElB,OAAOiC,CAAM,IAGf,MAAO,CACLC,WAAYlB,EAAoBgB,EAAK,aAAc,CAAC,qBACpDG,gBAAiBnB,EAAoBgB,EAAK,kBAAmB,CAAC,gCAC9DI,aAAcN,EAAmBE,EAAK,gBACtCK,OAAQP,EAAmBE,EAAK,UAChCM,SAAUR,EAAmBE,EAAK,YAClCO,YAAaT,EAAmBE,EAAK,eACrCQ,WAAYxB,EAAoBgB,EAAK,aAAc,CACjD,yBACA,mBACA,2BACA,mBACA,cACA,qBAEFS,MAAOzB,EAAoBgB,EAAK,QAAS,CAAC,oBAC1CU,UAAWZ,EAAmBE,EAAK,aACnCW,UAAW3B,EAAoBgB,EAAK,YAAa,CAAC,oBAClDY,YAAa5B,EAAoBgB,EAAK,cAAe,CAAC,YACtDa,SAAU7B,EAAoBgB,EAAK,WAAY,CAC7C,gBACA,oBACA,sBACA,iBAEFc,OAAQ9B,EAAoBgB,EAAK,SAAU,CAAC,yBAA0B,uBAE1E"}
@@ -1,15 +0,0 @@
1
- import { createMemo, createResource } from 'solid-js';
2
- import { init } from '@tma.js/sdk';
3
- import { SDKContext } from './context.js';
4
- export function SDKProvider(props) {
5
- const initOptions = createMemo(() => props.initOptions || {});
6
- const [data] = createResource(initOptions, init);
7
- const initResult = createMemo(() => {
8
- return data.state === 'ready' ? data() : null;
9
- });
10
- const loading = createMemo(() => data.loading);
11
- const error = createMemo(() => data.error === undefined ? null : data.error);
12
- return (<SDKContext.Provider value={{ initResult, loading, error }}>
13
- {props.children}
14
- </SDKContext.Provider>);
15
- }
@@ -1,2 +0,0 @@
1
- import { createContext } from 'solid-js';
2
- export const SDKContext = createContext(undefined, { name: 'SDKContext' });
@@ -1,12 +0,0 @@
1
- import { useContext } from 'solid-js';
2
- import { SDKContext } from './context.js';
3
- /**
4
- * Uses SDKContext context.
5
- */
6
- export function useSDKContext() {
7
- const context = useContext(SDKContext);
8
- if (context === undefined) {
9
- throw new Error('useSDKContext hook was used outside of SDKProvider.');
10
- }
11
- return context;
12
- }
@@ -1,6 +0,0 @@
1
- export * from './context.js';
2
- export * from './hooks.js';
3
- export * from './SDKProvider.jsx';
4
- export * from './types.js';
5
- export * from './useSDK.js';
6
- export { classNames, mergeClassNames } from '@tma.js/utils';
@@ -1 +0,0 @@
1
- export {};
@@ -1,61 +0,0 @@
1
- import { createEffect, createMemo, createSignal, onCleanup } from 'solid-js';
2
- import { useSDKContext } from './hooks.js';
3
- function useDynamicComponent(initResult, key, events) {
4
- const [component, setComponent] = createSignal(initResult()[key], { equals: false });
5
- createEffect(() => {
6
- const obj = component();
7
- events.forEach(event => {
8
- obj.on(event, () => setComponent(() => obj));
9
- });
10
- onCleanup(() => {
11
- events.forEach(event => {
12
- obj.off(event, () => setComponent(() => obj));
13
- });
14
- });
15
- });
16
- return component;
17
- }
18
- function useInitResultValue(initResult, key) {
19
- const value = createMemo(() => initResult()[key]);
20
- return value;
21
- }
22
- /**
23
- * Returns ready to use SDK components.
24
- */
25
- export function useSDK() {
26
- const { initResult } = useSDKContext();
27
- const sdk = createMemo(() => {
28
- const result = initResult();
29
- if (result === null) {
30
- throw new Error('Unable to use SDK as it is not ready.');
31
- }
32
- return result;
33
- });
34
- return {
35
- backButton: useDynamicComponent(sdk, 'backButton', ['isVisibleChanged']),
36
- closingBehavior: useDynamicComponent(sdk, 'closingBehavior', ['isConfirmationNeededChanged']),
37
- cloudStorage: useInitResultValue(sdk, 'cloudStorage'),
38
- haptic: useInitResultValue(sdk, 'haptic'),
39
- initData: useInitResultValue(sdk, 'initData'),
40
- initDataRaw: useInitResultValue(sdk, 'initDataRaw'),
41
- mainButton: useDynamicComponent(sdk, 'mainButton', [
42
- 'backgroundColorChanged',
43
- 'isVisibleChanged',
44
- 'isProgressVisibleChanged',
45
- 'isEnabledChanged',
46
- 'textChanged',
47
- 'textColorChanged',
48
- ]),
49
- popup: useDynamicComponent(sdk, 'popup', ['isOpenedChanged']),
50
- postEvent: useInitResultValue(sdk, 'postEvent'),
51
- qrScanner: useDynamicComponent(sdk, 'qrScanner', ['isOpenedChanged']),
52
- themeParams: useDynamicComponent(sdk, 'themeParams', ['changed']),
53
- viewport: useDynamicComponent(sdk, 'viewport', [
54
- 'heightChanged',
55
- 'isExpandedChanged',
56
- 'stableHeightChanged',
57
- 'widthChanged',
58
- ]),
59
- webApp: useDynamicComponent(sdk, 'webApp', ['backgroundColorChanged', 'headerColorChanged']),
60
- };
61
- }
@@ -1,2 +0,0 @@
1
- import type { SDKContextType } from './types.js';
2
- export declare const SDKContext: import("solid-js").Context<SDKContextType>;
File without changes
File without changes
File without changes
File without changes