@tma.js/sdk 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/dts/components/BackButton/initBackButton.d.ts +1 -1
  2. package/dist/dts/components/BiometryManager/initBiometryManager.d.ts +1 -1
  3. package/dist/dts/components/ClosingBehavior/initClosingBehavior.d.ts +1 -1
  4. package/dist/dts/components/CloudStorage/initCloudStorage.d.ts +1 -1
  5. package/dist/dts/components/HapticFeedback/initHapticFeedback.d.ts +1 -1
  6. package/dist/dts/components/InitData/initInitData.d.ts +1 -1
  7. package/dist/dts/components/Invoice/initInvoice.d.ts +1 -1
  8. package/dist/dts/components/MainButton/initMainButton.d.ts +1 -1
  9. package/dist/dts/components/MiniApp/initMiniApp.d.ts +1 -1
  10. package/dist/dts/components/Popup/initPopup.d.ts +1 -1
  11. package/dist/dts/components/QRScanner/initQRScanner.d.ts +1 -1
  12. package/dist/dts/components/SettingsButton/initSettingsButton.d.ts +1 -1
  13. package/dist/dts/components/ThemeParams/initThemeParams.d.ts +1 -1
  14. package/dist/dts/components/Utils/initUtils.d.ts +1 -1
  15. package/dist/dts/components/Viewport/initViewport.d.ts +1 -2
  16. package/dist/dts/index.d.ts +1 -1
  17. package/dist/dts/misc/createCleanup.d.ts +11 -0
  18. package/dist/dts/misc/createComponentInitFn/createComponentInitFn.d.ts +7 -6
  19. package/dist/dts/misc/createComponentInitFn/types.d.ts +28 -20
  20. package/dist/dts/navigation/BrowserNavigator/BrowserNavigator.d.ts +1 -1
  21. package/dist/dts/navigation/BrowserNavigator/types.d.ts +5 -4
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.iife.js +1 -1
  25. package/dist/index.iife.js.map +1 -1
  26. package/dist/index.js +581 -576
  27. package/dist/index.js.map +1 -1
  28. package/package.json +1 -1
  29. package/dist/dts/components/Viewport/initViewportFromRequest.d.ts +0 -10
@@ -4,4 +4,4 @@ import { BackButton } from './BackButton.js';
4
4
  * @returns A new initialized instance of the `BackButton` class.
5
5
  * @see BackButton
6
6
  */
7
- export declare const initBackButton: import('../../index.js').InitComponentFn<"version", BackButton, import('./types.js').BackButtonState>;
7
+ export declare const initBackButton: import('../../index.js').InitDynamicComponentFn<BackButton>;
@@ -4,4 +4,4 @@ import { BiometryManager } from './BiometryManager.js';
4
4
  * @returns A promise with a new initialized instance of the `BiometryManager` class.
5
5
  * @see BiometryManager
6
6
  */
7
- export declare const initBiometryManager: import('../../index.js').InitComponentFn<"version", Promise<BiometryManager>, import('./types.js').BiometryManagerState>;
7
+ export declare const initBiometryManager: import('../../index.js').InitDynamicComponentFn<Promise<BiometryManager>>;
@@ -4,4 +4,4 @@ import { ClosingBehavior } from './ClosingBehavior.js';
4
4
  * @returns A new initialized instance of the `ClosingBehavior` class.
5
5
  * @see ClosingBehavior
6
6
  */
7
- export declare const initClosingBehavior: import('../../index.js').InitComponentFn<never, ClosingBehavior, import('./types.js').ClosingBehaviorState>;
7
+ export declare const initClosingBehavior: import('../../index.js').InitDynamicComponentFn<ClosingBehavior>;
@@ -4,4 +4,4 @@ import { CloudStorage } from './CloudStorage.js';
4
4
  * @returns A new initialized instance of the `CloudStorage` class.
5
5
  * @see CloudStorage
6
6
  */
7
- export declare const initCloudStorage: import('../../index.js').InitComponentFn<"version", CloudStorage, never>;
7
+ export declare const initCloudStorage: import('../../index.js').InitStaticComponentFn<CloudStorage>;
@@ -4,4 +4,4 @@ import { HapticFeedback } from './HapticFeedback.js';
4
4
  * @returns A new initialized instance of the `HapticFeedback` class.
5
5
  * @see HapticFeedback
6
6
  */
7
- export declare const initHapticFeedback: import('../../index.js').InitComponentFn<"version", HapticFeedback, never>;
7
+ export declare const initHapticFeedback: import('../../index.js').InitStaticComponentFn<HapticFeedback>;
@@ -4,4 +4,4 @@ import { InitData } from './InitData.js';
4
4
  * @returns A new initialized instance of the `InitData` class or undefined.
5
5
  * @see InitData
6
6
  */
7
- export declare const initInitData: import('../../index.js').InitComponentFn<"initData", InitData | undefined, never>;
7
+ export declare const initInitData: import('../../index.js').InitStaticComponentFn<InitData | undefined>;
@@ -4,4 +4,4 @@ import { Invoice } from './Invoice.js';
4
4
  * @returns A new initialized instance of the `Invoice` class.
5
5
  * @see Invoice
6
6
  */
7
- export declare const initInvoice: import('../../index.js').InitComponentFn<"version", Invoice, never>;
7
+ export declare const initInvoice: import('../../index.js').InitStaticComponentFn<Invoice>;
@@ -4,4 +4,4 @@ import { MainButton } from './MainButton.js';
4
4
  * @returns A new initialized instance of the `MainButton` class.
5
5
  * @see MainButton
6
6
  */
7
- export declare const initMainButton: import('../../index.js').InitComponentFn<"themeParams", MainButton, import('./types.js').MainButtonState>;
7
+ export declare const initMainButton: import('../../index.js').InitDynamicComponentFn<MainButton>;
@@ -4,4 +4,4 @@ import { MiniApp } from './MiniApp.js';
4
4
  * @returns A new initialized instance of the `MiniApp` class.
5
5
  * @see MiniApp
6
6
  */
7
- export declare const initMiniApp: import('../../index.js').InitComponentFn<"botInline" | "themeParams" | "version", MiniApp, import('./types.js').MiniAppState>;
7
+ export declare const initMiniApp: import('../../index.js').InitDynamicComponentFn<MiniApp>;
@@ -4,4 +4,4 @@ import { Popup } from './Popup.js';
4
4
  * @returns A new initialized instance of the `Popup` class.
5
5
  * @see Popup
6
6
  */
7
- export declare const initPopup: import('../../index.js').InitComponentFn<"version", Popup, never>;
7
+ export declare const initPopup: import('../../index.js').InitStaticComponentFn<Popup>;
@@ -4,4 +4,4 @@ import { QRScanner } from './QRScanner.js';
4
4
  * @returns A new initialized instance of the `QRScanner` class.
5
5
  * @see QRScanner
6
6
  */
7
- export declare const initQRScanner: import('../../index.js').InitComponentFn<"version", QRScanner, never>;
7
+ export declare const initQRScanner: import('../../index.js').InitStaticComponentFn<QRScanner>;
@@ -4,4 +4,4 @@ import { SettingsButton } from './SettingsButton.js';
4
4
  * @returns A new initialized instance of the `SettingsButton` class.
5
5
  * @see SettingsButton
6
6
  */
7
- export declare const initSettingsButton: import('../../index.js').InitComponentFn<"version", SettingsButton, import('./types.js').SettingsButtonState>;
7
+ export declare const initSettingsButton: import('../../index.js').InitDynamicComponentFn<SettingsButton>;
@@ -4,4 +4,4 @@ import { ThemeParams } from './ThemeParams.js';
4
4
  * @returns A new initialized instance of the `ThemeParams` class.
5
5
  * @see ThemeParams
6
6
  */
7
- export declare const initThemeParams: import('../../index.js').InitComponentFn<"themeParams", ThemeParams, import('./types.js').ThemeParamsParsed>;
7
+ export declare const initThemeParams: import('../../index.js').InitDynamicComponentFn<ThemeParams>;
@@ -4,4 +4,4 @@ import { Utils } from './Utils.js';
4
4
  * @returns A new initialized instance of the `Utils` class.
5
5
  * @see Utils
6
6
  */
7
- export declare const initUtils: import('../../index.js').InitComponentFn<"version", Utils, never>;
7
+ export declare const initUtils: import('../../index.js').InitStaticComponentFn<Utils>;
@@ -1,8 +1,7 @@
1
1
  import { Viewport } from './Viewport.js';
2
- import { ViewportState } from './types.js';
3
2
 
4
3
  /**
5
4
  * @returns A promise with a new initialized instance of the `Viewport` class.
6
5
  * @see Viewport
7
6
  */
8
- export declare const initViewport: import('../../misc/createComponentInitFn/types.js').InitComponentFn<"platform", Promise<Viewport>, ViewportState>;
7
+ export declare const initViewport: import('../../index.js').InitDynamicComponentFn<Promise<Viewport>>;
@@ -118,7 +118,7 @@ export * from './launch-params/types.js';
118
118
  /**
119
119
  * Misc.
120
120
  */
121
- export type { FactoryOptions, FactoryStatic, Factory, FactoryDynamic, InitComponentFn, WithOnChange, } from './misc/createComponentInitFn/types.js';
121
+ export type { FactoryOptions, FactoryStatic, Factory, FactoryDynamic, InitComponentFn, InitStaticComponentFn, InitDynamicComponentFn, WithOnChange, } from './misc/createComponentInitFn/types.js';
122
122
  /**
123
123
  * Navigation.
124
124
  */
@@ -0,0 +1,11 @@
1
+ import { CleanupFn } from '../types/index.js';
2
+
3
+ /**
4
+ * Returns a tuple, containing function to add cleanup, call cleanup, and flag showing whether
5
+ * cleanup was called. Cleanup will not be performed in case, it was done before.
6
+ */
7
+ export declare function createCleanup(): [
8
+ add: (fn: CleanupFn) => void,
9
+ call: () => void,
10
+ cleanedUp: boolean
11
+ ];
@@ -1,15 +1,16 @@
1
- import { LaunchParamName } from '../../launch-params/types.js';
2
1
  import { StorageKey, StorageValue } from '../../storage/storage.js';
3
- import { FactoryDynamic, FactoryStatic, InitComponentFn, WithOnChange } from './types.js';
2
+ import { FactoryDynamic, FactoryStatic, InitStaticComponentFn, InitDynamicComponentFn, WithOnChange } from './types.js';
4
3
 
5
4
  /**
6
- * Creates new init function based only on common options.
5
+ * Creates a new init function based on factory, creating a component, not synchronizing its
6
+ * state with the session storage.
7
7
  * @param factory - function creating new component instance.
8
8
  */
9
- export declare function createComponentInitFn<R, LP extends LaunchParamName = never>(factory: FactoryStatic<LP, R>): InitComponentFn<LP, R, never>;
9
+ export declare function createComponentInitFn<R>(factory: FactoryStatic<R>): InitStaticComponentFn<R>;
10
10
  /**
11
- * Creates new init function based on common options and storage data.
11
+ * Creates a new init function based on factory, creating a component, synchronizing its
12
+ * state with the session storage.
12
13
  * @param factory - function creating new component instance.
13
14
  * @param storageKey - storage key to restore component from.
14
15
  */
15
- export declare function createComponentInitFn<SK extends StorageKey, R extends WithOnChange<StorageValue<SK>> | Promise<WithOnChange<StorageValue<SK>>>, LP extends LaunchParamName = never>(storageKey: SK, factory: FactoryDynamic<LP, R, SK>): InitComponentFn<LP, R, StorageValue<SK>>;
16
+ export declare function createComponentInitFn<SK extends StorageKey, R extends WithOnChange<StorageValue<SK>> | Promise<WithOnChange<StorageValue<SK>>>>(storageKey: SK, factory: FactoryDynamic<R, SK>): InitDynamicComponentFn<R>;
@@ -1,46 +1,54 @@
1
1
  import { PostEvent } from '../../bridge/methods/postEvent.js';
2
- import { LaunchParamName, PickLaunchParams } from '../../launch-params/types.js';
2
+ import { LaunchParams } from '../../launch-params/types.js';
3
3
  import { CreateRequestIdFn } from '../../request-id/types.js';
4
4
  import { StorageKey, StorageValue } from '../../storage/storage.js';
5
- import { If, IsNever } from '../../types/index.js';
5
+ import { CleanupFn, If, IsNever } from '../../types/index.js';
6
+ import { RemoveEventListenerFn } from '../../events/types.js';
6
7
 
7
8
  /**
8
9
  * Object, which supports tracking its state changes.
9
10
  */
10
11
  export interface WithOnChange<State> {
11
- on(event: 'change', listener: (state: State) => void): void;
12
+ on(event: 'change', listener: (state: State) => void): RemoveEventListenerFn;
12
13
  }
13
- type WithState<State> = If<IsNever<State>, {}, {
14
- state?: State;
15
- }>;
16
14
  /**
17
15
  * Options passed to a component factory.
18
16
  */
