@tma.js/sdk-solid 0.1.20 → 1.0.1

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.
Files changed (69) hide show
  1. package/dist/dts/createHook.d.ts +14 -0
  2. package/dist/dts/index.d.ts +3 -6
  3. package/dist/dts/{context.d.ts → provider/SDKContext.d.ts} +1 -1
  4. package/dist/dts/provider/SDKProvider.d.ts +2 -0
  5. package/dist/dts/provider/index.d.ts +6 -0
  6. package/dist/dts/provider/types.d.ts +22 -0
  7. package/dist/dts/provider/useInitResultDynamicValue.d.ts +3 -0
  8. package/dist/dts/provider/useInitResultValue.d.ts +8 -0
  9. package/dist/dts/{hooks.d.ts → provider/useSDKContext.d.ts} +1 -1
  10. package/dist/dts/tools/back-button.d.ts +4 -0
  11. package/dist/dts/tools/closing-behavior.d.ts +4 -0
  12. package/dist/dts/tools/cloud-storage.d.ts +4 -0
  13. package/dist/dts/tools/haptic-feedback.d.ts +4 -0
  14. package/dist/dts/tools/index.d.ts +16 -0
  15. package/dist/dts/tools/init-data-raw.d.ts +4 -0
  16. package/dist/dts/tools/init-data.d.ts +4 -0
  17. package/dist/dts/tools/invoice.d.ts +4 -0
  18. package/dist/dts/tools/launch-params.d.ts +5 -0
  19. package/dist/dts/tools/main-button.d.ts +4 -0
  20. package/dist/dts/tools/mini-app.d.ts +4 -0
  21. package/dist/dts/tools/popup.d.ts +4 -0
  22. package/dist/dts/tools/post-event.d.ts +4 -0
  23. package/dist/dts/tools/qr-scanner.d.ts +4 -0
  24. package/dist/dts/tools/theme-params.d.ts +4 -0
  25. package/dist/dts/tools/utils.d.ts +4 -0
  26. package/dist/dts/tools/viewport.d.ts +4 -0
  27. package/dist/dts/types.d.ts +22 -10
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.mjs +59 -67
  31. package/dist/index.mjs.map +1 -1
  32. package/package.json +5 -5
  33. package/src/createHook.ts +33 -0
  34. package/src/index.ts +28 -6
  35. package/src/provider/SDKContext.ts +9 -0
  36. package/src/provider/SDKProvider.tsx +21 -0
  37. package/src/provider/index.ts +6 -0
  38. package/src/provider/types.ts +26 -0
  39. package/src/provider/useInitResultDynamicValue.ts +34 -0
  40. package/src/provider/useInitResultValue.ts +23 -0
  41. package/src/provider/useSDKContext.ts +11 -0
  42. package/src/tools/back-button.ts +6 -0
  43. package/src/tools/closing-behavior.ts +6 -0
  44. package/src/tools/cloud-storage.ts +6 -0
  45. package/src/tools/haptic-feedback.ts +6 -0
  46. package/src/tools/index.ts +16 -0
  47. package/src/tools/init-data-raw.ts +6 -0
  48. package/src/tools/init-data.ts +6 -0
  49. package/src/tools/invoice.ts +6 -0
  50. package/src/tools/launch-params.tsx +8 -0
  51. package/src/tools/main-button.ts +6 -0
  52. package/src/tools/mini-app.ts +6 -0
  53. package/src/tools/popup.ts +6 -0
  54. package/src/tools/post-event.ts +6 -0
  55. package/src/tools/qr-scanner.ts +6 -0
  56. package/src/tools/theme-params.ts +6 -0
  57. package/src/tools/utils.ts +6 -0
  58. package/src/tools/viewport.ts +6 -0
  59. package/src/types.ts +29 -13
  60. package/dist/dts/SDKProvider.d.ts +0 -6
  61. package/dist/dts/useDynamicInitResultValue.d.ts +0 -21
  62. package/dist/dts/useInitResultValue.d.ts +0 -8
  63. package/dist/dts/useSDK.d.ts +0 -9
  64. package/src/SDKProvider.tsx +0 -24
  65. package/src/context.ts +0 -5
  66. package/src/hooks.ts +0 -16
  67. package/src/useDynamicInitResultValue.ts +0 -52
  68. package/src/useInitResultValue.ts +0 -14
  69. package/src/useSDK.ts +0 -54
@@ -0,0 +1,14 @@
1
+ import type { Accessor } from 'solid-js';
2
+ import type { DynamicInitResultKey, InitResultKey, InitResultValue, StaticInitResultKey } from './types.js';
3
+ export type Hook<K extends InitResultKey> = () => Accessor<InitResultValue<K>>;
4
+ /**
5
+ * Creates hook to retrieve static init result value.
6
+ * @param initResultKey - init result key.
7
+ */
8
+ export declare function createHook<K extends StaticInitResultKey>(initResultKey: K): Hook<K>;
9
+ /**
10
+ * Creates hook to retrieve dynamic init result value.
11
+ * @param initResultKey - init result key.
12
+ * @param dynamic - flag to let function know this init result value is dynamic.
13
+ */
14
+ export declare function createHook<K extends DynamicInitResultKey>(initResultKey: K, dynamic: true): Hook<K>;
@@ -1,6 +1,3 @@
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
+ export { useThemeParams, useInitData, useBackButton, useClosingBehavior, useInitDataRaw, useCloudStorage, useLaunchParams, useMainButton, useHapticFeedback, useInvoice, useMiniApp, usePopup, usePostEvent, useQRScanner, useUtils, useViewport, } from './tools/index.js';
2
+ export { useSDKContext, SDKProvider, type SDKProviderProps, type SDKContextType, } from './provider/index.js';
3
+ export type { InitOptions, InitResult, } from './types.js';
@@ -1,2 +1,2 @@
1
1
  import type { SDKContextType } from './types.js';
