@vbotma/sdk 3.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/dts/composables/AsyncMountable.d.ts +44 -0
- package/dist/dts/composables/Button.d.ts +140 -0
- package/dist/dts/composables/Mountable.d.ts +43 -0
- package/dist/dts/composables/Stateful.d.ts +35 -0
- package/dist/dts/errors.d.ts +51 -0
- package/dist/dts/features/BackButton/BackButton.d.ts +96 -0
- package/dist/dts/features/BackButton/exports.d.ts +2 -0
- package/dist/dts/features/BackButton/instance.d.ts +2 -0
- package/dist/dts/features/Biometry/Biometry.d.ts +121 -0
- package/dist/dts/features/Biometry/exports.d.ts +3 -0
- package/dist/dts/features/Biometry/instance.d.ts +2 -0
- package/dist/dts/features/Biometry/types.d.ts +84 -0
- package/dist/dts/features/ClosingBehavior/ClosingBehavior.d.ts +51 -0
- package/dist/dts/features/ClosingBehavior/exports.d.ts +2 -0
- package/dist/dts/features/ClosingBehavior/instance.d.ts +2 -0
- package/dist/dts/features/CloudStorage/CloudStorage.d.ts +90 -0
- package/dist/dts/features/CloudStorage/exports.d.ts +2 -0
- package/dist/dts/features/CloudStorage/instance.d.ts +2 -0
- package/dist/dts/features/DeviceStorage/DeviceStorage.d.ts +53 -0
- package/dist/dts/features/DeviceStorage/exports.d.ts +2 -0
- package/dist/dts/features/DeviceStorage/instance.d.ts +2 -0
- package/dist/dts/features/HapticFeedback/HapticFeedback.d.ts +57 -0
- package/dist/dts/features/HapticFeedback/exports.d.ts +2 -0
- package/dist/dts/features/HapticFeedback/instance.d.ts +2 -0
- package/dist/dts/features/InitData/InitData.d.ts +87 -0
- package/dist/dts/features/InitData/exports.d.ts +2 -0
- package/dist/dts/features/InitData/instance.d.ts +2 -0
- package/dist/dts/features/Invoice/Invoice.d.ts +54 -0
- package/dist/dts/features/Invoice/exports.d.ts +2 -0
- package/dist/dts/features/Invoice/instance.d.ts +2 -0
- package/dist/dts/features/LocationManager/LocationManager.d.ts +73 -0
- package/dist/dts/features/LocationManager/exports.d.ts +3 -0
- package/dist/dts/features/LocationManager/instance.d.ts +2 -0
- package/dist/dts/features/LocationManager/types.d.ts +65 -0
- package/dist/dts/features/MainButton/MainButton.d.ts +214 -0
- package/dist/dts/features/MainButton/exports.d.ts +2 -0
- package/dist/dts/features/MainButton/instance.d.ts +2 -0
- package/dist/dts/features/MiniApp/MiniApp.d.ts +192 -0
- package/dist/dts/features/MiniApp/exports.d.ts +2 -0
- package/dist/dts/features/MiniApp/instance.d.ts +2 -0
- package/dist/dts/features/Notification/Notification.d.ts +21 -0
- package/dist/dts/features/Notification/exports.d.ts +3 -0
- package/dist/dts/features/Notification/instance.d.ts +2 -0
- package/dist/dts/features/Notification/types.d.ts +19 -0
- package/dist/dts/features/Popup/Popup.d.ts +56 -0
- package/dist/dts/features/Popup/exports.d.ts +3 -0
- package/dist/dts/features/Popup/instance.d.ts +2 -0
- package/dist/dts/features/Popup/prepareParams.d.ts +9 -0
- package/dist/dts/features/Popup/types.d.ts +54 -0
- package/dist/dts/features/QrScanner/QrScanner.d.ts +131 -0
- package/dist/dts/features/QrScanner/exports.d.ts +2 -0
- package/dist/dts/features/QrScanner/instance.d.ts +2 -0
- package/dist/dts/features/Refresh/Refresh.d.ts +39 -0
- package/dist/dts/features/Refresh/exports.d.ts +3 -0
- package/dist/dts/features/Refresh/instance.d.ts +2 -0
- package/dist/dts/features/Refresh/types.d.ts +7 -0
- package/dist/dts/features/SecondaryButton/SecondaryButton.d.ts +253 -0
- package/dist/dts/features/SecondaryButton/exports.d.ts +2 -0
- package/dist/dts/features/SecondaryButton/instance.d.ts +2 -0
- package/dist/dts/features/SecureStorage/SecureStorage.d.ts +68 -0
- package/dist/dts/features/SecureStorage/exports.d.ts +2 -0
- package/dist/dts/features/SecureStorage/instance.d.ts +2 -0
- package/dist/dts/features/SettingsButton/SettingsButton.d.ts +96 -0
- package/dist/dts/features/SettingsButton/exports.d.ts +2 -0
- package/dist/dts/features/SettingsButton/instance.d.ts +2 -0
- package/dist/dts/features/StoragePermission/StoragePermission.d.ts +45 -0
- package/dist/dts/features/StoragePermission/exports.d.ts +3 -0
- package/dist/dts/features/StoragePermission/instance.d.ts +2 -0
- package/dist/dts/features/StoragePermission/types.d.ts +51 -0
- package/dist/dts/features/SwipeBehavior/SwipeBehavior.d.ts +62 -0
- package/dist/dts/features/SwipeBehavior/exports.d.ts +2 -0
- package/dist/dts/features/SwipeBehavior/instance.d.ts +2 -0
- package/dist/dts/features/ThemeParams/ThemeParams.d.ts +127 -0
- package/dist/dts/features/ThemeParams/exports.d.ts +2 -0
- package/dist/dts/features/ThemeParams/instance.d.ts +2 -0
- package/dist/dts/features/Viewport/Viewport.d.ts +219 -0
- package/dist/dts/features/Viewport/exports.d.ts +2 -0
- package/dist/dts/features/Viewport/instance.d.ts +2 -0
- package/dist/dts/features/emoji-status/exports.d.ts +2 -0
- package/dist/dts/features/emoji-status/requestEmojiStatusAccess.d.ts +16 -0
- package/dist/dts/features/emoji-status/setEmojiStatus.d.ts +28 -0
- package/dist/dts/features/home-screen/addToHomeScreen.d.ts +11 -0
- package/dist/dts/features/home-screen/checkHomeScreenStatus.d.ts +14 -0
- package/dist/dts/features/home-screen/exports.d.ts +2 -0
- package/dist/dts/features/links/exports.d.ts +3 -0
- package/dist/dts/features/links/openLink.d.ts +31 -0
- package/dist/dts/features/links/openTelegramLink.d.ts +18 -0
- package/dist/dts/features/links/shareURL.d.ts +18 -0
- package/dist/dts/features/privacy/exports.d.ts +3 -0
- package/dist/dts/features/privacy/requestContact.d.ts +59 -0
- package/dist/dts/features/privacy/requestPhoneAccess.d.ts +19 -0
- package/dist/dts/features/privacy/requestWriteAccess.d.ts +14 -0
- package/dist/dts/features/uncategorized/copyTextToClipboard.d.ts +5 -0
- package/dist/dts/features/uncategorized/downloadFile.d.ts +21 -0
- package/dist/dts/features/uncategorized/exports.d.ts +11 -0
- package/dist/dts/features/uncategorized/getCurrentTime.d.ts +15 -0
- package/dist/dts/features/uncategorized/hideKeyboard.d.ts +13 -0
- package/dist/dts/features/uncategorized/readTextFromClipboard.d.ts +13 -0
- package/dist/dts/features/uncategorized/retrieveAndroidDeviceData.d.ts +6 -0
- package/dist/dts/features/uncategorized/retrieveAndroidDeviceDataFrom.d.ts +14 -0
- package/dist/dts/features/uncategorized/sendData.d.ts +20 -0
- package/dist/dts/features/uncategorized/shareMessage.d.ts +14 -0
- package/dist/dts/features/uncategorized/shareStory.d.ts +50 -0
- package/dist/dts/features/uncategorized/switchInlineQuery.d.ts +28 -0
- package/dist/dts/fn-options/bottomButtonOptions.d.ts +11 -0
- package/dist/dts/fn-options/buttonOptions.d.ts +10 -0
- package/dist/dts/fn-options/createFnOption.d.ts +2 -0
- package/dist/dts/fn-options/sharedFeatureOptions.d.ts +8 -0
- package/dist/dts/fn-options/withCreateRequestId.d.ts +7 -0
- package/dist/dts/fn-options/withInvokeCustomMethod.d.ts +11 -0
- package/dist/dts/fn-options/withPostEvent.d.ts +8 -0
- package/dist/dts/fn-options/withRequest.d.ts +8 -0
- package/dist/dts/fn-options/withStateRestore.d.ts +13 -0
- package/dist/dts/fn-options/withVersion.d.ts +9 -0
- package/dist/dts/globals/createRequestId.d.ts +4 -0
- package/dist/dts/globals/invokeCustomMethod.d.ts +16 -0
- package/dist/dts/globals/isInlineMode.d.ts +4 -0
- package/dist/dts/globals/postEvent.d.ts +4 -0
- package/dist/dts/globals/request.d.ts +13 -0
- package/dist/dts/globals/resetGlobals.d.ts +4 -0
- package/dist/dts/globals/signals-registry.d.ts +39 -0
- package/dist/dts/globals/themeParams.d.ts +4 -0
- package/dist/dts/globals/version.d.ts +4 -0
- package/dist/dts/helpers/access.d.ts +2 -0
- package/dist/dts/helpers/component-storage.d.ts +9 -0
- package/dist/dts/helpers/createIsSupportedSignal.d.ts +5 -0
- package/dist/dts/helpers/css-vars.d.ts +11 -0
- package/dist/dts/helpers/isColorDark.d.ts +11 -0
- package/dist/dts/helpers/navigation.d.ts +5 -0
- package/dist/dts/helpers/removeUndefined.d.ts +10 -0
- package/dist/dts/helpers/shallowEqual.d.ts +1 -0
- package/dist/dts/index.d.ts +38 -0
- package/dist/dts/init.d.ts +42 -0
- package/dist/dts/types.d.ts +6 -0
- package/dist/dts/with-checks/throwifyWithChecksFp.d.ts +3 -0
- package/dist/dts/with-checks/withChecksFp.d.ts +170 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.iife.js +4 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.js +4088 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/helpers/access.ts","../src/composables/Mountable.ts","../src/helpers/removeUndefined.ts","../src/helpers/shallowEqual.ts","../src/composables/Stateful.ts","../src/helpers/createIsSupportedSignal.ts","../src/with-checks/throwifyWithChecksFp.ts","../src/errors.ts","../src/with-checks/withChecksFp.ts","../src/composables/Button.ts","../src/features/BackButton/BackButton.ts","../src/fn-options/sharedFeatureOptions.ts","../src/fn-options/createFnOption.ts","../src/globals/signals-registry.ts","../src/globals/postEvent.ts","../src/fn-options/withPostEvent.ts","../src/helpers/component-storage.ts","../src/helpers/navigation.ts","../src/fn-options/withStateRestore.ts","../src/globals/version.ts","../src/fn-options/withVersion.ts","../src/fn-options/buttonOptions.ts","../src/features/BackButton/instance.ts","../src/composables/AsyncMountable.ts","../src/features/Biometry/Biometry.ts","../src/globals/request.ts","../src/fn-options/withRequest.ts","../src/features/Biometry/instance.ts","../src/features/ClosingBehavior/ClosingBehavior.ts","../src/features/ClosingBehavior/instance.ts","../src/features/CloudStorage/CloudStorage.ts","../src/globals/createRequestId.ts","../src/globals/invokeCustomMethod.ts","../src/fn-options/withInvokeCustomMethod.ts","../src/features/CloudStorage/instance.ts","../src/features/DeviceStorage/DeviceStorage.ts","../src/fn-options/withCreateRequestId.ts","../src/features/DeviceStorage/instance.ts","../src/features/emoji-status/requestEmojiStatusAccess.ts","../src/features/emoji-status/setEmojiStatus.ts","../src/features/HapticFeedback/HapticFeedback.ts","../src/features/HapticFeedback/instance.ts","../src/features/home-screen/addToHomeScreen.ts","../src/features/home-screen/checkHomeScreenStatus.ts","../src/features/InitData/InitData.ts","../src/features/InitData/instance.ts","../src/features/Invoice/Invoice.ts","../src/features/Invoice/instance.ts","../src/features/links/openLink.ts","../src/features/links/openTelegramLink.ts","../src/features/links/shareURL.ts","../src/features/LocationManager/LocationManager.ts","../src/features/LocationManager/instance.ts","../src/features/MainButton/MainButton.ts","../src/helpers/css-vars.ts","../src/helpers/isColorDark.ts","../src/features/ThemeParams/ThemeParams.ts","../src/globals/themeParams.ts","../src/features/ThemeParams/instance.ts","../src/fn-options/bottomButtonOptions.ts","../src/features/MainButton/instance.ts","../src/features/MiniApp/MiniApp.ts","../src/features/MiniApp/instance.ts","../src/features/Notification/Notification.ts","../src/features/Notification/instance.ts","../src/features/Popup/prepareParams.ts","../src/features/Popup/Popup.ts","../src/features/Popup/instance.ts","../src/features/privacy/requestPhoneAccess.ts","../src/features/privacy/requestContact.ts","../src/features/privacy/requestWriteAccess.ts","../src/features/QrScanner/QrScanner.ts","../src/features/QrScanner/instance.ts","../src/features/Refresh/Refresh.ts","../src/features/Refresh/instance.ts","../src/features/SecondaryButton/SecondaryButton.ts","../src/features/SecondaryButton/instance.ts","../src/features/SecureStorage/SecureStorage.ts","../src/features/SecureStorage/instance.ts","../src/features/SettingsButton/SettingsButton.ts","../src/features/SettingsButton/instance.ts","../src/features/SwipeBehavior/SwipeBehavior.ts","../src/features/SwipeBehavior/instance.ts","../src/features/uncategorized/copyTextToClipboard.ts","../src/features/uncategorized/downloadFile.ts","../src/features/uncategorized/getCurrentTime.ts","../src/features/uncategorized/hideKeyboard.ts","../src/features/uncategorized/readTextFromClipboard.ts","../src/features/uncategorized/retrieveAndroidDeviceDataFrom.ts","../src/features/uncategorized/retrieveAndroidDeviceData.ts","../src/features/uncategorized/sendData.ts","../src/features/uncategorized/shareMessage.ts","../src/features/uncategorized/shareStory.ts","../src/globals/isInlineMode.ts","../src/features/uncategorized/switchInlineQuery.ts","../src/features/Viewport/Viewport.ts","../src/features/Viewport/instance.ts","../src/features/StoragePermission/StoragePermission.ts","../src/features/StoragePermission/instance.ts","../src/init.ts"],"sourcesContent":["import type { MaybeAccessor } from '@/types.js';\n\nexport function access<T>(value: MaybeAccessor<T>): T {\n return typeof value === 'function' ? (value as any)() as T : value;\n}\n","import { batch, computed, signal } from '@vbotma/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface MountableOptions<S, Err> {\n /**\n * A state to use if the `restoreState` function returned falsy value or\n * `isPageReload` returned false.\n */\n initialState: S | (() => E.Either<Err, S>);\n /**\n * @returns True if the current page was reloaded.\n */\n isPageReload: MaybeAccessor<boolean>;\n /**\n * A function to call whenever the component was mounted.\n * @param state - restored state.\n */\n onMounted?: (state: S) => void;\n /**\n * A function to call whenever the component was unmounted.\n */\n onUnmounted?: VoidFunction;\n /**\n * Attempts to restore previously saved component state. This function\n * will only be called if the current page was reloaded.\n */\n restoreState: () => (S | undefined);\n}\n\nexport class Mountable<S extends object, Err = never> {\n constructor({\n onMounted,\n restoreState,\n initialState,\n onUnmounted,\n isPageReload,\n }: MountableOptions<S, Err>) {\n this.mount = () => {\n if (this.isMounted()) {\n return E.right(undefined);\n }\n const restored = access(isPageReload) ? restoreState() : undefined;\n const state = restored\n ? E.right(restored)\n : (typeof initialState === 'function' ? initialState() : E.right(initialState));\n\n return fn.pipe(state, E.map(s => {\n batch(() => {\n this._isMounted.set(true);\n onMounted?.(s);\n });\n }));\n };\n\n this.unmount = () => {\n if (this._isMounted()) {\n batch(() => {\n this._isMounted.set(false);\n onUnmounted?.();\n });\n }\n };\n }\n\n private readonly _isMounted = signal(false);\n\n /**\n * Signal indicating if the component is mounted.\n */\n readonly isMounted = computed(this._isMounted);\n\n /**\n * Mounts the component restoring its state and calling required side effects.\n */\n readonly mount: () => E.Either<Err, void>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n}\n","import type { UnionRequiredKeys } from '@vbotma/toolkit';\n\ntype RemoveUndefined<T> = {\n [K in UnionRequiredKeys<T>]-?: T[K]\n};\n\n/**\n * @returns Object with keys having undefined values.\n * @param value - an object to remove undefined values from.\n */\nexport function removeUndefined<T extends {}>(value: T): RemoveUndefined<T> {\n const result = {} as RemoveUndefined<T>;\n for (const k in value) {\n const v = value[k];\n v !== undefined && ((result as any)[k] = v);\n }\n return result;\n}\n","export function shallowEqual<T extends object>(a: T, b: T): boolean {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n return aKeys.length !== bKeys.length\n ? false\n : aKeys.every(aKey => {\n return Object.prototype.hasOwnProperty.call(b, aKey)\n && (a as any)[aKey] === (b as any)[aKey];\n });\n}\n","import { type Computed, computed, type Signal, signal } from '@vbotma/signals';\n\nimport { removeUndefined } from '@/helpers/removeUndefined.js';\nimport { shallowEqual } from '@/helpers/shallowEqual.js';\n\nexport interface StatefulOptions<S> {\n /**\n * The initial state.\n */\n initialState: S;\n /**\n * A function to call whenever the state changes.\n * @param state - updated state.\n */\n onChange: (state: S) => void;\n}\n\nexport class Stateful<S extends object> {\n constructor({ initialState, onChange }: StatefulOptions<S>) {\n this._state = signal(initialState, { equals: shallowEqual });\n this.state = computed(this._state);\n this.state.sub(onChange);\n }\n\n protected readonly _state: Signal<S>;\n\n /**\n * The current state.\n */\n readonly state: Computed<S>;\n\n /**\n * Creates a computed signal based on the state.\n * @param key - a state key to use as a source.\n */\n getter<K extends keyof S>(key: K): Computed<S[K]> {\n return computed(() => this._state()[key]);\n }\n\n /**\n * Updates the state.\n * @param state - updates to apply.\n */\n readonly setState = (state: Partial<S>): void => {\n const nextState = { ...this.state(), ...removeUndefined(state) };\n if (!shallowEqual(nextState, this.state())) {\n this._state.set(nextState);\n }\n };\n\n /**\n * @returns True if specified payload will update the state.\n * @param state\n */\n hasDiff(state: Partial<S>): boolean {\n return !shallowEqual({ ...this.state(), ...removeUndefined(state) }, this.state());\n }\n}\n","import { type MethodName, supports } from '@vbotma/bridge';\nimport { type Computed, computed } from '@vbotma/signals';\nimport type { Version } from '@vbotma/types';\n\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport function createIsSupportedSignal(\n method: MethodName,\n version: MaybeAccessor<Version>,\n): Computed<boolean> {\n return computed(() => supports(method, access(version)));\n}\n","import { throwifyFpFn, throwifyAnyEither, type AnyFn } from '@vbotma/toolkit';\nimport { function as fn, option as O } from 'fp-ts';\n\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\n// #__NO_SIDE_EFFECTS__\nexport function throwifyWithChecksFp<\n Fn extends AnyFn,\n HasSupportCheck extends boolean,\n SupportsMapKeySchema extends string,\n>(\n fn_: WithChecksFp<Fn, HasSupportCheck, SupportsMapKeySchema>,\n): WithChecks<Fn, HasSupportCheck, SupportsMapKeySchema> {\n return Object.assign(throwifyFpFn(fn_), {\n ifAvailable(...args: Parameters<Fn>) {\n return fn.pipe(\n fn_.ifAvailable(...args),\n O.match(\n () => ({ ok: false }),\n data => ({\n ok: true,\n data: throwifyAnyEither(data),\n }),\n ),\n );\n },\n }) as unknown as WithChecks<Fn, HasSupportCheck, SupportsMapKeySchema>;\n}\n","import { errorClass, errorClassWithData } from 'error-kid';\nimport type { BaseIssue } from 'valibot';\n\nfunction msgToTuple(message?: string): [string?] {\n return [message];\n}\n\nexport class ValidationError extends /* #__PURE__ */ errorClassWithData<\n { input: unknown; issues: BaseIssue<any>[] },\n [input: unknown, issues: BaseIssue<any>[]]\n>(\n 'ValidationError',\n (input, issues) => ({ input, issues }),\n 'Validation error',\n) {\n}\n\nexport class CSSVarsBoundError extends /* #__PURE__ */ errorClass(\n 'CSSVarsBoundError',\n 'CSS variables are already bound',\n) {\n}\n\nexport class DeviceStorageMethodError extends /* #__PURE__ */ errorClassWithData<\n { error: string },\n [error: string]\n>('DeviceStorageMethodError', error => ({ error }), error => [error]) {\n}\n\nexport class SecureStorageMethodError extends /* #__PURE__ */ errorClassWithData<\n { error: string },\n [error: string]\n>('SecureStorageMethodError', error => ({ error }), error => [error]) {\n}\n\nexport class NotAvailableError extends /* #__PURE__ */ errorClass<[message: string]>(\n 'NotAvailableError',\n msgToTuple,\n) {\n}\n\nexport class InvalidEnvError extends /* #__PURE__ */ errorClass<[message?: string]>(\n 'InvalidEnvError',\n msgToTuple,\n) {\n}\n\nexport class FunctionUnavailableError extends /* #__PURE__ */ errorClass<[message?: string]>(\n 'FunctionNotAvailableError',\n msgToTuple,\n) {\n}\n\nexport class InvalidArgumentsError extends /* #__PURE__ */ errorClass<[message: string, cause?: unknown]>(\n 'InvalidArgumentsError',\n (message, cause) => [message, { cause }],\n) {\n}\n\nexport class ConcurrentCallError extends /* #__PURE__ */ errorClass<[message: string]>(\n 'ConcurrentCallError',\n msgToTuple,\n) {\n}\n\nexport class SetEmojiStatusError extends /* #__PURE__ */ errorClass<[error: string]>(\n 'SetEmojiStatusError',\n error => [`Failed to set emoji status: ${error}`],\n) {\n}\n\nexport class AccessDeniedError extends /* #__PURE__ */ errorClass<[message: string]>(\n 'AccessDeniedError',\n msgToTuple,\n) {\n}\n\nexport class FullscreenFailedError extends /* #__PURE__ */ errorClass<[message: string]>(\n 'FullscreenFailedError',\n msgToTuple,\n) {\n}\n\nexport class ShareMessageError extends /* #__PURE__ */ errorClass<[error: string]>(\n 'ShareMessageError',\n msgToTuple,\n) {\n}\n\nexport class UnknownThemeParamsKeyError extends /* #__PURE__ */ errorClass<[key: string]>(\n 'UnknownThemeParamsKeyError',\n key => [`Unknown theme params key passed: ${key}`],\n) {\n}\n","import {\n type MethodName,\n supports,\n type MethodNameWithVersionedParams,\n type MethodVersionedParams,\n} from '@vbotma/bridge';\nimport { type Computed, computed } from '@vbotma/signals';\nimport type {\n If,\n IsNever,\n AnyFnAnyEither,\n RightOfReturn,\n LeftOfReturn,\n MaybeMonadReturnTypeToCommon,\n MaybeCommonReturnTypeToMonad,\n AnyFn,\n} from '@vbotma/toolkit';\nimport type { Version } from '@vbotma/types';\nimport { either as E, option as O, taskEither as TE } from 'fp-ts';\n\nimport { FunctionUnavailableError } from '@/errors.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\ntype IfReturnsTask<Fn extends AnyFnAnyEither, A, B> =\n ReturnType<Fn> extends TE.TaskEither<any, any> ? A : B;\n\ntype OptionsBasedRequires<O extends WithChecksOptions<any>> = O extends { requires: any }\n ? true : false;\n\ntype OptionsBasedSupports<O extends WithChecksOptions<any>> = O extends { supports: any }\n ? Extract<keyof O['supports'], string> : never;\n\ntype OptionsBasedFn<Opts extends WithChecksOptions<any>> = (...args: any[]) => (\n Opts['returns'] extends 'plain'\n ? any\n : Opts['returns'] extends 'promise'\n ? PromiseLike<any>\n : Opts['returns'] extends 'task'\n ? TE.TaskEither<any, any>\n : E.Either<any, any>\n);\n\n/**\n * @returns Error text if something is wrong.\n */\nexport type CustomSupportFn = () => string | undefined;\n\nexport type Require =\n | MethodName\n | CustomSupportFn\n | { every: (MethodName | CustomSupportFn)[] }\n | { some: (MethodName | CustomSupportFn)[] };\n\n/**\n * A map where the key is a method name with versioned parameters, and the value is a tuple\n * containing the method and parameter names. The third tuple value is a function accepting\n * the wrapped function arguments and returning true if support check must be applied.\n */\nexport type SupportsMap<Args extends any[]> = {\n [OptionName: string]: {\n [M in MethodNameWithVersionedParams]: {\n /**\n * Method name.\n * @example 'web_app_set_header_color'\n */\n method: M;\n /**\n * Method version-dependent parameter.\n * @example `color`\n */\n param: MethodVersionedParams<M>;\n /**\n * @returns True if the support function should be called.\n * @param args - function arguments.\n */\n shouldCheck: (...args: Args) => boolean;\n };\n }[MethodNameWithVersionedParams];\n};\n\ntype WrappedFnReturnType<Fn extends AnyFn> = ReturnType<Fn> extends E.Either<any, any>\n ? E.Either<FunctionUnavailableError | LeftOfReturn<Fn>, RightOfReturn<Fn>>\n : ReturnType<Fn> extends TE.TaskEither<any, any>\n ? TE.TaskEither<FunctionUnavailableError | LeftOfReturn<Fn>, RightOfReturn<Fn>>\n : ReturnType<Fn> extends PromiseLike<infer U>\n ? TE.TaskEither<FunctionUnavailableError, U>\n : E.Either<FunctionUnavailableError, ReturnType<Fn>>;\n\nexport type WrappedFn<Fn extends AnyFn> = (...args: Parameters<Fn>) => WrappedFnReturnType<Fn>;\n\nexport type WithChecksFp<\n Fn extends AnyFn,\n HasSupportCheck extends boolean,\n SupportsMapKeySchema extends string = never,\n> =\n & WrappedFn<Fn>\n & {\n /**\n * A signal returning `true` if the function is available in the current environment and\n * conditions.\n *\n * To be more accurate, the method checks the following:\n * 1. The current environment is VBot Mini Apps.\n * 2. The SDK package is initialized (if this requirement is specified).\n * 3. If passed, the `isSupported` signal returned true.\n * 4. If passed, the `isMounted` signal returned true.\n *\n * *You should use this function when possible because it provides must-have code security\n * mechanisms and makes a developer sure that he is using the package properly.*\n *\n * @returns True if the function is available in the current environment.\n * @example\n * if (backButton.show.isAvailable()) {\n * backButton.show();\n * }\n */\n isAvailable: Computed<boolean>;\n /**\n * Calls the function only in case it is available.\n *\n * It uses the `isAvailable` internally to check if the function is available for call.\n * @example\n * backButton.show.ifAvailable();\n */\n ifAvailable(...args: Parameters<Fn>): O.Option<MaybeCommonReturnTypeToMonad<Fn>>;\n }\n & If<HasSupportCheck, {\n /**\n * The signal returning `true` if the function is supported by the VBot client,\n * including some possible additional conditions.\n *\n * It is highly recommended to use this signal only in certain narrow cases when only the\n * function support check is required, but not its availability.\n *\n * This signal is not applying additional operations like checking if the current environment\n * is Mini Apps and the SDK is initialized.\n *\n * To check if the function is available for use, use the `isAvailable` signal.\n *\n * @returns True if this function is supported.\n * @see isAvailable\n * @example\n * if (backButton.show.isSupported()) {\n * console.log('The method is supported');\n * }\n */\n isSupported: Computed<boolean>;\n }, {}>\n & If<IsNever<SupportsMapKeySchema>, {}, {\n /**\n * A map where the key is the function-specific option name and value is a signal indicating\n * if it is supported by the current environment.\n * @example\n * if (miniApp.setHeaderColor.isAvailable()) {\n * if (miniApp.setHeaderColor.supports('rgb')) {\n * miniApp.setHeaderColor('#ffaabb');\n * } else {\n * miniApp.setHeaderColor('bg_color');\n * }\n * }\n */\n supports: (key: SupportsMapKeySchema) => boolean;\n }>;\n\nexport type WithChecks<\n Fn extends AnyFn,\n HasSupportCheck extends boolean,\n SupportsMapKeySchema extends string = never,\n> =\n & ((...args: Parameters<Fn>) => MaybeMonadReturnTypeToCommon<Fn>)\n & Omit<WithChecksFp<Fn, HasSupportCheck, SupportsMapKeySchema>, 'ifAvailable'>\n & {\n /**\n * Calls the function only in case it is available.\n *\n * It uses the `isAvailable` internally to check if the function is available for call.\n * @example\n * backButton.show.ifAvailable();\n */\n ifAvailable(...args: Parameters<Fn>):\n | { ok: true; data: MaybeMonadReturnTypeToCommon<Fn> }\n | { ok: false };\n };\n\nexport interface WithChecksOptions<Fn extends AnyFn> {\n /**\n * Signal returning true if the owning component is mounted.\n */\n isMounted?: () => boolean;\n /**\n * Signal returning true if the owning component is mounting.\n */\n isMounting?: () => boolean;\n /**\n * A value determining the function requirements. This will enable additional checks for\n * the function before being called.\n */\n requires?: Require;\n /**\n * A signal to retrieve the current VBot Mini Apps version or the value itself.\n */\n isTma: MaybeAccessor<boolean>;\n /**\n * A map where the key is a method name with versioned parameters, and the value is a tuple\n * containing the method and parameter names. The third tuple value is a function accepting\n * the wrapped function arguments and returning true if support check must be applied.\n */\n supports?: SupportsMap<Parameters<Fn>>;\n /**\n * A signal to retrieve the current VBot Mini Apps version or the value itself.\n */\n version?: MaybeAccessor<Version>;\n /**\n * Allows to determine what exactly should be returned from the function - TaskEither or Either.\n * There is no other way to know it until the function itself is called, but we need to perform\n * some checks before calling it and return a valid value based on the function return type.\n */\n returns: Fn extends AnyFnAnyEither\n ? IfReturnsTask<Fn, 'task', 'either'>\n : ReturnType<Fn> extends PromiseLike<any> ? 'promise' : 'plain';\n}\n\nexport function withChecksFp<Fn extends AnyFn, O extends WithChecksOptions<Fn>>(\n fn: Fn,\n options: O,\n): WithChecksFp<Fn, OptionsBasedRequires<O>, OptionsBasedSupports<O>> {\n const version = computed(() => access(options.version) || '100');\n const isTma = computed(() => access(options.isTma));\n\n // Simplify the isSupported value to work with an array of validators or a single object.\n const { requires: optionsIsSupported, returns } = options;\n const isSupportedSimplified = optionsIsSupported\n ? typeof optionsIsSupported === 'object'\n ? optionsIsSupported\n : { every: [optionsIsSupported] }\n : undefined;\n\n /**\n * @param optionName - target option.\n * @returns True if specified option is supported.\n */\n const isOptionSupported = (optionName: string): boolean => {\n if (!options.supports) {\n return true;\n }\n const optionSettings = options.supports[optionName];\n return supports(optionSettings.method, optionSettings.param, version());\n };\n\n /**\n * @returns All found errors according to the isSupported variable value.\n */\n const calculateSupportError = (): string | undefined => {\n // isSupported was not specified. In this case, we assume that the function has no\n // dependencies and is always supported.\n if (!isSupportedSimplified) {\n return;\n }\n const [mode, requirements] = 'every' in isSupportedSimplified\n ? ['every', isSupportedSimplified.every] as const\n : ['some', isSupportedSimplified.some] as const;\n\n for (let i = 0; i < requirements.length; i++) {\n const requirement = requirements[i];\n const error = typeof requirement === 'function'\n ? requirement()\n : supports(requirement, version())\n ? undefined\n : `it is unsupported in Mini Apps version ${version()}`;\n // Return only if there was an error and all requirements must be satisfied, or\n // this was the last one requirement (when some of the requirements must be met).\n if (error && (mode === 'every' || i === requirements.length - 1)) {\n return error;\n }\n }\n };\n\n /**\n * @returns An error related to supports.<name> check.\n */\n const calculateOptionSupportError = (\n ...args: Parameters<Fn>\n ): string | undefined => {\n for (const k in options.supports) {\n if (options.supports[k].shouldCheck(...args) && !isOptionSupported(k)) {\n return `option ${k} is not supported in Mini Apps version ${version()}`;\n }\n }\n };\n\n const isSupported = computed(() => !calculateSupportError());\n const isInitialized = computed(() => version() !== '0.0');\n const isMounted = computed(() => (options.isMounted ? options.isMounted() : true));\n const isAvailable = computed(\n () => isTma()\n && isInitialized()\n && isSupported()\n && isMounted(),\n );\n\n const wrapError = (message: string): WrappedFnReturnType<Fn> => {\n const err = new FunctionUnavailableError(message);\n return (['task', 'promise'].includes(options.returns)\n ? TE.left(err)\n : E.left(err)) as WrappedFnReturnType<Fn>;\n };\n\n const call = (...args: Parameters<Fn>): MaybeCommonReturnTypeToMonad<Fn> => {\n if (returns === 'plain') {\n return E.tryCatch(() => fn(...args), e => e) as MaybeCommonReturnTypeToMonad<Fn>;\n }\n if (returns === 'promise') {\n return TE.tryCatch(() => fn(...args), e => e) as MaybeCommonReturnTypeToMonad<Fn>;\n }\n return fn(...args);\n };\n\n return Object.assign(\n (...args: Parameters<Fn>): WrappedFnReturnType<Fn> => {\n const errMessagePrefix = 'Unable to call function:';\n if (!isTma()) {\n return wrapError(`${errMessagePrefix} it can't be called outside Mini Apps`);\n }\n if (!isInitialized()) {\n return wrapError(`${errMessagePrefix} the SDK was not initialized. Use the SDK init() function`);\n }\n const supportErr = calculateSupportError();\n if (supportErr) {\n return wrapError(`${errMessagePrefix} ${supportErr}`);\n }\n const supportsOptionErr = calculateOptionSupportError(...args);\n if (supportsOptionErr) {\n return wrapError(`${errMessagePrefix} ${supportsOptionErr}`);\n }\n if (!isMounted()) {\n const message = options.isMounting?.()\n ? 'mounting. Wait for the mount completion'\n : 'unmounted. Use the mount() method';\n return wrapError(`${errMessagePrefix} the component is ${message}`);\n }\n return call(...args) as WrappedFnReturnType<Fn>;\n },\n fn,\n {\n isAvailable,\n ifAvailable(...args: Parameters<Fn>): O.Option<MaybeCommonReturnTypeToMonad<Fn>> {\n return isAvailable() ? O.some(call(...args)) : O.none;\n },\n },\n isSupportedSimplified ? { isSupported } : {},\n options.supports ? { supports: isOptionSupported } : {},\n );\n}\n\nexport function createWithChecksFp<O extends WithChecksOptions<any>>(options: O) {\n return <Fn extends OptionsBasedFn<O>>(fn: Fn): WithChecksFp<\n Fn,\n OptionsBasedRequires<O>,\n OptionsBasedSupports<O>\n > => withChecksFp(fn, options);\n}\n","import type { PostEventError, MethodName, MethodParams } from '@vbotma/bridge';\nimport { computed, type Computed } from '@vbotma/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { removeUndefined } from '@/helpers/removeUndefined.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n type WithChecksFp,\n type WithChecks,\n createWithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\ntype ButtonEither = E.Either<PostEventError, void>;\n\ntype BoolFields<S> = {\n [K in keyof S]-?: S[K] extends boolean ? K : never;\n}[keyof S];\n\nexport interface ButtonOptions<S, M extends MethodName>\n extends SharedFeatureOptions,\n WithStateRestore<S>,\n WithPostEvent,\n WithVersion {\n /**\n * The initial button state.\n */\n initialState: S;\n /**\n * Removes a component click listener.\n * @param listener - a listener to remove.\n * @param once - should the listener be called only once.\n */\n offClick: (listener: VoidFunction, once?: boolean) => void;\n /**\n * Adds a component click listener.\n * @returns A function to remove listener.\n * @param listener - a listener to add.\n * @param once - should the listener be called only once.\n */\n onClick: (listener: VoidFunction, once?: boolean) => VoidFunction;\n /**\n * A Mini Apps method to commit changes.\n */\n method: M;\n /**\n * A function to create method payload.\n * @param state\n */\n payload: (state: S) => MethodParams<M>;\n}\n\nexport class Button<S extends object, M extends MethodName> {\n constructor({\n isTma,\n storage,\n onClick,\n offClick,\n initialState,\n isPageReload,\n postEvent,\n payload,\n method,\n version,\n }: ButtonOptions<S, M>) {\n const stateful = new Stateful({\n initialState,\n onChange(state) {\n storage.set(state);\n },\n });\n const mountable = new Mountable<S>({\n initialState,\n isPageReload,\n onMounted: stateful.setState,\n restoreState: storage.get,\n });\n\n const wrapOptions = { version, requires: method, isTma };\n const wrapSupportedPlain = createWithChecksFp({\n ...wrapOptions,\n returns: 'plain',\n });\n const wrapMountedEither = createWithChecksFp({\n ...wrapOptions,\n returns: 'either',\n isMounted: mountable.isMounted,\n });\n\n this.isMounted = mountable.isMounted;\n this.isSupported = createIsSupportedSignal(method, version);\n this.state = stateful.state;\n\n this.setStateFp = wrapMountedEither(state => {\n const nextState = { ...this.state(), ...removeUndefined(state) };\n if (!stateful.hasDiff(nextState)) {\n return E.right(undefined);\n }\n return fn.pipe(\n postEvent(method as any, payload(nextState)),\n E.map(() => {\n stateful.setState(nextState);\n }),\n );\n });\n this.setState = throwifyWithChecksFp(this.setStateFp);\n this.onClickFp = wrapSupportedPlain(onClick);\n this.onClick = throwifyWithChecksFp(this.onClickFp);\n this.offClickFp = wrapSupportedPlain(offClick);\n this.offClick = throwifyWithChecksFp(this.offClickFp);\n this.mountFp = wrapSupportedPlain(() => {\n const nothing = () => undefined;\n return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n });\n this.mount = throwifyWithChecksFp(this.mountFp);\n this.unmount = mountable.unmount;\n this.stateSetters = key => {\n const wrapped = wrapMountedEither(value => {\n return this.setStateFp({ [key]: value } as unknown as Partial<S>);\n });\n return [throwifyWithChecksFp(wrapped), wrapped];\n };\n this.stateBoolSetters = <K extends keyof S>(key: K) => {\n const [, setFp] = this.stateSetters(key);\n const setFalse = wrapMountedEither(() => setFp(false as S[K]));\n const setTrue = wrapMountedEither(() => setFp(true as S[K]));\n return [\n [throwifyWithChecksFp(setFalse), setFalse],\n [throwifyWithChecksFp(setTrue), setTrue],\n ];\n };\n }\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Complete button state.\n */\n readonly state: Computed<S>;\n\n /**\n * @returns A computed based on the specified state and its related key.\n * @param key - a key to use.\n */\n stateGetter<K extends keyof S>(key: K): Computed<S[K]> {\n return computed(() => this.state()[key]);\n }\n\n /**\n * @returns A setter with checks for the specified key.\n * @param key\n */\n readonly stateSetters: <K extends keyof S>(key: K) => [\n throwing: WithChecks<(value: S[K]) => void, true>,\n fp: WithChecksFp<(value: S[K]) => ButtonEither, true>,\n ];\n\n /**\n * @returns Setters with checks to set a specified boolean key.\n * @param key\n */\n readonly stateBoolSetters: <K extends BoolFields<S>>(key: K) => [\n setFalse: [\n throwing: WithChecks<() => void, true>,\n fp: WithChecksFp<() => ButtonEither, true>,\n ],\n setTrue: [\n throwing: WithChecks<() => void, true>,\n fp: WithChecksFp<() => ButtonEither, true>,\n ],\n ];\n\n /**\n * Updates the button state.\n */\n readonly setStateFp: WithChecksFp<(state: Partial<S>) => ButtonEither, true>;\n\n /**\n * @see setStateFp\n */\n readonly setState: WithChecks<(state: Partial<S>) => void, true>;\n\n /**\n * Adds a new button listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @returns A function to remove bound listener.\n * @example\n * const off = button.onClick(() => {\n * console.log('User clicked the button');\n * off();\n * });\n */\n readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * @see onClickFp\n */\n readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * Removes the button click listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @example\n * function listener() {\n * console.log('User clicked the button');\n * button.offClick(listener);\n * }\n * button.onClick(listener);\n */\n readonly offClickFp: WithChecksFp<\n (listener: VoidFunction, once?: boolean) => void,\n true\n >;\n\n /**\n * @see offClickFp\n */\n readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v6.1\n */\n readonly mountFp: WithChecksFp<() => void, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, true>;\n\n /**\n * Unmounts the component.\n *\n * Note that this function does not remove listeners added via the `onClick`\n * function, so you have to remove them on your own.\n * @see onClick\n */\n readonly unmount: () => void;\n}\n","import type { PostEventError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface BackButtonState {\n isVisible: boolean;\n}\n\nexport type BackButtonOptions = Omit<\n ButtonOptions<BackButtonState, 'web_app_setup_back_button'>,\n 'method' | 'payload' | 'initialState'\n>;\n\n/**\n * @since Mini Apps v6.1\n */\nexport class BackButton {\n constructor(options: BackButtonOptions) {\n const button = new Button({\n ...options,\n method: 'web_app_setup_back_button',\n payload: state => ({ is_visible: state.isVisible }),\n initialState: { isVisible: false },\n });\n\n this.isVisible = button.stateGetter('isVisible');\n this.isMounted = button.isMounted;\n this.isSupported = button.isSupported;\n [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n this.onClick = button.onClick;\n this.onClickFp = button.onClickFp;\n this.offClick = button.offClick;\n this.offClickFp = button.offClickFp;\n this.mount = button.mount;\n this.mountFp = button.mountFp;\n this.unmount = button.unmount;\n }\n\n /**\n * Signal indicating if the component is currently visible.\n */\n readonly isVisible: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Hides the button.\n * @since Mini Apps v6.1\n */\n readonly hideFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see hideFp\n */\n readonly hide: WithChecks<() => void, true>;\n\n /**\n * Shows the button.\n * @since Mini Apps v6.1\n */\n readonly showFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see showFp\n */\n readonly show: WithChecks<() => void, true>;\n\n /**\n * Adds a new button listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @returns A function to remove bound listener.\n * @since Mini Apps v6.1\n * @example\n * const off = button.onClick(() => {\n * console.log('User clicked the button');\n * off();\n * });\n */\n readonly onClickFp: WithChecksFp<\n (listener: VoidFunction, once?: boolean) => VoidFunction,\n true\n >;\n\n /**\n * @see onClickFp\n */\n readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * Removes the button click listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @since Mini Apps v6.1\n * @example\n * function listener() {\n * console.log('User clicked the button');\n * button.offClick(listener);\n * }\n * button.onClick(listener);\n */\n readonly offClickFp: WithChecksFp<\n (listener: VoidFunction, once?: boolean) => void,\n true\n >;\n\n /**\n * @see offClickFp\n */\n readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v6.1\n */\n readonly mountFp: WithChecksFp<() => void, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, true>;\n\n /**\n * Unmounts the component.\n *\n * Note that this function does not remove listeners added via the `onClick`\n * function, so you have to remove them on your own.\n * @see onClick\n */\n readonly unmount: () => void;\n}\n","import { isVBMAFp } from '@vbotma/bridge';\nimport { computed } from '@vbotma/signals';\n\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface SharedFeatureOptions {\n /**\n * True if the current environment is VBot Mini Apps.\n */\n isTma: MaybeAccessor<boolean>;\n}\n\nexport function sharedFeatureOptions(): SharedFeatureOptions {\n return { isTma: computed(() => isVBMAFp()) };\n}\n","import { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport function createFnOption<T>(mix: MaybeAccessor<T>) {\n return <O extends object>(obj: O) => {\n return { ...obj, ...access(mix) };\n };\n}\n","import {\n computed,\n type Computed,\n type Signal,\n signal,\n type SignalOptions,\n} from '@vbotma/signals';\n\nexport type SignalsTuple<T> = [Signal<T>, Computed<T>];\n\nconst signals: (Signal<any> | Computed<any>)[] = [];\n\n/**\n * Creates a new signal with the initial value.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignal<T>(\n initialValue: T,\n options?: SignalOptions<T>,\n): Signal<T>;\n\n/**\n * Creates a new signal without the initial value.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignal<T>(\n initialValue?: T,\n options?: SignalOptions<T | undefined>,\n): Signal<T | undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport function createSignal<T>(\n initialValue?: T,\n options?: SignalOptions<T | undefined>,\n): Signal<T | undefined> {\n const s = signal(initialValue, options);\n signals.push(s);\n return s;\n}\n\n/**\n * Creates a signal, which wil be automatically updated if some of its dependant signals were\n * modified.\n * @param fn - computation function.\n * @param options - additional functions.\n */\n// #__NO_SIDE_EFFECTS__\nexport function createComputed<T>(fn: (prev?: T) => T, options?: SignalOptions<T>): Computed<T> {\n const s = computed(fn, options);\n signals.push(s);\n return s;\n}\n\n/**\n * Resets all signals states.\n */\nexport function resetSignals() {\n signals.forEach(s => {\n s.unsubAll();\n 'reset' in s && s.reset();\n });\n}\n\n/**\n * @returns A tuple, containing a manual and computed signals. The computed signal is based on\n * the manual one.\n * @param initialValue - the initial value.\n * @param options - additional options.\n */\nexport function createSignalsTuple<T>(\n initialValue: T,\n options?: SignalOptions<T>,\n): SignalsTuple<T>;\n\n/**\n * @returns A tuple, containing a manual and computed signals. The computed signal is based on\n * the manual one.\n * @param initialValue - an initial value.\n * @param options - additional options.\n */\nexport function createSignalsTuple<T>(\n initialValue?: T,\n options?: SignalOptions<T | undefined>,\n): SignalsTuple<T | undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport function createSignalsTuple<T>(\n initialValue?: T,\n options?: SignalOptions<T | undefined>,\n): SignalsTuple<T | undefined> {\n const s = createSignal(initialValue, options);\n return [s, createComputed(s)];\n}\n","import { postEventFp as _postEventFp, type PostEventFpFn, type PostEventFn } from '@vbotma/bridge';\nimport { throwifyAnyEither } from '@vbotma/toolkit';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\nexport const postEventFpSignal = createSignal(_postEventFp);\n\nexport const postEventFp: PostEventFpFn = (...args: any[]) => {\n return (postEventFpSignal as any)()(...args);\n};\n\nexport const postEvent: PostEventFn = (...args: any[]) => {\n return throwifyAnyEither((postEventFp as any)(...args));\n};\n","import { type PostEventFpFn } from '@vbotma/bridge';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { postEventFp } from '@/globals/postEvent.js';\n\nexport interface WithPostEvent {\n /**\n * A postEvent function to use to call Mini Apps methods.\n */\n postEvent: PostEventFpFn;\n}\n\nexport const withPostEvent = createFnOption<WithPostEvent>({\n postEvent: postEventFp,\n});\n","import { getStorageValue, setStorageValue } from '@vbotma/toolkit';\n\nexport interface ComponentStorage<T> {\n get: () => T | undefined;\n set: (value: T) => void;\n}\n\n/**\n * Creates a new sessionStorage-based component storage.\n * @param key - session storage key to use.\n */\nexport function createComponentSessionStorage<T>(key: string): ComponentStorage<T> {\n return {\n get: () => getStorageValue<T>(key),\n set(value) {\n setStorageValue<T>(key, value);\n },\n };\n}\n","/**\n * Returns the first navigation entry from window.performance.\n * @returns First navigation entry or null, in case performance functionality is not supported\n * or navigation entry was not found.\n */\nfunction getFirstNavigationEntry(): PerformanceNavigationTiming | undefined {\n return performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n}\n\n/**\n * @returns True, if the current page was reloaded.\n * @see https://stackoverflow.com/a/36444134/11894710\n */\nexport function isPageReload(): boolean {\n const entry = getFirstNavigationEntry();\n return !!entry && entry.type === 'reload';\n}\n","import { createFnOption } from '@/fn-options/createFnOption.js';\nimport { type ComponentStorage, createComponentSessionStorage } from '@/helpers/component-storage.js';\nimport { isPageReload } from '@/helpers/navigation.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface WithStateRestore<T> {\n /**\n * A storage the component could use to store its data.\n */\n storage: ComponentStorage<T>;\n /**\n * True if the current page is reloaded.\n */\n isPageReload: MaybeAccessor<boolean>;\n}\n\nexport function withStateRestore<S>(storageName: string) {\n return createFnOption<WithStateRestore<S>>({\n storage: createComponentSessionStorage<S>(storageName),\n isPageReload,\n });\n}\n","import type { Version } from '@vbotma/types';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * The current Mini Apps version.\n */\nexport const version = createSignal<Version>('0.0');\n","import type { Version } from '@vbotma/types';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { version } from '@/globals/version.js';\nimport type { MaybeAccessor } from '@/types.js';\n\nexport interface WithVersion {\n /**\n * The currently supported VBot Mini Apps version by the VBot client.\n */\n version: MaybeAccessor<Version>;\n}\n\nexport const withVersion = createFnOption<WithVersion>({ version });\n","import { on, off, type EventName } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\n// @__NO_SIDE_EFFECTS__\nexport function buttonOptions<S>(storageName: string, trackedClickEvent: EventName) {\n return {\n ...fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n withStateRestore<S>(storageName),\n ),\n onClick(listener: VoidFunction, once?: boolean): VoidFunction {\n return on(trackedClickEvent, listener, once);\n },\n offClick(listener: VoidFunction, once?: boolean): void {\n off(trackedClickEvent, listener, once);\n },\n };\n}\n","import { BackButton } from '@/features/BackButton/BackButton.js';\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\nexport const backButton = /* @__PURE__*/ new BackButton(\n buttonOptions('backButton', 'back_button_pressed'),\n);\n","import { batch, computed, signal } from '@vbotma/signals';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { access } from '@/helpers/access.js';\nimport type { AsyncOptions, MaybeAccessor } from '@/types.js';\n\nexport interface AsyncMountableOptions<S, E> {\n /**\n * A function to retrieve the initial state.\n * @param options - additional options.\n */\n initialState: (options?: AsyncOptions) => TE.TaskEither<E, S>;\n /**\n * @returns True if the current page was reloaded.\n */\n isPageReload: MaybeAccessor<boolean>;\n /**\n * A function to call whenever the component was mounted.\n * @param state - restored state.\n */\n onMounted?: (state: S) => void;\n /**\n * A function to call whenever the component was unmounted.\n */\n onUnmounted?: VoidFunction;\n /**\n * Attempts to restore previously saved component state. This function\n * will only be called if the current page was reloaded.\n */\n restoreState: () => (S | undefined);\n}\n\nexport class AsyncMountable<S extends object, E> {\n constructor({\n initialState,\n onMounted,\n restoreState,\n onUnmounted,\n isPageReload,\n }: AsyncMountableOptions<S, E>) {\n this.mount = options => {\n if (this._isMounted()) {\n return TE.right(undefined);\n }\n const restored = access(isPageReload) ? restoreState() : undefined;\n return fn.pipe(\n restored ? TE.right(restored) : initialState(options),\n TE.map(state => {\n // The user could call mount several times in a row while the\n // component was still mounting. We should prevent calling the\n // same hooks several times in this case.\n if (!this._isMounted()) {\n batch(() => {\n this._isMounted.set(true);\n onMounted?.(state);\n });\n }\n }),\n );\n };\n\n this.unmount = () => {\n if (this._isMounted()) {\n batch(() => {\n this._isMounted.set(false);\n onUnmounted?.();\n });\n }\n };\n }\n\n private readonly _isMounted = signal(false);\n\n /**\n * Signal indicating if the component is mounted.\n */\n readonly isMounted = computed(this._isMounted);\n\n /**\n * Mounts the component restoring its state and calling required side effects.\n * @param options - additional execution options.\n */\n readonly mount: (options?: AsyncOptions) => TE.TaskEither<E, void>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n}\n","import type {\n RequestError,\n PostEventError,\n EventPayload,\n BiometryAuthRequestStatus,\n EventListener,\n BiometryTokenUpdateStatus,\n} from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { NotAvailableError } from '@/errors.js';\nimport type {\n BiometryAuthenticateOptions, BiometryOptions,\n BiometryRequestAccessOptions,\n BiometryState,\n BiometryUpdateTokenOptions,\n} from '@/features/Biometry/types.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype BiometryTask<T> = TE.TaskEither<RequestError, T>;\n\ninterface AuthenticateResult {\n /**\n * Authentication status.\n */\n status: BiometryAuthRequestStatus;\n /**\n * Token from the local secure storage saved previously.\n */\n token?: string;\n}\n\nfunction createNotAvailableError() {\n return new NotAvailableError('Biometry is not available');\n}\n\nfunction eventToState(event: EventPayload<'biometry_info_received'>): BiometryState {\n let available = false;\n let tokenSaved = false;\n let deviceId = '';\n let accessRequested = false;\n let type = '';\n let accessGranted = false;\n if (event.available) {\n available = true;\n tokenSaved = event.token_saved;\n deviceId = event.device_id;\n accessRequested = event.access_requested;\n type = event.type;\n accessGranted = event.access_granted;\n }\n return { available, tokenSaved, deviceId, type, accessGranted, accessRequested };\n}\n\n/**\n * @since Mini Apps v7.2\n */\nexport class Biometry {\n constructor({\n version,\n request,\n postEvent,\n storage,\n onInfoReceived,\n offInfoReceived,\n isTma,\n isPageReload,\n }: BiometryOptions) {\n const listener: EventListener<'biometry_info_received'> = event => {\n stateful.setState(eventToState(event));\n };\n\n const stateful = new Stateful<BiometryState>({\n initialState: {\n available: false,\n type: 'unknown',\n accessGranted: false,\n accessRequested: false,\n deviceId: '',\n tokenSaved: false,\n },\n onChange: storage.set,\n });\n const mountable = new AsyncMountable({\n initialState(options) {\n return fn.pipe(\n request('web_app_biometry_get_info', 'biometry_info_received', options),\n TE.map(eventToState),\n );\n },\n isPageReload,\n onMounted(state) {\n stateful.setState(state);\n onInfoReceived(listener);\n },\n onUnmounted() {\n offInfoReceived(listener);\n },\n restoreState: storage.get,\n });\n\n const wrapOptions = { version, requires: 'web_app_biometry_request_auth', isTma } as const;\n const wrapSupportedEither = createWithChecksFp({\n ...wrapOptions,\n returns: 'either',\n });\n const wrapSupportedTask = createWithChecksFp({\n ...wrapOptions,\n returns: 'task',\n });\n const wrapMountedTask = createWithChecksFp({\n ...wrapOptions,\n isMounted: mountable.isMounted,\n returns: 'task',\n });\n\n this.isAvailable = stateful.getter('available');\n this.isMounted = mountable.isMounted;\n this.isSupported = createIsSupportedSignal('web_app_biometry_request_auth', version);\n this.state = stateful.state;\n this.unmount = mountable.unmount;\n this.mountFp = wrapSupportedTask(mountable.mount);\n\n this.authenticateFp = wrapMountedTask(options => {\n return !this.isAvailable()\n ? TE.left(createNotAvailableError())\n : fn.pipe(\n request('web_app_biometry_request_auth', 'biometry_auth_requested', {\n ...options,\n params: { reason: ((options || {}).reason || '').trim() },\n }),\n TE.map(response => {\n stateful.setState({ token: response.token });\n return response;\n }),\n );\n });\n\n this.openSettingsFp = wrapSupportedEither(() => postEvent('web_app_biometry_open_settings'));\n\n this.requestAccessFp = wrapMountedTask(options => {\n return fn.pipe(\n request('web_app_biometry_request_access', 'biometry_info_received', {\n ...options,\n params: { reason: ((options || {}).reason || '').trim() },\n }),\n TE.chain(response => {\n const state = eventToState(response);\n if (!state.available) {\n return TE.left(createNotAvailableError());\n }\n stateful.setState(state);\n return TE.right(state.accessRequested);\n }),\n );\n });\n\n this.updateTokenFp = wrapMountedTask((options = {}) => {\n return fn.pipe(\n request('web_app_biometry_update_token', 'biometry_token_updated', {\n ...options,\n params: { token: options.token || '', reason: options.reason?.trim() },\n }),\n TE.map(response => response.status),\n );\n });\n\n this.authenticate = throwifyWithChecksFp(this.authenticateFp);\n this.openSettings = throwifyWithChecksFp(this.openSettingsFp);\n this.requestAccess = throwifyWithChecksFp(this.requestAccessFp);\n this.updateToken = throwifyWithChecksFp(this.updateTokenFp);\n this.mount = throwifyWithChecksFp(this.mountFp);\n }\n\n /**\n * Signal indicating if biometry is available.\n */\n readonly isAvailable: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Signal indicating if the component is mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Complete component state.\n */\n readonly state: Computed<BiometryState>;\n\n /**\n * Attempts to authenticate a user using biometrics and fetch a previously stored secure token.\n * @param options - method options.\n * @since Mini Apps v7.2\n * @returns Token from the local secure storage saved previously or undefined.\n * @example\n * const { status, token } = await biometry.authenticate({\n * reason: 'Authenticate to open wallet',\n * });\n */\n readonly authenticateFp: WithChecksFp<(options?: BiometryAuthenticateOptions) => BiometryTask<{\n /**\n * Authentication status.\n */\n status: BiometryAuthRequestStatus;\n /**\n * Token from the local secure storage saved previously.\n */\n token?: string;\n }>, true>;\n\n /**\n * @see authenticateFp\n */\n readonly authenticate: WithChecks<\n (options?: BiometryAuthenticateOptions) => BetterPromise<AuthenticateResult>,\n true\n >;\n\n /**\n * Opens the biometric access settings for bots. Useful when you need to request biometrics\n * access to users who haven't granted it yet.\n *\n * _Note that this method can be called only in response to user interaction with the Mini App\n * interface (e.g. a click inside the Mini App or on the main button)_.\n * @since Mini Apps v7.2\n */\n readonly openSettingsFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see openSettingsFp\n */\n readonly openSettings: WithChecks<() => void, true>;\n\n /**\n * Requests permission to use biometrics.\n * @since Mini Apps v7.2\n * @returns Promise with true, if access was granted.\n * @example\n * const accessGranted = await biometry.requestAccess({\n * reason: 'Authenticate to open wallet',\n * });\n */\n readonly requestAccessFp: WithChecksFp<\n (options?: BiometryRequestAccessOptions) => BiometryTask<boolean>,\n true\n >;\n\n /**\n * @see requestAccessFp\n */\n readonly requestAccess: WithChecks<\n (options?: BiometryRequestAccessOptions) => BetterPromise<boolean>,\n true\n >;\n\n /**\n * Updates the biometric token in a secure storage on the device.\n * @since Mini Apps v7.2\n * @returns Promise with `true`, if token was updated.\n * @example Setting a new token\n * biometry.updateToken({\n * token: 'abcdef',\n * })\n * @example Deleting the token\n * biometry.updateToken();\n */\n readonly updateTokenFp: WithChecksFp<\n (options?: BiometryUpdateTokenOptions) => BiometryTask<BiometryTokenUpdateStatus>,\n true\n >;\n\n /**\n * @see updateTokenFp\n */\n readonly updateToken: WithChecks<\n (options?: BiometryUpdateTokenOptions) => BetterPromise<BiometryTokenUpdateStatus>,\n true\n >;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v7.2\n */\n readonly mountFp: WithChecksFp<(options?: AsyncOptions) => BiometryTask<void>, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n}\n","import {\n requestFp as _requestFp,\n request2Fp as _request2Fp,\n type RequestFpFn,\n type RequestFn,\n type Request2FpFn,\n type Request2Fn,\n} from '@vbotma/bridge';\nimport { BetterPromise } from 'better-promises';\n\nimport { postEventFp } from '@/globals/postEvent.js';\n\n/**\n * @deprecated To be removed in the next major update. Use `request2fp` instead, it provides\n * a proper way of handling multiple events.\n */\nexport const requestFp: RequestFpFn = (method: any, events: any, options: any) => {\n return _requestFp(method, events, {\n postEvent: postEventFp,\n ...options,\n });\n};\n\nexport const request2Fp: Request2FpFn = (method: any, events: any, options: any) => {\n return _request2Fp(method, events, {\n postEvent: postEventFp,\n ...options,\n });\n};\n\n/**\n * @deprecated To be removed in the next major update. Use `request` instead, it provides\n * a proper way of handling multiple events.\n */\nexport const request: RequestFn = (...args: any[]) => {\n return BetterPromise.fn(() => (requestFp as any)(...args)());\n};\n\nexport const request2: Request2Fn = (...args: any[]) => {\n return BetterPromise.fn(() => (request2Fp as any)(...args)());\n};\n","import type { Request2FpFn } from '@vbotma/bridge';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { request2Fp } from '@/globals/request.js';\n\nexport interface WithRequest {\n /**\n * A request function to use to call Mini Apps methods.\n */\n request: Request2FpFn;\n}\n\nexport const withRequest = createFnOption<WithRequest>({ request: request2Fp });\n","import { on, off } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { Biometry } from '@/features/Biometry/Biometry.js';\nimport type { BiometryState } from '@/features/Biometry/types.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new Biometry({\n ...fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n withRequest,\n withStateRestore<BiometryState>('biometry'),\n ),\n offInfoReceived(listener) {\n off('biometry_info_received', listener);\n },\n onInfoReceived(listener) {\n return on('biometry_info_received', listener);\n },\n });\n}\n\nexport const biometry = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport interface ClosingBehaviorState {\n isConfirmationEnabled: boolean;\n}\n\nexport interface ClosingBehaviorOptions\n extends WithStateRestore<ClosingBehaviorState>,\n WithPostEvent,\n SharedFeatureOptions {\n}\n\nexport class ClosingBehavior {\n constructor({ postEvent, storage, isTma, isPageReload }: ClosingBehaviorOptions) {\n const stateful = new Stateful({\n initialState: { isConfirmationEnabled: false },\n onChange(state) {\n storage.set(state);\n },\n });\n const mountable = new Mountable({\n onMounted: stateful.setState,\n restoreState: storage.get,\n initialState: { isConfirmationEnabled: false },\n isPageReload,\n });\n\n const wrapOptions = { requires: 'web_app_setup_closing_behavior', isTma } as const;\n const wrapSupportedPlain = createWithChecksFp({\n ...wrapOptions,\n returns: 'plain',\n });\n const wrapMountedEither = createWithChecksFp({\n ...wrapOptions,\n returns: 'either',\n isMounted: mountable.isMounted,\n });\n\n const setClosingConfirmation = (isConfirmationEnabled: boolean) => {\n if (isConfirmationEnabled === this.isConfirmationEnabled()) {\n return E.right(undefined);\n }\n stateful.setState({ isConfirmationEnabled });\n return postEvent('web_app_setup_closing_behavior', {\n need_confirmation: isConfirmationEnabled,\n });\n };\n\n this.isConfirmationEnabled = stateful.getter('isConfirmationEnabled');\n this.isMounted = mountable.isMounted;\n\n this.disableConfirmationFp = wrapMountedEither(() => {\n return setClosingConfirmation(false);\n });\n this.enableConfirmationFp = wrapMountedEither(() => {\n return setClosingConfirmation(true);\n });\n this.mountFp = wrapSupportedPlain(() => {\n const nothing = () => undefined;\n return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n });\n this.unmount = mountable.unmount;\n\n this.disableConfirmation = throwifyWithChecksFp(this.disableConfirmationFp);\n this.enableConfirmation = throwifyWithChecksFp(this.enableConfirmationFp);\n this.mount = throwifyWithChecksFp(this.mountFp);\n }\n\n /**\n * Signal indicating if closing confirmation dialog is currently enabled.\n */\n readonly isConfirmationEnabled: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Mounts the component restoring its state.\n */\n readonly mountFp: WithChecksFp<() => void, false>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, false>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n\n /**\n * Disables the closing confirmation dialog.\n */\n readonly disableConfirmationFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n /**\n * @see disableConfirmationFp\n */\n readonly disableConfirmation: WithChecks<() => void, false>;\n\n /**\n * Enables the closing confirmation dialog.\n */\n readonly enableConfirmationFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n /**\n * @see enableConfirmationFp\n */\n readonly enableConfirmation: WithChecks<() => void, false>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport {\n ClosingBehavior,\n type ClosingBehaviorState,\n} from '@/features/ClosingBehavior/ClosingBehavior.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\n\nfunction instantiate() {\n return new ClosingBehavior(fn.pipe(\n sharedFeatureOptions(),\n withStateRestore<ClosingBehaviorState>('closingBehavior'),\n withPostEvent,\n ));\n}\n\nexport const closingBehavior = /* @__PURE__*/ instantiate();\n","import type { InvokeCustomMethodFpOptions, RequestError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\nimport { array, parse, record, string } from 'valibot';\n\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithInvokeCustomMethod } from '@/fn-options/withInvokeCustomMethod.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype CloudStorageTask<T> = TE.TaskEither<RequestError, T>;\n\nexport interface CloudStorageOptions extends WithVersion,\n WithInvokeCustomMethod,\n SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.9\n */\nexport class CloudStorage {\n constructor({ version, isTma, invokeCustomMethod }: CloudStorageOptions) {\n const wrapSupportedTask = createWithChecksFp({\n version,\n requires: 'web_app_invoke_custom_method',\n isTma,\n returns: 'task',\n });\n\n this.isSupported = createIsSupportedSignal('web_app_invoke_custom_method', version);\n this.deleteItemFp = wrapSupportedTask((keyOrKeys, options) => {\n const keys = Array.isArray(keyOrKeys) ? keyOrKeys : [keyOrKeys];\n return fn.pipe(\n keys.length\n ? invokeCustomMethod('deleteStorageValues', { keys }, options)\n : TE.right(undefined),\n TE.map(() => undefined),\n );\n });\n this.getItemFp = wrapSupportedTask((key, options) => {\n return fn.pipe(\n this.getItemsFp([key], options),\n TE.map(values => values[key] || ''),\n );\n });\n this.getItemsFp = wrapSupportedTask((keys, options) => {\n return fn.pipe(\n keys.length ? invokeCustomMethod('getStorageValues', { keys }, options) : TE.right({}),\n TE.map(data => {\n return {\n // Fulfill the response with probably missing keys.\n ...keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = '';\n return acc;\n }, {}),\n ...parse(record(string(), string()), data),\n };\n }),\n );\n });\n this.getKeysFp = wrapSupportedTask(options => {\n return fn.pipe(\n invokeCustomMethod('getStorageKeys', {}, options),\n TE.map(data => parse(array(string()), data)),\n );\n });\n this.setItemFp = wrapSupportedTask((key, value, options) => {\n return fn.pipe(\n invokeCustomMethod('saveStorageValue', { key, value }, options),\n TE.map(() => undefined),\n );\n });\n this.clearFp = wrapSupportedTask(options => {\n return fn.pipe(this.getKeysFp(options), TE.chain(this.deleteItemFp));\n });\n\n this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n this.getItem = throwifyWithChecksFp(this.getItemFp);\n this.getItems = throwifyWithChecksFp(this.getItemsFp);\n this.getKeys = throwifyWithChecksFp(this.getKeysFp);\n this.setItem = throwifyWithChecksFp(this.setItemFp);\n this.clear = throwifyWithChecksFp(this.clearFp);\n }\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Deletes specified key or keys from the cloud storage.\n * @param keyOrKeys - key or keys to delete.\n * @param options - request execution options.\n * @since Mini Apps v6.9\n */\n readonly deleteItemFp: WithChecksFp<\n (keyOrKeys: string | string[], options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n true\n >;\n\n readonly deleteItem: WithChecks<\n (keyOrKeys: string | string[], options?: InvokeCustomMethodFpOptions) => BetterPromise<void>,\n true\n >;\n\n /**\n * Gets a single key value from the cloud storage.\n * @param key - a key to get.\n * @param options - request execution options.\n * @returns A key value as a string.\n * @since Mini Apps v6.9\n */\n readonly getItemFp: WithChecksFp<\n (key: string, options?: InvokeCustomMethodFpOptions) => CloudStorageTask<string>,\n true\n >;\n\n /**\n * @see getItemFp\n */\n readonly getItem: WithChecks<{\n <K extends string>(\n keys: K[],\n options?: InvokeCustomMethodFpOptions,\n ): BetterPromise<Record<K, string>>;\n (key: string, options?: InvokeCustomMethodFpOptions): BetterPromise<string>;\n }, true>;\n\n /**\n * Gets multiple keys' values from the cloud storage.\n * @param keys - keys list.\n * @param options - request execution options.\n * @returns A map, where a key is one of the specified in the `keys` argument,\n * and a value is a corresponding storage value if an array of keys was passed.\n * @since Mini Apps v6.9\n */\n readonly getItemsFp: WithChecksFp<\n <K extends string>(\n keys: K[],\n options?: InvokeCustomMethodFpOptions,\n ) => CloudStorageTask<Record<K, string>>,\n true\n >;\n\n /**\n * @see getItemsFp\n */\n readonly getItems: WithChecks<\n <K extends string>(\n keys: K[],\n options?: InvokeCustomMethodFpOptions,\n ) => BetterPromise<Record<K, string>>,\n true\n >;\n\n /**\n * Returns a list of all keys presented in the cloud storage.\n * @param options - request execution options.\n * @since Mini Apps v6.9\n */\n readonly getKeysFp: WithChecksFp<\n (options?: InvokeCustomMethodFpOptions) => CloudStorageTask<string[]>,\n true\n >;\n\n /**\n * @see getKeysFp\n */\n readonly getKeys: WithChecks<\n (options?: InvokeCustomMethodFpOptions) => BetterPromise<string[]>,\n true\n >;\n\n /**\n * Saves the specified value by a key.\n * @param key - storage key.\n * @param value - storage value.\n * @param options - request execution options.\n * @since Mini Apps v6.9\n */\n readonly setItemFp: WithChecksFp<\n (key: string, value: string, options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n true\n >;\n\n /**\n * @see setItemFp\n */\n readonly setItem: WithChecks<\n (key: string, value: string, options?: InvokeCustomMethodFpOptions) => BetterPromise<void>,\n true\n >;\n\n /**\n * Clears the cloud storage.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\n readonly clearFp: WithChecksFp<\n (options?: InvokeCustomMethodFpOptions) => CloudStorageTask<void>,\n true\n >;\n\n /**\n * @see clearFp\n */\n readonly clear: WithChecks<(options?: InvokeCustomMethodFpOptions) => BetterPromise<void>, true>;\n}\n","import { createSignal } from '@/globals/signals-registry.js';\n\nconst lastRequestId = createSignal(0);\n\n/**\n * @returns A new request identifier.\n */\nexport function createRequestId(): string {\n lastRequestId.set(lastRequestId() + 1);\n return lastRequestId().toString();\n}\n","import {\n type RequestError,\n type CustomMethodName,\n type CustomMethodParams,\n type InvokeCustomMethodOptions,\n invokeCustomMethodFp,\n} from '@vbotma/bridge';\nimport { taskEither as TE } from 'fp-ts';\n\nimport { createRequestId } from '@/globals/createRequestId.js';\nimport { postEventFp } from '@/globals/postEvent.js';\n\n/**\n * Invokes known custom method. Returns method execution result.\n * @param method - method name.\n * @param params - method parameters.\n * @param options - additional options.\n */\nexport function invokeCustomMethod<M extends CustomMethodName>(\n method: M,\n params: CustomMethodParams<M>,\n options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown>;\n\n/**\n * Invokes unknown custom method. Returns method execution result.\n * @param method - method name.\n * @param params - method parameters.\n * @param options - additional options.\n */\nexport function invokeCustomMethod(\n method: string,\n params: object,\n options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown>;\n\nexport function invokeCustomMethod(\n method: string,\n params: object,\n options?: InvokeCustomMethodOptions,\n): TE.TaskEither<RequestError, unknown> {\n return invokeCustomMethodFp(method, params, createRequestId(), {\n ...options || {},\n postEvent: postEventFp,\n });\n}\n","import type {\n CustomMethodParams,\n CustomMethodName,\n InvokeCustomMethodError,\n InvokeCustomMethodFpOptions,\n RequestError,\n} from '@vbotma/bridge';\nimport type * as TE from 'fp-ts/TaskEither';\n\nimport { createFnOption } from '@/fn-options/createFnOption.js';\nimport { invokeCustomMethod } from '@/globals/invokeCustomMethod.js';\n\nexport type { InvokeCustomMethodError };\n\nexport interface InvokeCustomMethodNoRequestIdFn {\n <M extends CustomMethodName>(\n this: void,\n method: M,\n params: CustomMethodParams<M>,\n options?: InvokeCustomMethodFpOptions,\n ): TE.TaskEither<InvokeCustomMethodError, unknown>;\n\n (\n this: void,\n method: string,\n params: object,\n options?: InvokeCustomMethodFpOptions,\n ): TE.TaskEither<RequestError, unknown>;\n}\n\nexport interface WithInvokeCustomMethod {\n invokeCustomMethod: InvokeCustomMethodNoRequestIdFn;\n}\n\nexport const withInvokeCustomMethod = createFnOption<WithInvokeCustomMethod>({\n invokeCustomMethod,\n});\n","import { function as fn } from 'fp-ts';\n\nimport { CloudStorage } from '@/features/CloudStorage/CloudStorage.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withInvokeCustomMethod } from '@/fn-options/withInvokeCustomMethod.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new CloudStorage(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withInvokeCustomMethod,\n ));\n}\n\nexport const cloudStorage = /* @__PURE__*/ instantiate();\n","import { EventPayload, type MethodParams, type Request2CaptureFn, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { DeviceStorageMethodError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type DeviceStorageError = RequestError | DeviceStorageMethodError;\n\nexport interface DeviceStorageOptions extends SharedFeatureOptions,\n WithVersion,\n WithRequest,\n WithCreateRequestId {\n}\n\n/**\n * @since Mini Apps v9.0\n */\nexport class DeviceStorage {\n constructor({ isTma, request, version, createRequestId }: DeviceStorageOptions) {\n const wrapSupportedTask = createWithChecksFp({\n version,\n requires: 'web_app_device_storage_get_key',\n isTma,\n returns: 'task',\n });\n\n const invokeMethod = <\n M extends (\n | 'web_app_device_storage_save_key'\n | 'web_app_device_storage_get_key'\n | 'web_app_device_storage_save_key'\n | 'web_app_device_storage_clear'\n ),\n E extends (\n | 'device_storage_key_saved'\n | 'device_storage_key_received'\n | 'device_storage_cleared'\n ),\n >(\n method: M,\n event: E,\n params: Omit<MethodParams<M>, 'req_id'>,\n ): TE.TaskEither<DeviceStorageError, EventPayload<E>> => {\n const requestId = createRequestId();\n return fn.pipe(\n request<M, ('device_storage_failed' | E)[]>(method, ['device_storage_failed', event], {\n params: { ...params, req_id: requestId },\n capture: (event => {\n return 'payload' in event ? event.payload.req_id === requestId : true;\n }) as Request2CaptureFn<('device_storage_failed' | E)[]>,\n }),\n TE.chain(response => (\n response.event === 'device_storage_failed'\n ? TE.left(new DeviceStorageMethodError(response.payload.error || 'UNKNOWN_ERROR'))\n : TE.right(response.payload as EventPayload<E>)\n )),\n );\n };\n\n this.getItemFp = wrapSupportedTask(key => {\n return fn.pipe(\n invokeMethod('web_app_device_storage_get_key', 'device_storage_key_received', { key }),\n TE.map(payload => payload.value),\n );\n });\n this.setItemFp = wrapSupportedTask((key, value) => {\n return fn.pipe(\n invokeMethod('web_app_device_storage_save_key', 'device_storage_key_saved', { key, value }),\n TE.map(() => undefined),\n );\n });\n this.deleteItemFp = wrapSupportedTask(key => {\n return this.setItemFp(key, null);\n });\n this.clearFp = wrapSupportedTask(() => {\n return fn.pipe(\n invokeMethod('web_app_device_storage_clear', 'device_storage_cleared', {}),\n TE.map(() => undefined),\n );\n });\n\n this.getItem = throwifyWithChecksFp(this.getItemFp);\n this.setItem = throwifyWithChecksFp(this.setItemFp);\n this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n this.clear = throwifyWithChecksFp(this.clearFp);\n }\n\n /**\n * Retrieves an item using its key.\n * @since Mini Apps v9.0\n */\n readonly getItemFp: WithChecksFp<\n (key: string) => TE.TaskEither<DeviceStorageError, string | null>,\n true\n >;\n\n /**\n * @see getItemFp\n */\n readonly getItem: WithChecks<(key: string) => Promise<string | null>, true>;\n\n /**\n * Sets a new item in the storage.\n * @since Mini Apps v9.0\n */\n readonly setItemFp: WithChecksFp<\n (key: string, value: string | null) => TE.TaskEither<DeviceStorageError, void>,\n true\n >;\n\n /**\n * @see setItemFp\n */\n readonly setItem: WithChecks<(key: string, value: string | null) => Promise<void>, true>;\n\n /**\n * Removes a key from the storage.\n * @since Mini Apps v9.0\n */\n readonly deleteItemFp: WithChecksFp<\n (key: string) => TE.TaskEither<DeviceStorageError, void>,\n true\n >;\n\n /**\n * @see deleteItemFp\n */\n readonly deleteItem: WithChecks<(key: string) => Promise<void>, true>;\n\n /**\n * Removes all keys from the storage.\n * @since Mini Apps v9.0\n */\n readonly clearFp: WithChecksFp<() => TE.TaskEither<DeviceStorageError, void>, true>;\n\n /**\n * @see clearFp\n */\n readonly clear: WithChecks<() => Promise<void>, true>;\n}\n","import { createFnOption } from '@/fn-options/createFnOption.js';\nimport { createRequestId } from '@/globals/createRequestId.js';\n\nexport interface WithCreateRequestId {\n /**\n * A function generating a request identifier.\n */\n createRequestId: () => string;\n}\n\nexport const withCreateRequestId = createFnOption<WithCreateRequestId>({ createRequestId });\n","import { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nimport { DeviceStorage } from './DeviceStorage.js';\n\nfunction instantiate() {\n return new DeviceStorage(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n withCreateRequestId,\n ));\n}\n\nexport const deviceStorage = /* @__PURE__*/ instantiate();\n","import type { EmojiStatusAccessRequestedStatus, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n options: AsyncOptions,\n ): TE.TaskEither<RequestError, EmojiStatusAccessRequestedStatus> => {\n return fn.pipe(\n request('web_app_request_emoji_status_access', 'emoji_status_access_requested', options),\n TE.map(response => response.status),\n );\n }, { ...rest, requires: 'web_app_request_emoji_status_access', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n ));\n}\n\n/**\n * Shows a native popup requesting permission for the bot to manage user's emoji status.\n * @param options - additional options.\n * @returns Emoji status access status.\n * @since Mini Apps v8.0\n * @example\n * const status = await requestEmojiStatusAccess();\n */\nexport const requestEmojiStatusAccessFp = instantiate();\n\n/**\n * @see requestEmojiStatusAccessFp\n */\nexport const requestEmojiStatusAccess = throwifyWithChecksFp(requestEmojiStatusAccessFp);\n","import { RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { SetEmojiStatusError } from '@/errors.js';\nimport {\n type SharedFeatureOptions,\n sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\nexport interface SetEmojiStatusOptions extends AsyncOptions {\n duration?: number;\n}\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n customEmojiId: string,\n options?: SetEmojiStatusOptions,\n ): TE.TaskEither<RequestError | SetEmojiStatusError, void> => {\n return fn.pipe(\n request('web_app_set_emoji_status', ['emoji_status_set', 'emoji_status_failed'], {\n params: {\n custom_emoji_id: customEmojiId,\n duration: (options || {}).duration,\n },\n ...options,\n }),\n TE.chainW(response => (\n response.event === 'emoji_status_failed'\n ? TE.left(new SetEmojiStatusError(response.payload.error))\n : TE.right(undefined)\n )),\n );\n }, {\n ...rest,\n requires: 'web_app_set_emoji_status',\n returns: 'task',\n });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withRequest,\n withVersion,\n ));\n}\n\n/**\n * Opens a dialog allowing the user to set the specified custom emoji as their status.\n * @returns Nothing if status set was successful.\n * @param options - additional options.\n * @since Mini Apps v8.0\n * @example\n * fn.pipe(\n * setEmojiStatusFp('5361800828313167608'),\n * TE.match(error => {\n * console.error('Error occurred', error);\n * }, () => {\n * console.log('Status set');\n * }),\n * );\n * const statusSet = await setEmojiStatus('5361800828313167608');\n */\nexport const setEmojiStatusFp = instantiate();\n\n/**\n * @see setEmojiStatusFp\n */\nexport const setEmojiStatus = throwifyWithChecksFp(setEmojiStatusFp);\n","import type {\n ImpactHapticFeedbackStyle,\n NotificationHapticFeedbackType,\n PostEventError,\n} from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { either as E } from 'fp-ts';\n\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecksFp, type WithChecks } from '@/with-checks/withChecksFp.js';\n\ntype HapticFeedbackEither = E.Either<PostEventError, void>;\n\nexport interface HapticFeedbackOptions extends WithVersion, WithPostEvent, SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class HapticFeedback {\n constructor({ postEvent, isTma, version }: HapticFeedbackOptions) {\n const HAPTIC_METHOD_NAME = 'web_app_trigger_haptic_feedback';\n const wrapSupported = createWithChecksFp({\n requires: HAPTIC_METHOD_NAME,\n isTma,\n version,\n returns: 'plain',\n });\n\n this.isSupported = createIsSupportedSignal(HAPTIC_METHOD_NAME, version);\n this.impactOccurredFp = wrapSupported(style => {\n return postEvent(HAPTIC_METHOD_NAME, { type: 'impact', impact_style: style });\n });\n this.notificationOccurredFp = wrapSupported(type => {\n return postEvent(HAPTIC_METHOD_NAME, { type: 'notification', notification_type: type });\n });\n this.selectionChangedFp = wrapSupported(() => {\n return postEvent(HAPTIC_METHOD_NAME, { type: 'selection_change' });\n });\n\n this.impactOccurred = throwifyWithChecksFp(this.impactOccurredFp);\n this.notificationOccurred = throwifyWithChecksFp(this.notificationOccurredFp);\n this.selectionChanged = throwifyWithChecksFp(this.selectionChangedFp);\n }\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * A method that tells if an impact occurred. The Telegram app may play the\n * appropriate haptics based on style value passed.\n * @param style - impact style.\n * @since Mini Apps v6.1\n */\n impactOccurredFp: WithChecksFp<(style: ImpactHapticFeedbackStyle) => HapticFeedbackEither, true>;\n\n /**\n * @see impactOccurredFp\n */\n impactOccurred: WithChecks<(style: ImpactHapticFeedbackStyle) => void, true>;\n\n /**\n * A method tells that a task or action has succeeded, failed, or produced\n * a warning. The Telegram app may play the appropriate haptics based on type\n * value passed.\n * @param type - notification type.\n * @since Mini Apps v6.1\n */\n notificationOccurredFp: WithChecksFp<\n (type: NotificationHapticFeedbackType) => HapticFeedbackEither,\n true\n >;\n\n /**\n * @see notificationOccurredFp\n */\n notificationOccurred: WithChecks<(type: NotificationHapticFeedbackType) => void, true>;\n\n /**\n * A method tells that the user has changed a selection. The Telegram app may\n * play the appropriate haptics.\n *\n * Do not use this feedback when the user makes or confirms a selection; use\n * it only when the selection changes.\n * @since Mini Apps v6.1\n */\n selectionChangedFp: WithChecksFp<() => HapticFeedbackEither, true>;\n\n /**\n * @see selectionChangedFp\n */\n selectionChanged: WithChecks<() => void, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { HapticFeedback } from '@/features/HapticFeedback/HapticFeedback.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new HapticFeedback(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n ));\n}\n\nexport const hapticFeedback = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\nimport type * as E from 'fp-ts/Either';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n return withChecksFp((): E.Either<PostEventError, void> => {\n return postEvent('web_app_add_to_home_screen');\n }, { ...rest, requires: 'web_app_add_to_home_screen', returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withPostEvent,\n ));\n}\n\n/**\n * Prompts the user to add the Mini App to the home screen.\n * @since Mini Apps v8.0\n */\nexport const addToHomeScreenFp = instantiate();\n\n/**\n * @see addToHomeScreenFp\n */\nexport const addToHomeScreen = throwifyWithChecksFp(addToHomeScreenFp);\n","import type { HomeScreenStatus, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((options?: AsyncOptions): TE.TaskEither<RequestError, HomeScreenStatus> => {\n return fn.pipe(\n request('web_app_check_home_screen', 'home_screen_checked', options),\n TE.map(response => response.status || 'unknown'),\n );\n }, { ...rest, requires: 'web_app_check_home_screen', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n ));\n}\n\n/**\n * Sends a request to the native VBot application to check if the current mini\n * application is added to the device's home screen.\n * @param options - additional options.\n * @since Mini Apps v8.0\n */\nexport const checkHomeScreenStatusFp = instantiate();\n\n/**\n * @see checkHomeScreenStatusFp\n */\nexport const checkHomeScreenStatus = throwifyWithChecksFp(checkHomeScreenStatusFp);\n","import { computed, type Computed, signal } from '@vbotma/signals';\nimport { throwifyFpFn } from '@vbotma/toolkit';\nimport type { InitData as InitDataType } from '@vbotma/types';\nimport { either as E, option as O, function as fn } from 'fp-ts';\n\nexport interface InitDataOptions<Err> {\n /**\n * Retrieves init data from the current environment.\n */\n retrieveInitData: () => E.Either<Err, O.Option<{\n raw: string;\n obj: InitDataType;\n }>>;\n}\n\nexport class InitData<Err extends Error> {\n constructor({ retrieveInitData }: InitDataOptions<Err>) {\n this.restoreFp = () => {\n return fn.pipe(\n retrieveInitData(),\n E.map(O.match(() => undefined, ({ raw, obj }) => {\n this._state.set(obj);\n this._raw.set(raw);\n })),\n );\n };\n this.restore = throwifyFpFn(this.restoreFp);\n }\n\n private fromState<K extends keyof InitDataType>(key: K): Computed<InitDataType[K] | undefined> {\n return computed(() => {\n const s = this._state();\n return s ? s[key] : undefined;\n });\n }\n\n private readonly _state = signal<InitDataType>();\n\n private readonly _raw = signal<string>();\n\n /**\n * Complete component state.\n */\n readonly state = computed(this._state);\n\n /**\n * @see InitDataType.auth_date\n */\n readonly authDate = this.fromState('auth_date');\n\n /**\n * @see InitDataType.can_send_after\n */\n readonly canSendAfter = this.fromState('can_send_after');\n\n /**\n * Date after which it is allowed to call\n * the [answerWebAppQuery](https://core.telegram.org/bots/api#answerwebappquery) method.\n */\n readonly canSendAfterDate = computed(() => {\n const authDateValue = this.authDate();\n const canSendAfterValue = this.canSendAfter();\n\n return canSendAfterValue && authDateValue\n ? new Date(authDateValue.getTime() + (canSendAfterValue * 1000))\n : undefined;\n });\n\n /**\n * @see InitDataType.chat\n */\n readonly chat = this.fromState('chat');\n\n /**\n * @see InitDataType.chat_type\n */\n readonly chatType = this.fromState('chat_type');\n\n /**\n * @see InitDataType.chat_instance\n */\n readonly chatInstance = this.fromState('chat_instance');\n\n /**\n * @see InitDataType.hash\n */\n readonly hash = this.fromState('hash');\n\n /**\n * @see InitDataType.query_id\n */\n readonly queryId = this.fromState('query_id');\n\n /**\n * Raw representation of init data.\n */\n readonly raw = computed(this._raw);\n\n /**\n * @see InitDataType.receiver\n */\n readonly receiver = this.fromState('receiver');\n\n /**\n * @see InitDataType.signature\n */\n readonly signature = this.fromState('signature');\n\n /**\n * @see InitDataType.start_param\n */\n readonly startParam = this.fromState('start_param');\n\n /**\n * @see InitDataType.auth\n */\n readonly auth = this.fromState(\"auth\")\n\n /**\n * @see InitDataType.user\n */\n readonly user = this.fromState('user');\n\n /**\n * Restores the component state.\n */\n readonly restoreFp: () => E.Either<Err, void>;\n\n /**\n * @see restoreFp\n */\n readonly restore: () => void;\n}\n","import { retrieveRawInitDataFp, retrieveLaunchParamsFp } from '@vbotma/bridge';\nimport { either as E, function as fn, option as O } from 'fp-ts';\n\nimport { InitData } from '@/features/InitData/InitData.js';\n\nfunction instantiate() {\n return new InitData({\n retrieveInitData() {\n return fn.pipe(\n E.Do,\n E.bindW('obj', () => fn.pipe(\n retrieveLaunchParamsFp(),\n E.map(({ vbWebAppData }) => {\n return vbWebAppData ? O.some(vbWebAppData) : O.none;\n }),\n )),\n E.bindW('raw', retrieveRawInitDataFp),\n E.map(({ obj, raw }) => {\n return fn.pipe(\n O.Do,\n O.bind('obj', () => obj),\n O.bind('raw', () => raw),\n );\n }),\n );\n },\n });\n}\n\nexport const initData = /* @__PURE__*/ instantiate();\n","import type { InvoiceStatus, RequestError } from '@vbotma/bridge';\nimport { computed, type Computed, signal } from '@vbotma/signals';\nimport { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError, InvalidArgumentsError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype InvoiceTask<E, T> = TE.TaskEither<RequestError | ConcurrentCallError | E, T>;\n\nexport interface InvoiceOptions extends WithVersion, WithRequest, SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class Invoice {\n constructor({ version, request, isTma }: InvoiceOptions) {\n const wrapSupportedTask = createWithChecksFp({\n version,\n isTma,\n requires: 'web_app_open_invoice',\n returns: 'task',\n });\n\n const isOpened = signal(false);\n const toggleClosed = () => {\n isOpened.set(false);\n };\n\n this.isSupported = createIsSupportedSignal('web_app_open_invoice', version);\n this.isOpened = computed(isOpened);\n this.openSlugFp = wrapSupportedTask((slug, options) => {\n return fn.pipe(\n this.isOpened()\n ? TE.left(new ConcurrentCallError('Invoice is already opened'))\n : TE.right(undefined as never),\n TE.chain(() => {\n isOpened.set(true);\n return request('web_app_open_invoice', 'invoice_closed', {\n ...options,\n params: { slug },\n capture: data => slug === data.slug,\n });\n }),\n TE.mapBoth(err => {\n toggleClosed();\n return err;\n }, data => {\n toggleClosed();\n return data.status;\n }),\n );\n });\n this.openUrlFp = wrapSupportedTask((url, options) => {\n const { hostname, pathname } = new URL(url, window.location.href);\n if (hostname !== 't.me') {\n return TE.left(new InvalidArgumentsError(`Link has unexpected hostname: ${hostname}`));\n }\n\n // Valid examples:\n // \"/invoice/my-slug\"\n // \"/$my-slug\"\n const match = pathname.match(/^\\/(\\$|invoice\\/)([A-Za-z0-9\\-_=]+)$/);\n if (!match) {\n return TE.left(new InvalidArgumentsError(\n 'Expected to receive a link with a pathname in format \"/invoice/{slug}\" or \"/${slug}\"',\n ));\n }\n return this.openSlugFp(match[2], options);\n });\n\n this.openUrl = throwifyWithChecksFp(this.openUrlFp);\n this.openSlug = throwifyWithChecksFp(this.openSlugFp);\n }\n\n /**\n * Signal indicating if any invoice is currently opened.\n */\n readonly isOpened: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Opens an invoice using its slug or URL.\n * @param slug - invoice slug.\n * @param options - additional options.\n * @since Mini Apps v6.1\n * @example\n * const status = await invoice.openSlug('kJNFS331');\n */\n readonly openSlugFp: WithChecksFp<\n (slug: string, options?: AsyncOptions) => InvoiceTask<never, InvoiceStatus>,\n true\n >;\n\n /**\n * @see openSlugFp\n */\n readonly openSlug: WithChecks<\n (slug: string, options?: AsyncOptions) => BetterPromise<InvoiceStatus>,\n true\n >;\n\n /**\n * Opens an invoice using its URL.\n * @param url - invoice URL.\n * @param options - additional options.\n * @since Mini Apps v6.1\n * @example\n * const status = await invoice.openUrl('https://t.me/$kJNFS331');\n */\n readonly openUrlFp: WithChecksFp<\n (url: string, options?: AsyncOptions) => (\n InvoiceTask<InvalidArgumentsError, InvoiceStatus>\n ),\n true\n >;\n\n /**\n * @see openUrlFp\n */\n readonly openUrl: WithChecks<\n (url: string, options?: AsyncOptions) => BetterPromise<InvoiceStatus>,\n true\n >;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { Invoice } from '@/features/Invoice/Invoice.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new Invoice(fn.pipe(sharedFeatureOptions(), withRequest, withVersion));\n}\n\nexport const invoice = /* @__PURE__*/ instantiate();\n","import type { OpenLinkBrowser, PostEventError } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n type SharedFeatureOptions,\n sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { type WithPostEvent, withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent {\n}\n\nexport interface OpenLinkOptions {\n /**\n * Attempts to use the instant view mode.\n */\n tryInstantView?: boolean;\n /**\n * A preferred browser to open the link in.\n */\n tryBrowser?: OpenLinkBrowser;\n}\n\nexport type OpenLinkError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n return withChecksFp((\n url: string | URL,\n options: OpenLinkOptions = {},\n ): E.Either<OpenLinkError, void> => {\n if (typeof url === 'string') {\n try {\n url = new URL(url);\n } catch (e) {\n return E.left(new InvalidArgumentsError(`\"${url.toString()}\" is invalid URL`, e));\n }\n }\n return postEvent('web_app_open_link', {\n url: url.toString(),\n try_browser: options.tryBrowser,\n try_instant_view: options.tryInstantView,\n });\n }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(sharedFeatureOptions(), withPostEvent));\n}\n\n/**\n * Opens a link.\n *\n * The Mini App will not be closed.\n *\n * Note that this method can be called only in response to the user\n * interaction with the Mini App interface (e.g. click inside the Mini App or on the main button).\n * @param url - URL to be opened.\n * @param options - additional options.\n * @example\n * openLink('https://google.com', {\n * tryInstantView: true,\n * tryBrowser: 'chrome',\n * });\n */\nexport const openLinkFp = instantiate();\n\nexport const openLink = throwifyWithChecksFp(openLinkFp);\n","import { supports, type PostEventError } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n type SharedFeatureOptions,\n sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport type OpenTelegramLinkError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, version, ...rest }: CreateOptions) {\n return withChecksFp((\n url: string | URL,\n ): E.Either<OpenTelegramLinkError, void> => {\n const urlString = url.toString();\n if (!urlString.match(/^https:\\/\\/t.me\\/.+/)) {\n return E.left(new InvalidArgumentsError(`\"${urlString}\" is invalid URL`));\n }\n\n if (supports('web_app_open_tg_link', access(version))) {\n url = new URL(url);\n return postEvent('web_app_open_tg_link', { path_full: url.pathname + url.search });\n }\n\n window.location.href = urlString;\n return E.right(undefined);\n }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n ));\n}\n\n/**\n * Opens a Telegram link inside the Telegram app. The function expects passing a link in a full\n * format using the hostname \"t.me\".\n *\n * The Mini App will be closed.\n * @param url - URL to be opened.\n * @example\n * openTelegramLink('https://t.me/heyqbnk');\n */\nexport const openTelegramLinkFp = instantiate();\n\n/**\n * @see openTelegramLinkFp\n */\nexport const openTelegramLink = throwifyWithChecksFp(openTelegramLinkFp);\n","import type { PostEventError } from '@vbotma/bridge';\nimport type { either as E } from 'fp-ts';\n\nimport { openTelegramLinkFp } from '@/features/links/openTelegramLink.js';\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions {\n openTelegramLink: (url: string) => E.Either<PostEventError, void>;\n}\n\nexport type ShareURLError = PostEventError;\n\nfunction create({ openTelegramLink, ...rest }: CreateOptions) {\n return withChecksFp((url: string, text?: string): E.Either<ShareURLError, void> => {\n return openTelegramLink(\n 'https://t.me/share/url?' + new URLSearchParams({ url, text: text || '' })\n .toString()\n // By default, URL search params encode spaces with \"+\".\n // We are replacing them with \"%20\", because plus symbols are working incorrectly\n // in Telegram.\n .replace(/\\+/g, '%20'),\n );\n }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create({\n ...sharedFeatureOptions(),\n openTelegramLink: openTelegramLinkFp,\n });\n}\n\n/**\n * Shares the specified URL with the passed to the chats, selected by user.\n * After being called, it closes the mini application.\n *\n * This method uses Telegram's Share Links.\n * @param url - URL to share.\n * @param text - text to append after the URL.\n * @see https://core.telegram.org/api/links#share-links\n * @see https://core.telegram.org/widgets/share#custom-buttons\n */\nexport const shareURLFp = instantiate();\n\n/**\n * @see shareURLFp\n */\nexport const shareURL = throwifyWithChecksFp(shareURLFp);\n","import type { EventPayload, RequestError, PostEventError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport type { Maybe } from '@vbotma/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type {\n LocationManagerOptions,\n LocationManagerRequestLocationResponse,\n LocationManagerState,\n} from '@/features/LocationManager/types.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\nfunction eventToState(event: EventPayload<'location_checked'>): LocationManagerState {\n let available = false;\n let accessRequested: Maybe<boolean>;\n let accessGranted: Maybe<boolean>;\n if (event.available) {\n available = true;\n accessRequested = event.access_requested;\n accessGranted = event.access_granted;\n }\n return {\n available,\n accessGranted: accessGranted || false,\n accessRequested: accessRequested || false,\n };\n}\n\n/**\n * @since Mini Apps v8.0\n */\nexport class LocationManager {\n constructor({\n version,\n request,\n postEvent,\n storage,\n isTma,\n isPageReload,\n }: LocationManagerOptions) {\n const stateful = new Stateful({\n initialState: {\n available: false,\n accessGranted: false,\n accessRequested: false,\n },\n onChange: storage.set,\n });\n const mountable = new AsyncMountable<LocationManagerState, RequestError>({\n isPageReload,\n restoreState: storage.get,\n onMounted: stateful.setState,\n initialState(options) {\n return fn.pipe(\n request('web_app_check_location', 'location_checked', options),\n TE.map(eventToState),\n );\n },\n });\n\n const wrapOptions = { version, requires: 'web_app_check_location', isTma } as const;\n const wrapSupportedEither = createWithChecksFp({\n ...wrapOptions,\n returns: 'either',\n });\n const wrapSupportedTask = createWithChecksFp({\n ...wrapOptions,\n returns: 'task',\n });\n const wrapMountedTask = createWithChecksFp({\n ...wrapOptions,\n returns: 'task',\n isMounted: mountable.isMounted,\n });\n\n this.isAvailable = stateful.getter('available');\n this.isAccessRequested = stateful.getter('accessRequested');\n this.isAccessGranted = stateful.getter('accessGranted');\n this.isSupported = createIsSupportedSignal('web_app_check_location', version);\n this.isMounted = mountable.isMounted;\n this.state = stateful.state;\n\n this.unmount = mountable.unmount;\n this.mountFp = wrapSupportedTask(mountable.mount);\n this.openSettingsFp = wrapSupportedEither(() => {\n return postEvent('web_app_open_location_settings');\n });\n this.requestLocationFp = wrapMountedTask(options => {\n return fn.pipe(\n request('web_app_request_location', 'location_requested', options),\n TE.map(response => {\n if (!response.available) {\n stateful.setState({ available: false });\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { available, ...rest } = response;\n return rest;\n }),\n );\n });\n\n this.mount = throwifyWithChecksFp(this.mountFp);\n this.openSettings = throwifyWithChecksFp(this.openSettingsFp);\n this.requestLocation = throwifyWithChecksFp(this.requestLocationFp);\n }\n\n /**\n * Complete location manager state.\n */\n readonly state: Computed<LocationManagerState>;\n\n /**\n * Signal indicating whether the location data tracking is currently available.\n */\n readonly isAvailable: Computed<boolean>;\n\n /**\n * Signal indicating whether the user has granted the app permission to track location data.\n */\n readonly isAccessGranted: Computed<boolean>;\n\n /**\n * Signal indicating whether the app has previously requested permission to track location data.\n */\n readonly isAccessRequested: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Opens the location access settings for bots. Useful when you need to request location access\n * from users who haven't granted it yet.\n *\n * Note that this method can be called only in response to user interaction with the Mini App\n * interface (e.g., a click inside the Mini App or on the main button).\n * @since Mini Apps v8.0\n */\n readonly openSettingsFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see openSettingsFp\n */\n readonly openSettings: WithChecks<() => void, true>;\n\n /**\n * Requests location data.\n * @since Mini Apps v8.0\n * @returns Promise with location data or null it access was not granted.\n */\n readonly requestLocationFp: WithChecksFp<\n (options?: AsyncOptions) => (\n TE.TaskEither<RequestError, LocationManagerRequestLocationResponse | null>\n ),\n true\n >;\n\n /**\n * @see requestLocationFp\n */\n readonly requestLocation: WithChecks<\n (options?: AsyncOptions) => BetterPromise<LocationManagerRequestLocationResponse | null>,\n true\n >;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v8.0\n */\n readonly mountFp: WithChecksFp<\n (options?: AsyncOptions) => TE.TaskEither<RequestError, void>,\n true\n >;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { LocationManager } from '@/features/LocationManager/LocationManager.js';\nimport type { LocationManagerState } from '@/features/LocationManager/types.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new LocationManager(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n withRequest,\n withStateRestore<LocationManagerState>('locationManager'),\n ));\n}\n\nexport const locationManager = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@vbotma/bridge';\nimport { computed, type Computed } from '@vbotma/signals';\nimport type { RGB } from '@vbotma/types';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport type { WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype MainButtonEither = E.Either<PostEventError, void>;\n\nexport interface MainButtonState {\n isVisible: boolean;\n bgColor?: RGB;\n hasShineEffect: boolean;\n isEnabled: boolean;\n isLoaderVisible: boolean;\n text: string;\n textColor?: RGB;\n}\n\nexport interface MainButtonOptions extends Omit<\n ButtonOptions<MainButtonState, 'web_app_setup_main_button'>,\n 'initialState' | 'method' | 'payload' | 'version'\n> {\n /**\n * Default values for different kinds of the button properties.\n */\n defaults: {\n bgColor: MaybeAccessor<RGB>;\n textColor: MaybeAccessor<RGB>;\n };\n}\n\nexport class MainButton {\n constructor({ defaults, ...options }: MainButtonOptions) {\n const button = new Button({\n ...options,\n version: '100',\n initialState: {\n hasShineEffect: false,\n isEnabled: true,\n isLoaderVisible: false,\n isVisible: false,\n text: 'Continue',\n },\n method: 'web_app_setup_main_button',\n payload: state => ({\n has_shine_effect: state.hasShineEffect,\n is_visible: state.isVisible,\n is_active: state.isEnabled,\n is_progress_visible: state.isLoaderVisible,\n text: state.text,\n color: state.bgColor,\n text_color: state.textColor,\n }),\n });\n\n const withDefault = (\n field: 'bgColor' | 'textColor',\n getDefault: MaybeAccessor<RGB>,\n ) => {\n const fromState = button.stateGetter(field);\n return computed(() => fromState() || access(getDefault));\n };\n\n this.bgColor = withDefault('bgColor', defaults.bgColor);\n this.textColor = withDefault('textColor', defaults.textColor);\n this.hasShineEffect = button.stateGetter('hasShineEffect');\n this.isEnabled = button.stateGetter('isEnabled');\n this.isLoaderVisible = button.stateGetter('isLoaderVisible');\n this.text = button.stateGetter('text');\n this.isVisible = button.stateGetter('isVisible');\n this.isMounted = button.isMounted;\n this.state = button.state;\n\n [this.setBgColor, this.setBgColorFp] = button.stateSetters('bgColor');\n [this.setTextColor, this.setTextColorFp] = button.stateSetters('textColor');\n [\n [this.disableShineEffect, this.disableShineEffectFp],\n [this.enableShineEffect, this.enableShineEffectFp],\n ] = button.stateBoolSetters('hasShineEffect');\n [\n [this.disable, this.disableFp],\n [this.enable, this.enableFp],\n ] = button.stateBoolSetters('isEnabled');\n [\n [this.hideLoader, this.hideLoaderFp],\n [this.showLoader, this.showLoaderFp],\n ] = button.stateBoolSetters('isLoaderVisible');\n\n [this.setText, this.setTextFp] = button.stateSetters('text');\n [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n this.setParams = button.setState;\n this.setParamsFp = button.setStateFp;\n this.onClick = button.onClick;\n this.onClickFp = button.onClickFp;\n this.offClick = button.offClick;\n this.offClickFp = button.offClickFp;\n this.mount = button.mount;\n this.mountFp = button.mountFp;\n this.unmount = button.unmount;\n }\n\n //#region Properties.\n /**\n * The button background color.\n */\n readonly bgColor: Computed<RGB>;\n\n /**\n * True if the button has a shining effect.\n */\n readonly hasShineEffect: Computed<boolean>;\n\n /**\n * True if the button is clickable.\n */\n readonly isEnabled: Computed<boolean>;\n\n /**\n * True if the button loader is visible.\n */\n readonly isLoaderVisible: Computed<boolean>;\n\n /**\n * True if the button is visible.\n */\n readonly isVisible: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * The complete button state.\n */\n readonly state: Computed<MainButtonState>;\n\n /**\n * The button displayed text.\n */\n readonly text: Computed<string>;\n\n /**\n * The button text color.\n *\n * Note that this value is computed based on the external defaults. For\n * example, if not explicitly set, this value may be equal to one of theme\n * params colors.\n */\n readonly textColor: Computed<RGB>;\n //#endregion\n\n //#region Methods.\n /**\n * Shows the button.\n */\n readonly showFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see showFp\n */\n readonly show: WithChecks<() => void, false>;\n\n /**\n * Hides the button.\n */\n readonly hideFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see hideFp\n */\n readonly hide: WithChecks<() => void, false>;\n\n /**\n * Enables the button.\n */\n readonly enableFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see enableFp\n */\n readonly enable: WithChecks<() => void, false>;\n\n /**\n * Enables the button.\n */\n readonly enableShineEffectFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see enableShineEffectFp\n */\n readonly enableShineEffect: WithChecks<() => void, false>;\n\n /**\n * Disables the button.\n */\n readonly disableFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see disableFp\n */\n readonly disable: WithChecks<() => void, false>;\n\n /**\n * Enables the button.\n */\n readonly disableShineEffectFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see disableShineEffectFp\n */\n readonly disableShineEffect: WithChecks<() => void, false>;\n\n /**\n * Updates the button background color.\n */\n readonly setBgColorFp: WithChecksFp<(value: RGB) => MainButtonEither, false>;\n\n /**\n * @see setBgColorFp\n */\n readonly setBgColor: WithChecks<(value: RGB) => void, false>;\n\n /**\n * Updates the button text color.\n */\n readonly setTextColorFp: WithChecksFp<(value: RGB) => MainButtonEither, false>;\n\n /**\n * @see setTextColorFp\n */\n readonly setTextColor: WithChecks<(value: RGB) => void, false>;\n\n /**\n * Updates the button text.\n */\n readonly setTextFp: WithChecksFp<(value: string) => MainButtonEither, false>;\n\n /**\n * @see setTextFp\n */\n readonly setText: WithChecks<(value: string) => void, false>;\n\n /**\n * Shows the button loader.\n */\n readonly showLoaderFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see showLoaderFp\n */\n readonly showLoader: WithChecks<() => void, false>;\n\n /**\n * Hides the button loader.\n */\n readonly hideLoaderFp: WithChecksFp<() => MainButtonEither, false>;\n\n /**\n * @see hideLoaderFp\n */\n readonly hideLoader: WithChecks<() => void, false>;\n\n /**\n * Updates the button state.\n * @param state - updates to apply.\n * @example\n * button.setParams({\n * text: 'Submit',\n * isEnabled: true,\n * hasShineEffect: true,\n * });\n */\n readonly setParamsFp: WithChecksFp<(state: Partial<MainButtonState>) => MainButtonEither, false>;\n\n readonly setParams: WithChecks<(state: Partial<MainButtonState>) => void, false>;\n\n /**\n * Mounts the component restoring its state.\n */\n readonly mountFp: WithChecksFp<() => void, false>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, false>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n\n /**\n * Adds a new button listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @returns A function to remove bound listener.\n * @example\n * const off = button.onClick(() => {\n * console.log('User clicked the button');\n * off();\n * });\n */\n readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, false>;\n\n /**\n * @see onClickFp\n */\n readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, false>;\n\n /**\n * Removes the button click listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @example\n * function listener() {\n * console.log('User clicked the button');\n * button.offClick(listener);\n * }\n * button.onClick(listener);\n */\n readonly offClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => void, false>;\n\n /**\n * @see offClickFp\n */\n readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, false>;\n //#endregion\n}\n","/**\n * Sets CSS variable globally.\n * @param name - variable name.\n * @param value - variable value.\n */\nexport function setCssVar(name: string, value: string | null): void {\n document.documentElement.style.setProperty(name, value);\n}\n\n/**\n * Deletes specified CSS variable.\n * @param name - variable name.\n */\nexport function deleteCssVar(name: string): void {\n document.documentElement.style.removeProperty(name);\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport { toRGBFullFp } from '@vbotma/transformers';\nimport { either as E, function as fn } from 'fp-ts';\n\n/**\n * @param color - color in any format acceptable by the `toRGB` function.\n * @returns True if the color is recognized as dark.\n * @see toRGB\n */\nexport function isColorDarkFp(color: string): E.Either<Error, boolean> {\n return fn.pipe(\n toRGBFullFp(color),\n E.map(rgb => {\n // Actual formula: hsp = Math.sqrt(0.299 * r * r + 0.587 * g * g + 0.114 * b * b)\n // See: https://stackoverflow.com/a/596243\n return Math.sqrt(\n [0.299, 0.587, 0.114].reduce<number>((acc, modifier, idx) => {\n // Extract part of #RRGGBB pattern and convert it to DEC.\n const dec = parseInt(rgb.slice(1 + (idx * 2), 1 + ((idx + 1) * 2)), 16);\n return acc + (dec * dec * modifier);\n }, 0),\n ) < 120;\n }),\n );\n}\n\n/**\n * @see isColorDarkFp\n */\nexport const isColorDark = throwifyFpFn(isColorDarkFp);\n","import type { EventListener } from '@vbotma/bridge';\nimport { computed, type Computed, signal } from '@vbotma/signals';\nimport { snakeToKebab } from '@vbotma/toolkit';\nimport type { ThemeParams as ThemeParamsType, RGB } from '@vbotma/types';\nimport { either as E } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { isColorDark } from '@/helpers/isColorDark.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type ThemeParamsState = ThemeParamsType;\n\nexport interface ThemeParamsOptions extends WithStateRestore<ThemeParamsState>,\n SharedFeatureOptions {\n /**\n * Removes a theme change listener.\n * @param listener - a listener to remove.\n */\n offChange: (listener: EventListener<'theme_changed'>) => void;\n /**\n * Adds a theme change listener.\n * @returns A function to remove listener.\n * @param listener - a listener to add.\n */\n onChange: (listener: EventListener<'theme_changed'>) => void;\n /**\n * Theme parameters initial state.\n */\n initialState: MaybeAccessor<ThemeParamsType>;\n}\n\nexport interface ThemeParamsGetCssVarNameFn {\n /**\n * @param property - palette key.\n * @returns Computed complete CSS variable name.\n */\n (property: Extract<keyof ThemeParamsType, string>): string;\n}\n\nexport class ThemeParams {\n constructor({\n initialState,\n onChange,\n offChange,\n isTma,\n storage,\n isPageReload,\n }: ThemeParamsOptions) {\n const stateful = new Stateful<ThemeParamsState>({\n initialState: {},\n onChange: storage.set,\n });\n const listener: EventListener<'theme_changed'> = event => {\n stateful.setState(event.theme_params);\n };\n const mountable = new Mountable<ThemeParamsType>({\n initialState: () => E.right(access(initialState)),\n isPageReload,\n onMounted(state) {\n stateful.setState(state);\n onChange(listener);\n },\n onUnmounted() {\n offChange(listener);\n },\n restoreState: storage.get,\n });\n\n const wrapOptions = { isTma, returns: 'either' } as const;\n const wrapSupportedEither = createWithChecksFp(wrapOptions);\n const wrapMountedEither = createWithChecksFp({\n ...wrapOptions,\n isMounted: mountable.isMounted,\n });\n\n // Colors.\n this.accentTextColor = stateful.getter('accent_text_color');\n this.bgColor = stateful.getter('bg_color');\n this.buttonColor = stateful.getter('button_color');\n this.buttonTextColor = stateful.getter('button_text_color');\n this.bottomBarBgColor = stateful.getter('bottom_bar_bg_color');\n this.destructiveTextColor = stateful.getter('destructive_text_color');\n this.headerBgColor = stateful.getter('header_bg_color');\n this.hintColor = stateful.getter('hint_color');\n this.linkColor = stateful.getter('link_color');\n this.secondaryBgColor = stateful.getter('secondary_bg_color');\n this.sectionBgColor = stateful.getter('section_bg_color');\n this.sectionHeaderTextColor = stateful.getter('section_header_text_color');\n this.sectionSeparatorColor = stateful.getter('section_separator_color');\n this.subtitleTextColor = stateful.getter('subtitle_text_color');\n this.textColor = stateful.getter('text_color');\n\n // Other public signals.\n this.state = stateful.state;\n this.isMounted = mountable.isMounted;\n this.bindCssVarsFp = wrapMountedEither(getCSSVarName => {\n if (this._isCssVarsBound()) {\n return E.left(new CSSVarsBoundError());\n }\n getCSSVarName ||= prop => `--tg-theme-${snakeToKebab(prop)}`;\n\n const forEachEntry = (fn: (key: string, value: RGB) => void): void => {\n Object.entries(stateful.state()).forEach(([k, v]) => {\n v && fn(k, v);\n });\n };\n\n const actualize = (): void => {\n forEachEntry((k, v) => {\n setCssVar(getCSSVarName(k), v);\n });\n };\n\n actualize();\n stateful.state.sub(actualize);\n this._isCssVarsBound.set(true);\n\n return E.right(() => {\n forEachEntry(deleteCssVar);\n stateful.state.unsub(actualize);\n this._isCssVarsBound.set(false);\n });\n });\n this.mountFp = wrapSupportedEither(mountable.mount);\n this.unmount = mountable.unmount;\n\n this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n this.mount = throwifyWithChecksFp(this.mountFp);\n }\n\n //#region Colors.\n /**\n * @since v6.10\n */\n readonly accentTextColor: Computed<RGB | undefined>;\n\n readonly bgColor: Computed<RGB | undefined>;\n\n readonly buttonColor: Computed<RGB | undefined>;\n\n readonly buttonTextColor: Computed<RGB | undefined>;\n\n /**\n * @since v7.10\n */\n readonly bottomBarBgColor: Computed<RGB | undefined>;\n\n readonly destructiveTextColor: Computed<RGB | undefined>;\n\n /**\n * @since v6.10\n */\n readonly headerBgColor: Computed<RGB | undefined>;\n\n readonly hintColor: Computed<RGB | undefined>;\n\n readonly linkColor: Computed<RGB | undefined>;\n\n readonly secondaryBgColor: Computed<RGB | undefined>;\n\n /**\n * @since v6.10\n */\n readonly sectionBgColor: Computed<RGB | undefined>;\n\n /**\n * @since v6.10\n */\n readonly sectionHeaderTextColor: Computed<RGB | undefined>;\n\n /**\n * @since v7.6\n */\n readonly sectionSeparatorColor: Computed<RGB | undefined>;\n\n /**\n * @since v6.10\n */\n readonly subtitleTextColor: Computed<RGB | undefined>;\n\n readonly textColor: Computed<RGB | undefined>;\n //#endregion\n\n //#region CSS variables.\n private readonly _isCssVarsBound = signal(false);\n\n /**\n * True if CSS variables are currently bound.\n */\n readonly isCssVarsBound = computed(this._isCssVarsBound);\n\n /**\n * Creates CSS variables connected with the current theme parameters.\n *\n * By default, created CSS variables names are following the pattern \"--tg-theme-{name}\", where\n * {name} is a theme parameters key name converted from snake case to kebab case.\n *\n * Default variables:\n * - `--tg-theme-bg-color`\n * - `--tg-theme-secondary-text-color`\n *\n * Variables are being automatically updated if theme parameters were changed.\n *\n * @param getCSSVarName - function, returning complete CSS variable name for the specified\n * theme parameters key.\n * @returns Function to stop updating variables.\n * @throws {CSSVarsBoundError} CSS variables are already bound\n * @example Using custom CSS vars generator\n * themeParams.bindCssVars(key => `--my-prefix-${key}`);\n */\n readonly bindCssVarsFp: WithChecksFp<\n (getCSSVarName?: ThemeParamsGetCssVarNameFn) => E.Either<CSSVarsBoundError, VoidFunction>,\n false\n >;\n\n /**\n * @see bindCssVarsFp\n */\n readonly bindCssVars: WithChecks<\n (getCSSVarName?: ThemeParamsGetCssVarNameFn) => VoidFunction,\n false\n >;\n //#endregion\n\n //#region Other public signals.\n /**\n * Complete component state.\n */\n readonly state: Computed<ThemeParamsType>;\n\n /**\n * @returns True if the current color scheme is recognized as dark.\n * This value is calculated based on the current theme's background color.\n */\n readonly isDark = computed(() => {\n const color = this.bgColor();\n return !color || isColorDark(color);\n });\n //#endregion\n\n //#region Mounting.\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Mounts the component restoring its state.\n */\n readonly mountFp: WithChecksFp<() => E.Either<never, void>, false>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, false>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n //#endregion\n}\n","import type { ThemeParams } from '@vbotma/types';\n\nimport { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * Mini application's theme parameters.\n */\nexport const themeParams = createSignal<ThemeParams>({});\n","import { on, off } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { ThemeParams, type ThemeParamsState } from '@/features/ThemeParams/ThemeParams.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { themeParams as globalThemeParams } from '@/globals/themeParams.js';\n\nfunction instantiate() {\n return new ThemeParams({\n ...fn.pipe(\n sharedFeatureOptions(),\n withStateRestore<ThemeParamsState>('themeParams'),\n ),\n offChange(listener) {\n off('theme_changed', listener);\n },\n onChange(listener) {\n on('theme_changed', listener);\n },\n initialState: globalThemeParams,\n });\n}\n\nexport const themeParams = /* @__PURE__*/ instantiate();\n","import type { EventName } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\n// @__NO_SIDE_EFFECTS__\nexport function bottomButtonOptions<S, D>(\n storageName: string,\n trackedClickEvent: EventName,\n defaults: D,\n) {\n return fn.pipe(\n buttonOptions<S>(storageName, trackedClickEvent),\n obj => ({ ...obj, defaults }),\n );\n}\n","import { computed } from '@vbotma/signals';\n\nimport { MainButton } from '@/features/MainButton/MainButton.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { bottomButtonOptions } from '@/fn-options/bottomButtonOptions.js';\n\nexport const mainButton = /* @__PURE__*/ new MainButton(\n bottomButtonOptions('mainButton', 'main_button_pressed', {\n bgColor: computed(() => themeParams.buttonColor() || '#2481cc'),\n textColor: computed(() => themeParams.buttonTextColor() || '#ffffff'),\n }),\n);\n","import {\n supports,\n type PostEventError,\n type EventPayload,\n type EventListener,\n} from '@vbotma/bridge';\nimport { type Computed, computed } from '@vbotma/signals';\nimport { signal } from '@vbotma/signals';\nimport { createCbCollector, camelToKebab } from '@vbotma/toolkit';\nimport { isRGB } from '@vbotma/transformers';\nimport type { KnownThemeParamsKey, RGB, ThemeParams } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError, UnknownThemeParamsKeyError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { isColorDark } from '@/helpers/isColorDark.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n withChecksFp,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\ntype AnyColor = RGB | KnownThemeParamsKey | string;\n\nexport interface MiniAppState {\n bgColor: AnyColor;\n bottomBarColor: AnyColor;\n headerColor: AnyColor;\n isActive: boolean;\n}\n\nexport interface MiniAppGetCssVarNameFn {\n /**\n * @param property - mini app property.\n * @returns Computed complete CSS variable name.\n */\n (property: 'bgColor' | 'bottomBarColor' | 'headerColor'): string;\n}\n\ntype WithListeners<Handlers extends string, Payload> = {\n [K in Handlers]: (listener: (payload: Payload) => void) => void;\n};\n\nexport interface MiniAppOptions extends WithPostEvent,\n WithVersion,\n WithStateRestore<MiniAppState>,\n WithListeners<'onVisibilityChanged' | 'offVisibilityChanged', EventPayload<'visibility_changed'>>,\n SharedFeatureOptions {\n /**\n * The current theme parameters.\n */\n theme: Computed<ThemeParams>;\n}\n\n/**\n * @since Mini Apps v6.1\n */\nexport class MiniApp {\n constructor({\n storage,\n isPageReload,\n version,\n postEvent,\n isTma,\n theme,\n onVisibilityChanged,\n offVisibilityChanged,\n }: MiniAppOptions) {\n //#region Mounting.\n const visibilityChangedListener: EventListener<'visibility_changed'> = event => {\n stateful.setState({ isActive: event.is_visible });\n };\n const themeChangedListener = (theme: ThemeParams) => {\n // Sometimes we may have the following colors to be specified as some theme params keys.\n // Due to the Mini Apps nature, we are not really allowed to do that, but we want to provide\n // such an opportunity to developers.\n //\n // So if the developer specified some field as a reference to some theme params key, we\n // should find an according RGB color for it and send it to the VBot client. We have one\n // exclusion here - the method 'web_app_set_header_color' may accept values 'bg_color'\n // and 'secondary_bg_color'. Other methods accept only RGB values.\n ([\n [this.headerColor, 'web_app_set_header_color'],\n [this.bgColor, 'web_app_set_background_color'],\n [this.bottomBarColor, 'web_app_set_bottom_bar_color'],\n ] as const).forEach(([signal, method]) => {\n const color = signal();\n // The value is already in RGB format, we have nothing to update here.\n if (isRGB(color)) {\n return;\n }\n // The real RGB value should only be extracted for the following methods:\n // - 'web_app_set_background_color'\n // - 'web_app_set_bottom_bar_color'\n // We should also do it in case of the 'web_app_set_header_color' method, if the value\n // specified is not 'bg_color' and 'secondary_bg_color' (unknown key to\n // the VBot client).\n if (\n method !== 'web_app_set_header_color'\n || !['bg_color', 'secondary_bg_color'].includes(color)\n ) {\n const rgb = theme[color];\n if (rgb) {\n postEvent(method, { color: rgb });\n }\n }\n });\n };\n const mountable = new Mountable({\n initialState() {\n return E.right({\n bgColor: 'bg_color',\n headerColor: 'header_bg_color',\n bottomBarColor: 'bottom_bar_bg_color',\n isActive: true,\n });\n },\n isPageReload,\n onMounted: state => {\n onVisibilityChanged(visibilityChangedListener);\n theme.sub(themeChangedListener);\n stateful.setState(state);\n },\n onUnmounted() {\n offVisibilityChanged(visibilityChangedListener);\n theme.unsub(themeChangedListener);\n },\n restoreState: storage.get,\n });\n this.isMounted = mountable.isMounted;\n this.mountFp = withChecksFp(() => {\n const nothing = () => undefined;\n return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n }, { isTma, returns: 'plain' });\n this.mount = throwifyWithChecksFp(this.mountFp);\n this.unmount = mountable.unmount;\n //#endregion\n\n //#region State.\n const stateful = new Stateful({\n initialState: {\n bgColor: 'bg_color',\n bottomBarColor: 'bottom_bar_bg_color',\n headerColor: 'bg_color',\n isActive: false,\n },\n onChange: storage.set,\n });\n this.state = stateful.state;\n\n const rgbBasedOn = (color: AnyColor): RGB | undefined => {\n return isRGB(color) ? color : access(theme)[color];\n };\n const computedRgbBasedOn = (signal: Computed<AnyColor>): Computed<RGB | undefined> => {\n return computed(() => rgbBasedOn(signal()));\n };\n //#endregion\n\n //#region Other properties.\n this.isActive = stateful.getter('isActive');\n this.isSupported = computed(() => {\n return ([\n 'web_app_set_header_color',\n 'web_app_set_background_color',\n 'web_app_set_bottom_bar_color',\n ] as const).some(method => supports(method, access(version)));\n });\n //#endregion\n\n //#region Css vars.\n const isCssVarsBound = signal(false);\n this.isCssVarsBound = computed(isCssVarsBound);\n this.bindCssVarsFp = withChecksFp(getCSSVarName => {\n if (isCssVarsBound()) {\n return E.left(new CSSVarsBoundError());\n }\n const [addCleanup, cleanup] = createCbCollector(() => {\n isCssVarsBound.set(false);\n });\n\n const bind = (cssVar: string, signal: Computed<RGB | undefined>) => {\n const update = () => {\n setCssVar(cssVar, signal() || null);\n };\n update();\n addCleanup(signal.sub(update), deleteCssVar.bind(null, cssVar));\n };\n\n getCSSVarName ||= prop => `--tg-${camelToKebab(prop)}`;\n bind(getCSSVarName('bgColor'), this.bgColorRgb);\n bind(getCSSVarName('bottomBarColor'), this.bottomBarColorRgb);\n bind(getCSSVarName('headerColor'), this.headerColorRgb);\n\n isCssVarsBound.set(true);\n\n return E.right(cleanup);\n }, { isTma, returns: 'either', isMounted: this.isMounted });\n this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n //#endregion\n\n //#region Colors.\n type GenColorToolsetResult<K extends Exclude<keyof MiniAppState, 'isActive'>> = [\n rawColor: Computed<AnyColor>,\n rgbColor: Computed<RGB | undefined>,\n throwing: WithChecks<\n (color: AnyColor) => void,\n true,\n K extends 'headerColor' ? 'rgb' : never\n >,\n fp: WithChecksFp<\n (color: AnyColor) => E.Either<UnknownThemeParamsKeyError | PostEventError, void>,\n true,\n K extends 'headerColor' ? 'rgb' : never\n >,\n ];\n const genColorToolset = <K extends Exclude<keyof MiniAppState, 'isActive'>>(\n stateKey: K,\n ): GenColorToolsetResult<K> => {\n const rawColor = stateful.getter(stateKey);\n const rgbColor = computedRgbBasedOn(rawColor);\n const method = ({\n headerColor: 'web_app_set_header_color',\n bgColor: 'web_app_set_background_color',\n bottomBarColor: 'web_app_set_bottom_bar_color',\n } as const)[stateKey];\n\n const fp = withChecksFp(\n (color: AnyColor): E.Either<UnknownThemeParamsKeyError | PostEventError, void> => {\n if (color === rawColor()) {\n return E.right(undefined);\n }\n if (\n method === 'web_app_set_header_color'\n && (color === 'bg_color' || color === 'secondary_bg_color')\n ) {\n return fn.pipe(\n postEvent('web_app_set_header_color', { color_key: color }),\n E.map(() => {\n stateful.setState({ [stateKey]: color });\n }),\n );\n }\n const rgb = rgbBasedOn(color);\n return fn.pipe(\n rgb\n ? postEvent(method, { color: rgb })\n : E.left(new UnknownThemeParamsKeyError(color)),\n E.map(() => {\n stateful.setState({ [stateKey]: color });\n }),\n );\n },\n {\n isTma,\n version,\n requires: method,\n isMounted: this.isMounted,\n returns: 'either',\n supports: stateKey === 'headerColor'\n ? {\n rgb: {\n method: 'web_app_set_header_color',\n param: 'color',\n shouldCheck: isRGB,\n },\n }\n : undefined,\n },\n );\n\n return [rawColor, rgbColor, throwifyWithChecksFp(fp), fp] as GenColorToolsetResult<K>;\n };\n [\n this.bgColor,\n this.bgColorRgb,\n this.setBgColor,\n this.setBgColorFp,\n ] = genColorToolset('bgColor');\n [\n this.headerColor,\n this.headerColorRgb,\n this.setHeaderColor,\n this.setHeaderColorFp,\n ] = genColorToolset('headerColor');\n [\n this.bottomBarColor,\n this.bottomBarColorRgb,\n this.setBottomBarColor,\n this.setBottomBarColorFp,\n ] = genColorToolset('bottomBarColor');\n //#endregion\n\n //#region Other methods.\n const withBasicEither = createWithChecksFp({ isTma, returns: 'either' });\n this.closeFp = withBasicEither(returnBack => {\n return postEvent('web_app_close', { return_back: returnBack });\n });\n this.close = throwifyWithChecksFp(this.closeFp);\n\n this.readyFp = withBasicEither(() => postEvent('web_app_ready'));\n this.ready = throwifyWithChecksFp(this.readyFp);\n //#endregion\n }\n\n //#region Other properties.\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * True if the current Mini App background color is recognized as dark.\n */\n readonly isDark = computed(() => {\n const color = this.bgColorRgb();\n return color ? isColorDark(color) : false;\n });\n\n /**\n * Signal indicating if the mini app is currently active.\n */\n readonly isActive: Computed<boolean>;\n\n /**\n * Complete component state.\n */\n readonly state: Computed<MiniAppState>;\n //#endregion\n\n //#region CSS variables.\n /**\n * True if the CSS variables are currently bound.\n */\n readonly isCssVarsBound: Computed<boolean>;\n\n /**\n * Creates CSS variables connected with the mini app.\n *\n * Default variables:\n * - `--tg-bg-color`\n * - `--tg-header-color`\n * - `--tg-bottom-bar-color`\n *\n * Variables are being automatically updated if theme parameters were changed.\n *\n * @param getCSSVarName - function, returning complete CSS variable name for the specified\n * mini app key.\n * @returns Function to stop updating variables.\n * @example Using no arguments\n * miniApp.bindCssVars();\n * @example Using custom CSS vars generator\n * miniApp.bindCssVars(key => `--my-prefix-${key}`);\n */\n readonly bindCssVarsFp: WithChecksFp<\n (getCssVarName?: MiniAppGetCssVarNameFn) => E.Either<CSSVarsBoundError, VoidFunction>,\n false\n >;\n\n readonly bindCssVars: WithChecks<(getCssVarName?: MiniAppGetCssVarNameFn) => VoidFunction, false>;\n //#endregion\n\n //#region Mounting.\n /**\n * Signal indicating if the component is mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Mounts the component.\n *\n * This function restores the component state and is automatically saving it in the local storage\n * if it changed.\n * @since Mini Apps v6.1\n */\n readonly mountFp: WithChecksFp<() => void, false>;\n\n /**\n * @see mount\n */\n readonly mount: WithChecks<() => void, false>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n //#endregion\n\n //#region Background color.\n /**\n * The Mini App background color.\n *\n * Represents an RGB color, or theme parameters key, like \"bg_color\", \"secondary_bg_color\", etc.\n *\n * Note that using a theme parameters key, background color becomes bound to the current\n * theme parameters, making it automatically being updated whenever theme parameters change.\n * In order to remove this bind, use an explicit RGB color.\n */\n readonly bgColor: Computed<AnyColor>;\n\n /**\n * RGB representation of the background color.\n *\n * This value requires the Theme Params component to be mounted to extract a valid RGB value\n * of the color key.\n */\n readonly bgColorRgb: Computed<RGB | undefined>;\n\n /**\n * Updates the mini app background color.\n * @since Mini Apps v6.1\n */\n readonly setBgColorFp: WithChecksFp<\n (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n true\n >;\n\n /**\n * @see setBgColorFp\n */\n readonly setBgColor: WithChecks<(color: AnyColor) => void, true>;\n //#endregion\n\n //#region Header color.\n /**\n * The Mini App header color.\n */\n readonly headerColor: Computed<AnyColor>;\n\n /**\n * RGB representation of the header color.\n *\n * This value requires the Theme Params component to be mounted to extract a valid RGB value\n * of the color key.\n */\n readonly headerColorRgb: Computed<RGB | undefined>;\n\n /**\n * Updates the mini app header color.\n * @since Mini Apps v6.1\n */\n readonly setHeaderColorFp: WithChecksFp<\n (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n true,\n 'rgb'\n >;\n\n /**\n * @see setHeaderColorFp\n */\n readonly setHeaderColor: WithChecks<(color: AnyColor) => void, true, 'rgb'>;\n //#endregion\n\n //#region Bottom bar background color.\n /**\n * The Mini App bottom bar background color.\n */\n readonly bottomBarColor: Computed<AnyColor>;\n\n /**\n * RGB representation of the bottom bar background color.\n *\n * This value requires the Theme Params component to be mounted to extract a valid RGB value\n * of the color key.\n */\n readonly bottomBarColorRgb: Computed<RGB | undefined>;\n\n /**\n * Updates the mini app bottom bar bg color.\n * @since Mini Apps v7.10\n */\n readonly setBottomBarColorFp: WithChecksFp<\n (color: AnyColor) => E.Either<PostEventError | UnknownThemeParamsKeyError, void>,\n true\n >;\n\n /**\n * @see setBottomBarColorFp\n */\n readonly setBottomBarColor: WithChecks<(color: AnyColor) => void, true>;\n //#endregion\n\n //#region Other methods.\n /**\n * Closes the Mini App.\n * @param returnBack - should the client return to the previous activity.\n */\n readonly closeFp: WithChecksFp<(returnBack?: boolean) => E.Either<PostEventError, void>, false>;\n\n /**\n * @see closeFp\n */\n readonly close: WithChecks<(returnBack?: boolean) => void, false>;\n\n /**\n * Informs the Telegram app that the Mini App is ready to be displayed.\n *\n * It is recommended to call this method as early as possible, as soon as all\n * essential interface elements loaded.\n *\n * Once this method is called, the loading placeholder is hidden and the Mini\n * App shown.\n *\n * If the method is not called, the placeholder will be hidden only when the\n * page was fully loaded.\n */\n readonly readyFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n /**\n * @see readyFp\n */\n readonly ready: WithChecks<() => void, false>;\n //#endregion\n}\n","import { on, off } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { MiniApp, type MiniAppState } from '@/features/MiniApp/MiniApp.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new MiniApp({\n ...fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n withStateRestore<MiniAppState>('miniApp'),\n ),\n offVisibilityChanged(listener) {\n off('visibility_changed', listener);\n },\n onVisibilityChanged(listener) {\n on('visibility_changed', listener);\n },\n theme: themeParams.state,\n });\n}\n\nexport const miniApp = /* @__PURE__*/ instantiate();\n","import { postEventFp, type UnknownEnvError } from '@vbotma/bridge';\r\nimport type { BetterPromise } from 'better-promises';\r\nimport { taskEither as TE, function as fn } from 'fp-ts';\r\n\r\nimport type { NotificationOptions, SendNotificationOptions } from '@/features/Notification/types.js';\r\n\r\n/**\r\n * Generates a unique notification ID using timestamp and random string.\r\n */\r\nfunction generateNotificationId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return `notif_${timestamp}_${random}`;\r\n}\r\n\r\n/**\r\n * Notification feature class.\r\n * @since v9.2\r\n */\r\nexport class Notification {\r\n constructor({ }: NotificationOptions) {\r\n this.sendFp = (options: SendNotificationOptions): TE.TaskEither<UnknownEnvError, void> => {\r\n return fn.pipe(\r\n TE.fromEither(\r\n postEventFp('web_app_send_notification', {\r\n id: generateNotificationId(),\r\n message: options.message,\r\n title: options.title,\r\n type: options.type ?? 'default',\r\n })\r\n ),\r\n TE.map(() => undefined)\r\n );\r\n };\r\n\r\n this.send = (options: SendNotificationOptions): BetterPromise<void> => {\r\n const task = this.sendFp(options);\r\n return (task() as Promise<any>).then(result => {\r\n if (result._tag === 'Left') {\r\n throw result.left;\r\n }\r\n return result.right;\r\n }) as BetterPromise<void>;\r\n };\r\n }\r\n\r\n /**\r\n * Sends a notification to the native app.\r\n * @param options - notification options including message, optional title, and optional type (defaults to 'default')\r\n * @since v9.2\r\n */\r\n readonly sendFp: (options: SendNotificationOptions) => TE.TaskEither<UnknownEnvError, void>;\r\n\r\n /**\r\n * @see sendFp\r\n */\r\n readonly send: (options: SendNotificationOptions) => BetterPromise<void>;\r\n}\r\n","import { function as fn } from 'fp-ts';\r\n\r\nimport { Notification } from '@/features/Notification/Notification.js';\r\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\r\n\r\nfunction instantiate() {\r\n return new Notification(fn.pipe(sharedFeatureOptions()));\r\n}\r\n\r\nexport const notification = /* @__PURE__*/ instantiate();\r\n","import type { PopupParams, PopupButton } from '@vbotma/bridge';\nimport { either as E } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport type { ShowOptions } from '@/features/Popup/types.js';\n\n/**\n * Prepares popup parameters before sending them to native app.\n * @param params - popup parameters.\n */\nexport function prepareParams(params: ShowOptions): E.Either<InvalidArgumentsError, PopupParams> {\n const message = params.message.trim();\n const title = (params.title || '').trim();\n const paramsButtons = params.buttons || [];\n\n if (title.length > 64) {\n return E.left(new InvalidArgumentsError(`Invalid title: ${title}`));\n }\n if (!message || message.length > 256) {\n return E.left(new InvalidArgumentsError(`Invalid message: ${message}`));\n }\n if (paramsButtons.length > 3) {\n return E.left(new InvalidArgumentsError(`Invalid buttons count: ${paramsButtons.length}`));\n }\n\n const buttons: PopupButton[] = [];\n if (!paramsButtons.length) {\n buttons.push({ type: 'close', id: '' });\n } else {\n for (let i = 0; i < paramsButtons.length; i++) {\n const button = paramsButtons[i];\n const id = button.id || '';\n if (id.length > 64) {\n return E.left(new InvalidArgumentsError(`Button with index ${i} has invalid id: ${id}`));\n }\n\n if (!button.type || button.type === 'default' || button.type === 'destructive') {\n const text = button.text.trim();\n if (!text || text.length > 64) {\n return E.left(new InvalidArgumentsError(`Button with index ${i} has invalid text: ${text}`));\n }\n buttons.push({ type: button.type, text, id });\n } else {\n buttons.push({ type: button.type, id });\n }\n }\n }\n\n return E.right({ title, message, buttons });\n}\n","import type { RequestError } from '@vbotma/bridge';\nimport { type Computed, signal, computed } from '@vbotma/signals';\nimport type { BetterPromise } from 'better-promises';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError, type InvalidArgumentsError } from '@/errors.js';\nimport { prepareParams } from '@/features/Popup/prepareParams.js';\nimport type { ShowOptions } from '@/features/Popup/types.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecksFp, type WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface PopupOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n}\n\n/**\n * @since Mini Apps v6.2\n */\nexport class Popup {\n constructor({ version, isTma, request }: PopupOptions) {\n const isOpened = signal(false);\n const toggleClosed = () => {\n isOpened.set(false);\n };\n\n const wrapSupportedTask = createWithChecksFp({\n version,\n isTma,\n requires: 'web_app_open_popup',\n returns: 'task',\n });\n\n this.isSupported = createIsSupportedSignal('web_app_open_popup', version);\n this.isOpened = computed(isOpened);\n this.showFp = wrapSupportedTask(options => {\n return fn.pipe(\n this.isOpened()\n ? TE.left(new ConcurrentCallError('A popup is already opened'))\n : TE.right(undefined as never),\n TE.chainW(() => TE.fromEither(prepareParams(options))),\n TE.chain(preparedOptions => {\n isOpened.set(true);\n return request('web_app_open_popup', 'popup_closed', {\n ...options,\n params: preparedOptions,\n });\n }),\n TE.mapBoth(\n err => {\n toggleClosed();\n return err;\n },\n response => {\n toggleClosed();\n return response.button_id;\n },\n ),\n );\n });\n this.show = throwifyWithChecksFp(this.showFp);\n }\n\n /**\n * Signal indicating if any popup is currently opened.\n */\n readonly isOpened: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * A method that shows a native popup described by the `params` argument.\n * The promise will be resolved when the popup is closed. Resolved value will have\n * an identifier of the pressed button.\n *\n * If a user clicked outside the popup or clicked the top right popup close\n * button, null will be resolved.\n *\n * @param options - popup parameters.\n * @since Mini Apps v6.2\n * @example\n * fn.pipe(\n * popup.showFp({\n * title: 'Confirm action',\n * message: 'Do you really want to buy this burger?',\n * buttons: [\n * { id: 'yes', text: 'Yes' },\n * { id: 'no', type: 'destructive', text: 'No' },\n * ],\n * }),\n * TE.map(buttonId => {\n * console.log('User clicked a button with ID', buttonId);\n * }),\n * );\n */\n readonly showFp: WithChecksFp<\n (options: ShowOptions) => TE.TaskEither<\n RequestError | InvalidArgumentsError | ConcurrentCallError,\n string | undefined\n >,\n true\n >;\n\n /**\n * @see showFp\n */\n readonly show: WithChecks<(options: ShowOptions) => BetterPromise<string | undefined>, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { Popup } from '@/features/Popup/Popup.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new Popup(fn.pipe(sharedFeatureOptions(), withRequest, withVersion));\n}\n\nexport const popup = /* @__PURE__*/ instantiate();\n","import type { PhoneRequestedStatus, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type RequestPhoneAccessError = RequestError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n options?: AsyncOptions,\n ): TE.TaskEither<RequestPhoneAccessError, PhoneRequestedStatus> => {\n return fn.pipe(\n request('web_app_request_phone', 'phone_requested', options),\n TE.map(response => response.status),\n );\n }, { ...rest, requires: 'web_app_request_phone', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n ));\n}\n\n/**\n * Requests current user phone access. Method returns promise, which resolves\n * status of the request. In case, user accepted the request, Mini App bot will receive\n * the according notification.\n *\n * To obtain the retrieved information instead, utilize the `requestContact` method.\n * @param options - additional options.\n * @since Mini Apps v6.9\n * @see requestContact\n */\nexport const requestPhoneAccessFp = instantiate();\n\n/**\n * @see requestPhoneAccessFp\n */\nexport const requestPhoneAccess = throwifyWithChecksFp(requestPhoneAccessFp);\n","import { PhoneRequestedStatus } from '@vbotma/bridge';\nimport { BetterTaskEither, type BetterTaskEitherError } from '@vbotma/toolkit';\nimport { pipeJsonToSchema, pipeQueryToSchema } from '@vbotma/transformers';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\nimport {\n safeParse,\n pipe as valiPipe,\n date,\n looseObject,\n number,\n optional,\n string,\n transform,\n} from 'valibot';\n\nimport { AccessDeniedError, ValidationError } from '@/errors.js';\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\n\nimport {\n withInvokeCustomMethod,\n type WithInvokeCustomMethod,\n InvokeCustomMethodError,\n} from '@/fn-options/withInvokeCustomMethod.js';\n\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\n\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\nimport { type RequestPhoneAccessError, requestPhoneAccessFp } from './requestPhoneAccess.js';\n\n/**\n * Requested contact information.\n */\nexport interface RequestedContact {\n contact: {\n user_id: number;\n phone_number: string;\n first_name: string;\n last_name?: string;\n [key: string]: unknown;\n };\n auth_date: Date;\n hash: string;\n [key: string]: unknown;\n}\n\n/**\n * Requested contact complete data.\n */\nexport interface RequestedContactCompleteData {\n /**\n * Raw original representation of the contact data returned from the Telegram server.\n */\n raw: string;\n /**\n * Parsed representation of the contact data.\n */\n parsed: RequestedContact;\n}\n\ninterface CreateCompleteOptions extends SharedFeatureOptions, WithInvokeCustomMethod, WithVersion {\n requestPhoneAccess: (options?: AsyncOptions) => (\n TE.TaskEither<RequestPhoneAccessError, PhoneRequestedStatus>\n );\n}\n\ninterface CreateParsedOptions extends SharedFeatureOptions, WithVersion {\n requestContact: (options?: AsyncOptions) => TE.TaskEither<RequestContactError, RequestedContact>;\n}\n\nexport type RequestContactError =\n | InvokeCustomMethodError\n | AccessDeniedError\n | ValidationError\n | BetterTaskEitherError;\n\nfunction createComplete({\n invokeCustomMethod,\n requestPhoneAccess,\n ...rest\n}: CreateCompleteOptions) {\n type GetRequestedContactError = InvokeCustomMethodError | ValidationError;\n\n // Attempts to get previously requested contact.\n const getContact = (\n options?: AsyncOptions,\n ): TE.TaskEither<GetRequestedContactError, RequestedContactCompleteData | undefined> => {\n return fn.pipe(\n invokeCustomMethod('getRequestedContact', {}, {\n ...options,\n timeout: (options || {}).timeout || 5000,\n }),\n TE.chainW(response => {\n const toStringResult = safeParse(string(), response);\n if (!toStringResult.success) {\n return TE.left(new ValidationError(response, toStringResult.issues));\n }\n\n if (!toStringResult.output) {\n return TE.right(undefined);\n }\n\n const toParsedResult = safeParse(\n pipeQueryToSchema(\n looseObject({\n contact: pipeJsonToSchema(looseObject({\n user_id: number(),\n phone_number: string(),\n first_name: string(),\n last_name: optional(string()),\n })),\n auth_date: valiPipe(\n string(),\n transform(input => new Date(Number(input) * 1000)),\n date(),\n ),\n hash: string(),\n }),\n ),\n toStringResult.output,\n );\n return toParsedResult.success\n ? TE.right({ raw: toStringResult.output, parsed: toParsedResult.output })\n : TE.left(new ValidationError(toStringResult.output, toParsedResult.issues));\n }),\n );\n };\n\n // Attempts to get previously requested contact, but ignores all errors except validation error.\n const getContactWithErrorsIgnore = (\n options?: AsyncOptions,\n ): TE.TaskEither<ValidationError, RequestedContactCompleteData | undefined> => {\n return fn.pipe(\n getContact(options),\n TE.match(\n // All other errors except validation ones should be ignored. Receiving validation error\n // means that we have some data, but we are unable to parse it properly. So, there is no\n // need to make some more requests further, the problem is local.\n error => (ValidationError.is(error) ? E.left(error) : E.right(undefined)),\n contact => E.right(contact),\n ),\n );\n };\n\n // Polls previously requested contact with increasing timeout between requests.\n const pollContact = (ctx: {\n isRejected: boolean;\n rejectReason: unknown;\n abortSignal: AbortSignal;\n }): TE.TaskEither<BetterTaskEitherError | ValidationError, RequestedContactCompleteData> => {\n return BetterTaskEither<ValidationError, RequestedContactCompleteData>(\n async (res, rej, context) => {\n // Time to wait before executing the next request.\n let sleepTime = 50;\n\n // We are trying to retrieve the requested contact until the deadline was reached.\n while (!context.isRejected) {\n const result = await getContactWithErrorsIgnore(context)();\n if (result._tag === 'Left') {\n return rej(result.left);\n }\n if (result.right) {\n return res(result.right);\n }\n await new Promise(resolve => setTimeout(resolve, sleepTime));\n sleepTime += 50;\n }\n },\n ctx,\n );\n };\n\n return withChecksFp((\n options?: AsyncOptions,\n ): TE.TaskEither<RequestContactError, RequestedContactCompleteData> => {\n return BetterTaskEither.fn(context => {\n return fn.pipe(\n // Try to get the requested contact. Probably, we already requested it before.\n getContactWithErrorsIgnore(context),\n TE.chain(contact => {\n if (contact) {\n return TE.right(contact);\n }\n return fn.pipe(\n requestPhoneAccess(context),\n TE.chainW(status => {\n return status === 'sent'\n ? pollContact(context)\n : TE.left(new AccessDeniedError('User denied access'));\n }),\n );\n }),\n );\n }, options);\n }, { ...rest, returns: 'task', requires: 'web_app_request_phone' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiateComplete() {\n return createComplete({\n ...fn.pipe(sharedFeatureOptions(), withInvokeCustomMethod, withVersion),\n requestPhoneAccess: requestPhoneAccessFp,\n });\n}\n\nfunction createParsed({ requestContact, ...rest }: CreateParsedOptions) {\n return withChecksFp(\n requestContact,\n { ...rest, returns: 'task', requires: 'web_app_request_phone' },\n );\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiateParsed() {\n return createParsed({\n ...fn.pipe(sharedFeatureOptions(), withVersion),\n requestContact(options) {\n return fn.pipe(\n requestContactCompleteFp(options),\n TE.map(contact => contact.parsed),\n );\n },\n });\n}\n\n/**\n * Requests current user contact information.\n *\n * This function returns an object, containing both raw and parsed representations of a response,\n * received from the VBot client.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestContactCompleteFp = instantiateComplete();\n\n/**\n * @see requestContactCompleteFp\n */\nexport const requestContactComplete = throwifyWithChecksFp(requestContactCompleteFp);\n\n/**\n * Works the same way as the `requestContactCompleteFp` function, but returns only parsed\n * representation of the contact data.\n * @see requestContactCompleteFp\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestContactFp = instantiateParsed();\n\n/**\n * @see requestContactFp\n */\nexport const requestContact = throwifyWithChecksFp(requestContactFp);\n","import type { WriteAccessRequestedStatus, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type RequestWriteAccessError = RequestError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n options?: AsyncOptions,\n ): TE.TaskEither<RequestWriteAccessError, WriteAccessRequestedStatus> => {\n return fn.pipe(\n request('web_app_request_write_access', 'write_access_requested', options),\n TE.map(response => response.status),\n );\n }, { ...rest, requires: 'web_app_request_write_access', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n ));\n}\n\n/**\n * Requests write message access to the current user.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const requestWriteAccessFp = instantiate();\n\n/**\n * @see requestWriteAccessFp\n */\nexport const requestWriteAccess = throwifyWithChecksFp(requestWriteAccessFp);\n","import type { PostEventError } from '@vbotma/bridge';\nimport { computed, type Computed, signal } from '@vbotma/signals';\nimport { createCbCollector, BetterTaskEither, type BetterTaskEitherError } from '@vbotma/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ConcurrentCallError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport interface QrScannerOptions extends WithVersion, WithPostEvent, SharedFeatureOptions {\n /**\n * A function to add a listener to the event determining if the QR scanner\n * was closed.\n * @param listener - a listener to add.\n * @returns A function to remove the listener.\n */\n onClosed: (listener: VoidFunction) => VoidFunction;\n /**\n * A function to add a listener to the event containing a scanned QR content.\n * @param listener - a listener to add.\n * @returns A function to remove the listener.\n */\n onTextReceived: (listener: (data: string) => void) => VoidFunction;\n}\n\ninterface SharedOptions extends AsyncOptions {\n /**\n * Title to be displayed in the scanner.\n */\n text?: string;\n}\n\ninterface CaptureOptions extends SharedOptions {\n /**\n * @returns True if the passed QR code should be captured.\n * @param qr - scanned QR content.\n */\n capture: (qr: string) => boolean;\n}\n\ninterface OpenOptions extends SharedOptions {\n /**\n * Function which will be called if a QR code was scanned.\n * @param qr - scanned QR content.\n */\n onCaptured: (qr: string) => void;\n}\n\n/**\n * @since Mini Apps v6.4\n */\nexport class QrScanner {\n constructor({\n version,\n onClosed,\n onTextReceived,\n isTma,\n postEvent,\n }: QrScannerOptions) {\n const wrapOptions = { version, requires: 'web_app_open_scan_qr_popup', isTma } as const;\n const wrapSupportedEither = createWithChecksFp({ ...wrapOptions, returns: 'either' });\n const wrapSupportedTask = createWithChecksFp({ ...wrapOptions, returns: 'task' });\n\n const isOpened = signal(false);\n const setClosed = () => {\n isOpened.set(false);\n };\n\n this.isSupported = createIsSupportedSignal('web_app_open_scan_qr_popup', version);\n this.isOpened = computed(isOpened);\n\n this.captureFp = wrapSupportedTask(options => {\n let captured: string | undefined;\n return fn.pipe(\n this.openFp({\n ...options,\n onCaptured: qr => {\n if (options.capture(qr)) {\n captured = qr;\n this.close();\n }\n },\n }),\n TE.map(() => captured),\n );\n });\n this.closeFp = wrapSupportedEither(() => {\n return fn.pipe(postEvent('web_app_close_scan_qr_popup'), E.map(setClosed));\n });\n this.openFp = wrapSupportedTask(options => {\n return fn.pipe(\n isOpened()\n ? TE.left(new ConcurrentCallError('The QR Scanner is already opened'))\n : async () => postEvent('web_app_open_scan_qr_popup', { text: options.text }),\n TE.chainW(() => {\n isOpened.set(true);\n const [addToCleanup, cleanup] = createCbCollector();\n const onSettled = <T>(value: T): T => {\n cleanup();\n isOpened.set(false);\n return value;\n };\n\n return fn.pipe(\n BetterTaskEither<never, void>(resolve => {\n addToCleanup(\n // The scanner was closed externally.\n onClosed(resolve),\n // The scanner was closed internally.\n isOpened.sub(isOpenedValue => {\n if (!isOpenedValue) {\n resolve();\n }\n }),\n onTextReceived(options.onCaptured),\n );\n }, options),\n TE.mapBoth(onSettled, onSettled),\n );\n }),\n );\n });\n\n this.open = throwifyWithChecksFp(this.openFp);\n this.capture = throwifyWithChecksFp(this.captureFp);\n this.close = throwifyWithChecksFp(this.closeFp);\n }\n\n /**\n * Signal indicating if the scanner is currently opened.\n */\n readonly isOpened: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Opens the scanner and returns a task which will be completed with the QR content if the\n * passed `capture` function returned true.\n *\n * Task may also be completed with undefined if the scanner was closed.\n * @param options - method options.\n * @returns A promise with QR content presented as string or undefined if the scanner was closed.\n * @since Mini Apps v6.4\n * @example\n * fn.pipe(\n * qrScanner.captureFp({\n * capture(scannedQr) {\n * return scannedQr === 'any expected by me qr';\n * }\n * }),\n * TE.match(\n * error => {\n * console.error(error);\n * },\n * qr => {\n * console.log('My QR:'), qr;\n * }\n * ),\n * );\n */\n readonly captureFp: WithChecksFp<\n (options: CaptureOptions) => (\n TE.TaskEither<PostEventError | BetterTaskEitherError, string | undefined>\n ),\n true\n >;\n\n /**\n * @see captureFp\n */\n readonly capture: WithChecks<\n (options: CaptureOptions) => BetterPromise<string | undefined>,\n true\n >;\n\n /**\n * Closes the scanner.\n * @since Mini Apps v6.4\n */\n readonly closeFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see close\n */\n readonly close: WithChecks<() => void, true>;\n\n /**\n * Opens the scanner and returns a task which will be completed when the scanner was closed.\n * @param options - method options.\n * @since Mini Apps v6.4\n * @example Without `capture` option\n * if (qrScanner.open.isAvailable()) {\n * const qr = await qrScanner.open({ text: 'Scan any QR' });\n * }\n * @example\n * fn.pipe(\n * qrScanner.openFp({\n * onCaptured(scannedQr) {\n * if (scannedQr === 'any expected by me qr') {\n * qrScanner.close();\n * }\n * }\n * }),\n * TE.match(\n * error => {\n * console.error(error);\n * },\n * () => {\n * console.log('The scanner was closed');\n * }\n * ),\n * );\n */\n readonly openFp: WithChecksFp<\n (options: OpenOptions) => TE.TaskEither<PostEventError, void>,\n true\n >;\n\n /**\n * @see openFp\n */\n readonly open: WithChecks<(options: OpenOptions) => BetterPromise<void>, true>;\n}\n","import { on } from '@vbotma/bridge';\nimport { function as fn } from 'fp-ts';\n\nimport { QrScanner } from '@/features/QrScanner/QrScanner.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new QrScanner({\n ...fn.pipe(sharedFeatureOptions(), withPostEvent, withVersion),\n onClosed(listener) {\n return on('scan_qr_popup_closed', listener);\n },\n onTextReceived(listener) {\n return on('qr_text_received', event => {\n listener(event.data);\n });\n },\n });\n}\n\nexport const qrScanner = /* @__PURE__*/ instantiate();\n","import { on, postEventFp, type UnknownEnvError, type EventListener } from '@vbotma/bridge';\r\nimport { signal, type Computed, computed } from '@vbotma/signals';\r\nimport type { BetterPromise } from 'better-promises';\r\nimport { taskEither as TE, function as fn } from 'fp-ts';\r\n\r\nimport type { RefreshOptions, RefreshRequestListener } from '@/features/Refresh/types.js';\r\n\r\n/**\r\n * Refresh feature class.\r\n * @since v9.2\r\n */\r\nexport class Refresh {\r\n constructor({ }: RefreshOptions) {\r\n const isRefreshing = signal(false);\r\n\r\n // Listen to refresh_requested event from native\r\n on('refresh_requested', () => {\r\n isRefreshing.set(true);\r\n });\r\n\r\n this.isRefreshing = computed(isRefreshing);\r\n\r\n this.finishRefreshFp = (): TE.TaskEither<UnknownEnvError, void> => {\r\n return fn.pipe(\r\n TE.fromEither(postEventFp('web_app_finish_refresh', {\r\n isRefreshed: true,\r\n })),\r\n TE.map(() => {\r\n isRefreshing.set(false);\r\n return undefined;\r\n })\r\n );\r\n };\r\n\r\n this.finishRefresh = (): BetterPromise<void> => {\r\n const task = this.finishRefreshFp();\r\n return (task() as Promise<any>).then(result => {\r\n if (result._tag === 'Left') {\r\n throw result.left;\r\n }\r\n return result.right;\r\n }) as BetterPromise<void>;\r\n };\r\n\r\n this.onRefreshRequest = (listener: RefreshRequestListener) => {\r\n const eventListener: EventListener<'refresh_requested'> = () => {\r\n listener();\r\n };\r\n return on('refresh_requested', eventListener);\r\n };\r\n }\r\n\r\n /**\r\n * Signal indicating if refresh is currently in progress.\r\n */\r\n readonly isRefreshing: Computed<boolean>;\r\n\r\n /**\r\n * Notifies native app that refresh has completed.\r\n * @since v9.2\r\n */\r\n readonly finishRefreshFp: () => TE.TaskEither<UnknownEnvError, void>;\r\n\r\n /**\r\n * @see finishRefreshFp\r\n */\r\n readonly finishRefresh: () => BetterPromise<void>;\r\n\r\n /**\r\n * Subscribes to refresh request events from native app.\r\n * @param listener - callback function to execute when refresh is requested\r\n * @returns unsubscribe function\r\n * @since v9.2\r\n * @example\r\n * const unsubscribe = refresh.onRefreshRequest(() => {\r\n * // Fetch new data\r\n * fetchData().then(() => {\r\n * refresh.finishRefresh();\r\n * });\r\n * });\r\n */\r\n readonly onRefreshRequest: (listener: RefreshRequestListener) => VoidFunction;\r\n}\r\n","import { function as fn } from 'fp-ts';\r\n\r\nimport { Refresh } from '@/features/Refresh/Refresh.js';\r\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\r\n\r\nfunction instantiate() {\r\n return new Refresh(fn.pipe(sharedFeatureOptions()));\r\n}\r\n\r\nexport const refresh = /* @__PURE__*/ instantiate();\r\n","import type { PostEventError, SecondaryButtonPosition } from '@vbotma/bridge';\nimport { computed, type Computed } from '@vbotma/signals';\nimport type { RGB } from '@vbotma/types';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport { access } from '@/helpers/access.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport type { WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype SecondaryButtonEither = E.Either<PostEventError, void>;\n\nexport interface SecondaryButtonState {\n isVisible: boolean;\n bgColor?: RGB;\n hasShineEffect: boolean;\n isEnabled: boolean;\n isLoaderVisible: boolean;\n text: string;\n textColor?: RGB;\n position: SecondaryButtonPosition;\n}\n\nexport interface SecondaryButtonOptions extends Omit<\n ButtonOptions<SecondaryButtonState, 'web_app_setup_secondary_button'>,\n 'initialState' | 'method' | 'payload'\n> {\n /**\n * Default values for different kinds of the button properties.\n */\n defaults: {\n bgColor: MaybeAccessor<RGB>;\n textColor: MaybeAccessor<RGB>;\n };\n}\n\n/**\n * @since Mini Apps v7.10\n */\nexport class SecondaryButton {\n constructor({ defaults, ...options }: SecondaryButtonOptions) {\n const button = new Button({\n ...options,\n initialState: {\n hasShineEffect: false,\n isEnabled: true,\n isLoaderVisible: false,\n isVisible: false,\n text: 'Cancel',\n position: 'left',\n },\n method: 'web_app_setup_secondary_button',\n payload: state => ({\n has_shine_effect: state.hasShineEffect,\n is_visible: state.isVisible,\n is_active: state.isEnabled,\n is_progress_visible: state.isLoaderVisible,\n text: state.text,\n color: state.bgColor,\n text_color: state.textColor,\n position: state.position,\n }),\n });\n\n const withDefault = (\n field: 'bgColor' | 'textColor',\n getDefault: MaybeAccessor<RGB>,\n ) => {\n const fromState = button.stateGetter(field);\n return computed(() => fromState() || access(getDefault));\n };\n\n this.isSupported = createIsSupportedSignal('web_app_setup_secondary_button', options.version);\n this.bgColor = withDefault('bgColor', defaults.bgColor);\n this.textColor = withDefault('textColor', defaults.textColor);\n this.position = button.stateGetter('position');\n this.hasShineEffect = button.stateGetter('hasShineEffect');\n this.isEnabled = button.stateGetter('isEnabled');\n this.isLoaderVisible = button.stateGetter('isLoaderVisible');\n this.text = button.stateGetter('text');\n this.isVisible = button.stateGetter('isVisible');\n this.isMounted = button.isMounted;\n this.state = button.state;\n\n [this.setPosition, this.setPositionFp] = button.stateSetters('position');\n [this.setBgColor, this.setBgColorFp] = button.stateSetters('bgColor');\n [this.setTextColor, this.setTextColorFp] = button.stateSetters('textColor');\n [\n [this.disableShineEffect, this.disableShineEffectFp],\n [this.enableShineEffect, this.enableShineEffectFp],\n ] = button.stateBoolSetters('hasShineEffect');\n [\n [this.disable, this.disableFp],\n [this.enable, this.enableFp],\n ] = button.stateBoolSetters('isEnabled');\n [\n [this.hideLoader, this.hideLoaderFp],\n [this.showLoader, this.showLoaderFp],\n ] = button.stateBoolSetters('isLoaderVisible');\n\n [this.setText, this.setTextFp] = button.stateSetters('text');\n [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n this.setParams = button.setState;\n this.setParamsFp = button.setStateFp;\n this.onClick = button.onClick;\n this.onClickFp = button.onClickFp;\n this.offClick = button.offClick;\n this.offClickFp = button.offClickFp;\n this.mount = button.mount;\n this.mountFp = button.mountFp;\n this.unmount = button.unmount;\n }\n\n //#region Properties.\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * The button position relative to the main one.\n */\n readonly position: Computed<SecondaryButtonPosition>;\n\n /**\n * The button background color.\n */\n readonly bgColor: Computed<RGB>;\n\n /**\n * True if the button has a shining effect.\n */\n readonly hasShineEffect: Computed<boolean>;\n\n /**\n * True if the button is clickable.\n */\n readonly isEnabled: Computed<boolean>;\n\n /**\n * True if the button loader is visible.\n */\n readonly isLoaderVisible: Computed<boolean>;\n\n /**\n * True if the button is visible.\n */\n readonly isVisible: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * The complete button state.\n */\n readonly state: Computed<SecondaryButtonState>;\n\n /**\n * The button displayed text.\n */\n readonly text: Computed<string>;\n\n /**\n * The button text color.\n *\n * Note that this value is computed based on the external defaults. For\n * example, if not explicitly set, this value may be equal to one of theme\n * params colors.\n */\n readonly textColor: Computed<RGB>;\n //#endregion\n\n //#region Methods.\n /**\n * Shows the button.\n * @since Mini Apps v7.10\n */\n readonly showFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see showFp\n */\n readonly show: WithChecks<() => void, true>;\n\n /**\n * Hides the button.\n * @since Mini Apps v7.10\n */\n readonly hideFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see hideFp\n */\n readonly hide: WithChecks<() => void, true>;\n\n /**\n * Enables the button.\n * @since Mini Apps v7.10\n */\n readonly enableFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see enableFp\n */\n readonly enable: WithChecks<() => void, true>;\n\n /**\n * Enables the button.\n * @since Mini Apps v7.10\n */\n readonly enableShineEffectFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see enableShineEffectFp\n */\n readonly enableShineEffect: WithChecks<() => void, true>;\n\n /**\n * Disables the button.\n * @since Mini Apps v7.10\n */\n readonly disableFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see disableFp\n */\n readonly disable: WithChecks<() => void, true>;\n\n /**\n * Enables the button.\n * @since Mini Apps v7.10\n */\n readonly disableShineEffectFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see disableShineEffectFp\n */\n readonly disableShineEffect: WithChecks<() => void, true>;\n\n /**\n * Updates the button background color.\n * @since Mini Apps v7.10\n */\n readonly setBgColorFp: WithChecksFp<(value: RGB) => SecondaryButtonEither, true>;\n\n /**\n * @see setBgColorFp\n */\n readonly setBgColor: WithChecks<(value: RGB) => void, true>;\n\n /**\n * Updates the button text color.\n * @since Mini Apps v7.10\n */\n readonly setTextColorFp: WithChecksFp<(value: RGB) => SecondaryButtonEither, true>;\n\n /**\n * @see setTextColorFp\n */\n readonly setTextColor: WithChecks<(value: RGB) => void, true>;\n\n /**\n * Updates the button text.\n * @since Mini Apps v7.10\n */\n readonly setTextFp: WithChecksFp<(value: string) => SecondaryButtonEither, true>;\n\n /**\n * @see setTextFp\n */\n readonly setText: WithChecks<(value: string) => void, true>;\n\n /**\n * Updates the button position.\n * @since Mini Apps v7.10\n */\n readonly setPositionFp: WithChecksFp<\n (position: SecondaryButtonPosition) => SecondaryButtonEither,\n true\n >;\n\n /**\n * @see setPositionFp\n */\n readonly setPosition: WithChecks<(position: SecondaryButtonPosition) => void, true>;\n\n /**\n * Shows the button loader.\n * @since Mini Apps v7.10\n */\n readonly showLoaderFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see showLoaderFp\n */\n readonly showLoader: WithChecks<() => void, true>;\n\n /**\n * Hides the button loader.\n * @since Mini Apps v7.10\n */\n readonly hideLoaderFp: WithChecksFp<() => SecondaryButtonEither, true>;\n\n /**\n * @see hideLoaderFp\n */\n readonly hideLoader: WithChecks<() => void, true>;\n\n /**\n * Updates the button state.\n * @param state - updates to apply.\n * @since Mini Apps v7.10\n * @example\n * button.setParams({\n * text: 'Submit',\n * isEnabled: true,\n * hasShineEffect: true,\n * });\n */\n readonly setParamsFp: WithChecksFp<\n (state: Partial<SecondaryButtonState>) => SecondaryButtonEither,\n true\n >;\n\n /**\n * @see setParamsFp\n */\n readonly setParams: WithChecks<(state: Partial<SecondaryButtonState>) => void, true>;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v7.10\n */\n readonly mountFp: WithChecksFp<() => void, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, true>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n\n /**\n * Adds a new button listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @returns A function to remove bound listener.\n * @since Mini Apps v7.10\n * @example\n * const off = button.onClick(() => {\n * console.log('User clicked the button');\n * off();\n * });\n */\n readonly onClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * @see onClick\n */\n readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * Removes the button click listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @since Mini Apps v7.10\n * @example\n * function listener() {\n * console.log('User clicked the button');\n * button.offClick(listener);\n * }\n * button.onClick(listener);\n */\n readonly offClickFp: WithChecksFp<(listener: VoidFunction, once?: boolean) => void, true>;\n\n /**\n * @see offClick\n */\n readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n //#endregion\n}\n","import { computed } from '@vbotma/signals';\n\nimport { miniApp } from '@/features/MiniApp/instance.js';\nimport { SecondaryButton } from '@/features/SecondaryButton/SecondaryButton.js';\nimport { themeParams } from '@/features/ThemeParams/instance.js';\nimport { bottomButtonOptions } from '@/fn-options/bottomButtonOptions.js';\n\nfunction instantiate() {\n return new SecondaryButton(\n bottomButtonOptions('secondaryButton', 'secondary_button_pressed', {\n bgColor: computed(() => miniApp.bottomBarColorRgb() || '#000000'),\n textColor: computed(() => themeParams.buttonColor() || '#2481cc'),\n }),\n );\n}\n\nexport const secondaryButton = /* @__PURE__*/ instantiate();\n","import { EventPayload, type MethodParams, type Request2CaptureFn, RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { SecureStorageMethodError } from '@/errors.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport type { WithRequest } from '@/fn-options/withRequest.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport {\n createWithChecksFp,\n type WithChecks,\n type WithChecksFp,\n} from '@/with-checks/withChecksFp.js';\n\nexport type SecureStorageError = RequestError | SecureStorageMethodError;\n\nexport interface SecureStorageOptions extends SharedFeatureOptions,\n WithVersion,\n WithRequest,\n WithCreateRequestId {\n}\n\n/**\n * @since Mini Apps v9.0\n */\nexport class SecureStorage {\n constructor({ isTma, request, version, createRequestId }: SecureStorageOptions) {\n const wrapSupportedTask = createWithChecksFp({\n version,\n requires: 'web_app_secure_storage_get_key',\n isTma,\n returns: 'task',\n });\n\n const invokeMethod = <\n M extends (\n | 'web_app_secure_storage_save_key'\n | 'web_app_secure_storage_get_key'\n | 'web_app_secure_storage_restore_key'\n | 'web_app_secure_storage_save_key'\n | 'web_app_secure_storage_clear'\n ),\n E extends (\n | 'secure_storage_key_saved'\n | 'secure_storage_key_received'\n | 'secure_storage_key_restored'\n | 'secure_storage_cleared'\n ),\n >(\n method: M,\n event: E,\n params: Omit<MethodParams<M>, 'req_id'>,\n ): TE.TaskEither<SecureStorageError, EventPayload<E>> => {\n const requestId = createRequestId();\n return fn.pipe(\n request<M, ('secure_storage_failed' | E)[]>(method, ['secure_storage_failed', event], {\n params: { ...params, req_id: requestId },\n capture: (event => {\n return 'payload' in event ? event.payload.req_id === requestId : true;\n }) as Request2CaptureFn<('secure_storage_failed' | E)[]>,\n }),\n TE.chain(response => (\n response.event === 'secure_storage_failed'\n ? TE.left(new SecureStorageMethodError(response.payload.error || 'UNKNOWN_ERROR'))\n : TE.right(response.payload as EventPayload<E>)\n )),\n );\n };\n\n this.getItemFp = wrapSupportedTask(key => {\n return fn.pipe(\n invokeMethod('web_app_secure_storage_get_key', 'secure_storage_key_received', { key }),\n TE.map(payload => ({\n value: payload.value,\n canRestore: !!payload.can_restore,\n })),\n );\n });\n this.setItemFp = wrapSupportedTask((key, value) => {\n return fn.pipe(\n invokeMethod('web_app_secure_storage_save_key', 'secure_storage_key_saved', { key, value }),\n TE.map(() => undefined),\n );\n });\n this.deleteItemFp = wrapSupportedTask(key => {\n return this.setItemFp(key, null);\n });\n this.clearFp = wrapSupportedTask(() => {\n return fn.pipe(\n invokeMethod('web_app_secure_storage_clear', 'secure_storage_cleared', {}),\n TE.map(() => undefined),\n );\n });\n this.restoreItemFp = wrapSupportedTask(key => {\n return fn.pipe(\n invokeMethod('web_app_secure_storage_restore_key', 'secure_storage_key_restored', { key }),\n TE.map(payload => payload.value),\n );\n });\n\n this.getItem = throwifyWithChecksFp(this.getItemFp);\n this.setItem = throwifyWithChecksFp(this.setItemFp);\n this.deleteItem = throwifyWithChecksFp(this.deleteItemFp);\n this.clear = throwifyWithChecksFp(this.clearFp);\n this.restoreItem = throwifyWithChecksFp(this.restoreItemFp);\n }\n\n /**\n * Retrieves an item using its key.\n * @since Mini Apps v9.0\n */\n readonly getItemFp: WithChecksFp<\n (key: string) => TE.TaskEither<SecureStorageError, {\n value: string | null;\n canRestore: boolean;\n }>,\n true\n >;\n\n /**\n * @see getItemFp\n */\n readonly getItem: WithChecks<\n (key: string) => Promise<{ value: string | null; canRestore: boolean }>,\n true\n >;\n\n /**\n * Restores an item from the storage.\n * @since Mini Apps v9.0\n */\n readonly restoreItemFp: WithChecksFp<\n (key: string) => TE.TaskEither<SecureStorageError, string | null>,\n true\n >;\n\n /**\n * @see restoreItemFp\n */\n readonly restoreItem: WithChecks<(key: string) => Promise<string | null>, true>;\n\n /**\n * Sets a new item in the storage.\n * @since Mini Apps v9.0\n */\n readonly setItemFp: WithChecksFp<\n (key: string, value: string | null) => TE.TaskEither<SecureStorageError, void>,\n true\n >;\n\n /**\n * @see setItemFp\n */\n readonly setItem: WithChecks<(key: string, value: string | null) => Promise<void>, true>;\n\n /**\n * Removes a key from the storage.\n * @since Mini Apps v9.0\n */\n readonly deleteItemFp: WithChecksFp<\n (key: string) => TE.TaskEither<SecureStorageError, void>,\n true\n >;\n\n /**\n * @see deleteItemFp\n */\n readonly deleteItem: WithChecks<(key: string) => Promise<void>, true>;\n\n /**\n * Removes all keys from the storage.\n * @since Mini Apps v9.0\n */\n readonly clearFp: WithChecksFp<() => TE.TaskEither<SecureStorageError, void>, true>;\n\n /**\n * @see clearFp\n */\n readonly clear: WithChecks<() => Promise<void>, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withCreateRequestId } from '@/fn-options/withCreateRequestId.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nimport { SecureStorage } from './SecureStorage.js';\n\nfunction instantiate() {\n return new SecureStorage(fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n withCreateRequestId,\n ));\n}\n\nexport const secureStorage = /* @__PURE__*/ instantiate();\n","import type { PostEventError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { either as E } from 'fp-ts';\n\nimport { Button, type ButtonOptions } from '@/composables/Button.js';\nimport type { WithChecksFp, WithChecks } from '@/with-checks/withChecksFp.js';\n\nexport interface SettingsButtonState {\n isVisible: boolean;\n}\n\nexport type SettingsButtonOptions = Omit<\n ButtonOptions<SettingsButtonState, 'web_app_setup_settings_button'>,\n 'method' | 'payload' | 'initialState'\n>;\n\n/**\n * @since Mini Apps v6.10\n */\nexport class SettingsButton {\n constructor(options: SettingsButtonOptions) {\n const button = new Button({\n ...options,\n method: 'web_app_setup_settings_button',\n payload: state => ({ is_visible: state.isVisible }),\n initialState: { isVisible: false },\n });\n\n this.isVisible = button.stateGetter('isVisible');\n this.isMounted = button.isMounted;\n this.isSupported = button.isSupported;\n [[this.hide, this.hideFp], [this.show, this.showFp]] = button.stateBoolSetters('isVisible');\n this.onClick = button.onClick;\n this.onClickFp = button.onClickFp;\n this.offClick = button.offClick;\n this.offClickFp = button.offClickFp;\n this.mount = button.mount;\n this.mountFp = button.mountFp;\n this.unmount = button.unmount;\n }\n\n /**\n * Signal indicating if the component is currently visible.\n */\n readonly isVisible: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Hides the button.\n * @since Mini Apps v6.10\n */\n readonly hideFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see hideFp\n */\n readonly hide: WithChecks<() => void, true>;\n\n /**\n * Shows the button.\n * @since Mini Apps v6.10\n */\n readonly showFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see showFp\n */\n readonly show: WithChecks<() => void, true>;\n\n /**\n * Adds a new button listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @returns A function to remove bound listener.\n * @since Mini Apps v6.10\n * @example\n * const off = button.onClick(() => {\n * console.log('User clicked the button');\n * off();\n * });\n */\n readonly onClickFp: WithChecksFp<\n (listener: VoidFunction, once?: boolean) => VoidFunction,\n true\n >;\n\n /**\n * @see onClickFp\n */\n readonly onClick: WithChecks<(listener: VoidFunction, once?: boolean) => VoidFunction, true>;\n\n /**\n * Removes the button click listener.\n * @param listener - event listener.\n * @param once - should the listener be called only once.\n * @since Mini Apps v6.10\n * @example\n * function listener() {\n * console.log('User clicked the button');\n * button.offClick(listener);\n * }\n * button.onClick(listener);\n */\n readonly offClickFp: WithChecksFp<\n (listener: VoidFunction, once?: boolean) => void,\n true\n >;\n\n /**\n * @see offClickFp\n */\n readonly offClick: WithChecks<(listener: VoidFunction, once?: boolean) => void, true>;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v6.10\n */\n readonly mountFp: WithChecksFp<() => void, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, true>;\n\n /**\n * Unmounts the component.\n *\n * Note that this function does not remove listeners added via the `onClick`\n * function, so you have to remove them on your own.\n * @see onClick\n */\n readonly unmount: () => void;\n}\n","import { SettingsButton } from '@/features/SettingsButton/SettingsButton.js';\nimport { buttonOptions } from '@/fn-options/buttonOptions.js';\n\nexport const settingsButton = /* @__PURE__*/ new SettingsButton(\n buttonOptions('settingsButton', 'settings_button_pressed'),\n);\n","import type { PostEventError } from '@vbotma/bridge';\nimport type { Computed } from '@vbotma/signals';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Mountable } from '@/composables/Mountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport type { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport type { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport type { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport type { WithVersion } from '@/fn-options/withVersion.js';\nimport { createIsSupportedSignal } from '@/helpers/createIsSupportedSignal.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, type WithChecks, type WithChecksFp } from '@/with-checks/withChecksFp.js';\n\nexport interface SwipeBehaviorState {\n isVerticalEnabled: boolean;\n}\n\nexport interface SwipeBehaviorOptions\n extends WithStateRestore<SwipeBehaviorState>,\n WithVersion,\n WithPostEvent,\n SharedFeatureOptions {\n}\n\n/**\n * @since Mini Apps v7.7\n */\nexport class SwipeBehavior {\n constructor({ postEvent, storage, isTma, isPageReload, version }: SwipeBehaviorOptions) {\n const initialState = { isVerticalEnabled: true };\n const stateful = new Stateful({\n initialState,\n onChange(state) {\n storage.set(state);\n },\n });\n const mountable = new Mountable({\n initialState,\n isPageReload,\n onMounted: stateful.setState,\n restoreState: storage.get,\n });\n\n const wrapOptions = { requires: 'web_app_setup_swipe_behavior', isTma, version } as const;\n const wrapSupportedPlain = createWithChecksFp({\n ...wrapOptions,\n returns: 'plain',\n });\n const wrapMountedEither = createWithChecksFp({\n ...wrapOptions,\n isMounted: mountable.isMounted,\n returns: 'either',\n });\n\n const setVerticalEnabled = (isVerticalEnabled: boolean) => {\n const update = { isVerticalEnabled };\n if (!stateful.hasDiff(update)) {\n return E.right(undefined);\n }\n return fn.pipe(\n postEvent('web_app_setup_swipe_behavior', { allow_vertical_swipe: isVerticalEnabled }),\n E.map(() => {\n stateful.setState(update);\n }),\n );\n };\n\n this.isSupported = createIsSupportedSignal('web_app_setup_swipe_behavior', version);\n this.isVerticalEnabled = stateful.getter('isVerticalEnabled');\n this.isMounted = mountable.isMounted;\n this.disableVerticalFp = wrapMountedEither(() => {\n return setVerticalEnabled(false);\n });\n this.enableVerticalFp = wrapMountedEither(() => {\n return setVerticalEnabled(true);\n });\n this.mountFp = wrapSupportedPlain(() => {\n const nothing = () => undefined;\n return fn.pipe(mountable.mount(), E.match(nothing, nothing));\n });\n this.unmount = mountable.unmount;\n\n this.disableVertical = throwifyWithChecksFp(this.disableVerticalFp);\n this.enableVertical = throwifyWithChecksFp(this.enableVerticalFp);\n this.mount = throwifyWithChecksFp(this.mountFp);\n }\n\n /**\n * Signal indicating if the component is supported.\n */\n readonly isSupported: Computed<boolean>;\n\n /**\n * Signal indicating if vertical swipes are enabled.\n */\n readonly isVerticalEnabled: Computed<boolean>;\n\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Mounts the component restoring its state.\n * @since Mini Apps v7.7\n */\n readonly mountFp: WithChecksFp<() => void, true>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<() => void, true>;\n\n /**\n * Unmounts the component.\n */\n readonly unmount: () => void;\n\n /**\n * Disables the closing confirmation dialog.\n * @since Mini Apps v7.7\n */\n readonly disableVerticalFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see disableVerticalFp\n */\n readonly disableVertical: WithChecks<() => void, true>;\n\n /**\n * Enables the closing confirmation dialog.\n * @since Mini Apps v7.7\n */\n readonly enableVerticalFp: WithChecksFp<() => E.Either<PostEventError, void>, true>;\n\n /**\n * @see enableVerticalFp\n */\n readonly enableVertical: WithChecks<() => void, true>;\n}\n","import { function as fn } from 'fp-ts';\n\nimport { SwipeBehavior, type SwipeBehaviorState } from '@/features/SwipeBehavior/SwipeBehavior.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction instantiate() {\n return new SwipeBehavior(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n withStateRestore<SwipeBehaviorState>('swipeBehavior'),\n ));\n}\n\nexport const swipeBehavior = /* @__PURE__*/ instantiate();\n","/**\n * Copies specified text to the clipboard.\n * @param text - text to copy.\n */\nexport async function copyTextToClipboard(text: string): Promise<void> {\n try {\n const { clipboard } = navigator;\n if (clipboard) {\n return await clipboard.writeText(text);\n }\n } catch {\n }\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textArea);\n }\n}\n","import { RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AccessDeniedError } from '@/errors.js';\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type DownloadFileError = RequestError | AccessDeniedError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n url: string,\n fileName: string,\n options?: AsyncOptions,\n ): TE.TaskEither<DownloadFileError, void> => {\n return fn.pipe(\n request(\n 'web_app_request_file_download',\n 'file_download_requested',\n { ...options, params: { url, file_name: fileName } },\n ),\n TE.chain(response => {\n return response.status === 'downloading'\n ? TE.right(undefined)\n : TE.left(new AccessDeniedError('User denied the action'));\n }),\n );\n }, { ...rest, requires: 'web_app_request_file_download', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withRequest,\n withVersion,\n ));\n}\n\n/**\n * Displays a native popup prompting the user to download a file.\n * @param url - the HTTPS URL of the file to be downloaded.\n * @param file - the suggested name for the downloaded file.\n * @param options - additional request execution options.\n * @since Mini Apps v8.0\n * @example\n * fn.pipe(\n * downloadFileFp('https://telegram.org/js/telegram-web-app.js', 'telegram-sdk.js'),\n * TE.map(() => {\n * console.log('Downloading');\n * })\n * )\n */\nexport const downloadFileFp = instantiate();\n\nexport const downloadFile = throwifyWithChecksFp(downloadFileFp);\n","import { taskEither as TE, function as fn } from 'fp-ts';\nimport { date, integer, number, transform, pipe as valiPipe, safeParse } from 'valibot';\n\nimport { ValidationError } from '@/errors.js';\nimport {\n type SharedFeatureOptions,\n sharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport {\n type WithInvokeCustomMethod,\n withInvokeCustomMethod,\n type InvokeCustomMethodError,\n} from '@/fn-options/withInvokeCustomMethod.js';\nimport { type WithVersion, withVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithInvokeCustomMethod, WithVersion {\n}\n\nexport type GetCurrentTimeError = InvokeCustomMethodError | ValidationError;\n\nfunction create({ invokeCustomMethod, ...rest }: CreateOptions) {\n return withChecksFp((options?: AsyncOptions): TE.TaskEither<GetCurrentTimeError, Date> => {\n return fn.pipe(\n invokeCustomMethod('getCurrentTime', {}, options),\n TE.chain(response => {\n const parsed = safeParse(\n valiPipe(number(), integer(), transform(v => new Date(v * 1000)), date()),\n response,\n );\n return parsed.success\n ? TE.right(parsed.output)\n : TE.left(new ValidationError(response, parsed.issues));\n }),\n );\n }, { ...rest, requires: 'web_app_invoke_custom_method', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withInvokeCustomMethod,\n withVersion,\n ));\n}\n\n/**\n * @returns The current time according to the Telegram server time.\n * @param options - additional options.\n * @since Mini Apps v6.9\n */\nexport const getCurrentTimeFp = instantiate();\n\n/**\n * @see getCurrentTimeFp\n */\nexport const getCurrentTime = throwifyWithChecksFp(getCurrentTimeFp);\n","import type { PostEventError } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport type HideKeyboardError = PostEventError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n return withChecksFp((): E.Either<HideKeyboardError, void> => {\n return postEvent('web_app_hide_keyboard');\n }, { ...rest, returns: 'either', requires: 'web_app_hide_keyboard' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n ));\n}\n\n/**\n * Hides the on-screen keyboard, if it is currently visible. Does nothing if the keyboard is\n * not active.\n * @since Mini Apps v9.1\n */\nexport const hideKeyboardFp = instantiate();\n\n/**\n * @see hideKeyboardFp\n */\nexport const hideKeyboard = throwifyWithChecksFp(hideKeyboardFp);\n","import { captureSameReq, type RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { createRequestId } from '@/globals/createRequestId.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithVersion, WithRequest {\n createRequestId: () => string;\n}\n\nexport type ReadTextFromClipboardError = RequestError;\n\nfunction create({ request, createRequestId, ...rest }: CreateOptions) {\n return withChecksFp((\n options?: AsyncOptions,\n ): TE.TaskEither<ReadTextFromClipboardError, string | null> => {\n const reqId = createRequestId();\n return fn.pipe(\n request('web_app_read_text_from_clipboard', 'clipboard_text_received', {\n ...options,\n params: { req_id: reqId },\n capture: captureSameReq(reqId),\n }),\n TE.map(({ data = null }) => data),\n );\n }, { ...rest, requires: 'web_app_read_text_from_clipboard', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create({\n ...fn.pipe(\n sharedFeatureOptions(),\n withVersion,\n withRequest,\n ),\n createRequestId,\n });\n}\n\n/**\n * Reads a text from the clipboard and returns a `string` or `null`. `null` is returned\n * in one of the following cases:\n * - A value in the clipboard is not a text.\n * - Access to the clipboard is not granted.\n * @since Mini Apps v6.4\n */\nexport const readTextFromClipboardFp = instantiate();\n\nexport const readTextFromClipboard = throwifyWithChecksFp(readTextFromClipboardFp);\n","export interface AndroidDeviceData {\n appVersion?: string;\n manufacturer?: string;\n model?: string;\n androidVersion?: string;\n sdkVersion?: number;\n performanceClass?: 'LOW' | 'AVERAGE' | 'HIGH' | string;\n}\n\n/**\n * Retrieves Android device data from the specified User Agent.\n * @see https://core.telegram.org/bots/webapps#additional-data-in-user-agent\n * @param userAgent - user agent.\n */\nexport function retrieveAndroidDeviceDataFrom(userAgent: string): AndroidDeviceData {\n const result: AndroidDeviceData = {};\n const match = userAgent.match(/Telegram-Android(?:\\/([^ ]+))?(?: (\\([^)]+\\))?|$)/);\n if (match) {\n const [, appVersion, systemInfo] = match;\n appVersion && (result.appVersion = appVersion);\n systemInfo && systemInfo\n .slice(1, systemInfo.length - 1)\n .split(';')\n .forEach(item => {\n const [key, value] = item.trim().split(' ');\n if (key === 'Android') {\n result.androidVersion = value;\n } else if (key === 'SDK') {\n const parsed = parseInt(value, 10);\n parsed && (result.sdkVersion = parsed);\n } else if (value) {\n result.manufacturer = key;\n result.model = value;\n } else {\n result.performanceClass = key;\n }\n });\n }\n return result;\n}\n","import {\n type AndroidDeviceData,\n retrieveAndroidDeviceDataFrom,\n} from './retrieveAndroidDeviceDataFrom.js';\n\n/**\n * Retrieves Android device data from the navigator.userAgent.\n * @see https://core.telegram.org/bots/webapps#additional-data-in-user-agent\n */\nexport function retrieveAndroidDeviceData(): AndroidDeviceData {\n return retrieveAndroidDeviceDataFrom(navigator.userAgent);\n}\n","import type { PostEventError } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { InvalidArgumentsError } from '@/errors.js';\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent {\n}\n\nexport type SendDataError = PostEventError | InvalidArgumentsError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n return withChecksFp((data: string): E.Either<SendDataError, void> => {\n const { size } = new Blob([data]);\n if (!size || size > 4096) {\n return E.left(\n new InvalidArgumentsError(size\n ? 'Maximum size of data to send is 4096 bytes'\n : 'Attempted to send empty data'),\n );\n }\n return postEvent('web_app_data_send', { data });\n }, { ...rest, returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(sharedFeatureOptions(), withPostEvent));\n}\n\n/**\n * Sends data to the bot.\n *\n * When this method called, a service message sent to the bot containing the data of the length\n * up to 4096 bytes, and the Mini App closed.\n *\n * See the field `web_app_data` in the class [Message](https://core.telegram.org/bots/api#message).\n *\n * This method is only available for Mini Apps launched via a Keyboard button.\n * @param data - data to send to bot.\n */\nexport const sendDataFp = instantiate();\n\n/**\n * @see sendDataFp\n */\nexport const sendData = throwifyWithChecksFp(sendDataFp);\n","import { RequestError } from '@vbotma/bridge';\nimport { taskEither as TE, function as fn } from 'fp-ts';\n\nimport { ShareMessageError } from '@/errors.js';\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withRequest, type WithRequest } from '@/fn-options/withRequest.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport type { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithRequest, WithVersion {\n}\n\nexport type ShareMessageFnError = RequestError | ShareMessageError;\n\nfunction create({ request, ...rest }: CreateOptions) {\n return withChecksFp((\n messageId: string,\n options?: AsyncOptions,\n ): TE.TaskEither<ShareMessageFnError, void> => {\n return fn.pipe(\n request(\n 'web_app_send_prepared_message',\n ['prepared_message_failed', 'prepared_message_sent'],\n {\n ...options,\n params: { id: messageId },\n },\n ),\n TE.chain(response => (\n response.event === 'prepared_message_failed'\n ? TE.left(new ShareMessageError(response.payload.error))\n : TE.right(undefined)\n )),\n );\n }, { ...rest, requires: 'web_app_send_prepared_message', returns: 'task' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withRequest,\n withVersion,\n ));\n}\n\n/**\n * Opens a dialog allowing the user to share a message provided by the bot.\n * @since Mini Apps v8.0\n */\nexport const shareMessageFp = instantiate();\n\n/**\n * @see shareMessageFp\n */\nexport const shareMessage = throwifyWithChecksFp(shareMessageFp);\n","import type { PostEventError } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n}\n\nexport interface ShareStoryOptions {\n /**\n * The caption to be added to the media.\n * 0-200 characters for regular users and 0-2048 characters for premium subscribers.\n * @see https://telegram.org/faq_premium#telegram-premium\n */\n text?: string;\n /**\n * An object that describes a widget link to be included in the story.\n * Note that only premium subscribers can post stories with links.\n * @see https://telegram.org/faq_premium#telegram-premium\n */\n widgetLink?: {\n /**\n * The URL to be included in the story.\n */\n url: string;\n /**\n * The name to be displayed for the widget link, 0-48 characters.\n */\n name?: string;\n };\n}\n\nexport type ShareStoryError = PostEventError;\n\nfunction create({ postEvent, ...rest }: CreateOptions) {\n return withChecksFp((\n mediaUrl: string,\n options: ShareStoryOptions = {},\n ): E.Either<ShareStoryError, void> => {\n return postEvent('web_app_share_to_story', {\n text: options.text,\n media_url: mediaUrl,\n widget_link: options.widgetLink,\n });\n }, { ...rest, requires: 'web_app_share_to_story', returns: 'either' });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create(fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n ));\n}\n\n/**\n * Opens the native story editor.\n * @since Mini Apps v7.8\n * @example\n * fn.pipe(\n * shareStory('https://example.com/background.png', {\n * text: 'Look at this cool group!',\n * widgetLink: {\n * url: 'https://t.me/heyqbnk',\n * name: 'Vlad\\'s community',\n * },\n * }),\n * TE.match(error => {\n * console.error('Something went wrong', error);\n * }, () => {\n * console.log('Call was successful');\n * }),\n * );\n */\nexport const shareStoryFp = instantiate();\n\n/**\n * @see shareStoryFp\n */\nexport const shareStory = throwifyWithChecksFp(shareStoryFp);\n","import { createSignal } from '@/globals/signals-registry.js';\n\n/**\n * True if the application is launched in inline mode.\n */\nexport const isInlineMode = createSignal(false);\n","import type { PostEventError, SwitchInlineQueryChatType } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport {\n sharedFeatureOptions,\n type SharedFeatureOptions,\n} from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent, type WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withVersion, type WithVersion } from '@/fn-options/withVersion.js';\nimport { isInlineMode } from '@/globals/isInlineMode.js';\nimport { access } from '@/helpers/access.js';\nimport type { MaybeAccessor } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { withChecksFp } from '@/with-checks/withChecksFp.js';\n\ninterface CreateOptions extends SharedFeatureOptions, WithPostEvent, WithVersion {\n isInlineMode: MaybeAccessor<boolean>;\n}\n\nexport type SwitchInlineQueryError = PostEventError;\n\nfunction create({ isInlineMode, postEvent, ...rest }: CreateOptions) {\n return withChecksFp((\n query: string,\n chatTypes?: SwitchInlineQueryChatType[],\n ): E.Either<SwitchInlineQueryError, void> => {\n return postEvent('web_app_switch_inline_query', {\n query: query,\n chat_types: chatTypes || [],\n });\n }, {\n ...rest,\n requires: {\n every: ['web_app_switch_inline_query', () => {\n return access(isInlineMode)\n ? undefined\n : 'The application must be launched in the inline mode';\n }],\n },\n returns: 'either',\n });\n}\n\n// #__NO_SIDE_EFFECTS__\nfunction instantiate() {\n return create({\n ...fn.pipe(\n sharedFeatureOptions(),\n withPostEvent,\n withVersion,\n ),\n isInlineMode,\n });\n}\n\n/**\n * Inserts the bot's username and the specified inline query in the current chat's input field.\n * Query may be empty, in which case only the bot's username will be inserted. The client prompts\n * the user to choose a specific chat, then opens that chat and inserts the bot's username and\n * the specified inline query in the input field.\n * @param query - text which should be inserted in the input after the current bot name. Max\n * length is 256 symbols.\n * @param chatTypes - List of chat types which could be chosen to send the message. Could be an\n * empty list.\n * @since Mini Apps v6.7\n * @example\n * fn.pipe(\n * switchInlineQuery('my query goes here', ['users']),\n * E.match(error => {\n * console.error('Something went wrong', error);\n * }, () => {\n * console.log('Call was successful');\n * }),\n * );\n */\nexport const switchInlineQueryFp = instantiate();\n\n/**\n * @see switchInlineQueryFp\n */\nexport const switchInlineQuery = throwifyWithChecksFp(switchInlineQueryFp);\n","import {\n type SafeAreaInsets,\n type EventListener,\n supports,\n type RequestError,\n type PostEventError,\n} from '@vbotma/bridge';\nimport { Computed, computed, signal } from '@vbotma/signals';\nimport { camelToKebab } from '@vbotma/toolkit';\nimport { BetterPromise } from 'better-promises';\nimport { either as E, taskEither as TE, function as fn } from 'fp-ts';\n\nimport { AsyncMountable } from '@/composables/AsyncMountable.js';\nimport { Stateful } from '@/composables/Stateful.js';\nimport { CSSVarsBoundError, FullscreenFailedError } from '@/errors.js';\nimport { SharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { WithPostEvent } from '@/fn-options/withPostEvent.js';\nimport { WithRequest } from '@/fn-options/withRequest.js';\nimport { WithStateRestore } from '@/fn-options/withStateRestore.js';\nimport { WithVersion } from '@/fn-options/withVersion.js';\nimport { access } from '@/helpers/access.js';\nimport { deleteCssVar, setCssVar } from '@/helpers/css-vars.js';\nimport { AsyncOptions } from '@/types.js';\nimport { throwifyWithChecksFp } from '@/with-checks/throwifyWithChecksFp.js';\nimport { createWithChecksFp, WithChecks, WithChecksFp } from '@/with-checks/withChecksFp.js';\n\ntype FullscreenError = FullscreenFailedError | RequestError;\ntype ViewportChangedEventListener = EventListener<'viewport_changed'>;\ntype FullscreenChangedEventListener = EventListener<'fullscreen_changed'>;\ntype SafeAreaInsetsChangedEventListener = EventListener<'safe_area_changed'>;\ntype SafeAreaInsetCSSVarKey = `safeAreaInset${Capitalize<keyof SafeAreaInsets>}`;\n\nexport type GetCSSVarNameKey =\n | 'width'\n | 'height'\n | 'stableHeight'\n | SafeAreaInsetCSSVarKey\n | `content${Capitalize<SafeAreaInsetCSSVarKey>}`;\n\nexport type GetCSSVarNameFn = (key: GetCSSVarNameKey) => string | null | undefined | false;\n\nexport interface ViewportState {\n contentSafeAreaInsets: SafeAreaInsets;\n height: number;\n isExpanded: boolean;\n isFullscreen: boolean;\n safeAreaInsets: SafeAreaInsets;\n stableHeight: number;\n width: number;\n}\n\ntype WithListeners<On extends string, Off extends string, L> = {\n [K in On | Off]: (listener: L) => void;\n};\n\nexport interface ViewportOptions<EViewportStable, EFullscreen>\n extends WithStateRestore<ViewportState>,\n WithVersion,\n WithRequest,\n WithPostEvent,\n WithListeners<'onViewportChanged', 'offViewportChanged', ViewportChangedEventListener>,\n WithListeners<'onFullscreenChanged', 'offFullscreenChanged', FullscreenChangedEventListener>,\n WithListeners<'onSafeAreaInsetsChanged', 'offSafeAreaInsetsChanged', SafeAreaInsetsChangedEventListener>,\n WithListeners<'onContentSafeAreaInsetsChanged', 'offContentSafeAreaInsetsChanged', SafeAreaInsetsChangedEventListener>,\n SharedFeatureOptions {\n /**\n * True if the viewport is stable.\n */\n isViewportStable: boolean | (() => E.Either<EViewportStable, boolean>);\n /**\n * True if the application was opened in fullscreen initially.\n */\n isFullscreen: boolean | (() => E.Either<EFullscreen, boolean>);\n}\n\nexport class Viewport<EViewportStable, EFullscreen> {\n constructor({\n storage,\n isPageReload,\n onContentSafeAreaInsetsChanged,\n onSafeAreaInsetsChanged,\n onViewportChanged,\n onFullscreenChanged,\n offContentSafeAreaInsetsChanged,\n offFullscreenChanged,\n offSafeAreaInsetsChanged,\n offViewportChanged,\n request,\n isViewportStable,\n isFullscreen,\n isTma,\n version,\n postEvent,\n }: ViewportOptions<EViewportStable, EFullscreen>) {\n const initialInsets: SafeAreaInsets = { top: 0, right: 0, left: 0, bottom: 0 };\n const stateful = new Stateful<ViewportState>({\n initialState: {\n contentSafeAreaInsets: initialInsets,\n height: 0,\n isExpanded: false,\n isFullscreen: false,\n safeAreaInsets: initialInsets,\n stableHeight: 0,\n width: 0,\n },\n onChange: storage.set,\n });\n\n const viewportChangedListener: ViewportChangedEventListener = event => {\n stateful.setState({\n isExpanded: event.is_expanded,\n height: event.height,\n width: event.width,\n stableHeight: event.is_state_stable ? event.height : undefined,\n });\n };\n const fullscreenChangedListener: FullscreenChangedEventListener = event => {\n stateful.setState({ isFullscreen: event.is_fullscreen });\n };\n const safeAreaInsetsChangedListener: SafeAreaInsetsChangedEventListener = event => {\n stateful.setState({ safeAreaInsets: event });\n };\n const contentSafeAreaInsetsChangedListener: SafeAreaInsetsChangedEventListener = event => {\n stateful.setState({ contentSafeAreaInsets: event });\n };\n\n const mountable = new AsyncMountable({\n initialState(options) {\n const genRequestInsets = (kind: 'safe-area' | 'content-safe-area') => {\n return () => {\n const [method, event] = kind === 'safe-area'\n ? ['web_app_request_safe_area', 'safe_area_changed'] as const\n : ['web_app_request_content_safe_area', 'content_safe_area_changed'] as const;\n\n if (!supports(method, access(version))) {\n return TE.right({ top: 0, left: 0, right: 0, bottom: 0 });\n }\n return request(method, event, options);\n };\n };\n const genFlag = <E>(flag: boolean | (() => E.Either<E, boolean>)) => {\n return () => (\n typeof flag === 'boolean'\n ? TE.right(flag)\n : TE.fromEither(flag())\n );\n };\n\n return fn.pipe(\n TE.Do,\n TE.bindW('safeAreaInsets', genRequestInsets('safe-area')),\n TE.bindW('contentSafeAreaInsets', genRequestInsets('content-safe-area')),\n TE.bindW('isFullscreen', genFlag(isFullscreen)),\n TE.bindW('isViewportStable', genFlag(isViewportStable)),\n TE.chainW(({ isViewportStable, ...shared }) => {\n if (isViewportStable) {\n return TE.right({\n ...shared,\n height: window.innerHeight,\n isExpanded: true,\n stableHeight: window.innerHeight,\n width: window.innerWidth,\n });\n }\n return fn.pipe(\n request('web_app_request_viewport', 'viewport_changed', options),\n TE.map(viewport => ({\n ...shared,\n height: viewport.height,\n isExpanded: viewport.is_expanded,\n stableHeight: viewport.is_state_stable ? viewport.height : 0,\n width: viewport.width,\n })),\n );\n }),\n );\n },\n isPageReload,\n onMounted(state) {\n onViewportChanged(viewportChangedListener);\n onFullscreenChanged(fullscreenChangedListener);\n onSafeAreaInsetsChanged(safeAreaInsetsChangedListener);\n onContentSafeAreaInsetsChanged(contentSafeAreaInsetsChangedListener);\n stateful.setState(state);\n },\n onUnmounted() {\n offViewportChanged(viewportChangedListener);\n offFullscreenChanged(fullscreenChangedListener);\n offSafeAreaInsetsChanged(safeAreaInsetsChangedListener);\n offContentSafeAreaInsetsChanged(contentSafeAreaInsetsChangedListener);\n },\n restoreState: storage.get,\n });\n\n const saBased = <K extends keyof SafeAreaInsets>(key: K) => {\n return computed(() => this.safeAreaInsets()[key]);\n };\n const csaBased = <K extends keyof SafeAreaInsets>(key: K) => {\n return computed(() => this.contentSafeAreaInsets()[key]);\n };\n\n this.state = stateful.state;\n this.height = stateful.getter('height');\n this.stableHeight = stateful.getter('stableHeight');\n this.width = stateful.getter('width');\n this.isExpanded = stateful.getter('isExpanded');\n this.safeAreaInsets = stateful.getter('safeAreaInsets');\n this.safeAreaInsetTop = saBased('top');\n this.safeAreaInsetBottom = saBased('bottom');\n this.safeAreaInsetLeft = saBased('left');\n this.safeAreaInsetRight = saBased('right');\n this.contentSafeAreaInsets = stateful.getter('contentSafeAreaInsets');\n this.contentSafeAreaInsetTop = csaBased('top');\n this.contentSafeAreaInsetBottom = csaBased('bottom');\n this.contentSafeAreaInsetLeft = csaBased('left');\n this.contentSafeAreaInsetRight = csaBased('right');\n\n const wrapTask = createWithChecksFp({ isTma, returns: 'task' });\n const wrapMountedEither = createWithChecksFp({\n isTma,\n returns: 'either',\n });\n const wrapFullscreenTask = createWithChecksFp({\n isTma,\n requires: 'web_app_request_fullscreen',\n version,\n returns: 'task',\n });\n const genFullscreenFn = (enable: boolean) => {\n return wrapFullscreenTask((options?: AsyncOptions) => {\n return fn.pipe(\n request(\n enable ? 'web_app_request_fullscreen' : 'web_app_exit_fullscreen',\n ['fullscreen_changed', 'fullscreen_failed'],\n options,\n ),\n TE.chain(response => {\n if (\n response.event === 'fullscreen_failed'\n && response.payload.error !== 'ALREADY_FULLSCREEN'\n ) {\n return TE.left(new FullscreenFailedError(response.payload.error));\n }\n stateful.setState({\n isFullscreen: 'is_fullscreen' in response.payload\n ? response.payload.is_fullscreen\n : true,\n });\n return TE.right(undefined);\n }),\n );\n });\n };\n\n // Mount.\n this.isMounted = mountable.isMounted;\n this.mountFp = wrapTask(mountable.mount);\n this.mount = throwifyWithChecksFp(this.mountFp);\n\n // Fullscreen.\n this.isFullscreen = stateful.getter('isFullscreen');\n this.requestFullscreenFp = genFullscreenFn(true);\n this.requestFullscreen = throwifyWithChecksFp(this.requestFullscreenFp);\n this.exitFullscreenFp = genFullscreenFn(false);\n this.exitFullscreen = throwifyWithChecksFp(this.exitFullscreenFp);\n\n // CSS vars.\n const isCssVarsBound = signal(false);\n this.isCssVarsBound = computed(isCssVarsBound);\n this.bindCssVarsFp = wrapMountedEither(\n (getCSSVarName?: GetCSSVarNameFn) => {\n if (isCssVarsBound()) {\n return E.left(new CSSVarsBoundError());\n }\n getCSSVarName ||= prop => `--tg-viewport-${camelToKebab(prop)}`;\n\n const settings = ([\n ['height', this.height],\n ['stableHeight', this.stableHeight],\n ['width', this.width],\n ['safeAreaInsetTop', this.safeAreaInsetTop],\n ['safeAreaInsetBottom', this.safeAreaInsetBottom],\n ['safeAreaInsetLeft', this.safeAreaInsetLeft],\n ['safeAreaInsetRight', this.safeAreaInsetRight],\n ['contentSafeAreaInsetTop', this.contentSafeAreaInsetTop],\n ['contentSafeAreaInsetBottom', this.contentSafeAreaInsetBottom],\n ['contentSafeAreaInsetLeft', this.contentSafeAreaInsetLeft],\n ['contentSafeAreaInsetRight', this.contentSafeAreaInsetRight],\n ] as const).reduce<{\n update: VoidFunction;\n removeListener: VoidFunction;\n cssVar: string;\n }[]>((acc, [key, signal]) => {\n const cssVar = getCSSVarName(key);\n if (cssVar) {\n const update = () => {\n setCssVar(cssVar, `${signal()}px`);\n };\n acc.push({ update, removeListener: signal.sub(update), cssVar });\n }\n return acc;\n }, []);\n\n settings.forEach(setting => {\n setting.update();\n });\n isCssVarsBound.set(true);\n\n return E.right(() => {\n settings.forEach(s => {\n s.removeListener();\n deleteCssVar(s.cssVar);\n });\n isCssVarsBound.set(false);\n });\n },\n );\n this.bindCssVars = throwifyWithChecksFp(this.bindCssVarsFp);\n\n // Other methods.\n this.expandFp = wrapMountedEither(() => postEvent('web_app_expand'));\n this.expand = throwifyWithChecksFp(this.expandFp);\n }\n\n //#region Other properties.\n /**\n * Complete component state.\n */\n readonly state: Computed<ViewportState>;\n\n /**\n * Signal containing the current height of the **visible area** of the Mini App.\n *\n * The application can display just the top part of the Mini App, with its\n * lower part remaining outside the screen area. From this position, the user\n * can \"pull\" the Mini App to its maximum height, while the bot can do the same\n * by calling `expand` method. As the position of the Mini App changes, the\n * current height value of the visible area will be updated in real time.\n *\n * Please note that the refresh rate of this value is not sufficient to\n * smoothly follow the lower border of the window. It should not be used to pin\n * interface elements to the bottom of the visible area. It's more appropriate\n * to use the value of the `stableHeight` field for this purpose.\n *\n * @see stableHeight\n */\n readonly height: Computed<number>;\n\n /**\n * Signal containing the height of the visible area of the Mini App in its last stable state.\n *\n * The application can display just the top part of the Mini App, with its\n * lower part remaining outside the screen area. From this position, the user\n * can \"pull\" the Mini App to its maximum height, while the application can do\n * the same by calling `expand` method.\n *\n * Unlike the value of `height`, the value of `stableHeight` does not change as\n * the position of the Mini App changes with user gestures or during\n * animations. The value of `stableHeight` will be updated after all gestures\n * and animations are completed and the Mini App reaches its final size.\n *\n * @see height\n */\n readonly stableHeight: Computed<number>;\n\n /**\n * Signal containing the currently visible area width.\n */\n readonly width: Computed<number>;\n\n /**\n * Signal indicating if the Mini App is expanded to the maximum available height. Otherwise,\n * if the Mini App occupies part of the screen and can be expanded to the full\n * height using the `expand` method.\n */\n readonly isExpanded: Computed<boolean>;\n\n /**\n * Signal indicating if the current viewport height is stable and is not going to change in\n * the next moment.\n */\n readonly isStable = computed(() => this.height() === this.stableHeight());\n //#endregion\n\n //#region Content safe area insets.\n /**\n * Signal containing content safe area insets.\n */\n readonly contentSafeAreaInsets: Computed<SafeAreaInsets>;\n\n /**\n * Signal containing top content safe area inset.\n */\n readonly contentSafeAreaInsetTop: Computed<number>;\n\n /**\n * Signal containing left content safe area inset.\n */\n readonly contentSafeAreaInsetLeft: Computed<number>;\n\n /**\n * Signal containing right content safe area inset.\n */\n readonly contentSafeAreaInsetRight: Computed<number>;\n\n /**\n * Signal containing bottom content safe area inset.\n */\n readonly contentSafeAreaInsetBottom: Computed<number>;\n //#endregion\n\n //#region Safe area insets.\n /**\n * Signal containing safe area insets.\n */\n readonly safeAreaInsets: Computed<SafeAreaInsets>;\n\n /**\n * Signal containing top safe area inset.\n */\n readonly safeAreaInsetTop: Computed<number>;\n\n /**\n * Signal containing left safe area inset.\n */\n readonly safeAreaInsetLeft: Computed<number>;\n\n /**\n * Signal containing right safe area inset.\n */\n readonly safeAreaInsetRight: Computed<number>;\n\n /**\n * Signal containing bottom safe area inset.\n */\n readonly safeAreaInsetBottom: Computed<number>;\n //#endregion\n\n //#region Fullscreen.\n /**\n * Signal indicating if the viewport is currently in fullscreen mode.\n */\n readonly isFullscreen: Computed<boolean>;\n\n /**\n * Requests fullscreen mode for the mini application.\n * @since Mini Apps v8.0\n */\n readonly requestFullscreenFp: WithChecksFp<\n (options?: AsyncOptions) => TE.TaskEither<FullscreenError, void>,\n true\n >;\n\n /**\n * @see requestFullscreenFp\n */\n readonly requestFullscreen: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n\n /**\n * Exits mini application from the fullscreen mode.\n * @since Mini Apps v8.0\n */\n readonly exitFullscreenFp: WithChecksFp<\n (options?: AsyncOptions) => TE.TaskEither<FullscreenError, void>,\n true\n >;\n\n /**\n * @see exitFullscreenFp\n */\n readonly exitFullscreen: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, true>;\n //#endregion\n\n //#region CSS Vars.\n /**\n * Signal indicating if CSS variables are bound.\n */\n readonly isCssVarsBound: Computed<boolean>;\n\n /**\n * Creates CSS variables connected with the current viewport.\n *\n * By default, created CSS variables names are following the pattern \"--tg-theme-{name}\", where\n * {name} is a viewport property name converted from camel case to kebab case.\n *\n * Default variables:\n * - `--tg-viewport-height`\n * - `--tg-viewport-width`\n * - `--tg-viewport-stable-height`\n * - `--tg-viewport-content-safe-area-inset-top`\n * - `--tg-viewport-content-safe-area-inset-bottom`\n * - `--tg-viewport-content-safe-area-inset-left`\n * - `--tg-viewport-content-safe-area-inset-right`\n * - `--tg-viewport-safe-area-inset-top`\n * - `--tg-viewport-safe-area-inset-bottom`\n * - `--tg-viewport-safe-area-inset-left`\n * - `--tg-viewport-safe-area-inset-right`\n *\n * Variables are being automatically updated if the viewport was changed.\n *\n * @param getCSSVarName - function, returning computed complete CSS variable name. The CSS\n * variable will only be defined if the function returned non-empty string value.\n * @returns Function to stop updating variables.\n * @example Using no arguments\n * bindCssVarsFp();\n * @example Using custom CSS vars generator\n * bindCssVarsFp(key => `--my-prefix-${key}`);\n */\n readonly bindCssVarsFp: WithChecksFp<(getCSSVarName?: GetCSSVarNameFn) => (\n E.Either<CSSVarsBoundError, VoidFunction>\n ), false>;\n\n /**\n * @see bindCssVarsFp\n */\n readonly bindCssVars: WithChecks<(getCSSVarName?: GetCSSVarNameFn) => VoidFunction, false>;\n //#endregion\n\n //#region Mount.\n /**\n * Signal indicating if the component is currently mounted.\n */\n readonly isMounted: Computed<boolean>;\n\n /**\n * Mounts the component.\n */\n readonly mountFp: WithChecksFp<(options?: AsyncOptions) => (\n TE.TaskEither<EFullscreen | EViewportStable | RequestError, void>\n ), false>;\n\n /**\n * @see mountFp\n */\n readonly mount: WithChecks<(options?: AsyncOptions) => BetterPromise<void>, false>;\n //#endregion\n\n //#region Other methods.\n /**\n * A method that expands the Mini App to the maximum available height. To find\n * out if the Mini App is expanded to the maximum height, refer to the value of\n * the `isExpanded`.\n */\n readonly expandFp: WithChecksFp<() => E.Either<PostEventError, void>, false>;\n\n /**\n * @see expandFp\n */\n readonly expand: WithChecks<() => void, false>;\n //#endregion\n}\n","import { retrieveLaunchParamsFp, on, off, type EventName, EventListener } from '@vbotma/bridge';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { Viewport, type ViewportState } from '@/features/Viewport/Viewport.js';\nimport { sharedFeatureOptions } from '@/fn-options/sharedFeatureOptions.js';\nimport { withPostEvent } from '@/fn-options/withPostEvent.js';\nimport { withRequest } from '@/fn-options/withRequest.js';\nimport { withStateRestore } from '@/fn-options/withStateRestore.js';\nimport { withVersion } from '@/fn-options/withVersion.js';\n\nfunction create() {\n const createListeners = <E extends EventName>(event: E) => {\n return {\n on: (listener: EventListener<E>) => {\n on(event, listener);\n },\n off: (listener: EventListener<E>) => {\n off(event, listener);\n },\n };\n };\n const viewportListeners = createListeners('viewport_changed');\n const fullscreenListeners = createListeners('fullscreen_changed');\n const safeAreaListeners = createListeners('safe_area_changed');\n const contentSafeAreaListeners = createListeners('content_safe_area_changed');\n\n return new Viewport({\n ...fn.pipe(\n sharedFeatureOptions(),\n withStateRestore<ViewportState>('viewport'),\n withVersion,\n withPostEvent,\n withRequest,\n ),\n isFullscreen() {\n return fn.pipe(retrieveLaunchParamsFp(), E.map(lp => !!lp.vbWebAppFullscreen));\n },\n isViewportStable() {\n return fn.pipe(retrieveLaunchParamsFp(), E.map(lp => {\n return ['macos', 'tdesktop', 'unigram', 'webk', 'weba', 'web'].includes(lp.vbWebAppPlatform);\n }));\n },\n offContentSafeAreaInsetsChanged: contentSafeAreaListeners.off,\n offFullscreenChanged: fullscreenListeners.off,\n offSafeAreaInsetsChanged: safeAreaListeners.off,\n offViewportChanged: viewportListeners.off,\n onContentSafeAreaInsetsChanged: contentSafeAreaListeners.on,\n onFullscreenChanged: fullscreenListeners.on,\n onSafeAreaInsetsChanged: safeAreaListeners.on,\n onViewportChanged: viewportListeners.on,\n });\n}\n\nexport const viewport = /* @__PURE__*/ create();\n","import { type RequestError } from '@vbotma/bridge';\r\nimport type { BetterPromise } from 'better-promises';\r\nimport { taskEither as TE, function as fn } from 'fp-ts';\r\n\r\nimport type {\r\n StoragePermissionOptions,\r\n RequestStorageAccessOptions,\r\n StorageAccessResult,\r\n} from '@/features/StoragePermission/types.js';\r\n\r\n/**\r\n * Storage Permission feature class.\r\n * Allows requesting access to device storage to select files or folders.\r\n * @since v9.3\r\n */\r\nexport class StoragePermission {\r\n constructor({ request }: StoragePermissionOptions) {\r\n this.requestAccessFp = (\r\n options: RequestStorageAccessOptions\r\n ): TE.TaskEither<RequestError, StorageAccessResult> => {\r\n return fn.pipe(\r\n request('web_app_request_storage_access' as any, 'storage_access_granted' as any, {\r\n params: {\r\n access_type: options.accessType,\r\n multiple: options.multiple,\r\n accept: options.accept,\r\n max_file_size: options.maxFileSize,\r\n read_content: options.readContent,\r\n }\r\n }),\r\n TE.map((event: any) => ({\r\n accessType: event.access_type,\r\n items: event.items.map((item: any) => ({\r\n name: item.name,\r\n path: item.path,\r\n size: item.size,\r\n type: item.type,\r\n content: item.content,\r\n lastModified: item.last_modified,\r\n })),\r\n }))\r\n );\r\n };\r\n\r\n this.requestAccess = (\r\n options: RequestStorageAccessOptions\r\n ): BetterPromise<StorageAccessResult> => {\r\n const task = this.requestAccessFp(options);\r\n return (task() as Promise<any>).then((result) => {\r\n if (result._tag === 'Left') {\r\n throw result.left;\r\n }\r\n return result.right;\r\n }) as BetterPromise<StorageAccessResult>;\r\n };\r\n\r\n // Convenience methods\r\n this.selectFile = (options?: {\r\n accept?: string[];\r\n maxFileSize?: number;\r\n readContent?: boolean;\r\n }): BetterPromise<StorageAccessResult> => {\r\n return this.requestAccess({\r\n accessType: 'file',\r\n multiple: false,\r\n ...options,\r\n });\r\n };\r\n\r\n this.selectFiles = (options?: {\r\n accept?: string[];\r\n maxFileSize?: number;\r\n readContent?: boolean;\r\n }): BetterPromise<StorageAccessResult> => {\r\n return this.requestAccess({\r\n accessType: 'file',\r\n multiple: true,\r\n ...options,\r\n });\r\n };\r\n\r\n this.selectFolder = (): BetterPromise<StorageAccessResult> => {\r\n return this.requestAccess({\r\n accessType: 'folder',\r\n });\r\n };\r\n }\r\n\r\n /**\r\n * Requests storage access with specified options.\r\n * Returns a promise that resolves with selected files/folders.\r\n * @param options - Storage access options\r\n * @since v9.3\r\n */\r\n readonly requestAccessFp: (\r\n options: RequestStorageAccessOptions\r\n ) => TE.TaskEither<RequestError, StorageAccessResult>;\r\n\r\n /**\r\n * @see requestAccessFp\r\n */\r\n readonly requestAccess: (\r\n options: RequestStorageAccessOptions\r\n ) => BetterPromise<StorageAccessResult>;\r\n\r\n /**\r\n * Convenience method to select a single file.\r\n * @param options - Optional file selection options\r\n */\r\n readonly selectFile: (options?: {\r\n accept?: string[];\r\n maxFileSize?: number;\r\n readContent?: boolean;\r\n }) => BetterPromise<StorageAccessResult>;\r\n\r\n /**\r\n * Convenience method to select multiple files.\r\n * @param options - Optional file selection options\r\n */\r\n readonly selectFiles: (options?: {\r\n accept?: string[];\r\n maxFileSize?: number;\r\n readContent?: boolean;\r\n }) => BetterPromise<StorageAccessResult>;\r\n\r\n /**\r\n * Convenience method to select a folder.\r\n */\r\n readonly selectFolder: () => BetterPromise<StorageAccessResult>;\r\n}\r\n","import { request2Fp } from '@vbotma/bridge';\r\nimport { StoragePermission } from './StoragePermission.js';\r\n\r\nfunction instantiate() {\r\n return new StoragePermission({\r\n request: request2Fp,\r\n });\r\n}\r\n\r\nexport const storagePermission = /* @__PURE__ */ instantiate();\r\n","import {\n on,\n logger,\n retrieveLaunchParamsFp,\n type RetrieveLaunchParamsError,\n type PostEventError,\n type PostEventFpFn,\n} from '@vbotma/bridge';\nimport { createCbCollector, throwifyFpFn } from '@vbotma/toolkit';\nimport type { Version, ThemeParams } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nimport { isInlineMode } from '@/globals/isInlineMode.js';\nimport { postEventFpSignal, postEventFp, postEvent } from '@/globals/postEvent.js';\nimport { themeParams } from '@/globals/themeParams.js';\nimport { version } from '@/globals/version.js';\n\nexport interface InitOptions {\n /**\n * True if SDK should accept styles sent from the VBot application.\n * @default true\n */\n acceptCustomStyles?: boolean;\n /**\n * True if the application is launched in inline mode.\n * @default Will be calculated based on the launch parameters' vbWebAppBotInline field.\n */\n isInlineMode?: boolean;\n /**\n * A custom `postEvent` function to use across the package.\n * @default tma.js/bridge's postEventFp function will be used.\n */\n postEvent?: PostEventFpFn;\n /**\n * Mini application theme parameters.\n * @default Will be calculated based on the launch parameters' vbWebAppThemeParams field.\n */\n themeParams?: ThemeParams;\n /**\n * VBot Mini Apps version supported by the VBot client.\n * @default Will be calculated based on the launch parameters' vbWebAppVersion field.\n */\n version?: Version;\n}\n\n/**\n * Initializes the SDK allowing it to properly handle events, sent from the native Telegram\n * application. This function also configure the package's global dependencies (functions,\n * variables used across the package).\n * @param options - function options.\n * @returns A function, to perform a cleanup.\n */\nexport function initFp(\n options: InitOptions = {},\n): E.Either<RetrieveLaunchParamsError | PostEventError, VoidFunction> {\n const {\n version: optionsVersion,\n isInlineMode: optionsInlineMode,\n themeParams: optionsThemeParams,\n } = options;\n\n if (optionsVersion && typeof optionsInlineMode === 'boolean' && optionsThemeParams) {\n version.set(optionsVersion);\n isInlineMode.set(optionsInlineMode);\n themeParams.set(optionsThemeParams);\n } else {\n const error = fn.pipe(retrieveLaunchParamsFp(), E.matchW(\n err => err,\n lp => {\n version.set(optionsVersion || lp.vbWebAppVersion);\n isInlineMode.set(typeof optionsInlineMode === 'boolean'\n ? optionsInlineMode\n : !!lp.vbWebAppBotInline);\n themeParams.set(optionsThemeParams || lp.vbWebAppThemeParams);\n },\n ));\n if (error) {\n return E.left(error);\n }\n }\n if (options.postEvent) {\n postEventFpSignal.set(options.postEvent);\n }\n\n const [addCleanup, cleanup] = createCbCollector(\n on('reload_iframe', () => {\n logger().log('Received a request to reload the page');\n postEvent('iframe_will_reload');\n window.location.reload();\n }),\n );\n\n const { acceptCustomStyles = true } = options;\n if (acceptCustomStyles) {\n const style = document.createElement('style');\n style.id = 'telegram-custom-styles';\n document.head.appendChild(style);\n\n addCleanup(\n on('set_custom_style', html => {\n // It is safe to use innerHTML here as long as style tag has a special behavior related\n // to the specified content.\n // In case any script will be passed here, it will not be executed, so XSS is not possible.\n style.innerHTML = html;\n }),\n () => {\n document.head.removeChild(style);\n },\n );\n }\n\n // Notify Telegram that the application is ready.\n //\n // This will result in sending style tag html content from the Telegram web application.\n // We should call this method also to start receiving \"reload_iframe\" events from the Telegram\n // application.\n //\n // It really has no effect outside non-Telegram web environment.\n return fn.pipe(\n postEventFp('iframe_ready', { reload_supported: true }),\n E.map(() => {\n logger().log('The package was initialized');\n return cleanup;\n }),\n );\n}\n\n/**\n * @see initFp\n */\nexport const init = throwifyFpFn(initFp);\n"],"names":["access","value","Mountable","onMounted","restoreState","initialState","onUnmounted","isPageReload","__publicField","signal","computed","E","restored","state","fn","s","batch","removeUndefined","result","k","v","shallowEqual","a","b","aKeys","bKeys","aKey","Stateful","onChange","nextState","key","createIsSupportedSignal","method","version","supports","throwifyWithChecksFp","fn_","throwifyFpFn","args","O","data","throwifyAnyEither","msgToTuple","message","ValidationError","errorClassWithData","input","issues","CSSVarsBoundError","errorClass","DeviceStorageMethodError","error","SecureStorageMethodError","NotAvailableError","InvalidEnvError","FunctionUnavailableError","InvalidArgumentsError","cause","ConcurrentCallError","SetEmojiStatusError","AccessDeniedError","FullscreenFailedError","ShareMessageError","UnknownThemeParamsKeyError","withChecksFp","options","isTma","optionsIsSupported","returns","isSupportedSimplified","isOptionSupported","optionName","optionSettings","calculateSupportError","mode","requirements","i","requirement","calculateOptionSupportError","isSupported","isInitialized","isMounted","isAvailable","wrapError","err","TE","call","e","errMessagePrefix","supportErr","supportsOptionErr","_a","createWithChecksFp","Button","storage","onClick","offClick","postEvent","payload","stateful","mountable","wrapOptions","wrapSupportedPlain","wrapMountedEither","nothing","wrapped","setFp","setFalse","setTrue","BackButton","button","sharedFeatureOptions","isVBMAFp","createFnOption","mix","obj","createSignal","initialValue","postEventFpSignal","_postEventFp","postEventFp","withPostEvent","createComponentSessionStorage","getStorageValue","setStorageValue","getFirstNavigationEntry","entry","withStateRestore","storageName","withVersion","buttonOptions","trackedClickEvent","listener","once","on","off","backButton","AsyncMountable","createNotAvailableError","eventToState","event","available","tokenSaved","deviceId","accessRequested","type","accessGranted","Biometry","request","onInfoReceived","offInfoReceived","wrapSupportedEither","wrapSupportedTask","wrapMountedTask","response","requestFp","events","_requestFp","request2Fp","_request2Fp","BetterPromise","request2","withRequest","instantiate","biometry","ClosingBehavior","setClosingConfirmation","isConfirmationEnabled","closingBehavior","CloudStorage","invokeCustomMethod","keyOrKeys","keys","values","acc","parse","record","string","array","lastRequestId","createRequestId","params","invokeCustomMethodFp","withInvokeCustomMethod","cloudStorage","DeviceStorage","invokeMethod","requestId","withCreateRequestId","deviceStorage","create","rest","requestEmojiStatusAccessFp","requestEmojiStatusAccess","customEmojiId","setEmojiStatusFp","setEmojiStatus","HapticFeedback","HAPTIC_METHOD_NAME","wrapSupported","style","hapticFeedback","addToHomeScreenFp","addToHomeScreen","checkHomeScreenStatusFp","checkHomeScreenStatus","InitData","retrieveInitData","authDateValue","canSendAfterValue","raw","retrieveLaunchParamsFp","vbWebAppData","retrieveRawInitDataFp","initData","Invoice","isOpened","toggleClosed","slug","url","hostname","pathname","match","invoice","openLinkFp","openLink","urlString","openTelegramLinkFp","openTelegramLink","text","shareURLFp","shareURL","LocationManager","locationManager","MainButton","defaults","withDefault","field","getDefault","fromState","setCssVar","name","deleteCssVar","isColorDarkFp","color","toRGBFullFp","rgb","modifier","idx","dec","isColorDark","ThemeParams","offChange","getCSSVarName","prop","snakeToKebab","forEachEntry","actualize","themeParams","globalThemeParams","bottomButtonOptions","mainButton","MiniApp","theme","onVisibilityChanged","offVisibilityChanged","visibilityChangedListener","themeChangedListener","isRGB","rgbBasedOn","computedRgbBasedOn","isCssVarsBound","addCleanup","cleanup","createCbCollector","bind","cssVar","update","camelToKebab","genColorToolset","stateKey","rawColor","rgbColor","fp","withBasicEither","returnBack","miniApp","generateNotificationId","timestamp","random","Notification","notification","prepareParams","title","paramsButtons","buttons","id","Popup","preparedOptions","popup","requestPhoneAccessFp","requestPhoneAccess","createComplete","getContact","toStringResult","safeParse","toParsedResult","pipeQueryToSchema","looseObject","pipeJsonToSchema","number","optional","valiPipe","transform","date","getContactWithErrorsIgnore","contact","pollContact","ctx","BetterTaskEither","res","rej","context","sleepTime","resolve","status","instantiateComplete","createParsed","requestContact","instantiateParsed","requestContactCompleteFp","requestContactComplete","requestContactFp","requestWriteAccessFp","requestWriteAccess","QrScanner","onClosed","onTextReceived","setClosed","captured","qr","addToCleanup","onSettled","isOpenedValue","qrScanner","Refresh","isRefreshing","eventListener","refresh","SecondaryButton","secondaryButton","SecureStorage","secureStorage","SettingsButton","settingsButton","SwipeBehavior","setVerticalEnabled","isVerticalEnabled","swipeBehavior","copyTextToClipboard","clipboard","textArea","fileName","downloadFileFp","downloadFile","parsed","integer","getCurrentTimeFp","getCurrentTime","hideKeyboardFp","hideKeyboard","reqId","captureSameReq","readTextFromClipboardFp","readTextFromClipboard","retrieveAndroidDeviceDataFrom","userAgent","appVersion","systemInfo","item","retrieveAndroidDeviceData","size","sendDataFp","sendData","messageId","shareMessageFp","shareMessage","mediaUrl","shareStoryFp","shareStory","isInlineMode","query","chatTypes","switchInlineQueryFp","switchInlineQuery","Viewport","onContentSafeAreaInsetsChanged","onSafeAreaInsetsChanged","onViewportChanged","onFullscreenChanged","offContentSafeAreaInsetsChanged","offFullscreenChanged","offSafeAreaInsetsChanged","offViewportChanged","isViewportStable","isFullscreen","initialInsets","viewportChangedListener","fullscreenChangedListener","safeAreaInsetsChangedListener","contentSafeAreaInsetsChangedListener","genRequestInsets","kind","genFlag","flag","shared","viewport","saBased","csaBased","wrapTask","wrapFullscreenTask","genFullscreenFn","enable","settings","setting","createListeners","viewportListeners","fullscreenListeners","safeAreaListeners","contentSafeAreaListeners","lp","StoragePermission","storagePermission","initFp","optionsVersion","optionsInlineMode","optionsThemeParams","logger","acceptCustomStyles","html","init"],"mappings":"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"}
|