19
- export type FactoryOptions<LP extends LaunchParamName, State> = PickLaunchParams<LP> & WithState<State> & {
17
+ export type FactoryOptions<State, SideEffects extends boolean> = LaunchParams & {
20
18
  postEvent: PostEvent;
21
19
  createRequestId: CreateRequestIdFn;
22
- };
23
- export interface Factory<LP extends LaunchParamName, R, State> {
20
+ } & If<IsNever<State>, {}, {
21
+ state?: State;
22
+ }> & If<SideEffects, {
23
+ addCleanup(fn: CleanupFn): void;
24
+ }, {}>;
25
+ export interface Factory<Result, SideEffects extends boolean, State> {
24
26
  /**
25
27
  * Creates a new component instance.
26
28
  * @param options - factory options.
27
29
  */
28
- (options: FactoryOptions<LP, State>): R;
30
+ (options: FactoryOptions<State, SideEffects>): Result;
29
31
  }
30
- export interface FactoryStatic<LP extends LaunchParamName, R> extends Factory<LP, R, never> {
32
+ export interface FactoryStatic<Result> extends Factory<Result, false, never> {
31
33
  }
32
- export interface FactoryDynamic<LP extends LaunchParamName, R, SK extends StorageKey> extends Factory<LP, R, StorageValue<SK>> {
34
+ export interface FactoryDynamic<Result, SK extends StorageKey> extends Factory<Result, true, StorageValue<SK>> {
33
35
  }
34
- export interface InitComponentFn<LP extends LaunchParamName, Result, State> {
36
+ export interface InitComponentFn<Result, SideEffects extends boolean> {
35
37
  /**
36
- * Initializes new component instance.
37
- * @param options - initialization options.
38
+ * Initializes a new static component instance.
38
39
  */
39
- (options?: {
40
+ (): If<SideEffects, [
41
+ /**
42
+ * Execution result.
43
+ */
44
+ result: Result,
40
45
  /**
41
- * Options, applicable only to SSR mode.
46
+ * Cleanup function.
42
47
  */
43
- ssr?: Partial<PickLaunchParams<LP>> & WithState<State>;
44
- }): Result;
48
+ cleanup: CleanupFn
49
+ ], Result>;
50
+ }
51
+ export interface InitStaticComponentFn<Result> extends InitComponentFn<Result, false> {
52
+ }
53
+ export interface InitDynamicComponentFn<Result> extends InitComponentFn<Result, true> {
45
54
  }
46
- export {};
@@ -5,7 +5,7 @@ type Emitter<State> = EventEmitter<BrowserNavigatorEvents<State>>;
5
5
  export declare class BrowserNavigator<State = {}> {
6
6
  private readonly navigator;
7
7
  private readonly ee;
8
- readonly hashMode?: BrowserNavigatorHashMode;
8
+ readonly hashMode: BrowserNavigatorHashMode | null;
9
9
  readonly base: string;
10
10
  constructor(
11
11
  /**
@@ -13,9 +13,10 @@ export interface BrowserNavigatorConOptions {
13
13
  */
14
14
  base?: string;
15
15
  /**
16
- * Hash navigation mode. Omit, if non-hash mode is required.
16
+ * Hash navigation mode. Pass null to enable MPA (Multi Page Application) navigation.
17
+ * @default 'classic'
17
18
  */
18
- hashMode?: BrowserNavigatorHashMode;
19
+ hashMode?: BrowserNavigatorHashMode | null;
19
20
  /**
20
21
  * Function to call Mini Apps methods.
21
22
  * @default Global postEvent function.
@@ -32,12 +33,12 @@ export interface BrowserNavigatorHistoryItem<State> extends URLLike {
32
33
  export type BrowserNavigatorAnyHistoryItem<State> = string | Partial<BrowserNavigatorHistoryItem<State>>;
33
34
  /**
34
35
  * Hash navigation mode.
35
- * @example 'default'
36
+ * @example 'classic'
36
37
  * '#pathname?search'
37
38
  * @example 'slash'
38
39
  * '#/pathname?search'
39
40
  */
40
- export type BrowserNavigatorHashMode = 'default' | 'slash';
41
+ export type BrowserNavigatorHashMode = 'classic' | 'slash';
41
42
  /**
42
43
  * Events supported by `BrowserNavigator`.
43
44
  */
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ye=Object.defineProperty;var Ee=(e,t,s)=>t in e?ye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var c=(e,t,s)=>(Ee(e,typeof t!="symbol"?t+"":t,s),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function Pt(e,t){let s;const n=()=>{s!==void 0&&t&&t(s),s=void 0};return[()=>s===void 0?s=e(n):s,n]}function K(e){const t=U(),{count:s}=t;t.unsubscribe(e),s&&!t.count&&De()}function St(e){return U().subscribe(e),()=>K(e)}class ve{constructor(t,s={}){this.scope=t,this.options=s}print(t,...s){const n=new Date,r=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(n),{textColor:i,bgColor:o}=this.options,a="font-weight: bold;padding: 0 5px;border-radius:5px";console[t](`%c${r}%c / %c${this.scope}`,`${a};background-color: lightblue;color:black`,"",`${a};${i?`color:${i};`:""}${o?`background-color:${o}`:""}`,...s)}error(...t){this.print("error",...t)}log(...t){this.print("log",...t)}}const O=new ve("SDK",{bgColor:"forestgreen",textColor:"white"});let J=!1;const mt=({event:e,args:[t]})=>{O.log("Event received:",t===void 0?{name:e}:{name:e,data:t})};function Pe(e){J!==e&&(J=e,e?St(mt):K(mt))}function Se(...e){J&&O.log(...e)}class q{constructor(){c(this,"listeners",new Map);c(this,"listenersCount",0);c(this,"subscribeListeners",[])}clear(){this.listeners.clear(),this.subscribeListeners=[]}get count(){return this.listenersCount+this.subscribeListeners.length}emit(t,...s){this.subscribeListeners.forEach(r=>r({event:t,args:s})),(this.listeners.get(t)||[]).forEach(([r,i])=>{r(...s),i&&this.off(t,r)})}on(t,s,n){let r=this.listeners.get(t);return r||this.listeners.set(t,r=[]),r.push([s,n]),this.listenersCount+=1,()=>this.off(t,s)}off(t,s){const n=this.listeners.get(t)||[];for(let r=0;r<n.length;r+=1)if(s===n[r][0]){n.splice(r,1),this.listenersCount-=1;return}}subscribe(t){return this.subscribeListeners.push(t),()=>this.unsubscribe(t)}unsubscribe(t){for(let s=0;s<this.subscribeListeners.length;s+=1)if(this.subscribeListeners[s]===t){this.subscribeListeners.splice(s,1);return}}}function Q(e,t,s){return window.addEventListener(e,t,s),()=>window.removeEventListener(e,t,s)}class k extends Error{constructor(t,s,n){super(s,{cause:n}),this.type=t,Object.setPrototypeOf(this,k.prototype)}}function f(e,t,s){return new k(e,t,s)}const Rt="ERR_METHOD_UNSUPPORTED",Tt="ERR_METHOD_PARAMETER_UNSUPPORTED",Ct="ERR_UNKNOWN_ENV",At="ERR_INVOKE_CUSTOM_METHOD_RESPONSE",It="ERR_TIMED_OUT",xt="ERR_UNEXPECTED_TYPE",X="ERR_PARSE",Nt="ERR_NAVIGATION_LIST_EMPTY",qt="ERR_NAVIGATION_CURSOR_INVALID",Re="ERR_NAVIGATION_ITEM_INVALID",Z="ERR_SSR_INIT",kt="ERR_INVALID_PATH_BASE";function R(){return f(xt,"Value has unexpected type")}class L{constructor(t,s,n){this.parser=t,this.isOptional=s,this.type=n}parse(t){if(!(this.isOptional&&t===void 0))try{return this.parser(t)}catch(s){throw f(X,`Unable to parse value${this.type?` as ${this.type}`:""}`,s)}}optional(){return this.isOptional=!0,this}}function T(e,t){return()=>new L(e,!1,t)}const w=T(e=>{if(typeof e=="boolean")return e;const t=String(e);if(t==="1"||t==="true")return!0;if(t==="0"||t==="false")return!1;throw R()},"boolean");function Dt(e,t){const s={};for(const n in e){const r=e[n];if(!r)continue;let i,o;if(typeof r=="function"||"parse"in r)i=n,o=typeof r=="function"?r:r.parse.bind(r);else{const{type:a}=r;i=r.from||n,o=typeof a=="function"?a:a.parse.bind(a)}try{const a=o(t(i));a!==void 0&&(s[n]=a)}catch(a){throw f(X,`Unable to parse field "${n}"`,a)}}return s}function tt(e){let t=e;if(typeof t=="string"&&(t=JSON.parse(t)),typeof t!="object"||t===null||Array.isArray(t))throw R();return t}function u(e,t){return new L(s=>{const n=tt(s);return Dt(e,r=>n[r])},!1,t)}const E=T(e=>{if(typeof e=="number")return e;if(typeof e=="string"){const t=Number(e);if(!Number.isNaN(t))return t}throw R()},"number");function $(e){return/^#[\da-f]{6}$/i.test(e)}function Vt(e){return/^#[\da-f]{3}$/i.test(e)}function et(e){const t=e.replace(/\s/g,"").toLowerCase();if($(t))return t;if(Vt(t)){let n="#";for(let r=0;r<3;r+=1)n+=t[1+r].repeat(2);return n}const s=t.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||t.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(!s)throw new Error(`Value "${e}" does not satisfy any of known RGB formats.`);return s.slice(1).reduce((n,r)=>{const i=parseInt(r,10).toString(16);return n+(i.length===1?"0":"")+i},"#")}const h=T(e=>{if(typeof e=="string"||typeof e=="number")return e.toString();throw R()},"string"),st=T(e=>et(h().parse(e)),"rgb");function Te(e){return u({eventType:h(),eventData:t=>t}).parse(e)}function Ce(){["TelegramGameProxy_receiveEvent","TelegramGameProxy","Telegram"].forEach(e=>{delete window[e]})}function Ae(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}function Ie(){[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach(e=>{let t=window;e.forEach((s,n,r)=>{if(n===r.length-1){t[s]=Ae;return}s in t||(t[s]={}),t=t[s]})})}const xe=u({button_id:e=>e==null?void 0:h().parse(e)}),Ne={clipboard_text_received:u({req_id:h(),data:e=>e===null?e:h().optional().parse(e)}),custom_method_invoked:u({req_id:h(),result:e=>e,error:h().optional()}),invoice_closed:u({slug:h(),status:h()}),phone_requested:u({status:h()}),popup_closed:{parse:e=>xe.parse(e??{})},qr_text_received:u({data:h().optional()}),theme_changed:u({theme_params:e=>{const t=st().optional();return Object.entries(tt(e)).reduce((s,[n,r])=>(s[n]=t.parse(r),s),{})}}),viewport_changed:u({height:E(),width:e=>e==null?window.innerWidth:E().parse(e),is_state_stable:w(),is_expanded:w()}),write_access_requested:u({status:h()})};function qe(){const e=new q;Ie();let t=[Ce,Q("resize",()=>{e.emit("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})}),Q("message",s=>{if(s.source!==window.parent)return;let n;try{n=Te(s.data)}catch{return}const{eventType:r,eventData:i}=n,o=Ne[r];try{const a=o?o.parse(i):i;e.emit(...a?[r,a]:[r])}catch(a){O.error(`An error occurred processing the "${r}" event from the Telegram application. Please, file an issue here: https://github.com/Telegram-Mini-Apps/tma.js/issues/new/choose`,n,a)}}),()=>e.clear()];return[e,()=>{t.forEach(s=>s()),t=[]}]}const[ke,De]=Pt(e=>{const[t,s]=qe(),n=t.off.bind(t);return t.off=(r,i)=>{const{count:o}=t;n(r,i),o&&!t.count&&e()},[t,s]},([,e])=>e());function U(){return ke()[0]}function D(e,t){U().off(e,t)}function g(e,t,s){return U().on(e,t,s)}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Mt(e,t){const s=e.split("."),n=t.split("."),r=Math.max(s.length,n.length);for(let i=0;i<r;i+=1){const o=parseInt(s[i]||"0",10),a=parseInt(n[i]||"0",10);if(o!==a)return o>a?1:-1}return 0}function b(e,t){return Mt(e,t)<=0}function v(e,t,s){if(typeof s=="string"){if(e==="web_app_open_link"&&t==="try_instant_view")return b("6.4",s);if(e==="web_app_set_header_color"&&t==="color")return b("6.9",s)}switch(e){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return b("6.1",t);case"web_app_open_popup":return b("6.2",t);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return b("6.4",t);case"web_app_switch_inline_query":return b("6.7",t);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return b("6.9",t);case"web_app_setup_settings_button":return b("6.10",t);case"web_app_biometry_get_info":case"web_app_biometry_open_settings":case"web_app_biometry_request_access":case"web_app_biometry_request_auth":case"web_app_biometry_update_token":return b("7.2",t);default:return["iframe_ready","iframe_will_reload","web_app_close","web_app_data_send","web_app_expand","web_app_open_link","web_app_ready","web_app_request_theme","web_app_request_viewport","web_app_setup_main_button","web_app_setup_closing_behavior"].includes(e)}}function Ve(e){return"external"in e&&V(e.external)&&"notify"in e.external&&typeof e.external.notify=="function"}function Bt(e){return"TelegramWebviewProxy"in e&&V(e.TelegramWebviewProxy)&&"postEvent"in e.TelegramWebviewProxy&&typeof e.TelegramWebviewProxy.postEvent=="function"}function Ot(){try{return window.self!==window.top}catch{return!0}}let Lt="https://web.telegram.org";function Me(e){Lt=e}function $t(){return Lt}function S(e,t,s){let n={},r;t===void 0&&s===void 0?n={}:t!==void 0&&s!==void 0?(n=s,r=t):t!==void 0&&("targetOrigin"in t?n=t:r=t);const{targetOrigin:i=$t()}=n;if(Se("Posting event:",r?{event:e,data:r}:{event:e}),Ot()){window.parent.postMessage(JSON.stringify({eventType:e,eventData:r}),i);return}if(Ve(window)){window.external.notify(JSON.stringify({eventType:e,eventData:r}));return}if(Bt(window)){window.TelegramWebviewProxy.postEvent(e,JSON.stringify(r));return}throw f(Ct,"Unable to determine current environment and possible way to send event. You are probably trying to use Mini Apps method outside of Telegram application environment.")}function Ut(e){return(t,s)=>{if(!v(t,e))throw f(Rt,`Method "${t}" is unsupported in Mini Apps version ${e}`);if(V(s)){let n;if(t==="web_app_open_link"&&"try_instant_view"in s?n="try_instant_view":t==="web_app_set_header_color"&&"color"in s&&(n="color"),n&&!v(t,n,e))throw f(Tt,`Parameter "${n}" of "${t}" method is unsupported in Mini Apps version ${e}`)}return S(t,s)}}function nt(e){return({req_id:t})=>t===e}function Ht(e){return f(It,`Timeout reached: ${e}ms`)}function rt(e,t){return Promise.race([typeof e=="function"?e():e,new Promise((s,n)=>{setTimeout(()=>{n(Ht(t))},t)})])}async function l(e){let t;const s=new Promise(_=>{t=_}),{method:n,event:r,capture:i,postEvent:o=S,timeout:a}=e,p=(Array.isArray(r)?r:[r]).map(_=>g(_,wt=>(!i||i(wt))&&t(wt)));try{return o(n,e.params),await(a?rt(s,a):s)}finally{p.forEach(_=>_())}}async function P(e,t,s,n={}){const{result:r,error:i}=await l({...n,method:"web_app_invoke_custom_method",event:"custom_method_invoked",params:{method:e,params:t,req_id:s},capture:nt(s)});if(i)throw f(At,i);return r}function B(...e){return e.map(t=>{if(typeof t=="string")return t;if(V(t))return B(Object.entries(t).map(s=>s[1]&&s[0]));if(Array.isArray(t))return B(...t)}).filter(Boolean).join(" ")}function Be(...e){return e.reduce((t,s)=>(V(s)&&Object.entries(s).forEach(([n,r])=>{const i=B(t[n],r);i.length&&(t[n]=i)}),t),{})}function it(e){const t=et(e);return Math.sqrt([.299,.587,.114].reduce((s,n,r)=>{const i=parseInt(t.slice(1+r*2,1+(r+1)*2),16);return s+i*i*n},0))<120}class Oe{constructor(t){c(this,"ee",new q);c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));this.state=t}clone(){return{...this.state}}set(t,s){Object.entries(typeof t=="string"?{[t]:s}:t).reduce((r,[i,o])=>this.state[i]===o||o===void 0?r:(this.state[i]=o,this.ee.emit(`change:${i}`,o),!0),!1)&&this.ee.emit("change",this.state)}get(t){return this.state[t]}}class ot{constructor(t){c(this,"state");c(this,"get");c(this,"set");c(this,"clone");this.state=new Oe(t),this.set=this.state.set.bind(this.state),this.get=this.state.get.bind(this.state),this.clone=this.state.clone.bind(this.state)}}function Wt(e,t){return s=>v(t[s],e)}class at extends ot{constructor(s,n,r){super(s);c(this,"supports");this.supports=Wt(n,r)}}class Gt extends at{constructor(s,n,r){super({isVisible:s},n,{show:"web_app_setup_back_button",hide:"web_app_setup_back_button"});c(this,"on",(s,n)=>s==="click"?g("back_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?D("back_button_pressed",n):this.state.off(s,n));this.postEvent=r}set isVisible(s){this.set("isVisible",s),this.postEvent("web_app_setup_back_button",{is_visible:s})}get isVisible(){return this.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}function y(){return typeof window>"u"}const ct=T(e=>e instanceof Date?e:new Date(E().parse(e)*1e3),"Date");function H(e,t){return new L(s=>{if(typeof s!="string"&&!(s instanceof URLSearchParams))throw R();const n=typeof s=="string"?new URLSearchParams(s):s;return Dt(e,r=>{const i=n.get(r);return i===null?void 0:i})},!1,t)}const Le=u({id:E(),type:h(),title:h(),photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"Chat").optional(),yt=u({addedToAttachmentMenu:{type:w().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:w().optional(),from:"allows_write_to_pm"},firstName:{type:h(),from:"first_name"},id:E(),isBot:{type:w().optional(),from:"is_bot"},isPremium:{type:w().optional(),from:"is_premium"},languageCode:{type:h().optional(),from:"language_code"},lastName:{type:h().optional(),from:"last_name"},photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"User").optional();function jt(){return H({authDate:{type:ct(),from:"auth_date"},canSendAfter:{type:E().optional(),from:"can_send_after"},chat:Le,chatInstance:{type:h().optional(),from:"chat_instance"},chatType:{type:h().optional(),from:"chat_type"},hash:h(),queryId:{type:h().optional(),from:"query_id"},receiver:yt,startParam:{type:h().optional(),from:"start_param"},user:yt},"InitData")}function $e(e){return e.replace(/_[a-z]/g,t=>t[1].toUpperCase())}function Ue(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}const Ft=T(e=>{const t=st().optional();return Object.entries(tt(e)).reduce((s,[n,r])=>(s[$e(n)]=t.parse(r),s),{})},"ThemeParams");function ht(e){return H({botInline:{type:w().optional(),from:"tgWebAppBotInline"},initData:{type:jt().optional(),from:"tgWebAppData"},initDataRaw:{type:h().optional(),from:"tgWebAppData"},platform:{type:h(),from:"tgWebAppPlatform"},showSettings:{type:w().optional(),from:"tgWebAppShowSettings"},startParam:{type:h().optional(),from:"tgWebAppStartParam"},themeParams:{type:Ft(),from:"tgWebAppThemeParams"},version:{type:h(),from:"tgWebAppVersion"}}).parse(e)}function zt(e){return ht(e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&"))}function He(){return zt(window.location.href)}function Jt(){return performance.getEntriesByType("navigation")[0]}function We(){const e=Jt();if(!e)throw new Error("Unable to get first navigation entry.");return zt(e.name)}function Qt(e){return`tma.js/${e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}`}function Yt(e,t){sessionStorage.setItem(Qt(e),JSON.stringify(t))}function Kt(e){const t=sessionStorage.getItem(Qt(e));try{return t?JSON.parse(t):void 0}catch{}}function Ge(){return ht(Kt("launchParams")||"")}function Xt(e){return JSON.stringify(Object.fromEntries(Object.entries(e).map(([t,s])=>[Ue(t),s])))}function Zt(e){const{initDataRaw:t,themeParams:s,platform:n,version:r,showSettings:i,startParam:o,botInline:a}=e,p=new URLSearchParams;return p.set("tgWebAppPlatform",n),p.set("tgWebAppThemeParams",Xt(s)),p.set("tgWebAppVersion",r),t&&p.set("tgWebAppData",t),o&&p.set("tgWebAppStartParam",o),typeof i=="boolean"&&p.set("tgWebAppShowSettings",i?"1":"0"),typeof a=="boolean"&&p.set("tgWebAppBotInline",a?"1":"0"),p.toString()}function je(e){Yt("launchParams",Zt(e))}function te(){for(const e of[He,We,Ge])try{const t=e();return je(t),t}catch{}throw new Error("Unable to retrieve launch parameters from any known source.")}function pt(){const e=Jt();return!!(e&&e.type==="reload")}function Fe(){let e=0;return()=>(e+=1).toString()}const[ze]=Pt(Fe);function d(e,t){return({ssr:s}={})=>{const n=y()?{version:"6.0",themeParams:{},platform:"unknown",...s||{}}:te(),r={...n,postEvent:y()?()=>null:Ut(n.version),createRequestId:ze()};if(y()||typeof e=="function")return typeof e=="function"?e(r):t(r);const i=t({...r,state:pt()?Kt(e):void 0}),o=a=>(a.on("change",p=>{Yt(e,p)}),a);return i instanceof Promise?i.then(o):o(i)}}const Je=d("backButton",({postEvent:e,version:t,state:s={isVisible:!1}})=>new Gt(s.isVisible,t,e));class M extends at{constructor(){super(...arguments);c(this,"on",this.state.on.bind(this.state));c(this,"off",this.state.off.bind(this.state))}}function ee(e){const t=e.available?e:{available:!1,device_id:"",token_saved:!1,access_requested:!1,access_granted:!1,type:""};return{available:!0,type:t.type,deviceId:t.device_id,tokenSaved:t.token_saved,accessRequested:t.access_requested,accessGranted:t.access_granted}}class Y extends M{constructor({postEvent:s,version:n,...r}){super(r,n,{auth:"web_app_biometry_request_auth",openSettings:"web_app_biometry_open_settings",requestAccess:"web_app_biometry_request_access",updateToken:"web_app_biometry_update_token"});c(this,"postEvent");c(this,"authPromise");c(this,"accessPromise");this.postEvent=s}get available(){return this.get("available")}get accessGranted(){return this.get("accessGranted")}get accessRequested(){return this.get("accessRequested")}async authenticate({reason:s,...n}){return this.authPromise||(this.authPromise=l({...n,method:"web_app_biometry_request_auth",event:"biometry_auth_requested",postEvent:this.postEvent,params:{reason:(s||"").trim()}}).then(({token:r})=>r).finally(()=>this.authPromise=void 0)),this.authPromise}get deviceId(){return this.get("deviceId")}openSettings(){this.postEvent("web_app_biometry_open_settings")}requestAccess({reason:s,...n}={}){return this.accessPromise||(this.accessPromise=l({...n,postEvent:this.postEvent,method:"web_app_biometry_request_access",event:"biometry_info_received",params:{reason:s||""}}).then(r=>{const i=ee(r);return this.set(i),i.accessGranted}).finally(()=>this.accessPromise=void 0)),this.accessPromise}get biometryType(){return this.get("biometryType")}get tokenSaved(){return this.get("tokenSaved")}async updateToken({token:s,...n}={}){return["removed","updated"].includes((await l({...n,postEvent:this.postEvent,method:"web_app_biometry_update_token",event:"biometry_token_updated",params:{token:s||""}})).status)}}async function se(e){return ee(await l({...e||{},method:"web_app_biometry_get_info",event:"biometry_info_received"}))}const Qe=d("biometryManager",async({postEvent:e,version:t,state:s})=>{if(s)return new Y({...s,version:t,postEvent:e});if(y())throw f(Z,"BiometryManager cannot be instantiated on the server side without passing the ssr.state object.");return new Y({...await se({timeout:1e3}),version:t,postEvent:e})});class ut extends ot{constructor(){super(...arguments);c(this,"on",this.state.on.bind(this.state));c(this,"off",this.state.off.bind(this.state))}}class ne extends ut{constructor(t,s){super({isConfirmationNeeded:t}),this.postEvent=s}set isConfirmationNeeded(t){this.set("isConfirmationNeeded",t),this.postEvent("web_app_setup_closing_behavior",{need_confirmation:t})}get isConfirmationNeeded(){return this.get("isConfirmationNeeded")}disableConfirmation(){this.isConfirmationNeeded=!1}enableConfirmation(){this.isConfirmationNeeded=!0}}const Ye=d("closingBehavior",({postEvent:e,state:t={isConfirmationNeeded:!1}})=>new ne(t.isConfirmationNeeded,e));class lt{constructor(t,s){c(this,"supports");this.supports=Wt(t,s)}}function Ke(e){if(Array.isArray(e))return e;if(typeof e=="string")try{const t=JSON.parse(e);if(Array.isArray(t))return t}catch{}throw R()}class Xe extends L{constructor(s,n,r){super(Ke,n,r);c(this,"itemParser");this.itemParser=typeof s=="function"?s:s.parse.bind(s)}parse(s){const n=super.parse(s);return n===void 0?n:n.map(this.itemParser)}of(s){return this.itemParser=typeof s=="function"?s:s.parse.bind(s),this}}function re(e){return new Xe(t=>t,!1,e)}function Et(e,t){return Object.fromEntries(e.map(s=>[s,t]))}class ie extends lt{constructor(t,s,n){super(t,{delete:"web_app_invoke_custom_method",get:"web_app_invoke_custom_method",getKeys:"web_app_invoke_custom_method",set:"web_app_invoke_custom_method"}),this.createRequestId=s,this.postEvent=n}async delete(t,s={}){const n=Array.isArray(t)?t:[t];n.length&&await P("deleteStorageValues",{keys:n},this.createRequestId(),{...s,postEvent:this.postEvent})}async getKeys(t={}){return re().of(h()).parse(await P("getStorageKeys",{},this.createRequestId(),{...t,postEvent:this.postEvent}))}async get(t,s={}){const n=Array.isArray(t)?t:[t];if(!n.length)return Et(n,"");const r=await P("getStorageValues",{keys:n},this.createRequestId(),{...s,postEvent:this.postEvent}),i=u(Et(n,h()),"CloudStorageData").parse(r);return Array.isArray(t)?i:i[t]}async set(t,s,n={}){await P("saveStorageValue",{key:t,value:s},this.createRequestId(),{...n,postEvent:this.postEvent})}}const Ze=d(({createRequestId:e,postEvent:t,version:s})=>new ie(s,e,t));class oe extends lt{constructor(t,s){super(t,{impactOccurred:"web_app_trigger_haptic_feedback",notificationOccurred:"web_app_trigger_haptic_feedback",selectionChanged:"web_app_trigger_haptic_feedback"}),this.postEvent=s}impactOccurred(t){this.postEvent("web_app_trigger_haptic_feedback",{type:"impact",impact_style:t})}notificationOccurred(t){this.postEvent("web_app_trigger_haptic_feedback",{type:"notification",notification_type:t})}selectionChanged(){this.postEvent("web_app_trigger_haptic_feedback",{type:"selection_change"})}}const ts=d(({version:e,postEvent:t})=>new oe(e,t));class ae{constructor(t){this.initData=t}get authDate(){return this.initData.authDate}get canSendAfter(){return this.initData.canSendAfter}get canSendAfterDate(){const{canSendAfter:t}=this;return t?new Date(this.authDate.getTime()+t*1e3):void 0}get chat(){return this.initData.chat}get chatType(){return this.initData.chatType}get chatInstance(){return this.initData.chatInstance}get hash(){return this.initData.hash}get queryId(){return this.initData.queryId}get receiver(){return this.initData.receiver}get startParam(){return this.initData.startParam}get user(){return this.initData.user}}const es=d(({initData:e})=>e?new ae(e):void 0);function ss(e){return jt().parse(e)}class ce extends M{constructor(t,s,n){super({isOpened:t},s,{open:"web_app_open_invoice"}),this.postEvent=n}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t,s){if(this.isOpened)throw new Error("Invoice is already opened");let n;if(!s)n=t;else{const{hostname:r,pathname:i}=new URL(t,window.location.href);if(r!=="t.me")throw new Error(`Incorrect hostname: ${r}`);const o=i.match(/^\/(\$|invoice\/)([A-Za-z0-9\-_=]+)$/);if(!o)throw new Error('Link pathname has incorrect format. Expected to receive "/invoice/{slug}" or "/${slug}"');[,,n]=o}this.isOpened=!0;try{return(await l({method:"web_app_open_invoice",event:"invoice_closed",params:{slug:n},postEvent:this.postEvent,capture(i){return n===i.slug}})).status}finally{this.isOpened=!1}}}const ns=d(({version:e,postEvent:t})=>new ce(!1,e,t));class he extends ot{constructor({postEvent:s,...n}){super(n);c(this,"postEvent");c(this,"on",(s,n)=>s==="click"?g("main_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?D("main_button_pressed",n):this.state.off(s,n));this.postEvent=s}commit(){this.text!==""&&this.postEvent("web_app_setup_main_button",{is_visible:this.isVisible,is_active:this.isEnabled,is_progress_visible:this.isLoaderVisible,text:this.text,color:this.backgroundColor,text_color:this.textColor})}set isEnabled(s){this.setParams({isEnabled:s})}get isEnabled(){return this.get("isEnabled")}set isLoaderVisible(s){this.setParams({isLoaderVisible:s})}get isLoaderVisible(){return this.get("isLoaderVisible")}set isVisible(s){this.setParams({isVisible:s})}get isVisible(){return this.get("isVisible")}get backgroundColor(){return this.get("backgroundColor")}get text(){return this.get("text")}get textColor(){return this.get("textColor")}disable(){return this.isEnabled=!1,this}enable(){return this.isEnabled=!0,this}hide(){return this.isVisible=!1,this}hideLoader(){return this.isLoaderVisible=!1,this}show(){return this.isVisible=!0,this}showLoader(){return this.isLoaderVisible=!0,this}setText(s){return this.setParams({text:s})}setTextColor(s){return this.setParams({textColor:s})}setBackgroundColor(s){return this.setParams({backgroundColor:s})}setParams(s){return this.set(s),this.commit(),this}}const rs=d("mainButton",({postEvent:e,themeParams:t,state:s={isVisible:!1,isEnabled:!1,text:"",isLoaderVisible:!1,textColor:t.buttonTextColor||"#ffffff",backgroundColor:t.buttonColor||"#000000"}})=>new he({...s,postEvent:e}));function is(){return H({contact:u({userId:{type:E(),from:"user_id"},phoneNumber:{type:h(),from:"phone_number"},firstName:{type:h(),from:"first_name"},lastName:{type:h().optional(),from:"last_name"}}),authDate:{type:ct(),from:"auth_date"},hash:h()},"RequestedContact")}function pe(e,t){return s=>{const[n,r]=t[s];return v(n,r,e)}}function os(e){return new Promise(t=>{setTimeout(t,e)})}class ue extends M{constructor({postEvent:s,createRequestId:n,version:r,botInline:i,...o}){super(o,r,{requestPhoneAccess:"web_app_request_phone",requestWriteAccess:"web_app_request_write_access",switchInlineQuery:"web_app_switch_inline_query",setHeaderColor:"web_app_set_header_color",setBackgroundColor:"web_app_set_background_color"});c(this,"botInline");c(this,"postEvent");c(this,"createRequestId");c(this,"requestPhoneAccessPromise");c(this,"requestWriteAccessPromise");c(this,"supportsParam");this.createRequestId=n,this.postEvent=s,this.botInline=i;const a=this.supports.bind(this);this.supports=p=>a(p)?p!=="switchInlineQuery"||i:!1,this.supportsParam=pe(r,{"setHeaderColor.color":["web_app_set_header_color","color"]})}async getRequestedContact({timeout:s=1e4}={}){return is().parse(await P("getRequestedContact",{},this.createRequestId(),{postEvent:this.postEvent,timeout:s}))}get bgColor(){return this.get("bgColor")}close(){this.postEvent("web_app_close")}get headerColor(){return this.get("headerColor")}get isBotInline(){return this.botInline}get isDark(){return it(this.bgColor)}ready(){this.postEvent("web_app_ready")}async requestContact({timeout:s=5e3}={}){try{return await this.getRequestedContact()}catch{}if(await this.requestPhoneAccess()!=="sent")throw new Error("Access denied.");const r=Date.now()+s;let i=50;return rt(async()=>{for(;Date.now()<r;){try{return await this.getRequestedContact()}catch{}await os(i),i+=50}throw Ht(s)},s)}async requestPhoneAccess(s={}){return this.requestPhoneAccessPromise||(this.requestPhoneAccessPromise=l({...s,method:"web_app_request_phone",event:"phone_requested",postEvent:this.postEvent}).then(({status:n})=>n).finally(()=>this.requestPhoneAccessPromise=void 0)),this.requestPhoneAccessPromise}async requestWriteAccess(s={}){return this.requestWriteAccessPromise||(this.requestWriteAccessPromise=l({...s,method:"web_app_request_write_access",event:"write_access_requested",postEvent:this.postEvent}).then(({status:n})=>n).finally(()=>this.requestWriteAccessPromise=void 0)),this.requestWriteAccessPromise}sendData(s){const{size:n}=new Blob([s]);if(!n||n>4096)throw new Error(`Passed data has incorrect size: ${n}`);this.postEvent("web_app_data_send",{data:s})}setHeaderColor(s){this.postEvent("web_app_set_header_color",$(s)?{color:s}:{color_key:s}),this.set("headerColor",s)}setBgColor(s){this.postEvent("web_app_set_background_color",{color:s}),this.set("bgColor",s)}switchInlineQuery(s,n=[]){if(!this.supports("switchInlineQuery")&&!this.isBotInline)throw new Error("Method is unsupported because Mini App should be launched in inline mode.");this.postEvent("web_app_switch_inline_query",{query:s,chat_types:n})}}const as=d("miniApp",({themeParams:e,botInline:t=!1,state:s={bgColor:e.bgColor||"#ffffff",headerColor:e.headerBgColor||"#000000"},...n})=>new ue({...n,...s,botInline:t}));function cs(e){const t=e.message.trim(),s=(e.title||"").trim(),n=e.buttons||[];let r;if(s.length>64)throw new Error(`Title has incorrect size: ${s.length}`);if(!t.length||t.length>256)throw new Error(`Message has incorrect size: ${t.length}`);if(n.length>3)throw new Error(`Buttons have incorrect size: ${n.length}`);return n.length?r=n.map(i=>{const{id:o=""}=i;if(o.length>64)throw new Error(`Button ID has incorrect size: ${o}`);if(!i.type||i.type==="default"||i.type==="destructive"){const a=i.text.trim();if(!a.length||a.length>64){const p=i.type||"default";throw new Error(`Button text with type "${p}" has incorrect size: ${i.text.length}`)}return{...i,text:a,id:o}}return{...i,id:o}}):r=[{type:"close",id:""}],{title:s,message:t,buttons:r}}class le extends M{constructor(t,s,n){super({isOpened:t},s,{open:"web_app_open_popup"}),this.postEvent=n}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t){if(this.isOpened)throw new Error("Popup is already opened.");this.isOpened=!0;try{const{button_id:s=null}=await l({event:"popup_closed",method:"web_app_open_popup",postEvent:this.postEvent,params:cs(t)});return s}finally{this.isOpened=!1}}}const hs=d(({postEvent:e,version:t})=>new le(!1,t,e));class de extends M{constructor(t,s,n){super({isOpened:t},s,{close:"web_app_close_scan_qr_popup",open:"web_app_open_scan_qr_popup"}),this.postEvent=n}close(){this.postEvent("web_app_close_scan_qr_popup"),this.isOpened=!1}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t){if(this.isOpened)throw new Error("QR scanner is already opened.");this.isOpened=!0;try{return(await l({method:"web_app_open_scan_qr_popup",event:["qr_text_received","scan_qr_popup_closed"],postEvent:this.postEvent,params:{text:t}})||{}).data||null}finally{this.isOpened=!1}}}const ps=d(({version:e,postEvent:t})=>new de(!1,e,t));class _e extends at{constructor(s,n,r){super({isVisible:s},n,{show:"web_app_setup_settings_button",hide:"web_app_setup_settings_button"});c(this,"on",(s,n)=>s==="click"?g("settings_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?D("settings_button_pressed",n):this.state.off(s,n));this.postEvent=r}set isVisible(s){this.set("isVisible",s),this.postEvent("web_app_setup_settings_button",{is_visible:s})}get isVisible(){return this.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}const us=d("settingsButton",({version:e,postEvent:t,state:s={isVisible:!1}})=>new _e(s.isVisible,e,t));function dt(e){return Ft().parse(e)}class fe extends ut{get accentTextColor(){return this.get("accentTextColor")}get bgColor(){return this.get("bgColor")}get buttonColor(){return this.get("buttonColor")}get buttonTextColor(){return this.get("buttonTextColor")}get destructiveTextColor(){return this.get("destructiveTextColor")}getState(){return this.clone()}get headerBgColor(){return this.get("headerBgColor")}get hintColor(){return this.get("hintColor")}get isDark(){return!this.bgColor||it(this.bgColor)}get linkColor(){return this.get("linkColor")}get secondaryBgColor(){return this.get("secondaryBgColor")}get sectionBgColor(){return this.get("sectionBgColor")}get sectionHeaderTextColor(){return this.get("sectionHeaderTextColor")}listen(){return g("theme_changed",t=>{this.set(dt(t.theme_params))})}get subtitleTextColor(){return this.get("subtitleTextColor")}get textColor(){return this.get("textColor")}}const ls=d("themeParams",({themeParams:e,state:t=e})=>{const s=new fe(t);return y()||s.listen(),s});function ds(e={}){return l({...e,method:"web_app_request_theme",event:"theme_changed"}).then(dt)}class ge extends lt{constructor(s,n,r){super(s,{readTextFromClipboard:"web_app_read_text_from_clipboard"});c(this,"supportsParam");this.version=s,this.createRequestId=n,this.postEvent=r,this.supportsParam=pe(s,{"openLink.tryInstantView":["web_app_open_link","try_instant_view"]})}openLink(s,n){const r=new URL(s,window.location.href).toString();if(!v("web_app_open_link",this.version)){window.open(r,"_blank");return}this.postEvent("web_app_open_link",{url:r,...typeof n=="boolean"?{try_instant_view:n}:{}})}openTelegramLink(s){const{hostname:n,pathname:r,search:i}=new URL(s,window.location.href);if(n!=="t.me")throw new Error(`URL has not allowed hostname: ${n}. Only "t.me" is allowed`);if(!v("web_app_open_tg_link",this.version)){window.location.href=s;return}this.postEvent("web_app_open_tg_link",{path_full:r+i})}async readTextFromClipboard(){const s=this.createRequestId(),{data:n=null}=await l({method:"web_app_read_text_from_clipboard",event:"clipboard_text_received",postEvent:this.postEvent,params:{req_id:s},capture:nt(s)});return n}}const _s=d(({version:e,postEvent:t,createRequestId:s})=>new ge(e,s,t));async function _t(e={}){const{is_expanded:t,is_state_stable:s,...n}=await l({...e,method:"web_app_request_viewport",event:"viewport_changed"});return{...n,isExpanded:t,isStateStable:s}}function C(e){return e<0?0:e}class ft extends ut{constructor({postEvent:s,stableHeight:n,height:r,width:i,isExpanded:o}){super({height:C(r),isExpanded:o,stableHeight:C(n),width:C(i)});c(this,"postEvent");this.postEvent=s}async sync(s){const{isStateStable:n,...r}=await _t(s);this.set({...r,stableHeight:n?r.height:this.get("stableHeight")})}get height(){return this.get("height")}get stableHeight(){return this.get("stableHeight")}listen(){return g("viewport_changed",s=>{const{height:n,width:r,is_expanded:i,is_state_stable:o}=s,a=C(n);this.set({height:a,isExpanded:i,width:C(r),...o?{stableHeight:a}:{}})})}get isExpanded(){return this.get("isExpanded")}get width(){return this.get("width")}expand(){this.postEvent("web_app_expand"),this.set("isExpanded",!0)}get isStable(){return this.stableHeight===this.height}}async function fs(e,t={}){const{height:s,width:n,isExpanded:r,isStateStable:i}=await _t({...t,postEvent:e});return new ft({postEvent:e,height:s,width:n,isExpanded:r,stableHeight:i?s:0})}function gs({state:e,platform:t,postEvent:s}){let n=!1,r=0,i=0,o=0;return e?(n=e.isExpanded,r=e.height,i=e.width,o=e.stableHeight):["macos","tdesktop","unigram","webk","weba","web"].includes(t)&&(n=!0,r=window.innerHeight,i=window.innerWidth,o=window.innerHeight),new ft({postEvent:s,height:r,width:i,stableHeight:o,isExpanded:n})}const bs=d("viewport",async e=>{if(y()&&!e.state)throw f(Z,"Viewport cannot be instantiated on the server side without passing the ssr.state object.");let t=gs(e);return y()||(t.width===0&&await fs(e.postEvent,{timeout:1e3}).then(s=>t=s).catch(s=>O.error("Unable to sync viewport state",s)),t.listen()),t});function m(e,t){document.documentElement.style.setProperty(e,t)}function ws(e,t,s){s||(s=a=>`--tg-${a}-color`);const n=s("header"),r=s("bg"),i=()=>{const{headerColor:a}=e;if($(a))m(n,a);else{const{bgColor:p,secondaryBgColor:_}=t;a==="bg_color"&&p?m(n,p):a==="secondary_bg_color"&&_&&m(n,_)}m(r,e.bgColor)},o=[t.on("change",i),e.on("change",i)];return i(),()=>o.forEach(a=>a())}function ms(e,t){t||(t=n=>`--tg-theme-${n.replace(/[A-Z]/g,r=>`-${r.toLowerCase()}`)}`);const s=()=>{Object.entries(e.getState()).forEach(([n,r])=>{r&&m(t(n),r)})};return s(),e.on("change",s)}function ys(e,t){t||(t=_=>`--tg-viewport-${_}`);const[s,n,r]=["height","width","stable-height"].map(_=>t(_)),i=()=>m(s,`${e.height}px`),o=()=>m(n,`${e.width}px`),a=()=>m(r,`${e.stableHeight}px`),p=[e.on("change:height",i),e.on("change:width",o),e.on("change:stableHeight",a)];return i(),o(),a(),()=>p.forEach(_=>_())}function Es(e=!0){const t=[g("reload_iframe",()=>{S("iframe_will_reload"),window.location.reload()})],s=()=>t.forEach(n=>n());if(e){const n=document.createElement("style");n.id="telegram-custom-styles",document.head.appendChild(n),t.push(g("set_custom_style",r=>{n.innerHTML=r}),()=>document.head.removeChild(n))}return S("iframe_ready",{reload_supported:!0}),s}async function vs(){if(Bt(window))return!0;try{return await l({method:"web_app_request_theme",event:"theme_changed",timeout:100}),!0}catch{return!1}}function be(e){return e instanceof k}function Ps(e,t){return be(e)&&e.type===t}function W(e,t){let s,n,r;return typeof e=="string"?s=e:(s=e.pathname===void 0?t:e.pathname,n=e.params,r=e.id),Object.freeze({id:r||(Math.random()*2**14|0).toString(16),pathname:s,params:n})}class we{constructor(t,s,n=S){c(this,"history");c(this,"ee",new q);c(this,"attached",!1);c(this,"back",()=>this.go(-1));c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));if(this._index=s,this.postEvent=n,t.length===0)throw f(Nt,"History should not be empty.");if(s<0||s>=t.length)throw f(qt,"Index should not be zero and higher or equal than history size.");this.history=t.map(r=>W(r,""))}attach(){this.attached||(this.attached=!0,this.sync(),g("back_button_pressed",this.back))}get current(){return this.history[this.index]}detach(){this.attached=!1,D("back_button_pressed",this.back)}forward(){this.go(1)}go(t,s){const n=this.index+t,r=Math.min(Math.max(0,n),this.history.length-1);(n===r||s)&&this.replaceAndMove(r,this.history[r])}goTo(t,s){this.go(t-this.index,s)}get hasPrev(){return this.index>0}get hasNext(){return this.index!==this.history.length-1}get index(){return this._index}push(t){this.hasNext&&this.history.splice(this.index+1),this.replaceAndMove(this.index+1,W(t,this.current.pathname))}replace(t){this.replaceAndMove(this.index,W(t,this.current.pathname))}replaceAndMove(t,s){const n=t-this.index;if(!n&&this.current===s)return;const r=this.current;if(this.index!==t){const i=this._index;this._index=t,this.attached&&i>0!=t>0&&this.sync()}this.history[t]=s,this.ee.emit("change",{navigator:this,from:r,to:this.current,delta:n})}sync(){this.postEvent("web_app_setup_back_button",{is_visible:!!this.index})}}function G({params:e,...t}){return{...e||{hash:"",search:""},...t}}function I(e,t){return e.startsWith(t)?e:`${t}${e}`}function x(e){return new URL(typeof e=="string"?e:`${e.pathname||""}${I(e.search||"","?")}${I(e.hash||"","#")}`,"http://a")}function N(e){const t=typeof e=="string"?e.startsWith("/"):!!(e.pathname&&e.pathname.startsWith("/")),s=x(e);return`${t?s.pathname:s.pathname.slice(1)}${s.search}${s.hash}`}function j(e,t,s){let n,r;typeof e=="string"?n=e:(n=N(e),s=e.state,r=e.id);const{pathname:i,search:o,hash:a}=new URL(n,`http://a${I(t,"/")}`);return{id:r,pathname:i,params:{hash:a,search:o,state:s}}}async function A(e){return e===0?!0:Promise.race([new Promise(t=>{const s=Q("popstate",()=>{s(),t(!0)});window.history.go(e)}),new Promise(t=>{setTimeout(t,50,!1)})])}async function Ss(){if(window.history.length<=1||(window.history.pushState(null,""),await A(1-window.history.length)))return;let t=await A(-1);for(;t;)t=await A(-1)}function gt(e){return x(e).pathname}const vt=0,F=1,z=2;class bt{constructor(t,s,{postEvent:n,hashMode:r,base:i}={}){c(this,"navigator");c(this,"ee",new q);c(this,"hashMode");c(this,"base");c(this,"attached",!1);c(this,"onPopState",({state:t})=>{if(t===null)return this.push(this.parsePath(window.location.href));t===vt?window.history.forward():t===F&&this.back(),t===z&&this.forward()});c(this,"onNavigatorChange",async({to:t,from:s,delta:n})=>{this.attached&&await this.syncHistory(),this.ee.emit("change",{delta:n,from:G(s),to:G(t),navigator:this})});c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));this.navigator=new we(t.map(o=>j(o,"/")),s,n),this.navigator.on("change",this.onNavigatorChange),this.hashMode=r,this.base=gt(i||"")}async attach(){this.attached||(this.attached=!0,this.navigator.attach(),window.addEventListener("popstate",this.onPopState),await this.syncHistory())}back(){this.navigator.back()}detach(){this.attached=!1,this.navigator.detach(),window.removeEventListener("popstate",this.onPopState)}forward(){return this.navigator.forward()}get index(){return this.navigator.index}get id(){return this.navigator.current.id}go(t,s){return this.navigator.go(t,s)}goTo(t,s){this.navigator.goTo(t,s)}get hash(){return(this.navigator.current.params||{}).hash||""}get hasPrev(){return this.navigator.hasPrev}get hasNext(){return this.navigator.hasNext}get history(){return this.navigator.history.map(G)}get path(){return N(this)}get pathname(){return this.navigator.current.pathname}parsePath(t){let s=x(t);return this.hashMode&&(s=x(s.hash.slice(1))),{pathname:s.pathname,search:s.search,hash:s.hash}}push(t,s){const n=j(t,this.path),{state:r=s}=n.params;this.navigator.push({...n,params:{...n.params,state:r}})}replace(t,s){const n=j(t,this.path),{state:r=s}=n.params;this.navigator.replace({...n,params:{...n.params,state:r}})}renderPath(t){const s=(this.base.length===1?"":this.base)+I(N(t),"/");return this.hashMode?I(s.slice(1),this.hashMode==="default"?"#":"#/"):s}async syncHistory(){window.removeEventListener("popstate",this.onPopState);const{state:t}=this,s=this.renderPath(this);await Ss(),this.hasPrev&&this.hasNext?(window.history.replaceState(F,""),window.history.pushState(t,"",s),window.history.pushState(z,""),await A(-1)):this.hasPrev?(window.history.replaceState(F,""),window.history.pushState(t,"",s)):this.hasNext?(window.history.replaceState(t,s),window.history.pushState(z,""),await A(-1)):(window.history.replaceState(vt,""),window.history.pushState(t,"",s)),window.addEventListener("popstate",this.onPopState)}get search(){return(this.navigator.current.params||{}).search||""}get state(){return(this.navigator.current.params||{}).state}}function me(e){e||(e={});const{href:t,hash:s}=window.location;let n=N(e.hashMode?s.includes("?")?s.slice(1):`?${s.slice(1)}`:t);const r=e.base?gt(e.base):void 0;if(r){if(!n.startsWith(r))throw f(kt,`Path "${n}" expected to be starting with "${r}"`);n=n.slice(r.length)}return new bt([n],0,e)}function Rs(e){const t=e.match(/#(.+)/);return t?t[1]:null}function Ts(e,t){if(pt()){const s=sessionStorage.getItem(e);if(s)try{const{index:n,history:r}=JSON.parse(s);return new bt(r,n,t)}catch(n){console.error("Unable to restore hash navigator state.",n)}}return me(t)}function Cs(e,t){const s=Ts(e,t),n=()=>sessionStorage.setItem(e,JSON.stringify({index:s.index,history:s.history}));return s.on("change",n),n(),s}exports.BackButton=Gt;exports.BasicNavigator=we;exports.BiometryManager=Y;exports.BrowserNavigator=bt;exports.ClosingBehavior=ne;exports.CloudStorage=ie;exports.ERR_INVALID_PATH_BASE=kt;exports.ERR_INVOKE_CUSTOM_METHOD_RESPONSE=At;exports.ERR_METHOD_PARAMETER_UNSUPPORTED=Tt;exports.ERR_METHOD_UNSUPPORTED=Rt;exports.ERR_NAVIGATION_HISTORY_EMPTY=Nt;exports.ERR_NAVIGATION_INDEX_INVALID=qt;exports.ERR_NAVIGATION_ITEM_INVALID=Re;exports.ERR_PARSE=X;exports.ERR_SSR_INIT=Z;exports.ERR_TIMED_OUT=It;exports.ERR_UNEXPECTED_TYPE=xt;exports.ERR_UNKNOWN_ENV=Ct;exports.EventEmitter=q;exports.HapticFeedback=oe;exports.InitData=ae;exports.Invoice=ce;exports.MainButton=he;exports.MiniApp=ue;exports.Popup=le;exports.QRScanner=de;exports.SDKError=k;exports.SettingsButton=_e;exports.ThemeParams=fe;exports.Utils=ge;exports.Viewport=ft;exports.array=re;exports.bindMiniAppCSSVars=ws;exports.bindThemeParamsCSSVars=ms;exports.bindViewportCSSVars=ys;exports.boolean=w;exports.captureSameReq=nt;exports.classNames=B;exports.compareVersions=Mt;exports.createBrowserNavigatorFromLocation=me;exports.createPostEvent=Ut;exports.createSafeURL=x;exports.date=ct;exports.getHash=Rs;exports.getPathname=gt;exports.initBackButton=Je;exports.initBiometryManager=Qe;exports.initClosingBehavior=Ye;exports.initCloudStorage=Ze;exports.initHapticFeedback=ts;exports.initInitData=es;exports.initInvoice=ns;exports.initMainButton=rs;exports.initMiniApp=as;exports.initNavigator=Cs;exports.initPopup=hs;exports.initQRScanner=ps;exports.initSettingsButton=us;exports.initThemeParams=ls;exports.initUtils=_s;exports.initViewport=bs;exports.initWeb=Es;exports.invokeCustomMethod=P;exports.isColorDark=it;exports.isIframe=Ot;exports.isPageReload=pt;exports.isRGB=$;exports.isRGBShort=Vt;exports.isSDKError=be;exports.isSDKErrorOfType=Ps;exports.isSSR=y;exports.isTMA=vs;exports.json=u;exports.mergeClassNames=Be;exports.number=E;exports.off=D;exports.on=g;exports.parseInitData=ss;exports.parseLaunchParams=ht;exports.parseThemeParams=dt;exports.postEvent=S;exports.request=l;exports.requestBiometryInfo=se;exports.requestThemeParams=ds;exports.requestViewport=_t;exports.retrieveLaunchParams=te;exports.rgb=st;exports.searchParams=H;exports.serializeLaunchParams=Zt;exports.serializeThemeParams=Xt;exports.setCSSVar=m;exports.setDebug=Pe;exports.setTargetOrigin=Me;exports.string=h;exports.subscribe=St;exports.supports=v;exports.targetOrigin=$t;exports.toRGB=et;exports.unsubscribe=K;exports.urlToPath=N;exports.withTimeout=rt;
1
+ "use strict";var me=Object.defineProperty;var we=(e,t,s)=>t in e?me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var c=(e,t,s)=>(we(e,typeof t!="symbol"?t+"":t,s),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function wt(e,t){let s;const n=()=>{s!==void 0&&t&&t(s),s=void 0};return[()=>s===void 0?s=e(n):s,n]}function Q(e){const t=$(),{count:s}=t;t.unsubscribe(e),s&&!t.count&&ke()}function yt(e){return $().subscribe(e),()=>Q(e)}class ye{constructor(t,s={}){this.scope=t,this.options=s}print(t,...s){const n=new Date,r=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(n),{textColor:i,bgColor:a}=this.options,o="font-weight: bold;padding: 0 5px;border-radius:5px";console[t](`%c${r}%c / %c${this.scope}`,`${o};background-color: lightblue;color:black`,"",`${o};${i?`color:${i};`:""}${a?`background-color:${a}`:""}`,...s)}error(...t){this.print("error",...t)}log(...t){this.print("log",...t)}}const Y=new ye("SDK",{bgColor:"forestgreen",textColor:"white"});let z=!1;const ft=({event:e,args:[t]})=>{Y.log("Event received:",t===void 0?{name:e}:{name:e,data:t})};function Ee(e){z!==e&&(z=e,e?yt(ft):Q(ft))}function ve(...e){z&&Y.log(...e)}class N{constructor(){c(this,"listeners",new Map);c(this,"listenersCount",0);c(this,"subscribeListeners",[])}clear(){this.listeners.clear(),this.subscribeListeners=[]}get count(){return this.listenersCount+this.subscribeListeners.length}emit(t,...s){this.subscribeListeners.forEach(r=>r({event:t,args:s})),(this.listeners.get(t)||[]).forEach(([r,i])=>{r(...s),i&&this.off(t,r)})}on(t,s,n){let r=this.listeners.get(t);return r||this.listeners.set(t,r=[]),r.push([s,n]),this.listenersCount+=1,()=>this.off(t,s)}off(t,s){const n=this.listeners.get(t)||[];for(let r=0;r<n.length;r+=1)if(s===n[r][0]){n.splice(r,1),this.listenersCount-=1;return}}subscribe(t){return this.subscribeListeners.push(t),()=>this.unsubscribe(t)}unsubscribe(t){for(let s=0;s<this.subscribeListeners.length;s+=1)if(this.subscribeListeners[s]===t){this.subscribeListeners.splice(s,1);return}}}function J(e,t,s){return window.addEventListener(e,t,s),()=>window.removeEventListener(e,t,s)}class q extends Error{constructor(t,s,n){super(s,{cause:n}),this.type=t,Object.setPrototypeOf(this,q.prototype)}}function f(e,t,s){return new q(e,t,s)}const Et="ERR_METHOD_UNSUPPORTED",vt="ERR_METHOD_PARAMETER_UNSUPPORTED",Pt="ERR_UNKNOWN_ENV",St="ERR_INVOKE_CUSTOM_METHOD_RESPONSE",Rt="ERR_TIMED_OUT",Tt="ERR_UNEXPECTED_TYPE",K="ERR_PARSE",Ct="ERR_NAVIGATION_LIST_EMPTY",At="ERR_NAVIGATION_CURSOR_INVALID",Pe="ERR_NAVIGATION_ITEM_INVALID",Se="ERR_SSR_INIT",It="ERR_INVALID_PATH_BASE";function S(){return f(Tt,"Value has unexpected type")}class O{constructor(t,s,n){this.parser=t,this.isOptional=s,this.type=n}parse(t){if(!(this.isOptional&&t===void 0))try{return this.parser(t)}catch(s){throw f(K,`Unable to parse value${this.type?` as ${this.type}`:""}`,s)}}optional(){return this.isOptional=!0,this}}function R(e,t){return()=>new O(e,!1,t)}const m=R(e=>{if(typeof e=="boolean")return e;const t=String(e);if(t==="1"||t==="true")return!0;if(t==="0"||t==="false")return!1;throw S()},"boolean");function xt(e,t){const s={};for(const n in e){const r=e[n];if(!r)continue;let i,a;if(typeof r=="function"||"parse"in r)i=n,a=typeof r=="function"?r:r.parse.bind(r);else{const{type:o}=r;i=r.from||n,a=typeof o=="function"?o:o.parse.bind(o)}try{const o=a(t(i));o!==void 0&&(s[n]=o)}catch(o){throw f(K,`Unable to parse field "${n}"`,o)}}return s}function X(e){let t=e;if(typeof t=="string"&&(t=JSON.parse(t)),typeof t!="object"||t===null||Array.isArray(t))throw S();return t}function l(e,t){return new O(s=>{const n=X(s);return xt(e,r=>n[r])},!1,t)}const y=R(e=>{if(typeof e=="number")return e;if(typeof e=="string"){const t=Number(e);if(!Number.isNaN(t))return t}throw S()},"number");function L(e){return/^#[\da-f]{6}$/i.test(e)}function Nt(e){return/^#[\da-f]{3}$/i.test(e)}function Z(e){const t=e.replace(/\s/g,"").toLowerCase();if(L(t))return t;if(Nt(t)){let n="#";for(let r=0;r<3;r+=1)n+=t[1+r].repeat(2);return n}const s=t.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||t.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(!s)throw new Error(`Value "${e}" does not satisfy any of known RGB formats.`);return s.slice(1).reduce((n,r)=>{const i=parseInt(r,10).toString(16);return n+(i.length===1?"0":"")+i},"#")}const h=R(e=>{if(typeof e=="string"||typeof e=="number")return e.toString();throw S()},"string"),tt=R(e=>Z(h().parse(e)),"rgb");function Re(e){return l({eventType:h(),eventData:t=>t}).parse(e)}function Te(){["TelegramGameProxy_receiveEvent","TelegramGameProxy","Telegram"].forEach(e=>{delete window[e]})}function Ce(e,t){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:e,eventData:t}),source:window.parent}))}function Ae(){[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach(e=>{let t=window;e.forEach((s,n,r)=>{if(n===r.length-1){t[s]=Ce;return}s in t||(t[s]={}),t=t[s]})})}const Ie=l({button_id:e=>e==null?void 0:h().parse(e)}),xe={clipboard_text_received:l({req_id:h(),data:e=>e===null?e:h().optional().parse(e)}),custom_method_invoked:l({req_id:h(),result:e=>e,error:h().optional()}),invoice_closed:l({slug:h(),status:h()}),phone_requested:l({status:h()}),popup_closed:{parse:e=>Ie.parse(e??{})},qr_text_received:l({data:h().optional()}),theme_changed:l({theme_params:e=>{const t=tt().optional();return Object.entries(X(e)).reduce((s,[n,r])=>(s[n]=t.parse(r),s),{})}}),viewport_changed:l({height:y(),width:e=>e==null?window.innerWidth:y().parse(e),is_state_stable:m(),is_expanded:m()}),write_access_requested:l({status:h()})};function Ne(){const e=new N;Ae();let t=[Te,J("resize",()=>{e.emit("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})}),J("message",s=>{if(s.source!==window.parent)return;let n;try{n=Re(s.data)}catch{return}const{eventType:r,eventData:i}=n,a=xe[r];try{const o=a?a.parse(i):i;e.emit(...o?[r,o]:[r])}catch(o){Y.error(`An error occurred processing the "${r}" event from the Telegram application. Please, file an issue here: https://github.com/Telegram-Mini-Apps/tma.js/issues/new/choose`,n,o)}}),()=>e.clear()];return[e,()=>{t.forEach(s=>s()),t=[]}]}const[qe,ke]=wt(e=>{const[t,s]=Ne(),n=t.off.bind(t);return t.off=(r,i)=>{const{count:a}=t;n(r,i),a&&!t.count&&e()},[t,s]},([,e])=>e());function $(){return qe()[0]}function k(e,t){$().off(e,t)}function g(e,t,s){return $().on(e,t,s)}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qt(e,t){const s=e.split("."),n=t.split("."),r=Math.max(s.length,n.length);for(let i=0;i<r;i+=1){const a=parseInt(s[i]||"0",10),o=parseInt(n[i]||"0",10);if(a!==o)return a>o?1:-1}return 0}function b(e,t){return qt(e,t)<=0}function E(e,t,s){if(typeof s=="string"){if(e==="web_app_open_link"&&t==="try_instant_view")return b("6.4",s);if(e==="web_app_set_header_color"&&t==="color")return b("6.9",s)}switch(e){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return b("6.1",t);case"web_app_open_popup":return b("6.2",t);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return b("6.4",t);case"web_app_switch_inline_query":return b("6.7",t);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return b("6.9",t);case"web_app_setup_settings_button":return b("6.10",t);case"web_app_biometry_get_info":case"web_app_biometry_open_settings":case"web_app_biometry_request_access":case"web_app_biometry_request_auth":case"web_app_biometry_update_token":return b("7.2",t);default:return["iframe_ready","iframe_will_reload","web_app_close","web_app_data_send","web_app_expand","web_app_open_link","web_app_ready","web_app_request_theme","web_app_request_viewport","web_app_setup_main_button","web_app_setup_closing_behavior"].includes(e)}}function De(e){return"external"in e&&D(e.external)&&"notify"in e.external&&typeof e.external.notify=="function"}function kt(e){return"TelegramWebviewProxy"in e&&D(e.TelegramWebviewProxy)&&"postEvent"in e.TelegramWebviewProxy&&typeof e.TelegramWebviewProxy.postEvent=="function"}function Dt(){try{return window.self!==window.top}catch{return!0}}let Vt="https://web.telegram.org";function Ve(e){Vt=e}function Mt(){return Vt}function P(e,t,s){let n={},r;t===void 0&&s===void 0?n={}:t!==void 0&&s!==void 0?(n=s,r=t):t!==void 0&&("targetOrigin"in t?n=t:r=t);const{targetOrigin:i=Mt()}=n;if(ve("Posting event:",r?{event:e,data:r}:{event:e}),Dt()){window.parent.postMessage(JSON.stringify({eventType:e,eventData:r}),i);return}if(De(window)){window.external.notify(JSON.stringify({eventType:e,eventData:r}));return}if(kt(window)){window.TelegramWebviewProxy.postEvent(e,JSON.stringify(r));return}throw f(Pt,"Unable to determine current environment and possible way to send event. You are probably trying to use Mini Apps method outside of Telegram application environment.")}function Bt(e){return(t,s)=>{if(!E(t,e))throw f(Et,`Method "${t}" is unsupported in Mini Apps version ${e}`);if(D(s)){let n;if(t==="web_app_open_link"&&"try_instant_view"in s?n="try_instant_view":t==="web_app_set_header_color"&&"color"in s&&(n="color"),n&&!E(t,n,e))throw f(vt,`Parameter "${n}" of "${t}" method is unsupported in Mini Apps version ${e}`)}return P(t,s)}}function et(e){return({req_id:t})=>t===e}function Ot(e){return f(Rt,`Timeout reached: ${e}ms`)}function st(e,t){return Promise.race([typeof e=="function"?e():e,new Promise((s,n)=>{setTimeout(()=>{n(Ot(t))},t)})])}async function d(e){let t;const s=new Promise(u=>{t=u}),{method:n,event:r,capture:i,postEvent:a=P,timeout:o}=e,p=(Array.isArray(r)?r:[r]).map(u=>g(u,M=>(!i||i(M))&&t(M)));try{return a(n,e.params),await(o?st(s,o):s)}finally{p.forEach(u=>u())}}async function v(e,t,s,n={}){const{result:r,error:i}=await d({...n,method:"web_app_invoke_custom_method",event:"custom_method_invoked",params:{method:e,params:t,req_id:s},capture:et(s)});if(i)throw f(St,i);return r}function B(...e){return e.map(t=>{if(typeof t=="string")return t;if(D(t))return B(Object.entries(t).map(s=>s[1]&&s[0]));if(Array.isArray(t))return B(...t)}).filter(Boolean).join(" ")}function Me(...e){return e.reduce((t,s)=>(D(s)&&Object.entries(s).forEach(([n,r])=>{const i=B(t[n],r);i.length&&(t[n]=i)}),t),{})}function nt(e){const t=Z(e);return Math.sqrt([.299,.587,.114].reduce((s,n,r)=>{const i=parseInt(t.slice(1+r*2,1+(r+1)*2),16);return s+i*i*n},0))<120}class Be{constructor(t){c(this,"ee",new N);c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));this.state=t}clone(){return{...this.state}}set(t,s){Object.entries(typeof t=="string"?{[t]:s}:t).reduce((r,[i,a])=>this.state[i]===a||a===void 0?r:(this.state[i]=a,this.ee.emit(`change:${i}`,a),!0),!1)&&this.ee.emit("change",this.state)}get(t){return this.state[t]}}class rt{constructor(t){c(this,"state");c(this,"get");c(this,"set");c(this,"clone");this.state=new Be(t),this.set=this.state.set.bind(this.state),this.get=this.state.get.bind(this.state),this.clone=this.state.clone.bind(this.state)}}function Lt(e,t){return s=>E(t[s],e)}class it extends rt{constructor(s,n,r){super(s);c(this,"supports");this.supports=Lt(n,r)}}class $t extends it{constructor(s,n,r){super({isVisible:s},n,{show:"web_app_setup_back_button",hide:"web_app_setup_back_button"});c(this,"on",(s,n)=>s==="click"?g("back_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?k("back_button_pressed",n):this.state.off(s,n));this.postEvent=r}set isVisible(s){this.set("isVisible",s),this.postEvent("web_app_setup_back_button",{is_visible:s})}get isVisible(){return this.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}const ot=R(e=>e instanceof Date?e:new Date(y().parse(e)*1e3),"Date");function U(e,t){return new O(s=>{if(typeof s!="string"&&!(s instanceof URLSearchParams))throw S();const n=typeof s=="string"?new URLSearchParams(s):s;return xt(e,r=>{const i=n.get(r);return i===null?void 0:i})},!1,t)}const Oe=l({id:y(),type:h(),title:h(),photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"Chat").optional(),gt=l({addedToAttachmentMenu:{type:m().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:m().optional(),from:"allows_write_to_pm"},firstName:{type:h(),from:"first_name"},id:y(),isBot:{type:m().optional(),from:"is_bot"},isPremium:{type:m().optional(),from:"is_premium"},languageCode:{type:h().optional(),from:"language_code"},lastName:{type:h().optional(),from:"last_name"},photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"User").optional();function Ut(){return U({authDate:{type:ot(),from:"auth_date"},canSendAfter:{type:y().optional(),from:"can_send_after"},chat:Oe,chatInstance:{type:h().optional(),from:"chat_instance"},chatType:{type:h().optional(),from:"chat_type"},hash:h(),queryId:{type:h().optional(),from:"query_id"},receiver:gt,startParam:{type:h().optional(),from:"start_param"},user:gt},"InitData")}function Le(e){return e.replace(/_[a-z]/g,t=>t[1].toUpperCase())}function $e(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}const Ht=R(e=>{const t=tt().optional();return Object.entries(X(e)).reduce((s,[n,r])=>(s[Le(n)]=t.parse(r),s),{})},"ThemeParams");function at(e){return U({botInline:{type:m().optional(),from:"tgWebAppBotInline"},initData:{type:Ut().optional(),from:"tgWebAppData"},initDataRaw:{type:h().optional(),from:"tgWebAppData"},platform:{type:h(),from:"tgWebAppPlatform"},showSettings:{type:m().optional(),from:"tgWebAppShowSettings"},startParam:{type:h().optional(),from:"tgWebAppStartParam"},themeParams:{type:Ht(),from:"tgWebAppThemeParams"},version:{type:h(),from:"tgWebAppVersion"}}).parse(e)}function Wt(e){return at(e.replace(/^[^?#]*[?#]/,"").replace(/[?#]/g,"&"))}function Ue(){return Wt(window.location.href)}function Gt(){return performance.getEntriesByType("navigation")[0]}function He(){const e=Gt();if(!e)throw new Error("Unable to get first navigation entry.");return Wt(e.name)}function jt(e){return`tma.js/${e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}`}function Ft(e,t){sessionStorage.setItem(jt(e),JSON.stringify(t))}function zt(e){const t=sessionStorage.getItem(jt(e));try{return t?JSON.parse(t):void 0}catch{}}function We(){return at(zt("launchParams")||"")}function Jt(e){return JSON.stringify(Object.fromEntries(Object.entries(e).map(([t,s])=>[$e(t),s])))}function Qt(e){const{initDataRaw:t,themeParams:s,platform:n,version:r,showSettings:i,startParam:a,botInline:o}=e,p=new URLSearchParams;return p.set("tgWebAppPlatform",n),p.set("tgWebAppThemeParams",Jt(s)),p.set("tgWebAppVersion",r),t&&p.set("tgWebAppData",t),a&&p.set("tgWebAppStartParam",a),typeof i=="boolean"&&p.set("tgWebAppShowSettings",i?"1":"0"),typeof o=="boolean"&&p.set("tgWebAppBotInline",o?"1":"0"),p.toString()}function Ge(e){Ft("launchParams",Qt(e))}function Yt(){for(const e of[Ue,He,We])try{const t=e();return Ge(t),t}catch{}throw new Error("Unable to retrieve launch parameters from any known source.")}function ct(){const e=Gt();return!!(e&&e.type==="reload")}function je(){let e=0;return()=>(e+=1).toString()}function Fe(){let e=!1;const t=[];return[s=>!e&&t.push(s),()=>{e||(e=!0,t.forEach(s=>s()))},e]}const[ze]=wt(je);function _(e,t){return()=>{const s=Yt(),n={...s,postEvent:Bt(s.version),createRequestId:ze()};if(typeof e=="function")return e(n);const[r,i,a]=Fe(),o=t({...n,state:ct()?zt(e):void 0,addCleanup:r}),p=u=>(a||r(u.on("change",M=>{Ft(e,M)})),u);return[o instanceof Promise?o.then(p):p(o),i]}}const Je=_("backButton",({postEvent:e,version:t,state:s={isVisible:!1}})=>new $t(s.isVisible,t,e));class V extends it{constructor(){super(...arguments);c(this,"on",this.state.on.bind(this.state));c(this,"off",this.state.off.bind(this.state))}}function Kt(e){const t=e.available?e:{available:!1,device_id:"",token_saved:!1,access_requested:!1,access_granted:!1,type:""};return{available:!0,type:t.type,deviceId:t.device_id,tokenSaved:t.token_saved,accessRequested:t.access_requested,accessGranted:t.access_granted}}class Xt extends V{constructor({postEvent:s,version:n,...r}){super(r,n,{auth:"web_app_biometry_request_auth",openSettings:"web_app_biometry_open_settings",requestAccess:"web_app_biometry_request_access",updateToken:"web_app_biometry_update_token"});c(this,"postEvent");c(this,"authPromise");c(this,"accessPromise");this.postEvent=s}get available(){return this.get("available")}get accessGranted(){return this.get("accessGranted")}get accessRequested(){return this.get("accessRequested")}async authenticate({reason:s,...n}){return this.authPromise||(this.authPromise=d({...n,method:"web_app_biometry_request_auth",event:"biometry_auth_requested",postEvent:this.postEvent,params:{reason:(s||"").trim()}}).then(({token:r})=>r).finally(()=>this.authPromise=void 0)),this.authPromise}get deviceId(){return this.get("deviceId")}openSettings(){this.postEvent("web_app_biometry_open_settings")}requestAccess({reason:s,...n}={}){return this.accessPromise||(this.accessPromise=d({...n,postEvent:this.postEvent,method:"web_app_biometry_request_access",event:"biometry_info_received",params:{reason:s||""}}).then(r=>{const i=Kt(r);return this.set(i),i.accessGranted}).finally(()=>this.accessPromise=void 0)),this.accessPromise}get biometryType(){return this.get("biometryType")}get tokenSaved(){return this.get("tokenSaved")}async updateToken({token:s,...n}={}){return["removed","updated"].includes((await d({...n,postEvent:this.postEvent,method:"web_app_biometry_update_token",event:"biometry_token_updated",params:{token:s||""}})).status)}}async function Zt(e){return Kt(await d({...e||{},method:"web_app_biometry_get_info",event:"biometry_info_received"}))}const Qe=_("biometryManager",async({postEvent:e,version:t,state:s})=>new Xt({...s||await Zt({timeout:1e3}),version:t,postEvent:e}));class ht extends rt{constructor(){super(...arguments);c(this,"on",this.state.on.bind(this.state));c(this,"off",this.state.off.bind(this.state))}}class te extends ht{constructor(t,s){super({isConfirmationNeeded:t}),this.postEvent=s}set isConfirmationNeeded(t){this.set("isConfirmationNeeded",t),this.postEvent("web_app_setup_closing_behavior",{need_confirmation:t})}get isConfirmationNeeded(){return this.get("isConfirmationNeeded")}disableConfirmation(){this.isConfirmationNeeded=!1}enableConfirmation(){this.isConfirmationNeeded=!0}}const Ye=_("closingBehavior",({postEvent:e,state:t={isConfirmationNeeded:!1}})=>new te(t.isConfirmationNeeded,e));class pt{constructor(t,s){c(this,"supports");this.supports=Lt(t,s)}}function Ke(e){if(Array.isArray(e))return e;if(typeof e=="string")try{const t=JSON.parse(e);if(Array.isArray(t))return t}catch{}throw S()}class Xe extends O{constructor(s,n,r){super(Ke,n,r);c(this,"itemParser");this.itemParser=typeof s=="function"?s:s.parse.bind(s)}parse(s){const n=super.parse(s);return n===void 0?n:n.map(this.itemParser)}of(s){return this.itemParser=typeof s=="function"?s:s.parse.bind(s),this}}function ee(e){return new Xe(t=>t,!1,e)}function bt(e,t){return Object.fromEntries(e.map(s=>[s,t]))}class se extends pt{constructor(t,s,n){super(t,{delete:"web_app_invoke_custom_method",get:"web_app_invoke_custom_method",getKeys:"web_app_invoke_custom_method",set:"web_app_invoke_custom_method"}),this.createRequestId=s,this.postEvent=n}async delete(t,s={}){const n=Array.isArray(t)?t:[t];n.length&&await v("deleteStorageValues",{keys:n},this.createRequestId(),{...s,postEvent:this.postEvent})}async getKeys(t={}){return ee().of(h()).parse(await v("getStorageKeys",{},this.createRequestId(),{...t,postEvent:this.postEvent}))}async get(t,s={}){const n=Array.isArray(t)?t:[t];if(!n.length)return bt(n,"");const r=await v("getStorageValues",{keys:n},this.createRequestId(),{...s,postEvent:this.postEvent}),i=l(bt(n,h()),"CloudStorageData").parse(r);return Array.isArray(t)?i:i[t]}async set(t,s,n={}){await v("saveStorageValue",{key:t,value:s},this.createRequestId(),{...n,postEvent:this.postEvent})}}const Ze=_(({createRequestId:e,postEvent:t,version:s})=>new se(s,e,t));class ne extends pt{constructor(t,s){super(t,{impactOccurred:"web_app_trigger_haptic_feedback",notificationOccurred:"web_app_trigger_haptic_feedback",selectionChanged:"web_app_trigger_haptic_feedback"}),this.postEvent=s}impactOccurred(t){this.postEvent("web_app_trigger_haptic_feedback",{type:"impact",impact_style:t})}notificationOccurred(t){this.postEvent("web_app_trigger_haptic_feedback",{type:"notification",notification_type:t})}selectionChanged(){this.postEvent("web_app_trigger_haptic_feedback",{type:"selection_change"})}}const ts=_(({version:e,postEvent:t})=>new ne(e,t));class re{constructor(t){this.initData=t}get authDate(){return this.initData.authDate}get canSendAfter(){return this.initData.canSendAfter}get canSendAfterDate(){const{canSendAfter:t}=this;return t?new Date(this.authDate.getTime()+t*1e3):void 0}get chat(){return this.initData.chat}get chatType(){return this.initData.chatType}get chatInstance(){return this.initData.chatInstance}get hash(){return this.initData.hash}get queryId(){return this.initData.queryId}get receiver(){return this.initData.receiver}get startParam(){return this.initData.startParam}get user(){return this.initData.user}}const es=_(({initData:e})=>e?new re(e):void 0);function ss(e){return Ut().parse(e)}class ie extends V{constructor(t,s,n){super({isOpened:t},s,{open:"web_app_open_invoice"}),this.postEvent=n}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t,s){if(this.isOpened)throw new Error("Invoice is already opened");let n;if(!s)n=t;else{const{hostname:r,pathname:i}=new URL(t,window.location.href);if(r!=="t.me")throw new Error(`Incorrect hostname: ${r}`);const a=i.match(/^\/(\$|invoice\/)([A-Za-z0-9\-_=]+)$/);if(!a)throw new Error('Link pathname has incorrect format. Expected to receive "/invoice/{slug}" or "/${slug}"');[,,n]=a}this.isOpened=!0;try{return(await d({method:"web_app_open_invoice",event:"invoice_closed",params:{slug:n},postEvent:this.postEvent,capture(i){return n===i.slug}})).status}finally{this.isOpened=!1}}}const ns=_(({version:e,postEvent:t})=>new ie(!1,e,t));class oe extends rt{constructor({postEvent:s,...n}){super(n);c(this,"postEvent");c(this,"on",(s,n)=>s==="click"?g("main_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?k("main_button_pressed",n):this.state.off(s,n));this.postEvent=s}commit(){this.text!==""&&this.postEvent("web_app_setup_main_button",{is_visible:this.isVisible,is_active:this.isEnabled,is_progress_visible:this.isLoaderVisible,text:this.text,color:this.backgroundColor,text_color:this.textColor})}set isEnabled(s){this.setParams({isEnabled:s})}get isEnabled(){return this.get("isEnabled")}set isLoaderVisible(s){this.setParams({isLoaderVisible:s})}get isLoaderVisible(){return this.get("isLoaderVisible")}set isVisible(s){this.setParams({isVisible:s})}get isVisible(){return this.get("isVisible")}get backgroundColor(){return this.get("backgroundColor")}get text(){return this.get("text")}get textColor(){return this.get("textColor")}disable(){return this.isEnabled=!1,this}enable(){return this.isEnabled=!0,this}hide(){return this.isVisible=!1,this}hideLoader(){return this.isLoaderVisible=!1,this}show(){return this.isVisible=!0,this}showLoader(){return this.isLoaderVisible=!0,this}setText(s){return this.setParams({text:s})}setTextColor(s){return this.setParams({textColor:s})}setBackgroundColor(s){return this.setParams({backgroundColor:s})}setParams(s){return this.set(s),this.commit(),this}}const rs=_("mainButton",({postEvent:e,themeParams:t,state:s={isVisible:!1,isEnabled:!1,text:"",isLoaderVisible:!1,textColor:t.buttonTextColor||"#ffffff",backgroundColor:t.buttonColor||"#000000"}})=>new oe({...s,postEvent:e}));function is(){return U({contact:l({userId:{type:y(),from:"user_id"},phoneNumber:{type:h(),from:"phone_number"},firstName:{type:h(),from:"first_name"},lastName:{type:h().optional(),from:"last_name"}}),authDate:{type:ot(),from:"auth_date"},hash:h()},"RequestedContact")}function ae(e,t){return s=>{const[n,r]=t[s];return E(n,r,e)}}function os(e){return new Promise(t=>{setTimeout(t,e)})}class ce extends V{constructor({postEvent:s,createRequestId:n,version:r,botInline:i,...a}){super(a,r,{requestPhoneAccess:"web_app_request_phone",requestWriteAccess:"web_app_request_write_access",switchInlineQuery:"web_app_switch_inline_query",setHeaderColor:"web_app_set_header_color",setBackgroundColor:"web_app_set_background_color"});c(this,"botInline");c(this,"postEvent");c(this,"createRequestId");c(this,"requestPhoneAccessPromise");c(this,"requestWriteAccessPromise");c(this,"supportsParam");this.createRequestId=n,this.postEvent=s,this.botInline=i;const o=this.supports.bind(this);this.supports=p=>o(p)?p!=="switchInlineQuery"||i:!1,this.supportsParam=ae(r,{"setHeaderColor.color":["web_app_set_header_color","color"]})}async getRequestedContact({timeout:s=1e4}={}){return is().parse(await v("getRequestedContact",{},this.createRequestId(),{postEvent:this.postEvent,timeout:s}))}get bgColor(){return this.get("bgColor")}close(){this.postEvent("web_app_close")}get headerColor(){return this.get("headerColor")}get isBotInline(){return this.botInline}get isDark(){return nt(this.bgColor)}ready(){this.postEvent("web_app_ready")}async requestContact({timeout:s=5e3}={}){try{return await this.getRequestedContact()}catch{}if(await this.requestPhoneAccess()!=="sent")throw new Error("Access denied.");const r=Date.now()+s;let i=50;return st(async()=>{for(;Date.now()<r;){try{return await this.getRequestedContact()}catch{}await os(i),i+=50}throw Ot(s)},s)}async requestPhoneAccess(s={}){return this.requestPhoneAccessPromise||(this.requestPhoneAccessPromise=d({...s,method:"web_app_request_phone",event:"phone_requested",postEvent:this.postEvent}).then(({status:n})=>n).finally(()=>this.requestPhoneAccessPromise=void 0)),this.requestPhoneAccessPromise}async requestWriteAccess(s={}){return this.requestWriteAccessPromise||(this.requestWriteAccessPromise=d({...s,method:"web_app_request_write_access",event:"write_access_requested",postEvent:this.postEvent}).then(({status:n})=>n).finally(()=>this.requestWriteAccessPromise=void 0)),this.requestWriteAccessPromise}sendData(s){const{size:n}=new Blob([s]);if(!n||n>4096)throw new Error(`Passed data has incorrect size: ${n}`);this.postEvent("web_app_data_send",{data:s})}setHeaderColor(s){this.postEvent("web_app_set_header_color",L(s)?{color:s}:{color_key:s}),this.set("headerColor",s)}setBgColor(s){this.postEvent("web_app_set_background_color",{color:s}),this.set("bgColor",s)}switchInlineQuery(s,n=[]){if(!this.supports("switchInlineQuery")&&!this.isBotInline)throw new Error("Method is unsupported because Mini App should be launched in inline mode.");this.postEvent("web_app_switch_inline_query",{query:s,chat_types:n})}}const as=_("miniApp",({themeParams:e,botInline:t=!1,state:s={bgColor:e.bgColor||"#ffffff",headerColor:e.headerBgColor||"#000000"},...n})=>new ce({...n,...s,botInline:t}));function cs(e){const t=e.message.trim(),s=(e.title||"").trim(),n=e.buttons||[];let r;if(s.length>64)throw new Error(`Title has incorrect size: ${s.length}`);if(!t.length||t.length>256)throw new Error(`Message has incorrect size: ${t.length}`);if(n.length>3)throw new Error(`Buttons have incorrect size: ${n.length}`);return n.length?r=n.map(i=>{const{id:a=""}=i;if(a.length>64)throw new Error(`Button ID has incorrect size: ${a}`);if(!i.type||i.type==="default"||i.type==="destructive"){const o=i.text.trim();if(!o.length||o.length>64){const p=i.type||"default";throw new Error(`Button text with type "${p}" has incorrect size: ${i.text.length}`)}return{...i,text:o,id:a}}return{...i,id:a}}):r=[{type:"close",id:""}],{title:s,message:t,buttons:r}}class he extends V{constructor(t,s,n){super({isOpened:t},s,{open:"web_app_open_popup"}),this.postEvent=n}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t){if(this.isOpened)throw new Error("Popup is already opened.");this.isOpened=!0;try{const{button_id:s=null}=await d({event:"popup_closed",method:"web_app_open_popup",postEvent:this.postEvent,params:cs(t)});return s}finally{this.isOpened=!1}}}const hs=_(({postEvent:e,version:t})=>new he(!1,t,e));class pe extends V{constructor(t,s,n){super({isOpened:t},s,{close:"web_app_close_scan_qr_popup",open:"web_app_open_scan_qr_popup"}),this.postEvent=n}close(){this.postEvent("web_app_close_scan_qr_popup"),this.isOpened=!1}set isOpened(t){this.set("isOpened",t)}get isOpened(){return this.get("isOpened")}async open(t){if(this.isOpened)throw new Error("QR scanner is already opened.");this.isOpened=!0;try{return(await d({method:"web_app_open_scan_qr_popup",event:["qr_text_received","scan_qr_popup_closed"],postEvent:this.postEvent,params:{text:t}})||{}).data||null}finally{this.isOpened=!1}}}const ps=_(({version:e,postEvent:t})=>new pe(!1,e,t));class ue extends it{constructor(s,n,r){super({isVisible:s},n,{show:"web_app_setup_settings_button",hide:"web_app_setup_settings_button"});c(this,"on",(s,n)=>s==="click"?g("settings_button_pressed",n):this.state.on(s,n));c(this,"off",(s,n)=>s==="click"?k("settings_button_pressed",n):this.state.off(s,n));this.postEvent=r}set isVisible(s){this.set("isVisible",s),this.postEvent("web_app_setup_settings_button",{is_visible:s})}get isVisible(){return this.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}const us=_("settingsButton",({version:e,postEvent:t,state:s={isVisible:!1}})=>new ue(s.isVisible,e,t));function ut(e){return Ht().parse(e)}class le extends ht{get accentTextColor(){return this.get("accentTextColor")}get bgColor(){return this.get("bgColor")}get buttonColor(){return this.get("buttonColor")}get buttonTextColor(){return this.get("buttonTextColor")}get destructiveTextColor(){return this.get("destructiveTextColor")}getState(){return this.clone()}get headerBgColor(){return this.get("headerBgColor")}get hintColor(){return this.get("hintColor")}get isDark(){return!this.bgColor||nt(this.bgColor)}get linkColor(){return this.get("linkColor")}get secondaryBgColor(){return this.get("secondaryBgColor")}get sectionBgColor(){return this.get("sectionBgColor")}get sectionHeaderTextColor(){return this.get("sectionHeaderTextColor")}listen(){return g("theme_changed",t=>{this.set(ut(t.theme_params))})}get subtitleTextColor(){return this.get("subtitleTextColor")}get textColor(){return this.get("textColor")}}const ls=_("themeParams",({themeParams:e,state:t=e,addCleanup:s})=>{const n=new le(t);return s(n.listen()),n});function ds(e={}){return d({...e,method:"web_app_request_theme",event:"theme_changed"}).then(ut)}class de extends pt{constructor(s,n,r){super(s,{readTextFromClipboard:"web_app_read_text_from_clipboard"});c(this,"supportsParam");this.version=s,this.createRequestId=n,this.postEvent=r,this.supportsParam=ae(s,{"openLink.tryInstantView":["web_app_open_link","try_instant_view"]})}openLink(s,n){const r=new URL(s,window.location.href).toString();if(!E("web_app_open_link",this.version)){window.open(r,"_blank");return}this.postEvent("web_app_open_link",{url:r,...typeof n=="boolean"?{try_instant_view:n}:{}})}openTelegramLink(s){const{hostname:n,pathname:r,search:i}=new URL(s,window.location.href);if(n!=="t.me")throw new Error(`URL has not allowed hostname: ${n}. Only "t.me" is allowed`);if(!E("web_app_open_tg_link",this.version)){window.location.href=s;return}this.postEvent("web_app_open_tg_link",{path_full:r+i})}async readTextFromClipboard(){const s=this.createRequestId(),{data:n=null}=await d({method:"web_app_read_text_from_clipboard",event:"clipboard_text_received",postEvent:this.postEvent,params:{req_id:s},capture:et(s)});return n}}const _s=_(({version:e,postEvent:t,createRequestId:s})=>new de(e,s,t));async function lt(e={}){const{is_expanded:t,is_state_stable:s,...n}=await d({...e,method:"web_app_request_viewport",event:"viewport_changed"});return{...n,isExpanded:t,isStateStable:s}}function T(e){return e<0?0:e}class _e extends ht{constructor({postEvent:s,stableHeight:n,height:r,width:i,isExpanded:a}){super({height:T(r),isExpanded:a,stableHeight:T(n),width:T(i)});c(this,"postEvent");this.postEvent=s}async sync(s){const{isStateStable:n,...r}=await lt(s);this.set({...r,stableHeight:n?r.height:this.get("stableHeight")})}get height(){return this.get("height")}get stableHeight(){return this.get("stableHeight")}listen(){return g("viewport_changed",s=>{const{height:n,width:r,is_expanded:i,is_state_stable:a}=s,o=T(n);this.set({height:o,isExpanded:i,width:T(r),...a?{stableHeight:o}:{}})})}get isExpanded(){return this.get("isExpanded")}get width(){return this.get("width")}expand(){this.postEvent("web_app_expand"),this.set("isExpanded",!0)}get isStable(){return this.stableHeight===this.height}}const fs=_("viewport",async({state:e,platform:t,postEvent:s,addCleanup:n})=>{let r=!1,i=0,a=0,o=0;if(e)r=e.isExpanded,i=e.height,a=e.width,o=e.stableHeight;else if(["macos","tdesktop","unigram","webk","weba","web"].includes(t))r=!0,i=window.innerHeight,a=window.innerWidth,o=window.innerHeight;else{const u=await lt({timeout:1e3,postEvent:s});r=u.isExpanded,i=u.height,a=u.width,o=u.isStateStable?i:0}const p=new _e({postEvent:s,height:i,width:a,stableHeight:o,isExpanded:r});return n(p.listen()),p});function w(e,t){document.documentElement.style.setProperty(e,t)}function gs(e,t,s){s||(s=o=>`--tg-${o}-color`);const n=s("header"),r=s("bg"),i=()=>{const{headerColor:o}=e;if(L(o))w(n,o);else{const{bgColor:p,secondaryBgColor:u}=t;o==="bg_color"&&p?w(n,p):o==="secondary_bg_color"&&u&&w(n,u)}w(r,e.bgColor)},a=[t.on("change",i),e.on("change",i)];return i(),()=>a.forEach(o=>o())}function bs(e,t){t||(t=n=>`--tg-theme-${n.replace(/[A-Z]/g,r=>`-${r.toLowerCase()}`)}`);const s=()=>{Object.entries(e.getState()).forEach(([n,r])=>{r&&w(t(n),r)})};return s(),e.on("change",s)}function ms(e,t){t||(t=u=>`--tg-viewport-${u}`);const[s,n,r]=["height","width","stable-height"].map(u=>t(u)),i=()=>w(s,`${e.height}px`),a=()=>w(n,`${e.width}px`),o=()=>w(r,`${e.stableHeight}px`),p=[e.on("change:height",i),e.on("change:width",a),e.on("change:stableHeight",o)];return i(),a(),o(),()=>p.forEach(u=>u())}function ws(e=!0){const t=[g("reload_iframe",()=>{P("iframe_will_reload"),window.location.reload()})],s=()=>t.forEach(n=>n());if(e){const n=document.createElement("style");n.id="telegram-custom-styles",document.head.appendChild(n),t.push(g("set_custom_style",r=>{n.innerHTML=r}),()=>document.head.removeChild(n))}return P("iframe_ready",{reload_supported:!0}),s}function ys(){return typeof window>"u"}async function Es(){if(kt(window))return!0;try{return await d({method:"web_app_request_theme",event:"theme_changed",timeout:100}),!0}catch{return!1}}function fe(e){return e instanceof q}function vs(e,t){return fe(e)&&e.type===t}function H(e,t){let s,n,r;return typeof e=="string"?s=e:(s=e.pathname===void 0?t:e.pathname,n=e.params,r=e.id),Object.freeze({id:r||(Math.random()*2**14|0).toString(16),pathname:s,params:n})}class ge{constructor(t,s,n=P){c(this,"history");c(this,"ee",new N);c(this,"attached",!1);c(this,"back",()=>this.go(-1));c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));if(this._index=s,this.postEvent=n,t.length===0)throw f(Ct,"History should not be empty.");if(s<0||s>=t.length)throw f(At,"Index should not be zero and higher or equal than history size.");this.history=t.map(r=>H(r,""))}attach(){this.attached||(this.attached=!0,this.sync(),g("back_button_pressed",this.back))}get current(){return this.history[this.index]}detach(){this.attached=!1,k("back_button_pressed",this.back)}forward(){this.go(1)}go(t,s){const n=this.index+t,r=Math.min(Math.max(0,n),this.history.length-1);(n===r||s)&&this.replaceAndMove(r,this.history[r])}goTo(t,s){this.go(t-this.index,s)}get hasPrev(){return this.index>0}get hasNext(){return this.index!==this.history.length-1}get index(){return this._index}push(t){this.hasNext&&this.history.splice(this.index+1),this.replaceAndMove(this.index+1,H(t,this.current.pathname))}replace(t){this.replaceAndMove(this.index,H(t,this.current.pathname))}replaceAndMove(t,s){const n=t-this.index;if(!n&&this.current===s)return;const r=this.current;if(this.index!==t){const i=this._index;this._index=t,this.attached&&i>0!=t>0&&this.sync()}this.history[t]=s,this.ee.emit("change",{navigator:this,from:r,to:this.current,delta:n})}sync(){this.postEvent("web_app_setup_back_button",{is_visible:!!this.index})}}function W({params:e,...t}){return{...e||{hash:"",search:""},...t}}function A(e,t){return e.startsWith(t)?e:`${t}${e}`}function I(e){return new URL(typeof e=="string"?e:`${e.pathname||""}${A(e.search||"","?")}${A(e.hash||"","#")}`,"http://a")}function x(e){const t=typeof e=="string"?e.startsWith("/"):!!(e.pathname&&e.pathname.startsWith("/")),s=I(e);return`${t?s.pathname:s.pathname.slice(1)}${s.search}${s.hash}`}function G(e,t,s){let n,r;typeof e=="string"?n=e:(n=x(e),s=e.state,r=e.id);const{pathname:i,search:a,hash:o}=new URL(n,`http://a${A(t,"/")}`);return{id:r,pathname:i,params:{hash:o,search:a,state:s}}}async function C(e){return e===0?!0:Promise.race([new Promise(t=>{const s=J("popstate",()=>{s(),t(!0)});window.history.go(e)}),new Promise(t=>{setTimeout(t,50,!1)})])}async function Ps(){if(window.history.length<=1||(window.history.pushState(null,""),await C(1-window.history.length)))return;let t=await C(-1);for(;t;)t=await C(-1)}function dt(e){return I(e).pathname}const mt=0,j=1,F=2;class _t{constructor(t,s,{postEvent:n,hashMode:r="classic",base:i}={}){c(this,"navigator");c(this,"ee",new N);c(this,"hashMode");c(this,"base");c(this,"attached",!1);c(this,"onPopState",({state:t})=>{if(t===null)return this.push(this.parsePath(window.location.href));t===mt?window.history.forward():t===j&&this.back(),t===F&&this.forward()});c(this,"onNavigatorChange",async({to:t,from:s,delta:n})=>{this.attached&&await this.syncHistory(),this.ee.emit("change",{delta:n,from:W(s),to:W(t),navigator:this})});c(this,"on",this.ee.on.bind(this.ee));c(this,"off",this.ee.off.bind(this.ee));this.navigator=new ge(t.map(a=>G(a,"/")),s,n),this.navigator.on("change",this.onNavigatorChange),this.hashMode=r,this.base=dt(i||"")}async attach(){this.attached||(this.attached=!0,this.navigator.attach(),window.addEventListener("popstate",this.onPopState),await this.syncHistory())}back(){this.navigator.back()}detach(){this.attached=!1,this.navigator.detach(),window.removeEventListener("popstate",this.onPopState)}forward(){return this.navigator.forward()}get index(){return this.navigator.index}get id(){return this.navigator.current.id}go(t,s){return this.navigator.go(t,s)}goTo(t,s){this.navigator.goTo(t,s)}get hash(){return(this.navigator.current.params||{}).hash||""}get hasPrev(){return this.navigator.hasPrev}get hasNext(){return this.navigator.hasNext}get history(){return this.navigator.history.map(W)}get path(){return x(this)}get pathname(){return this.navigator.current.pathname}parsePath(t){let s=I(t);return this.hashMode&&(s=I(s.hash.slice(1))),{pathname:s.pathname,search:s.search,hash:s.hash}}push(t,s){const n=G(t,this.path),{state:r=s}=n.params;this.navigator.push({...n,params:{...n.params,state:r}})}replace(t,s){const n=G(t,this.path),{state:r=s}=n.params;this.navigator.replace({...n,params:{...n.params,state:r}})}renderPath(t){const s=(this.base.length===1?"":this.base)+A(x(t),"/");return this.hashMode?A(s.slice(1),this.hashMode==="classic"?"#":"#/"):s}async syncHistory(){window.removeEventListener("popstate",this.onPopState);const{state:t}=this,s=this.renderPath(this);await Ps(),this.hasPrev&&this.hasNext?(window.history.replaceState(j,""),window.history.pushState(t,"",s),window.history.pushState(F,""),await C(-1)):this.hasPrev?(window.history.replaceState(j,""),window.history.pushState(t,"",s)):this.hasNext?(window.history.replaceState(t,s),window.history.pushState(F,""),await C(-1)):(window.history.replaceState(mt,""),window.history.pushState(t,"",s)),window.addEventListener("popstate",this.onPopState)}get search(){return(this.navigator.current.params||{}).search||""}get state(){return(this.navigator.current.params||{}).state}}function be(e){e||(e={});const{href:t,hash:s}=window.location;let n=x(e.hashMode===null?t:s.includes("?")?s.slice(1):`?${s.slice(1)}`);const r=e.base?dt(e.base):void 0;if(r){if(!n.startsWith(r))throw f(It,`Path "${n}" expected to be starting with "${r}"`);n=n.slice(r.length)}return new _t([n],0,e)}function Ss(e){const t=e.match(/#(.+)/);return t?t[1]:null}function Rs(e,t){if(ct()){const s=sessionStorage.getItem(e);if(s)try{const{index:n,history:r}=JSON.parse(s);return new _t(r,n,t)}catch(n){console.error("Unable to restore hash navigator state.",n)}}return be(t)}function Ts(e,t){const s=Rs(e,t),n=()=>sessionStorage.setItem(e,JSON.stringify({index:s.index,history:s.history}));return s.on("change",n),n(),s}exports.BackButton=$t;exports.BasicNavigator=ge;exports.BiometryManager=Xt;exports.BrowserNavigator=_t;exports.ClosingBehavior=te;exports.CloudStorage=se;exports.ERR_INVALID_PATH_BASE=It;exports.ERR_INVOKE_CUSTOM_METHOD_RESPONSE=St;exports.ERR_METHOD_PARAMETER_UNSUPPORTED=vt;exports.ERR_METHOD_UNSUPPORTED=Et;exports.ERR_NAVIGATION_HISTORY_EMPTY=Ct;exports.ERR_NAVIGATION_INDEX_INVALID=At;exports.ERR_NAVIGATION_ITEM_INVALID=Pe;exports.ERR_PARSE=K;exports.ERR_SSR_INIT=Se;exports.ERR_TIMED_OUT=Rt;exports.ERR_UNEXPECTED_TYPE=Tt;exports.ERR_UNKNOWN_ENV=Pt;exports.EventEmitter=N;exports.HapticFeedback=ne;exports.InitData=re;exports.Invoice=ie;exports.MainButton=oe;exports.MiniApp=ce;exports.Popup=he;exports.QRScanner=pe;exports.SDKError=q;exports.SettingsButton=ue;exports.ThemeParams=le;exports.Utils=de;exports.Viewport=_e;exports.array=ee;exports.bindMiniAppCSSVars=gs;exports.bindThemeParamsCSSVars=bs;exports.bindViewportCSSVars=ms;exports.boolean=m;exports.captureSameReq=et;exports.classNames=B;exports.compareVersions=qt;exports.createBrowserNavigatorFromLocation=be;exports.createPostEvent=Bt;exports.createSafeURL=I;exports.date=ot;exports.getHash=Ss;exports.getPathname=dt;exports.initBackButton=Je;exports.initBiometryManager=Qe;exports.initClosingBehavior=Ye;exports.initCloudStorage=Ze;exports.initHapticFeedback=ts;exports.initInitData=es;exports.initInvoice=ns;exports.initMainButton=rs;exports.initMiniApp=as;exports.initNavigator=Ts;exports.initPopup=hs;exports.initQRScanner=ps;exports.initSettingsButton=us;exports.initThemeParams=ls;exports.initUtils=_s;exports.initViewport=fs;exports.initWeb=ws;exports.invokeCustomMethod=v;exports.isColorDark=nt;exports.isIframe=Dt;exports.isPageReload=ct;exports.isRGB=L;exports.isRGBShort=Nt;exports.isSDKError=fe;exports.isSDKErrorOfType=vs;exports.isSSR=ys;exports.isTMA=Es;exports.json=l;exports.mergeClassNames=Me;exports.number=y;exports.off=k;exports.on=g;exports.parseInitData=ss;exports.parseLaunchParams=at;exports.parseThemeParams=ut;exports.postEvent=P;exports.request=d;exports.requestBiometryInfo=Zt;exports.requestThemeParams=ds;exports.requestViewport=lt;exports.retrieveLaunchParams=Yt;exports.rgb=tt;exports.searchParams=U;exports.serializeLaunchParams=Qt;exports.serializeThemeParams=Jt;exports.setCSSVar=w;exports.setDebug=Ee;exports.setTargetOrigin=Ve;exports.string=h;exports.subscribe=yt;exports.supports=E;exports.targetOrigin=Mt;exports.toRGB=Z;exports.unsubscribe=Q;exports.urlToPath=x;exports.withTimeout=st;
2
2
  //# sourceMappingURL=index.cjs.map