2
- export declare const SDKContext: import("solid-js").Context<SDKContextType | undefined>;
2
+ export declare const SDKContext: import("solid-js").Context<SDKContextType>;
@@ -0,0 +1,2 @@
1
+ import type { SDKProviderProps } from './types.js';
2
+ export declare function SDKProvider(props: SDKProviderProps): any;
@@ -0,0 +1,6 @@
1
+ export * from './SDKContext.js';
2
+ export * from './SDKProvider.js';
3
+ export * from './types.js';
4
+ export * from './useSDKContext.js';
5
+ export * from './useInitResultDynamicValue.js';
6
+ export * from './useInitResultValue.js';
@@ -0,0 +1,22 @@
1
+ import type { InitOptions, InitResult } from '@tma.js/sdk';
2
+ import type { Accessor, ParentProps } from 'solid-js';
3
+ export type SDKProviderProps = ParentProps<{
4
+ /**
5
+ * Init function options.
6
+ */
7
+ options?: InitOptions;
8
+ }>;
9
+ export interface SDKContextType {
10
+ /**
11
+ * Error occurred during initialization.
12
+ */
13
+ error: Accessor<unknown | undefined>;
14
+ /**
15
+ * Initialization result.
16
+ */
17
+ initResult: Accessor<InitResult | undefined>;
18
+ /**
19
+ * True if SDK is loading.
20
+ */
21
+ loading: Accessor<boolean>;
22
+ }
@@ -0,0 +1,3 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import type { DynamicInitResultKey, InitResultValue } from '../types.js';
3
+ export declare function useInitResultDynamicValue<K extends DynamicInitResultKey>(initResultKey: K): Accessor<InitResultValue<K>>;
@@ -0,0 +1,8 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import type { InitResultKey, InitResultValue } from '../types.js';
3
+ /**
4
+ * Returns value by its field name from SDK init result.
5
+ * @param key - init result key.
6
+ * @throws {Error} SDK is not initialized.
7
+ */
8
+ export declare function useInitResultValue<K extends InitResultKey>(key: K): Accessor<InitResultValue<K>>;
@@ -1,5 +1,5 @@
1
1
  import type { SDKContextType } from './types.js';
2
2
  /**
3
- * Uses SDKContext context.
3
+ * Returns current SDK information.
4
4
  */
5
5
  export declare function useSDKContext(): SDKContextType;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve BackButton component.
3
+ */
4
+ export declare const useBackButton: import("../createHook.js").Hook<"backButton">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve ClosingBehavior component.
3
+ */
4
+ export declare const useClosingBehavior: import("../createHook.js").Hook<"closingBehavior">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve CloudStorage component.
3
+ */
4
+ export declare const useCloudStorage: import("../createHook.js").Hook<"cloudStorage">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve HapticFeedback component.
3
+ */
4
+ export declare const useHapticFeedback: import("../createHook.js").Hook<"hapticFeedback">;
@@ -0,0 +1,16 @@
1
+ export * from './back-button.js';
2
+ export * from './closing-behavior.js';
3
+ export * from './cloud-storage.js';
4
+ export * from './haptic-feedback.js';
5
+ export * from './init-data.js';
6
+ export * from './init-data-raw.js';
7
+ export * from './invoice.js';
8
+ export * from './launch-params.js';
9
+ export * from './main-button.js';
10
+ export * from './mini-app.js';
11
+ export * from './popup.js';
12
+ export * from './post-event.js';
13
+ export * from './qr-scanner.js';
14
+ export * from './theme-params.js';
15
+ export * from './viewport.js';
16
+ export * from './utils.js';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve init data raw representation.
3
+ */
4
+ export declare const useInitDataRaw: import("../createHook.js").Hook<"initDataRaw">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve InitData component.
3
+ */
4
+ export declare const useInitData: import("../createHook.js").Hook<"initData">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve Invoice component.
3
+ */
4
+ export declare const useInvoice: import("../createHook.js").Hook<"invoice">;
@@ -0,0 +1,5 @@
1
+ import { type LaunchParams } from '@tma.js/sdk';
2
+ /**
3
+ * Hooks to retrieve launch parameters.
4
+ */
5
+ export declare function useLaunchParams(): LaunchParams;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve MainButton component.
3
+ */
4
+ export declare const useMainButton: import("../createHook.js").Hook<"mainButton">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve MiniApp component.
3
+ */
4
+ export declare const useMiniApp: import("../createHook.js").Hook<"miniApp">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve Popup component.
3
+ */
4
+ export declare const usePopup: import("../createHook.js").Hook<"popup">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve postEvent function.
3
+ */
4
+ export declare const usePostEvent: import("../createHook.js").Hook<"postEvent">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve QRScanner component.
3
+ */
4
+ export declare const useQRScanner: import("../createHook.js").Hook<"qrScanner">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve ThemeParams component.
3
+ */
4
+ export declare const useThemeParams: import("../createHook.js").Hook<"themeParams">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve Utils component.
3
+ */
4
+ export declare const useUtils: import("../createHook.js").Hook<"utils">;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Hook to retrieve Viewport component.
3
+ */
4
+ export declare const useViewport: import("../createHook.js").Hook<"viewport">;
@@ -1,11 +1,23 @@
1
- import type { InitResult, InitOptions } from '@tma.js/sdk';
2
- import type { Accessor } from 'solid-js';
3
- export type SDKInitOptions = InitOptions;
4
- export type SDKInitResult = InitResult;
5
- export type SDKInitResultKey = keyof SDKInitResult;
6
- export type SDKInitResultValue<K extends SDKInitResultKey> = SDKInitResult[K];
7
- export interface SDKContextType {
8
- initResult: Accessor<SDKInitResult | null>;
9
- loading: Accessor<boolean>;
10
- error: Accessor<unknown | null>;
1
+ import type { InitOptions, InitResult } from '@tma.js/sdk';
2
+ export { InitOptions, InitResult };
3
+ export interface Trackable {
4
+ on(event: 'change', listener: () => void): () => void;
11
5
  }
6
+ /**
7
+ * SDK init result keys, which describe values with trackable changes.
8
+ */
9
+ export type DynamicInitResultKey = {
10
+ [K in InitResultKey]-?: InitResultValue<K> extends Trackable ? K : never;
11
+ }[InitResultKey];
12
+ /**
13
+ * SDK init result keys, which describe static values.
14
+ */
15
+ export type StaticInitResultKey = Exclude<InitResultKey, DynamicInitResultKey>;
16
+ /**
17
+ * SDK initialization result key.
18
+ */
19
+ export type InitResultKey = keyof InitResult;
20
+ /**
21
+ * Returns SDK init result value type by its key.
22
+ */
23
+ export type InitResultValue<K extends InitResultKey> = InitResult[K];
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("solid-js"),m=require("@tma.js/sdk"),h=require("@tma.js/utils"),d=t.createContext(void 0,{name:"SDKContext"});function C(){const n=t.useContext(d);if(n===void 0)throw new Error("useSDKContext hook was used outside of SDKProvider.");return n}function p(n){const e=t.createMemo(()=>n.initOptions||{}),[o]=t.createResource(e,m.init),s=t.createMemo(()=>o.state==="ready"?o():null),u=t.createMemo(()=>o.loading),c=t.createMemo(()=>o.error===void 0?null:o.error);return t.createComponent(d.Provider,{value:{initResult:s,loading:u,error:c},get children(){return n.children}})}function a(n,e){return t.createMemo(()=>n()[e])}function r(n,e,o){const s=a(n,e),[u,c]=t.createSignal(s(),{equals:!1});return t.createEffect(()=>{const l=s(),g=()=>{c(i=>i)};o.forEach(i=>l.on(i,g)),t.onCleanup(()=>{o.forEach(i=>l.off(i,g))})}),u}function f(){const{initResult:n}=C(),e=t.createMemo(()=>{const o=n();if(o===null)throw new Error("Unable to use SDK as it is not ready.");return o});return{backButton:r(e,"backButton",["isVisibleChanged"]),closingBehavior:r(e,"closingBehavior",["isConfirmationNeededChanged"]),cloudStorage:a(e,"cloudStorage"),haptic:a(e,"haptic"),initData:a(e,"initData"),initDataRaw:a(e,"initDataRaw"),mainButton:r(e,"mainButton",["backgroundColorChanged","isVisibleChanged","isProgressVisibleChanged","isEnabledChanged","textChanged","textColorChanged"]),popup:r(e,"popup",["isOpenedChanged"]),postEvent:a(e,"postEvent"),qrScanner:r(e,"qrScanner",["isOpenedChanged"]),themeParams:r(e,"themeParams",["changed"]),viewport:r(e,"viewport",["heightChanged","isExpandedChanged","stableHeightChanged","widthChanged"]),webApp:r(e,"webApp",["backgroundColorChanged","headerColorChanged"])}}Object.defineProperty(exports,"classNames",{enumerable:!0,get:()=>h.classNames});Object.defineProperty(exports,"mergeClassNames",{enumerable:!0,get:()=>h.mergeClassNames});exports.SDKContext=d;exports.SDKProvider=p;exports.useSDK=f;exports.useSDKContext=C;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("solid-js"),a=require("@tma.js/sdk"),i=n.createContext({loading:()=>!1,error:()=>{},initResult:()=>{}},{name:"SDKContext"});function d(o){const[t]=n.createResource(()=>o.options,a.init),s=n.createMemo(()=>t.state==="ready"?t():void 0),u=n.createMemo(()=>t.loading),r=n.createMemo(()=>t.error===void 0?null:t.error);return n.createComponent(i.Provider,{value:{initResult:s,loading:u,error:r},get children(){return o.children}})}function c(){return n.useContext(i)}function l(o){const{initResult:t}=c();return n.createMemo(()=>{const s=t();if(!s)throw new Error(`Unable to get init result key "${o}" as long as SDK is not initialized`);return s[o]})}function p(o){const t=l(o),[s,u]=n.createSignal(t(),{equals:!1});return n.createEffect(()=>{n.onCleanup(t().on("change",()=>{u(r=>r)}))}),s}function e(o,t){return t?()=>p(o):()=>l(o)}const m=e("backButton",!0),g=e("closingBehavior",!0),v=e("cloudStorage"),S=e("hapticFeedback"),h=e("initData"),D=e("initDataRaw"),f=e("invoice",!0);function P(){return a.retrieveLaunchData().launchParams}const C=e("mainButton",!0),B=e("miniApp",!0),R=e("popup",!0),M=e("postEvent"),k=e("qrScanner",!0),w=e("themeParams",!0),I=e("viewport",!0),b=e("utils");exports.SDKProvider=d;exports.useBackButton=m;exports.useClosingBehavior=g;exports.useCloudStorage=v;exports.useHapticFeedback=S;exports.useInitData=h;exports.useInitDataRaw=D;exports.useInvoice=f;exports.useLaunchParams=P;exports.useMainButton=C;exports.useMiniApp=B;exports.usePopup=R;exports.usePostEvent=M;exports.useQRScanner=k;exports.useSDKContext=c;exports.useThemeParams=w;exports.useUtils=b;exports.useViewport=I;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.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, type 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 { createMemo, type Accessor } from 'solid-js';\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.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 { createEffect, createSignal, onCleanup, type Accessor } from 'solid-js';\nimport { useInitResultValue } from './useInitResultValue.js';\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.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":"gKAIaA,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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/provider/SDKContext.ts","../src/provider/SDKProvider.tsx","../src/provider/useSDKContext.ts","../src/provider/useInitResultValue.ts","../src/provider/useInitResultDynamicValue.ts","../src/createHook.ts","../src/tools/back-button.ts","../src/tools/closing-behavior.ts","../src/tools/cloud-storage.ts","../src/tools/haptic-feedback.ts","../src/tools/init-data.ts","../src/tools/init-data-raw.ts","../src/tools/invoice.ts","../src/tools/launch-params.tsx","../src/tools/main-button.ts","../src/tools/mini-app.ts","../src/tools/popup.ts","../src/tools/post-event.ts","../src/tools/qr-scanner.ts","../src/tools/theme-params.ts","../src/tools/viewport.ts","../src/tools/utils.ts"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>({\n loading: () => false,\n error: () => undefined,\n initResult: () => undefined,\n}, { name: 'SDKContext' });\n","import { init } from '@tma.js/sdk';\nimport { createMemo, createResource } from 'solid-js';\n\nimport { SDKContext } from './SDKContext.js';\nimport type { SDKProviderProps } from './types.js';\n\nexport function SDKProvider(props: SDKProviderProps) {\n const [data] = createResource(() => props.options, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : undefined;\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 { useContext } from 'solid-js';\n\nimport { SDKContext } from './SDKContext.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Returns current SDK information.\n */\nexport function useSDKContext(): SDKContextType {\n return useContext(SDKContext);\n}\n","import { type Accessor, createMemo } from 'solid-js';\n\nimport { useSDKContext } from './useSDKContext.js';\nimport type { InitResultKey, InitResultValue } from '../types.js';\n\n/**\n * Returns value by its field name from SDK init result.\n * @param key - init result key.\n * @throws {Error} SDK is not initialized.\n */\nexport function useInitResultValue<K extends InitResultKey>(key: K): Accessor<InitResultValue<K>> {\n const { initResult } = useSDKContext();\n\n // eslint-disable-next-line solid/reactivity\n return createMemo<InitResultValue<K>>(() => {\n const result = initResult();\n\n if (!result) {\n throw new Error(`Unable to get init result key \"${key}\" as long as SDK is not initialized`);\n }\n return result[key];\n });\n}\n","import {\n type Accessor,\n createEffect,\n createSignal,\n onCleanup,\n} from 'solid-js';\n\nimport { useInitResultValue } from './useInitResultValue.js';\nimport type {\n DynamicInitResultKey,\n InitResultValue,\n Trackable,\n} from '../types.js';\n\nexport function useInitResultDynamicValue<K extends DynamicInitResultKey>(\n initResultKey: K,\n): Accessor<InitResultValue<K>> {\n // Extract init result value.\n const initial = useInitResultValue(initResultKey);\n\n // Create value which will be returned to the external environment.\n const [signal, setSignal] = createSignal(initial(), { equals: false });\n\n // Effect which listens to change event and calls update.\n createEffect(() => {\n onCleanup(\n (initial() as Trackable).on('change', () => {\n setSignal((prev) => prev);\n }),\n );\n });\n\n return signal;\n}\n","import type { Accessor } from 'solid-js';\n\nimport { useInitResultDynamicValue, useInitResultValue } from './provider/index.js';\nimport type {\n DynamicInitResultKey,\n InitResultKey,\n InitResultValue,\n StaticInitResultKey,\n} from './types.js';\n\nexport type Hook<K extends InitResultKey> = () => Accessor<InitResultValue<K>>;\n\n/**\n * Creates hook to retrieve static init result value.\n * @param initResultKey - init result key.\n */\nexport function createHook<K extends StaticInitResultKey>(initResultKey: K): Hook<K>;\n\n/**\n * Creates hook to retrieve dynamic init result value.\n * @param initResultKey - init result key.\n * @param dynamic - flag to let function know this init result value is dynamic.\n */\nexport function createHook<K extends DynamicInitResultKey>(\n initResultKey: K,\n dynamic: true,\n): Hook<K>;\n\nexport function createHook(initResultKey: InitResultKey, dynamic?: true): Hook<any> {\n return dynamic\n ? () => useInitResultDynamicValue(initResultKey as DynamicInitResultKey)\n : () => useInitResultValue(initResultKey);\n}\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve BackButton component.\n */\nexport const useBackButton = createHook('backButton', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve ClosingBehavior component.\n */\nexport const useClosingBehavior = createHook('closingBehavior', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve CloudStorage component.\n */\nexport const useCloudStorage = createHook('cloudStorage');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve HapticFeedback component.\n */\nexport const useHapticFeedback = createHook('hapticFeedback');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve InitData component.\n */\nexport const useInitData = createHook('initData');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve init data raw representation.\n */\nexport const useInitDataRaw = createHook('initDataRaw');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Invoice component.\n */\nexport const useInvoice = createHook('invoice', true);\n","import { type LaunchParams, retrieveLaunchData } from '@tma.js/sdk';\n\n/**\n * Hooks to retrieve launch parameters.\n */\nexport function useLaunchParams(): LaunchParams {\n return retrieveLaunchData().launchParams;\n}\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve MainButton component.\n */\nexport const useMainButton = createHook('mainButton', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve MiniApp component.\n */\nexport const useMiniApp = createHook('miniApp', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Popup component.\n */\nexport const usePopup = createHook('popup', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve postEvent function.\n */\nexport const usePostEvent = createHook('postEvent');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve QRScanner component.\n */\nexport const useQRScanner = createHook('qrScanner', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve ThemeParams component.\n */\nexport const useThemeParams = createHook('themeParams', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Viewport component.\n */\nexport const useViewport = createHook('viewport', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Utils component.\n */\nexport const useUtils = createHook('utils');\n"],"names":["SDKContext","createContext","SDKProvider","props","data","createResource","options","init","initResult","createMemo","state","undefined","loading","error","_$createComponent","Provider","value","children","useSDKContext","useContext","useInitResultValue","key","result","useInitResultDynamicValue","initResultKey","initial","signal","setSignal","createSignal","createEffect","onCleanup","prev","createHook","dynamic","useBackButton","useClosingBehavior","useCloudStorage","useHapticFeedback","useInitData","useInitDataRaw","useInvoice","useLaunchParams","retrieveLaunchData","launchParams","useMainButton","useMiniApp","usePopup","usePostEvent","useQRScanner","useThemeParams","useViewport","useUtils"],"mappings":"qIAIaA,EAAaC,EAAAA,cAA8B,CACtD,QAAS,IAAM,GACf,MAAO,IAAM,GACb,WAAY,IAAM,EACpB,EAAG,CAAE,KAAM,aAAc,ECFlB,SAASC,EAAYC,EAAyB,CACnD,KAAM,CAACC,CAAI,EAAIC,EAAc,eAAC,IAAMF,EAAMG,QAASC,EAAAA,IAAI,EAEjDC,EAAaC,EAAAA,WAAW,IACrBL,EAAKM,QAAU,QAAUN,EAAI,EAAKO,MAC1C,EACKC,EAAUH,EAAU,WAAC,IAAML,EAAKQ,OAAO,EACvCC,EAAQJ,aAAW,IAAOL,EAAKS,QAAUF,OAAY,KAAOP,EAAKS,KAAM,EAE7E,OAAAC,EAAA,gBACGd,EAAWe,SAAQ,CAACC,MAAO,CAAER,WAAAA,EAAYI,QAAAA,EAASC,MAAAA,CAAO,EAAA,IAAAI,UAAA,CAAA,OACvDd,EAAMc,QAAQ,CAAA,CAAA,CAGrB,CCZO,SAASC,GAAgC,CAC9C,OAAOC,EAAAA,WAAWnB,CAAU,CAC9B,CCAO,SAASoB,EAA4CC,EAAsC,CAC1F,KAAA,CAAE,WAAAb,GAAeU,IAGvB,OAAOT,aAA+B,IAAM,CAC1C,MAAMa,EAASd,IAEf,GAAI,CAACc,EACH,MAAM,IAAI,MAAM,kCAAkCD,CAAG,qCAAqC,EAE5F,OAAOC,EAAOD,CAAG,CAAA,CAClB,CACH,CCRO,SAASE,EACdC,EAC8B,CAExB,MAAAC,EAAUL,EAAmBI,CAAa,EAG1C,CAACE,EAAQC,CAAS,EAAIC,EAAA,aAAaH,IAAW,CAAE,OAAQ,EAAA,CAAO,EAGrEI,OAAAA,EAAAA,aAAa,IAAM,CACjBC,EAAA,UACGL,EAAQ,EAAgB,GAAG,SAAU,IAAM,CAChCE,EAACI,GAASA,CAAI,CAAA,CACzB,CAAA,CACH,CACD,EAEML,CACT,CCLgB,SAAAM,EAAWR,EAA8BS,EAA2B,CAClF,OAAOA,EACH,IAAMV,EAA0BC,CAAqC,EACrE,IAAMJ,EAAmBI,CAAa,CAC5C,CC3Ba,MAAAU,EAAgBF,EAAW,aAAc,EAAI,ECA7CG,EAAqBH,EAAW,kBAAmB,EAAI,ECAvDI,EAAkBJ,EAAW,cAAc,ECA3CK,EAAoBL,EAAW,gBAAgB,ECA/CM,EAAcN,EAAW,UAAU,ECAnCO,EAAiBP,EAAW,aAAa,ECAzCQ,EAAaR,EAAW,UAAW,EAAI,ECA7C,SAASS,GAAgC,CAC9C,OAAOC,EAAAA,mBAAoB,EAACC,YAC9B,CCFa,MAAAC,EAAgBZ,EAAW,aAAc,EAAI,ECA7Ca,EAAab,EAAW,UAAW,EAAI,ECAvCc,EAAWd,EAAW,QAAS,EAAI,ECAnCe,EAAef,EAAW,WAAW,ECArCgB,EAAehB,EAAW,YAAa,EAAI,ECA3CiB,EAAiBjB,EAAW,cAAe,EAAI,ECA/CkB,EAAclB,EAAW,WAAY,EAAI,ECAzCmB,EAAWnB,EAAW,OAAO"}
package/dist/index.mjs CHANGED
@@ -1,81 +1,73 @@
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, {
1
+ import { createContext as c, createResource as l, createMemo as r, createComponent as d, useContext as p, createSignal as m, createEffect as f, onCleanup as g } from "solid-js";
2
+ import { init as v, retrieveLaunchData as h } from "@tma.js/sdk";
3
+ const a = c({
4
+ loading: () => !1,
5
+ error: () => {
6
+ },
7
+ initResult: () => {
8
+ }
9
+ }, { name: "SDKContext" });
10
+ function R(n) {
11
+ const [e] = l(() => n.options, v), o = r(() => e.state === "ready" ? e() : void 0), u = r(() => e.loading), s = r(() => e.error === void 0 ? null : e.error);
12
+ return d(a.Provider, {
14
13
  value: {
15
- initResult: s,
14
+ initResult: o,
16
15
  loading: u,
17
- error: c
16
+ error: s
18
17
  },
19
18
  get children() {
20
- return t.children;
19
+ return n.children;
21
20
  }
22
21
  });
23
22
  }
24
- function a(t, e) {
25
- return r(() => t()[e]);
23
+ function D() {
24
+ return p(a);
25
+ }
26
+ function i(n) {
27
+ const { initResult: e } = D();
28
+ return r(() => {
29
+ const o = e();
30
+ if (!o)
31
+ throw new Error(`Unable to get init result key "${n}" as long as SDK is not initialized`);
32
+ return o[n];
33
+ });
26
34
  }
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;
35
+ function S(n) {
36
+ const e = i(n), [o, u] = m(e(), { equals: !1 });
37
+ return f(() => {
38
+ g(
39
+ e().on("change", () => {
40
+ u((s) => s);
41
+ })
42
+ );
43
+ }), o;
37
44
  }
45
+ function t(n, e) {
46
+ return e ? () => S(n) : () => i(n);
47
+ }
48
+ const B = t("backButton", !0), w = t("closingBehavior", !0), x = t("cloudStorage"), k = t("hapticFeedback"), I = t("initData"), b = t("initDataRaw"), E = t("invoice", !0);
38
49
  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
- };
50
+ return h().launchParams;
72
51
  }
52
+ const M = t("mainButton", !0), V = t("miniApp", !0), q = t("popup", !0), A = t("postEvent"), F = t("qrScanner", !0), H = t("themeParams", !0), L = t("viewport", !0), U = t("utils");
73
53
  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
54
+ R as SDKProvider,
55
+ B as useBackButton,
56
+ w as useClosingBehavior,
57
+ x as useCloudStorage,
58
+ k as useHapticFeedback,
59
+ I as useInitData,
60
+ b as useInitDataRaw,
61
+ E as useInvoice,
62
+ K as useLaunchParams,
63
+ M as useMainButton,
64
+ V as useMiniApp,
65
+ q as usePopup,
66
+ A as usePostEvent,
67
+ F as useQRScanner,
68
+ D as useSDKContext,
69
+ H as useThemeParams,
70
+ U as useUtils,
71
+ L as useViewport
80
72
  };
81
73
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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, type 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 { createMemo, type Accessor } from 'solid-js';\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.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 { createEffect, createSignal, onCleanup, type Accessor } from 'solid-js';\nimport { useInitResultValue } from './useInitResultValue.js';\nimport type { SDKInitResult, SDKInitResultKey, SDKInitResultValue } from './types.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;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/provider/SDKContext.ts","../src/provider/SDKProvider.tsx","../src/provider/useSDKContext.ts","../src/provider/useInitResultValue.ts","../src/provider/useInitResultDynamicValue.ts","../src/createHook.ts","../src/tools/back-button.ts","../src/tools/closing-behavior.ts","../src/tools/cloud-storage.ts","../src/tools/haptic-feedback.ts","../src/tools/init-data.ts","../src/tools/init-data-raw.ts","../src/tools/invoice.ts","../src/tools/launch-params.tsx","../src/tools/main-button.ts","../src/tools/mini-app.ts","../src/tools/popup.ts","../src/tools/post-event.ts","../src/tools/qr-scanner.ts","../src/tools/theme-params.ts","../src/tools/viewport.ts","../src/tools/utils.ts"],"sourcesContent":["import { createContext } from 'solid-js';\n\nimport type { SDKContextType } from './types.js';\n\nexport const SDKContext = createContext<SDKContextType>({\n loading: () => false,\n error: () => undefined,\n initResult: () => undefined,\n}, { name: 'SDKContext' });\n","import { init } from '@tma.js/sdk';\nimport { createMemo, createResource } from 'solid-js';\n\nimport { SDKContext } from './SDKContext.js';\nimport type { SDKProviderProps } from './types.js';\n\nexport function SDKProvider(props: SDKProviderProps) {\n const [data] = createResource(() => props.options, init);\n\n const initResult = createMemo(() => {\n return data.state === 'ready' ? data() : undefined;\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 { useContext } from 'solid-js';\n\nimport { SDKContext } from './SDKContext.js';\nimport type { SDKContextType } from './types.js';\n\n/**\n * Returns current SDK information.\n */\nexport function useSDKContext(): SDKContextType {\n return useContext(SDKContext);\n}\n","import { type Accessor, createMemo } from 'solid-js';\n\nimport { useSDKContext } from './useSDKContext.js';\nimport type { InitResultKey, InitResultValue } from '../types.js';\n\n/**\n * Returns value by its field name from SDK init result.\n * @param key - init result key.\n * @throws {Error} SDK is not initialized.\n */\nexport function useInitResultValue<K extends InitResultKey>(key: K): Accessor<InitResultValue<K>> {\n const { initResult } = useSDKContext();\n\n // eslint-disable-next-line solid/reactivity\n return createMemo<InitResultValue<K>>(() => {\n const result = initResult();\n\n if (!result) {\n throw new Error(`Unable to get init result key \"${key}\" as long as SDK is not initialized`);\n }\n return result[key];\n });\n}\n","import {\n type Accessor,\n createEffect,\n createSignal,\n onCleanup,\n} from 'solid-js';\n\nimport { useInitResultValue } from './useInitResultValue.js';\nimport type {\n DynamicInitResultKey,\n InitResultValue,\n Trackable,\n} from '../types.js';\n\nexport function useInitResultDynamicValue<K extends DynamicInitResultKey>(\n initResultKey: K,\n): Accessor<InitResultValue<K>> {\n // Extract init result value.\n const initial = useInitResultValue(initResultKey);\n\n // Create value which will be returned to the external environment.\n const [signal, setSignal] = createSignal(initial(), { equals: false });\n\n // Effect which listens to change event and calls update.\n createEffect(() => {\n onCleanup(\n (initial() as Trackable).on('change', () => {\n setSignal((prev) => prev);\n }),\n );\n });\n\n return signal;\n}\n","import type { Accessor } from 'solid-js';\n\nimport { useInitResultDynamicValue, useInitResultValue } from './provider/index.js';\nimport type {\n DynamicInitResultKey,\n InitResultKey,\n InitResultValue,\n StaticInitResultKey,\n} from './types.js';\n\nexport type Hook<K extends InitResultKey> = () => Accessor<InitResultValue<K>>;\n\n/**\n * Creates hook to retrieve static init result value.\n * @param initResultKey - init result key.\n */\nexport function createHook<K extends StaticInitResultKey>(initResultKey: K): Hook<K>;\n\n/**\n * Creates hook to retrieve dynamic init result value.\n * @param initResultKey - init result key.\n * @param dynamic - flag to let function know this init result value is dynamic.\n */\nexport function createHook<K extends DynamicInitResultKey>(\n initResultKey: K,\n dynamic: true,\n): Hook<K>;\n\nexport function createHook(initResultKey: InitResultKey, dynamic?: true): Hook<any> {\n return dynamic\n ? () => useInitResultDynamicValue(initResultKey as DynamicInitResultKey)\n : () => useInitResultValue(initResultKey);\n}\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve BackButton component.\n */\nexport const useBackButton = createHook('backButton', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve ClosingBehavior component.\n */\nexport const useClosingBehavior = createHook('closingBehavior', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve CloudStorage component.\n */\nexport const useCloudStorage = createHook('cloudStorage');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve HapticFeedback component.\n */\nexport const useHapticFeedback = createHook('hapticFeedback');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve InitData component.\n */\nexport const useInitData = createHook('initData');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve init data raw representation.\n */\nexport const useInitDataRaw = createHook('initDataRaw');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Invoice component.\n */\nexport const useInvoice = createHook('invoice', true);\n","import { type LaunchParams, retrieveLaunchData } from '@tma.js/sdk';\n\n/**\n * Hooks to retrieve launch parameters.\n */\nexport function useLaunchParams(): LaunchParams {\n return retrieveLaunchData().launchParams;\n}\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve MainButton component.\n */\nexport const useMainButton = createHook('mainButton', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve MiniApp component.\n */\nexport const useMiniApp = createHook('miniApp', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Popup component.\n */\nexport const usePopup = createHook('popup', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve postEvent function.\n */\nexport const usePostEvent = createHook('postEvent');\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve QRScanner component.\n */\nexport const useQRScanner = createHook('qrScanner', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve ThemeParams component.\n */\nexport const useThemeParams = createHook('themeParams', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Viewport component.\n */\nexport const useViewport = createHook('viewport', true);\n","import { createHook } from '../createHook.js';\n\n/**\n * Hook to retrieve Utils component.\n */\nexport const useUtils = createHook('utils');\n"],"names":["SDKContext","createContext","SDKProvider","props","data","createResource","options","init","initResult","createMemo","state","undefined","loading","error","_$createComponent","Provider","value","children","useSDKContext","useContext","useInitResultValue","key","result","useInitResultDynamicValue","initResultKey","initial","signal","setSignal","createSignal","createEffect","onCleanup","prev","createHook","dynamic","useBackButton","useClosingBehavior","useCloudStorage","useHapticFeedback","useInitData","useInitDataRaw","useInvoice","useLaunchParams","retrieveLaunchData","launchParams","useMainButton","useMiniApp","usePopup","usePostEvent","useQRScanner","useThemeParams","useViewport","useUtils"],"mappings":";;AAIO,MAAMA,IAAaC,EAA8B;AAAA,EACtD,SAAS,MAAM;AAAA,EACf,OAAO,MAAM;AAAA;AAAA,EACb,YAAY,MAAM;AAAA;AACpB,GAAG,EAAE,MAAM,cAAc;ACFlB,SAASC,EAAYC,GAAyB;AACnD,QAAM,CAACC,CAAI,IAAIC,EAAe,MAAMF,EAAMG,SAASC,CAAI,GAEjDC,IAAaC,EAAW,MACrBL,EAAKM,UAAU,UAAUN,EAAI,IAAKO,MAC1C,GACKC,IAAUH,EAAW,MAAML,EAAKQ,OAAO,GACvCC,IAAQJ,EAAW,MAAOL,EAAKS,UAAUF,SAAY,OAAOP,EAAKS,KAAM;AAE7E,SAAAC,EACGd,EAAWe,UAAQ;AAAA,IAACC,OAAO;AAAA,MAAER,YAAAA;AAAAA,MAAYI,SAAAA;AAAAA,MAASC,OAAAA;AAAAA,IAAO;AAAA,IAAA,IAAAI,WAAA;AAAA,aACvDd,EAAMc;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;ACZO,SAASC,IAAgC;AAC9C,SAAOC,EAAWnB,CAAU;AAC9B;ACAO,SAASoB,EAA4CC,GAAsC;AAC1F,QAAA,EAAE,YAAAb,MAAeU;AAGvB,SAAOT,EAA+B,MAAM;AAC1C,UAAMa,IAASd;AAEf,QAAI,CAACc;AACH,YAAM,IAAI,MAAM,kCAAkCD,CAAG,qCAAqC;AAE5F,WAAOC,EAAOD,CAAG;AAAA,EAAA,CAClB;AACH;ACRO,SAASE,EACdC,GAC8B;AAExB,QAAAC,IAAUL,EAAmBI,CAAa,GAG1C,CAACE,GAAQC,CAAS,IAAIC,EAAaH,KAAW,EAAE,QAAQ,GAAA,CAAO;AAGrE,SAAAI,EAAa,MAAM;AACjB,IAAAC;AAAA,MACGL,EAAQ,EAAgB,GAAG,UAAU,MAAM;AAChC,QAAAE,EAAA,CAACI,MAASA,CAAI;AAAA,MAAA,CACzB;AAAA,IAAA;AAAA,EACH,CACD,GAEML;AACT;ACLgB,SAAAM,EAAWR,GAA8BS,GAA2B;AAClF,SAAOA,IACH,MAAMV,EAA0BC,CAAqC,IACrE,MAAMJ,EAAmBI,CAAa;AAC5C;AC3Ba,MAAAU,IAAgBF,EAAW,cAAc,EAAI,GCA7CG,IAAqBH,EAAW,mBAAmB,EAAI,GCAvDI,IAAkBJ,EAAW,cAAc,GCA3CK,IAAoBL,EAAW,gBAAgB,GCA/CM,IAAcN,EAAW,UAAU,GCAnCO,IAAiBP,EAAW,aAAa,GCAzCQ,IAAaR,EAAW,WAAW,EAAI;ACA7C,SAASS,IAAgC;AAC9C,SAAOC,EAAoB,EAACC;AAC9B;ACFa,MAAAC,IAAgBZ,EAAW,cAAc,EAAI,GCA7Ca,IAAab,EAAW,WAAW,EAAI,GCAvCc,IAAWd,EAAW,SAAS,EAAI,GCAnCe,IAAef,EAAW,WAAW,GCArCgB,IAAehB,EAAW,aAAa,EAAI,GCA3CiB,IAAiBjB,EAAW,eAAe,EAAI,GCA/CkB,IAAclB,EAAW,YAAY,EAAI,GCAzCmB,IAAWnB,EAAW,OAAO;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tma.js/sdk-solid",
3
- "version": "0.1.20",
3
+ "version": "1.0.1",
4
4
  "description": "Solid JS bindings for Mini Apps client SDK.",
5
5
  "author": "Vladislav Kibenko <wolfram.deus@gmail.com>",
6
6
  "homepage": "https://github.com/Telegram-Mini-Apps/tma.js#readme",
@@ -37,8 +37,7 @@
37
37
  }
38
38
  },
39
39
  "dependencies": {
40
- "@tma.js/utils": "0.5.6",
41
- "@tma.js/sdk": "0.13.3"
40
+ "@tma.js/sdk": "1.0.1"
42
41
  },
43
42
  "peerDependencies": {
44
43
  "solid-js": "^1.0.0"
@@ -52,8 +51,9 @@
52
51
  "access": "public"
53
52
  },
54
53
  "scripts": {
55
- "lint": "eslint -c .eslintrc.cjs src/**/*",
56
- "typecheck": "tsc --noEmit -p tsconfig.build.json",
54
+ "lint": "eslint src/**/*",
55
+ "lint:fix": "pnpm run lint --fix",
56
+ "typecheck": "tsc --noEmit",
57
57
  "build": "vite build"
58
58
  }
59
59
  }