@wowlabtech/mini-app-adapter 0.2.7 → 0.2.81

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/disposables.ts","../src/lib/download.ts","../src/lib/safeArea.ts","../src/lib/shell.ts","../src/adapters/baseAdapter.ts","../src/adapters/maxAdapter.ts","../src/adapters/shellAdapter.ts","../src/adapters/telegramAdapter.ts","../src/lib/features.ts","../src/lib/viewport.ts","../src/adapters/vkAdapter.ts","../src/config/vkAnalytics.ts","../src/lib/bridge.ts","../src/adapters/webAdapter.ts","../src/adapters/index.ts","../src/components/AdapterProvider.tsx","../src/registry.ts","../src/hooks/useAdapterTheme.ts","../src/hooks/useSafeArea.ts","../src/platform.ts","../src/analytics.ts"],"sourcesContent":["export type Disposable = (() => void) | { dispose: () => void } | null | undefined;\n\nexport class DisposableBag {\n private disposers = new Set<() => void>();\n\n add(disposable: Disposable): () => void {\n if (!disposable) {\n return () => {};\n }\n\n const dispose = typeof disposable === 'function'\n ? disposable\n : typeof disposable.dispose === 'function'\n ? disposable.dispose.bind(disposable)\n : undefined;\n\n if (!dispose) {\n return () => {};\n }\n\n let called = false;\n const wrapped = () => {\n if (called) {\n return;\n }\n called = true;\n try {\n dispose();\n } catch (error) {\n console.warn('[tvm-app-adapter] disposable failed:', error);\n } finally {\n this.disposers.delete(wrapped);\n }\n };\n\n this.disposers.add(wrapped);\n return wrapped;\n }\n\n disposeAll(): void {\n for (const disposer of Array.from(this.disposers)) {\n try {\n disposer();\n } catch (error) {\n console.warn('[tvm-app-adapter] disposeAll failed:', error);\n }\n }\n this.disposers.clear();\n }\n}\n","const isClient = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nfunction getFallbackFileName(url: string, provided?: string): string {\n if (provided && provided.trim().length > 0) {\n return provided;\n }\n try {\n const parsed = new URL(url);\n const path = parsed.pathname.split('/').filter(Boolean).pop();\n if (path) {\n return path;\n }\n } catch {\n // Ignore parse errors and fall back to generic name.\n }\n return 'download';\n}\n\nfunction triggerAnchorDownload(href: string, fileName: string, { targetBlank }: { targetBlank: boolean }): void {\n if (!isClient) {\n return;\n }\n\n const anchor = document.createElement('a');\n anchor.href = href;\n anchor.download = fileName;\n anchor.rel = 'noopener noreferrer';\n if (targetBlank) {\n anchor.target = '_blank';\n }\n\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n}\n\nexport interface TriggerFileDownloadOptions {\n preferBlob?: boolean;\n}\n\nexport async function triggerFileDownload(url: string, fileName?: string, options?: TriggerFileDownloadOptions): Promise<void> {\n if (!url) {\n return;\n }\n\n const safeFileName = getFallbackFileName(url, fileName);\n const preferBlob = options?.preferBlob ?? false;\n\n if (!isClient) {\n if (typeof window !== 'undefined') {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (preferBlob && typeof fetch === 'function') {\n try {\n const response = await fetch(url, { credentials: 'include' });\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.status}`);\n }\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n triggerAnchorDownload(objectUrl, safeFileName, { targetBlank: false });\n setTimeout(() => URL.revokeObjectURL(objectUrl), 30_000);\n return;\n } catch (error) {\n console.warn('[tvm-app-adapter] blob download failed, falling back to direct link:', error);\n }\n }\n\n triggerAnchorDownload(url, safeFileName, { targetBlank: true });\n}\n","import type { MiniAppEnvironmentInfo, MiniAppViewportInsets } from '@/types/miniApp';\n\nconst SAFE_AREA_EDGES = ['top', 'right', 'bottom', 'left'] as const;\ntype SafeAreaEdge = (typeof SAFE_AREA_EDGES)[number];\nexport type SafeArea = Record<SafeAreaEdge, number>;\ntype PartialSafeArea = Partial<Record<SafeAreaEdge, number>>;\n\nconst DEFAULT_SAFE_AREA: SafeArea = { top: 0, right: 0, bottom: 0, left: 0 };\n\nfunction cloneSafeArea(source: SafeArea): SafeArea {\n return { ...source };\n}\n\nfunction addSafeArea(target: SafeArea, source?: PartialSafeArea): void {\n if (!source) {\n return;\n }\n for (const edge of SAFE_AREA_EDGES) {\n const value = source[edge];\n if (typeof value === 'number' && Number.isFinite(value)) {\n target[edge] += value;\n }\n }\n}\n\nfunction applyMinimum(target: SafeArea, source?: PartialSafeArea): void {\n if (!source) {\n return;\n }\n for (const edge of SAFE_AREA_EDGES) {\n const value = source[edge];\n if (typeof value === 'number' && Number.isFinite(value)) {\n target[edge] = Math.max(target[edge], value);\n }\n }\n}\n\nfunction areSafeAreasEqual(a?: SafeArea, b?: SafeArea): boolean {\n if (!a || !b) {\n return false;\n }\n return SAFE_AREA_EDGES.every((edge) => a[edge] === b[edge]);\n}\n\nexport interface ComputeSafeAreaOptions {\n environment?: Partial<MiniAppEnvironmentInfo['safeArea']>;\n viewport?: MiniAppViewportInsets;\n additions?: PartialSafeArea;\n minimum?: PartialSafeArea;\n css?: PartialSafeArea;\n}\n\nexport function computeCombinedSafeArea(options: ComputeSafeAreaOptions = {}): SafeArea {\n const safeArea = cloneSafeArea(DEFAULT_SAFE_AREA);\n\n addSafeArea(safeArea, options.environment as PartialSafeArea | undefined);\n\n if (options.viewport) {\n addSafeArea(safeArea, options.viewport.safeArea);\n addSafeArea(safeArea, options.viewport.contentSafeArea);\n }\n\n addSafeArea(safeArea, options.additions);\n\n applyMinimum(safeArea, options.css);\n applyMinimum(safeArea, options.minimum);\n\n return safeArea;\n}\n\nexport function readCssSafeArea(): SafeArea | undefined {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return undefined;\n }\n\n const styles = getComputedStyle(document.documentElement);\n const readEdge = (prop: string) => {\n const value = parseFloat(styles.getPropertyValue(prop));\n return Number.isFinite(value) ? value : 0;\n };\n\n const top = readEdge('--safe-area-inset-top');\n const right = readEdge('--safe-area-inset-right');\n const bottom = readEdge('--safe-area-inset-bottom');\n const left = readEdge('--safe-area-inset-left');\n\n if (top || right || bottom || left) {\n return { top, right, bottom, left };\n }\n\n return undefined;\n}\n\nexport interface SafeAreaWatcherOptions {\n getSafeArea: () => MiniAppEnvironmentInfo['safeArea'] | undefined;\n onChange: (safeArea: MiniAppEnvironmentInfo['safeArea']) => void;\n windowObj?: Window & typeof globalThis;\n events?: Array<'resize' | 'orientationchange'>;\n}\n\nfunction normalizeSafeArea(value?: MiniAppEnvironmentInfo['safeArea']): SafeArea | undefined {\n if (!value) {\n return undefined;\n }\n\n const safeArea: SafeArea = { ...DEFAULT_SAFE_AREA };\n addSafeArea(safeArea, value as PartialSafeArea);\n return safeArea;\n}\n\nexport function createSafeAreaWatcher(options: SafeAreaWatcherOptions): (() => void) | undefined {\n const targetWindow = options.windowObj ?? (typeof window !== 'undefined' ? window : undefined);\n if (!targetWindow) {\n return undefined;\n }\n\n let previous = normalizeSafeArea(options.getSafeArea());\n if (previous) {\n options.onChange(previous);\n previous = cloneSafeArea(previous);\n }\n\n const handler = () => {\n const next = normalizeSafeArea(options.getSafeArea());\n if (!next) {\n return;\n }\n\n if (!previous || !areSafeAreasEqual(previous, next)) {\n options.onChange(next);\n previous = cloneSafeArea(next);\n }\n };\n\n handler();\n\n const events = options.events ?? ['resize', 'orientationchange'];\n for (const eventName of events) {\n targetWindow.addEventListener(eventName, handler);\n }\n\n return () => {\n for (const eventName of events) {\n targetWindow.removeEventListener(eventName, handler);\n }\n };\n}\n","import type { MiniAppPlatform } from '@/types/miniApp';\n\nexport type ShellPlatform = 'shell_ios' | 'shell_android';\n\nconst SHELL_PLATFORMS: readonly ShellPlatform[] = ['shell_ios', 'shell_android'] as const;\nconst SHELL_QR_TIMEOUT_MS = 60_000;\n\ntype ShellBridgeCommand =\n | {\n type: 'storeToken';\n payload?: ShellStoreTokenPayload;\n }\n | {\n type: 'requestPushPermission';\n }\n | {\n type: 'openNativeQR';\n };\n\nexport interface ShellStoreTokenPayload {\n token?: string;\n [key: string]: unknown;\n}\n\ninterface NativeShellBridge {\n postMessage(message: ShellBridgeCommand): void;\n}\n\ntype ShellWindow = Window &\n Record<string, unknown> & {\n NativeBridge?: NativeShellBridge;\n nativePlatform?: ShellPlatform;\n nativePushToken?: (token: string) => void;\n nativeDeepLink?: (path: string) => void;\n nativeQRResult?: (value: string) => void;\n nativeAppActive?: () => void;\n nativeAppBackground?: () => void;\n };\n\ntype PushListener = (token: string) => void;\ntype DeepLinkListener = (path: string) => void;\ntype VoidListener = () => void;\n\ntype PendingQrRequest = {\n resolve: (value: string) => void;\n reject: (reason: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\nconst pushListeners = new Set<PushListener>();\nconst deepLinkListeners = new Set<DeepLinkListener>();\nconst activeListeners = new Set<VoidListener>();\nconst backgroundListeners = new Set<VoidListener>();\n\nlet lastPushToken: string | null = null;\n\nlet pendingQrRequest: PendingQrRequest | null = null;\n\nexport interface ShellBridgeConfig {\n platformFlag: string;\n pushTokenCallback: string;\n qrResultCallback: string;\n deepLinkCallback: string;\n appActiveCallback: string;\n appBackgroundCallback: string;\n}\n\nconst DEFAULT_BRIDGE_CONFIG: ShellBridgeConfig = {\n platformFlag: 'nativePlatform',\n pushTokenCallback: 'nativePushToken',\n qrResultCallback: 'nativeQRResult',\n deepLinkCallback: 'nativeDeepLink',\n appActiveCallback: 'nativeAppActive',\n appBackgroundCallback: 'nativeAppBackground',\n};\n\nlet bridgeConfig: ShellBridgeConfig = { ...DEFAULT_BRIDGE_CONFIG };\n\ntype BridgeCallbackKey =\n | 'pushTokenCallback'\n | 'deepLinkCallback'\n | 'appActiveCallback'\n | 'appBackgroundCallback'\n | 'qrResultCallback';\n\nlet installedCallbackNames: Partial<Record<BridgeCallbackKey, string>> = {};\n\nfunction notifyPushListeners(token: string): void {\n lastPushToken = token;\n for (const listener of pushListeners) {\n try {\n listener(token);\n } catch (error) {\n console.warn('[tvm-app-adapter] push token listener failed:', error);\n }\n }\n}\n\nexport interface ShellAPI {\n openNativeQR(): Promise<string>;\n onPushToken(callback: PushListener): () => void;\n onDeepLink(callback: DeepLinkListener): () => void;\n onAppActive(callback: VoidListener): () => void;\n onAppBackground(callback: VoidListener): () => void;\n}\n\nexport function configureShellBridge(config: Partial<ShellBridgeConfig>): void {\n bridgeConfig = { ...bridgeConfig, ...config };\n installGlobalCallbacks();\n}\n\nexport function isShell(platform: MiniAppPlatform): platform is ShellPlatform {\n return SHELL_PLATFORMS.includes(platform as ShellPlatform);\n}\n\nexport function isShellIOS(platform: MiniAppPlatform): platform is 'shell_ios' {\n return platform === 'shell_ios';\n}\n\nexport function isShellAndroid(platform: MiniAppPlatform): platform is 'shell_android' {\n return platform === 'shell_android';\n}\n\nexport function readShellPlatform(): ShellPlatform | undefined {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n return undefined;\n }\n const platform = (shellWindow as Record<string, unknown>)[bridgeConfig.platformFlag];\n if (platform === 'shell_ios' || platform === 'shell_android') {\n return platform;\n }\n return undefined;\n}\n\ntype PlatformResolver = MiniAppPlatform | (() => MiniAppPlatform);\n\nexport function createShellAPI(platform: PlatformResolver): ShellAPI {\n installGlobalCallbacks();\n\n const resolvePlatform = typeof platform === 'function' ? platform : () => platform;\n\n return {\n async openNativeQR(): Promise<string> {\n const currentPlatform = resolvePlatform();\n if (isShell(currentPlatform)) {\n return openNativeQrViaBridge();\n }\n return startHtml5Qrcode();\n },\n onPushToken(callback: PushListener): () => void {\n pushListeners.add(callback);\n if (lastPushToken) {\n queueMicrotask(() => {\n try {\n callback(lastPushToken as string);\n } catch (error) {\n console.warn('[tvm-app-adapter] push token listener failed:', error);\n }\n });\n }\n return () => pushListeners.delete(callback);\n },\n onDeepLink(callback: DeepLinkListener): () => void {\n deepLinkListeners.add(callback);\n return () => deepLinkListeners.delete(callback);\n },\n onAppActive(callback: VoidListener): () => void {\n activeListeners.add(callback);\n return () => activeListeners.delete(callback);\n },\n onAppBackground(callback: VoidListener): () => void {\n backgroundListeners.add(callback);\n return () => backgroundListeners.delete(callback);\n },\n };\n}\n\nexport const shell = createShellAPI(() => readShellPlatform() ?? 'web');\n\nexport function storeShellToken(payload?: ShellStoreTokenPayload): boolean {\n return sendBridgeCommand({ type: 'storeToken', payload });\n}\n\nexport function requestShellPushPermission(): boolean {\n return sendBridgeCommand({ type: 'requestPushPermission' });\n}\n\nfunction getShellWindow(): ShellWindow | null {\n return typeof window === 'undefined' ? null : (window as unknown as ShellWindow);\n}\n\nfunction getNativeBridge(): NativeShellBridge | null {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n return null;\n }\n const bridge = shellWindow.NativeBridge;\n if (!bridge || typeof bridge.postMessage !== 'function') {\n return null;\n }\n return bridge;\n}\n\nfunction sendBridgeCommand(command: ShellBridgeCommand): boolean {\n const bridge = getNativeBridge();\n if (!bridge) {\n return false;\n }\n try {\n bridge.postMessage(command);\n return true;\n } catch (error) {\n console.warn('[tvm-app-adapter] NativeBridge.postMessage failed:', error);\n return false;\n }\n}\n\nfunction installGlobalCallbacks(): void {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n installedCallbackNames = {};\n return;\n }\n\n const target = shellWindow as ShellWindow & Record<string, unknown>;\n\n const assignCallback = (\n key: BridgeCallbackKey,\n handler: (...args: unknown[]) => void,\n ) => {\n const nextName = bridgeConfig[key];\n const previousName = installedCallbackNames[key];\n if (previousName && previousName !== nextName) {\n delete target[previousName];\n }\n installedCallbackNames[key] = nextName;\n target[nextName] = handler;\n };\n\n assignCallback('pushTokenCallback', (token: unknown) => {\n if (typeof token !== 'string') {\n return;\n }\n console.log('[tvm-app-adapter] nativePushToken', token);\n notifyPushListeners(token);\n });\n\n assignCallback('deepLinkCallback', (path: unknown) => {\n if (typeof path !== 'string') {\n return;\n }\n for (const listener of deepLinkListeners) {\n try {\n listener(path);\n } catch (error) {\n console.warn('[tvm-app-adapter] deep link listener failed:', error);\n }\n }\n });\n\n assignCallback('appActiveCallback', () => {\n for (const listener of activeListeners) {\n try {\n listener();\n } catch (error) {\n console.warn('[tvm-app-adapter] app active listener failed:', error);\n }\n }\n });\n\n assignCallback('appBackgroundCallback', () => {\n for (const listener of backgroundListeners) {\n try {\n listener();\n } catch (error) {\n console.warn('[tvm-app-adapter] app background listener failed:', error);\n }\n }\n });\n\n assignCallback('qrResultCallback', (value: unknown) => {\n if (typeof value !== 'string') {\n return;\n }\n if (!pendingQrRequest) {\n return;\n }\n clearTimeout(pendingQrRequest.timeoutId);\n pendingQrRequest.resolve(value);\n pendingQrRequest = null;\n });\n}\n\nfunction openNativeQrViaBridge(): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n if (pendingQrRequest) {\n pendingQrRequest.reject(new Error('QR request superseded by a new call.'));\n clearTimeout(pendingQrRequest.timeoutId);\n pendingQrRequest = null;\n }\n\n if (!sendBridgeCommand({ type: 'openNativeQR' })) {\n reject(new Error('Native bridge is unavailable.'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n if (pendingQrRequest) {\n pendingQrRequest.reject(new Error('Native QR request timed out.'));\n pendingQrRequest = null;\n }\n }, SHELL_QR_TIMEOUT_MS);\n\n pendingQrRequest = { resolve, reject, timeoutId };\n });\n}\n\nasync function startHtml5Qrcode(): Promise<string> {\n if (typeof document === 'undefined') {\n throw new Error('QR scanning requires a browser environment.');\n }\n\n const [{ Html5Qrcode }] = await Promise.all([import('html5-qrcode')]);\n\n return new Promise<string>((resolve, reject) => {\n const elementId = `native-shell-qr-${Date.now()}`;\n const overlay = document.createElement('div');\n overlay.style.position = 'fixed';\n overlay.style.inset = '0';\n overlay.style.background = 'rgba(0, 0, 0, 0.9)';\n overlay.style.display = 'flex';\n overlay.style.flexDirection = 'column';\n overlay.style.alignItems = 'center';\n overlay.style.justifyContent = 'center';\n overlay.style.zIndex = '2147483647';\n overlay.style.backdropFilter = 'blur(2px)';\n\n const reader = document.createElement('div');\n reader.id = elementId;\n reader.style.width = '280px';\n reader.style.height = '280px';\n reader.style.borderRadius = '16px';\n reader.style.overflow = 'hidden';\n reader.style.position = 'relative';\n\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.textContent = '✕';\n closeButton.style.position = 'absolute';\n closeButton.style.top = '16px';\n closeButton.style.right = '16px';\n closeButton.style.background = 'transparent';\n closeButton.style.border = 'none';\n closeButton.style.color = '#fff';\n closeButton.style.fontSize = '28px';\n closeButton.style.cursor = 'pointer';\n\n overlay.appendChild(closeButton);\n overlay.appendChild(reader);\n document.body.appendChild(overlay);\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n let disposed = false;\n const scanner = new Html5Qrcode(elementId);\n\n const cleanup = async (result?: string, error?: Error) => {\n if (disposed) {\n return;\n }\n disposed = true;\n\n try {\n await scanner.stop();\n const maybeClear = (scanner as unknown as { clear?: () => Promise<void> | void }).clear;\n if (typeof maybeClear === 'function') {\n await Promise.resolve(maybeClear.call(scanner));\n }\n } catch {\n // Ignore stop errors.\n }\n\n overlay.remove();\n document.body.style.overflow = previousOverflow;\n\n if (typeof result === 'string') {\n resolve(result);\n } else if (error) {\n reject(error);\n } else {\n reject(new Error('QR scanning was cancelled.'));\n }\n };\n\n closeButton.addEventListener('click', () => {\n void cleanup(undefined, new Error('QR scanning was cancelled by the user.'));\n });\n\n scanner\n .start(\n { facingMode: 'environment' },\n { fps: 10, qrbox: { width: 240, height: 240 } },\n (decodedText: string) => {\n void cleanup(decodedText);\n },\n () => {}\n )\n .catch((error: unknown) => {\n const cause = error instanceof Error ? error : new Error('Unable to start HTML5 QR scanner.');\n void cleanup(undefined, cause);\n });\n });\n}\n","import type {\r\n ImpactHapticFeedbackStyle,\r\n NotificationHapticFeedbackType,\r\n} from '@tma.js/bridge';\r\n\r\nimport {\r\n type MiniAppShareStoryOptions,\r\n type MiniAppAdapter,\r\n type MiniAppCapability,\r\n type MiniAppEnvironmentInfo,\r\n type MiniAppInitOptions,\r\n type MiniAppPlatform,\r\n type MiniAppPopupOptions,\r\n type MiniAppQrScanOptions,\r\n type MiniAppViewportInsets,\r\n} from '@/types/miniApp';\r\nimport { DisposableBag, type Disposable } from '@/lib/disposables';\r\nimport { triggerFileDownload } from '@/lib/download';\r\nimport { computeCombinedSafeArea, readCssSafeArea } from '@/lib/safeArea';\r\nimport { createShellAPI, type ShellAPI } from '@/lib/shell';\r\n\r\nexport abstract class BaseMiniAppAdapter implements MiniAppAdapter {\r\n protected ready = false;\r\n\r\n protected environment: MiniAppEnvironmentInfo;\r\n\r\n private listeners = new Set<() => void>();\r\n\r\n private readonly disposables = new DisposableBag();\r\n\r\n readonly shell: ShellAPI;\r\n\r\n protected constructor(platform: MiniAppPlatform, environment?: Partial<MiniAppEnvironmentInfo>) {\r\n this.shell = createShellAPI(platform);\r\n this.environment = {\r\n platform,\r\n ...environment,\r\n };\r\n\r\n if (typeof window !== 'undefined') {\r\n const resizeHandler = () => this.notifyEnvironmentChanged();\r\n window.addEventListener('resize', resizeHandler);\r\n this.registerDisposable(() => window.removeEventListener('resize', resizeHandler));\r\n\r\n if (platform !== 'web') {\r\n const cleanup = this.applyScrollGuards();\r\n if (cleanup) {\r\n this.registerDisposable(cleanup);\r\n }\r\n }\r\n }\r\n }\r\n\r\n supports(capability: MiniAppCapability): boolean | Promise<boolean> {\n switch (capability) {\n case 'openExternalLink':\n return true;\n default:\n return false;\n }\n }\n\r\n get platform(): MiniAppPlatform {\r\n return this.environment.platform;\r\n }\r\n\r\n async init(_options?: MiniAppInitOptions): Promise<void> {\r\n this.ready = true;\r\n }\r\n\r\n isReady(): boolean {\r\n return this.ready;\r\n }\r\n\r\n getEnvironment(): MiniAppEnvironmentInfo {\r\n return { ...this.environment };\r\n }\r\n\r\n destroy(): void {\r\n try {\r\n this.onDestroy();\r\n } finally {\r\n this.disposables.disposeAll();\r\n this.listeners.clear();\r\n this.ready = false;\r\n }\r\n }\r\n\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n async setColors(colors: { header?: string; background?: string }): Promise<void> {\r\n if (colors.background) {\r\n document.body.style.backgroundColor = colors.background;\r\n }\r\n if (colors.header) {\r\n const meta = document.querySelector('meta[name=\"theme-color\"]');\r\n if (meta) {\r\n meta.setAttribute('content', colors.header);\r\n }\r\n }\r\n }\r\n\r\n onBackButton(callback: () => void): () => void {\r\n const handler = () => callback();\r\n window.addEventListener('popstate', handler);\r\n return () => window.removeEventListener('popstate', handler);\r\n }\r\n\r\n onPushToken(callback: (token: string) => void): () => void {\r\n return this.shell.onPushToken(callback);\r\n }\r\n\r\n onDeepLink(callback: (path: string) => void): () => void {\r\n return this.shell.onDeepLink(callback);\r\n }\r\n\r\n async openExternalLink(url: string): Promise<void> {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n }\r\n \r\n async openInternalLink(url: string): Promise<void> {\r\n window.open(url, '_self', 'noopener,noreferrer');\r\n }\r\n\r\n async closeApp(): Promise<void> {\r\n if (window.history.length > 1) {\r\n window.history.back();\r\n } else {\r\n window.close();\r\n }\r\n }\r\n\r\n setBackButtonVisibility(_visible: boolean): void {\r\n // No-op by default.\r\n }\r\n\r\n onAppearanceChange(callback: (appearance: 'dark' | 'light' | undefined) => void): () => void {\r\n callback(this.environment.appearance as 'dark' | 'light' | undefined);\r\n return () => {};\r\n }\r\n\r\n getInitData(): string | undefined {\r\n return undefined;\r\n }\r\n\r\n getLaunchParams(): unknown {\r\n return undefined;\r\n }\r\n\r\n decodeStartParam(_param: string): unknown {\r\n return undefined;\r\n }\r\n\r\n requestFullscreen(): void {\r\n // No-op by default.\r\n }\r\n\r\n onViewportChange(callback: (state: { height: number; stableHeight: number }) => void): () => void {\r\n if (typeof window === 'undefined') {\r\n return () => {};\r\n }\r\n\r\n const fallbackHeight = () => window.visualViewport?.height ?? window.innerHeight;\r\n\r\n const notify = () => {\r\n const height = fallbackHeight();\r\n callback({ height, stableHeight: height });\r\n };\r\n\r\n notify();\r\n\r\n const onResize = () => notify();\r\n window.visualViewport?.addEventListener('resize', onResize);\r\n window.visualViewport?.addEventListener('scroll', onResize);\r\n window.addEventListener('resize', onResize);\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', onResize);\r\n window.visualViewport?.removeEventListener('scroll', onResize);\r\n window.removeEventListener('resize', onResize);\r\n };\r\n }\r\n\r\n getViewportInsets(): MiniAppViewportInsets | undefined {\r\n return undefined;\r\n }\r\n\r\n shareMessage(_message: string): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n shareUrl(_url: string, _text: string): void {\r\n // No-op by default.\r\n }\r\n\r\n\r\n async downloadFile(url: string, filename: string): Promise<void> {\r\n await triggerFileDownload(url, filename);\r\n }\r\n\r\n shareStory(_mediaUrl: string, _options?: MiniAppShareStoryOptions): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n trackConversionEvent(_event: string, _payload?: Record<string, unknown>): void {\r\n // No-op by default; platform-specific adapters can override.\r\n }\r\n\r\n trackPixelEvent(_event: string, _payload?: Record<string, unknown>): void {\r\n // No-op by default; platform-specific adapters can override.\r\n }\r\n\r\n copyTextToClipboard(text: string): Promise<void> {\r\n return navigator.clipboard.writeText(text).catch(() => {\r\n // Fallback for older browsers\r\n const textarea = document.createElement('textarea');\r\n textarea.value = text;\r\n textarea.style.position = 'fixed'; // Prevent scrolling to bottom of page in MS Edge.\r\n document.body.appendChild(textarea);\r\n textarea.focus();\r\n textarea.select();\r\n try {\r\n document.execCommand('copy');\r\n } catch {\r\n // Ignore errors\r\n }\r\n document.body.removeChild(textarea);\r\n });\r\n }\r\n\r\n computeSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n const viewportInsets = this.getViewportInsets?.();\r\n const cssSafeArea = readCssSafeArea();\r\n\r\n return computeCombinedSafeArea({\r\n environment: this.environment.safeArea,\r\n viewport: viewportInsets,\r\n css: cssSafeArea,\r\n });\r\n }\r\n\r\n bindCssVariables(_mapper?: (key: string) => string): void {\r\n // No-op by default.\r\n }\r\n\r\n vibrateImpact(_style: ImpactHapticFeedbackStyle): void {\r\n navigator.vibrate?.(10);\r\n }\r\n\r\n vibrateNotification(_type: NotificationHapticFeedbackType): void {\r\n navigator.vibrate?.([10, 30, 10]);\r\n }\r\n\r\n vibrateSelection(): void {\r\n navigator.vibrate?.(5);\r\n }\r\n\r\n onViewHide(_callback: () => void): () => void {\r\n return () => {};\r\n }\r\n\r\n onViewRestore(_callback: () => void): () => void {\r\n return () => {};\r\n }\r\n\r\n async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\r\n const message = [options.title, options.message].filter(Boolean).join('\\n\\n');\r\n window.alert(message);\r\n const firstButton = options.buttons?.[0];\r\n return firstButton?.id ?? 'ok';\r\n }\r\n\r\n async scanQRCode(_options?: MiniAppQrScanOptions): Promise<string | null> {\r\n return null;\r\n }\r\n\r\n async requestPhone(): Promise<string | null> {\r\n return null;\r\n }\r\n\r\n async requestNotificationsPermission(): Promise<boolean> {\r\n if (typeof Notification === 'undefined' || typeof Notification.requestPermission !== 'function') {\r\n return false;\r\n }\r\n\r\n try {\r\n const permission = await Notification.requestPermission();\r\n return permission === 'granted';\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] requestNotificationsPermission fallback failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async addToHomeScreen(): Promise<boolean> {\r\n // Браузерный универсальный промпт отсутствует\r\n return false;\r\n }\r\n\r\n async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\r\n return 'unknown';\r\n }\r\n\r\n async denyNotifications(): Promise<boolean> {\r\n // Браузер не предоставляет API для принудительного отключения ранее выданного разрешения\r\n // уведомлений, поэтому по умолчанию возвращаем false.\r\n console.warn('[tvm-app-adapter] denyNotifications fallback is not supported in this environment.');\r\n return false;\r\n }\r\n\r\n enableVerticalSwipes(): void {\r\n // No-op by default.\r\n }\r\n\r\n disableVerticalSwipes(): void {\r\n // No-op by default.\r\n }\r\n\r\n protected notifyEnvironmentChanged(): void {\r\n for (const listener of this.listeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] environment listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n protected onDestroy(): void {\r\n // Subclasses can override to run synchronous teardown before shared disposables flush.\r\n }\r\n\r\n protected registerDisposable(disposable: Disposable): () => void {\r\n return this.disposables.add(disposable);\r\n }\r\n\r\n private applyScrollGuards(): (() => void) | undefined {\r\n if (typeof document === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n const html = document.documentElement;\r\n const body = document.body;\r\n if (!html || !body) {\r\n return undefined;\r\n }\r\n\r\n const prevHtmlOverscroll = html.style.overscrollBehaviorY;\r\n const prevBodyOverscroll = body.style.overscrollBehaviorY;\r\n const prevBodyTouchAction = body.style.touchAction;\r\n\r\n html.style.overscrollBehaviorY = 'none';\r\n body.style.overscrollBehaviorY = 'none';\r\n body.style.touchAction = 'manipulation';\r\n\r\n return () => {\r\n html.style.overscrollBehaviorY = prevHtmlOverscroll;\r\n body.style.overscrollBehaviorY = prevBodyOverscroll;\r\n body.style.touchAction = prevBodyTouchAction;\r\n };\r\n }\r\n}\r\n","import type {\n ImpactHapticFeedbackStyle,\n NotificationHapticFeedbackType,\n} from '@tma.js/bridge';\n\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\nimport type {\n MiniAppCapability,\n MiniAppEnvironmentInfo,\n MiniAppInitOptions,\n MiniAppPopupOptions,\n MiniAppQrScanOptions,\n} from '@/types/miniApp';\n\ntype MaxBackButtonPayload = {\n needConfirmation?: boolean;\n};\n\ninterface MaxBackButton {\n isVisible?: boolean;\n show?: () => void;\n hide?: () => void;\n onClick?: (handler: (payload: MaxBackButtonPayload) => void) => (() => void) | void;\n offClick?: (handler: (payload: MaxBackButtonPayload) => void) => void;\n}\n\ninterface MaxHapticFeedback {\n impactOccurred?: (style: ImpactHapticFeedbackStyle, disableVibrationFallback?: boolean) => Promise<unknown>;\n notificationOccurred?: (\n type: NotificationHapticFeedbackType,\n disableVibrationFallback?: boolean,\n ) => Promise<unknown>;\n selectionChanged?: (disableVibrationFallback?: boolean) => Promise<unknown>;\n}\n\ninterface MaxWebApp {\n version?: string;\n platform?: string;\n initData?: string;\n initDataUnsafe?: {\n query_id?: string;\n start_param?: string;\n user?: {\n language_code?: string;\n first_name?: string;\n last_name?: string;\n username?: string;\n };\n };\n ready?: () => void;\n close?: () => void;\n enableClosingConfirmation?: () => void;\n disableClosingConfirmation?: () => void;\n openExternalLink?: (url: string) => void;\n openMaxLink?: (url: string) => void;\n downloadFile?: (url: string, fileName: string) => Promise<unknown>;\n shareContent?: (payload: { text: string; link?: string; requestId: string }) => Promise<unknown>;\n shareMaxContent?: (payload: { text: string; link?: string; requestId: string }) => Promise<unknown>;\n openCodeReader?: (allowFileSelect?: boolean) => Promise<{ requestId: string; value?: string }>;\n requestPhoneNumber?: () => Promise<unknown>;\n BackButton?: MaxBackButton;\n HapticFeedback?: MaxHapticFeedback;\n}\n\ntype MaxPhoneRequestEventDetail = {\n providePromise: (promise: Promise<unknown>) => void;\n};\n\nfunction getMaxBridge(): MaxWebApp | undefined {\n return (window as typeof window & { WebApp?: MaxWebApp }).WebApp;\n}\n\nexport class MaxMiniAppAdapter extends BaseMiniAppAdapter {\n private readonly backHandlers = new Map<() => void, () => void>();\n private initData?: string;\n private initDataUnsafe?: MaxWebApp['initDataUnsafe'];\n\n constructor() {\n super('max');\n }\n\n override async init(_options?: MiniAppInitOptions): Promise<void> {\n if (this.ready) {\n return;\n }\n\n const bridge = getMaxBridge();\n bridge?.ready?.();\n\n this.initData = bridge?.initData;\n this.initDataUnsafe = bridge?.initDataUnsafe;\n\n const environment: MiniAppEnvironmentInfo = {\n platform: 'max',\n sdkVersion: bridge?.version,\n appVersion: bridge?.version,\n languageCode: bridge?.initDataUnsafe?.user?.language_code,\n isWebView: true,\n };\n\n this.environment = environment;\n this.ready = true;\n }\n\n override supports(capability: MiniAppCapability): boolean {\n const bridge = getMaxBridge();\n\n switch (capability) {\n case 'haptics':\n return Boolean(bridge?.HapticFeedback?.impactOccurred);\n case 'qrScanner':\n return typeof bridge?.openCodeReader === 'function';\n case 'closeApp':\n return typeof bridge?.close === 'function';\n case 'backButton':\n return Boolean(bridge?.BackButton?.onClick);\n case 'backButtonVisibility':\n return Boolean(bridge?.BackButton?.show && bridge.BackButton.hide);\n case 'openInternalLink':\n return typeof bridge?.openMaxLink === 'function';\n case 'downloadFile':\n return typeof bridge?.downloadFile === 'function';\n case 'requestPhone':\n if (!bridge) {\n return false;\n }\n return typeof bridge.requestPhoneNumber === 'function' || typeof window !== 'undefined';\n case 'popup':\n return false;\n default:\n return false;\n }\n }\n\n override getInitData(): string | undefined {\n return this.initData;\n }\n\n override getLaunchParams(): unknown {\n return this.initDataUnsafe ?? undefined;\n }\n\n override onBackButton(callback: () => void): () => void {\n const bridge = getMaxBridge();\n if (!bridge?.BackButton?.onClick) {\n return super.onBackButton(callback);\n }\n\n const wrapped = () => callback();\n const disposer = bridge.BackButton.onClick(wrapped);\n bridge.BackButton.show?.();\n\n const removeFromBag = this.registerDisposable(() => {\n if (typeof disposer === 'function') {\n disposer();\n } else {\n bridge.BackButton?.offClick?.(wrapped);\n }\n this.backHandlers.delete(callback);\n if (!this.backHandlers.size) {\n bridge.BackButton?.hide?.();\n }\n });\n\n this.backHandlers.set(callback, removeFromBag);\n return removeFromBag;\n }\n\n override setBackButtonVisibility(visible: boolean): void {\n const bridge = getMaxBridge();\n if (!bridge?.BackButton) {\n return;\n }\n visible ? bridge.BackButton.show?.() : bridge.BackButton.hide?.();\n }\n\n override async openExternalLink(url: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.openExternalLink) {\n bridge.openExternalLink(url);\n return;\n }\n await super.openExternalLink(url);\n }\n\n override async openInternalLink(url: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.openMaxLink) {\n bridge.openMaxLink(url);\n return;\n }\n await super.openInternalLink(url);\n }\n\n override async closeApp(): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.close) {\n bridge.close();\n return;\n }\n await super.closeApp();\n }\n\n override vibrateImpact(style: ImpactHapticFeedbackStyle): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.impactOccurred) {\n super.vibrateImpact(style);\n return;\n }\n void bridge.HapticFeedback.impactOccurred(style).catch((error) => {\n console.warn('[mini-app-template] MAX impact haptic failed:', error);\n });\n }\n\n override vibrateNotification(type: NotificationHapticFeedbackType): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.notificationOccurred) {\n super.vibrateNotification(type);\n return;\n }\n void bridge.HapticFeedback.notificationOccurred(type).catch((error) => {\n console.warn('[mini-app-template] MAX notification haptic failed:', error);\n });\n }\n\n override vibrateSelection(): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.selectionChanged) {\n super.vibrateSelection();\n return;\n }\n void bridge.HapticFeedback.selectionChanged().catch((error) => {\n console.warn('[mini-app-template] MAX selection haptic failed:', error);\n });\n }\n\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\n const bridge = getMaxBridge();\n if (!bridge?.openCodeReader) {\n return super.scanQRCode(options);\n }\n\n try {\n const result = await bridge.openCodeReader(options?.closeOnCapture !== false);\n return result?.value ?? null;\n } catch (error) {\n console.warn('[mini-app-template] MAX QR scanner failed:', error);\n return null;\n }\n }\n\n override async requestPhone(): Promise<string | null> {\n const bridge = getMaxBridge();\n if (bridge?.requestPhoneNumber) {\n try {\n const response = await bridge.requestPhoneNumber();\n return this.extractPhone(response);\n } catch (error) {\n console.warn('[mini-app-template] MAX requestPhone failed:', error);\n return null;\n }\n }\n\n return this.requestPhoneViaEvent();\n }\n\n override async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\n // MAX bridge does not expose a native popup API yet.\n return super.showPopup(options);\n }\n\n override async downloadFile(url: string, filename: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.downloadFile) {\n try {\n await bridge.downloadFile(url, filename);\n return;\n } catch (error) {\n console.warn('[mini-app-template] MAX downloadFile failed:', error);\n }\n }\n\n await super.downloadFile(url, filename);\n }\n\n private async requestPhoneViaEvent(): Promise<string | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n let providedPromise: Promise<unknown> | undefined;\n const detail: MaxPhoneRequestEventDetail = {\n providePromise: (promise) => {\n providedPromise = promise;\n },\n };\n\n window.dispatchEvent(new CustomEvent<MaxPhoneRequestEventDetail>('WebAppRequestPhone', { detail }));\n\n if (!providedPromise) {\n console.warn('[mini-app-template] MAX requestPhone not handled: native promise missing');\n return null;\n }\n\n try {\n const result = await providedPromise;\n return this.extractPhone(result);\n } catch (error) {\n console.warn('[mini-app-template] MAX requestPhone promise rejected:', error);\n return null;\n }\n }\n\n private extractPhone(data: unknown): string | null {\n if (typeof data === 'string') {\n return data || null;\n }\n\n if (!data || typeof data !== 'object') {\n return null;\n }\n\n const directPhone = (data as { phone?: unknown; phone_number?: unknown; phoneNumber?: unknown }).phone\n ?? (data as { phone_number?: unknown }).phone_number\n ?? (data as { phoneNumber?: unknown }).phoneNumber;\n\n if (typeof directPhone === 'string' && directPhone) {\n return directPhone;\n }\n\n const contact = (data as { contact?: unknown }).contact;\n if (contact && typeof contact === 'object') {\n const nested = (contact as {\n phone?: unknown;\n phone_number?: unknown;\n phoneNumber?: unknown;\n }).phone\n ?? (contact as { phone_number?: unknown }).phone_number\n ?? (contact as { phoneNumber?: unknown }).phoneNumber;\n\n if (typeof nested === 'string' && nested) {\n return nested;\n }\n }\n\n return null;\n }\n\n protected override onDestroy(): void {\n this.backHandlers.clear();\n super.onDestroy();\n }\n}\n","import { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\nimport type { MiniAppCapability } from '@/types/miniApp';\nimport { requestShellPushPermission } from '@/lib/shell';\n\nexport class ShellMiniAppAdapter extends BaseMiniAppAdapter {\n constructor(platform: 'shell_ios' | 'shell_android') {\n super(platform, {\n isWebView: true,\n hasNativeQR: true,\n hasPush: true,\n hasWidgets: true,\n });\n }\n\n override supports(capability: MiniAppCapability): boolean | Promise<boolean> {\n switch (capability) {\n case 'qrScanner':\n return true;\n case 'notifications':\n return true;\n default:\n return super.supports(capability);\n }\n }\n\n override async scanQRCode(): Promise<string | null> {\n try {\n const value = await this.shell.openNativeQR();\n return value ?? null;\n } catch (error) {\n console.warn('[tvm-app-adapter] shell.openNativeQR failed:', error);\n return null;\n }\n }\n\n override async requestNotificationsPermission(): Promise<boolean> {\n return requestShellPushPermission();\n }\n}\n","import type {\r\n ImpactHapticFeedbackStyle,\r\n NotificationHapticFeedbackType,\r\n} from '@tma.js/bridge';\r\n\r\nimport {\r\n backButton,\r\n emitEvent,\r\n hapticFeedback,\r\n init as initSDK,\r\n initData,\r\n mockTelegramEnv,\r\n miniApp,\r\n openLink,\r\n popup,\r\n qrScanner,\r\n postEvent,\r\n retrieveLaunchParams,\r\n setDebug,\r\n themeParams,\r\n viewport,\r\n} from '@tma.js/sdk-react';\r\nimport {\r\n decodeStartParam,\r\n closingBehavior,\r\n requestContact,\r\n requestPhoneAccess,\r\n swipeBehavior,\r\n viewport as rawViewport,\r\n shareURL as shareURLSdk,\r\n copyTextToClipboard as copyTextToClipboardSdk,\r\n downloadFile as downloadFileSdk,\r\n shareStory as shareStorySdk,\r\n addToHomeScreen as addToHomeScreenSdk,\r\n checkHomeScreenStatus as checkHomeScreenStatusSdk,\r\n on,\r\n off,\r\n} from '@tma.js/sdk';\r\n\r\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\r\nimport type {\r\n MiniAppCapability,\r\n MiniAppEnvironmentInfo,\r\n MiniAppInitOptions,\r\n MiniAppPopupOptions,\r\n MiniAppQrScanOptions,\r\n MiniAppShareStoryOptions,\r\n MiniAppViewportInsets,\r\n} from '@/types/miniApp';\r\nimport { ensureFeature, isFeatureAvailable } from '@/lib/features';\r\nimport { bindViewportCssVars, ensureViewportMounted } from '@/lib/viewport';\r\nexport class TelegramMiniAppAdapter extends BaseMiniAppAdapter {\r\n private readonly backHandlers = new Map<() => void, () => void>();\r\n private cssVariablesBound = false;\r\n private readonly appearanceListeners = new Set<\r\n (appearance: 'dark' | 'light' | undefined) => void\r\n >();\r\n private appearanceWatcherDispose?: () => void;\r\n private readonly viewHideListeners = new Set<() => void>();\r\n private readonly viewRestoreListeners = new Set<() => void>();\r\n private activeWatcherDispose?: () => void;\r\n\r\n constructor() {\r\n super('telegram');\r\n }\r\n\r\n override async init(options?: MiniAppInitOptions): Promise<void> {\r\n if (this.ready) {\r\n return;\r\n }\r\n\r\n const debug = Boolean(options?.debug);\r\n const eruda = Boolean(options?.eruda);\r\n const mockForMacOS = Boolean(options?.mockForMacOS);\r\n\r\n setDebug(debug);\r\n initSDK();\r\n\r\n if (!miniApp.isSupported()) {\r\n console.warn('[tvm-app-adapter] miniApp feature is not supported; falling back to limited mode.');\r\n }\r\n\r\n if (eruda) {\r\n void import('eruda').then(({ default: erudaInstance }) => {\r\n erudaInstance.init();\r\n erudaInstance.position({ x: window.innerWidth - 150, y: window.innerHeight - 150 });\r\n });\r\n }\r\n\r\n if (mockForMacOS) {\r\n let firstThemeSent = false;\r\n mockTelegramEnv({\r\n onEvent(event, next) {\r\n if (event.name === 'web_app_request_theme') {\r\n let tp: Record<string, string | undefined> = {};\r\n if (firstThemeSent) {\r\n tp = themeParams.state();\r\n } else {\r\n firstThemeSent = true;\r\n tp ||= retrieveLaunchParams().tgWebAppThemeParams;\r\n }\r\n return emitEvent('theme_changed', { theme_params: tp as Record<string, `#${string}` | undefined> });\r\n }\r\n\r\n if (event.name === 'web_app_request_safe_area') {\r\n return emitEvent('safe_area_changed', { left: 0, top: 0, right: 0, bottom: 0 });\r\n }\r\n\r\n next();\r\n },\r\n });\r\n }\r\n\r\n initData.restore();\r\n\r\n miniApp.ready();\r\n\r\n const launchParams = retrieveLaunchParams();\r\n let appearance: string | undefined;\r\n try {\r\n appearance = miniApp.isDark() ? 'dark' : 'light';\r\n } catch {\r\n appearance = undefined;\r\n }\r\n\r\n const environment: MiniAppEnvironmentInfo = {\r\n platform: 'telegram',\r\n sdkVersion: launchParams.tgWebAppVersion,\r\n languageCode: initData.user()?.language_code,\r\n appearance,\r\n isWebView: true,\r\n };\r\n this.environment = environment;\r\n this.notifyAppearance(environment.appearance as 'dark' | 'light' | undefined);\r\n\r\n backButton.mount.ifAvailable();\r\n\r\n if (miniApp.mount.isAvailable()) {\r\n themeParams.mount();\r\n miniApp.mount();\r\n this.bindCssVariables();\r\n }\r\n\r\n await this.prepareViewport();\r\n\r\n this.setupAppearanceWatcher();\r\n this.setupActiveWatcher();\r\n\r\n this.ready = true;\r\n }\r\n\r\n override async setColors(colors: { header?: string; background?: string; footer?: string }): Promise<void> {\r\n const fallback: { header?: string; background?: string; footer?: string } = {};\r\n\r\n if (colors.header) {\r\n if (miniApp.setHeaderColor.isAvailable()) {\r\n const headerColor = miniApp.setHeaderColor.supports?.('rgb') ? colors.header : 'bg_color';\r\n const { ok } = ensureFeature(miniApp.setHeaderColor, headerColor);\r\n if (!ok) {\r\n fallback.header = colors.header;\r\n }\r\n } else {\r\n fallback.header = colors.header;\r\n }\r\n }\r\n\r\n if (colors.background) {\r\n if (miniApp.setBgColor.isAvailable()) {\r\n const { ok } = ensureFeature(miniApp.setBgColor, colors.background);\r\n if (!ok) {\r\n fallback.background = colors.background;\r\n }\r\n } else {\r\n fallback.background = colors.background;\r\n }\r\n }\r\n\r\n if (colors.footer) {\r\n if (miniApp.setBgColor.isAvailable()) {\r\n const { ok } = ensureFeature(miniApp.setBottomBarColorFp, colors.footer);\r\n if (!ok) {\r\n fallback.footer = colors.footer;\r\n }\r\n } else {\r\n fallback.footer = colors.footer;\r\n }\r\n }\r\n\r\n if (fallback.header || fallback.background) {\r\n await super.setColors(fallback);\r\n }\r\n }\r\n\r\n override copyTextToClipboard(text: string): Promise<void> {\r\n return copyTextToClipboardSdk(text);\r\n }\r\n\r\n override onBackButton(callback: () => void): () => void {\r\n if (!backButton.isSupported()) {\r\n return super.onBackButton(callback);\r\n }\r\n\r\n const dispose = backButton.onClick(() => callback());\r\n\r\n const removeFromBag = this.registerDisposable(() => {\r\n if (typeof dispose === 'function') {\r\n dispose();\r\n }\r\n this.backHandlers.delete(callback);\r\n if (!this.backHandlers.size) {\r\n backButton.hide();\r\n }\r\n });\r\n\r\n this.backHandlers.set(callback, removeFromBag);\r\n return removeFromBag;\r\n }\r\n\r\n override async openExternalLink(url: string): Promise<void> {\r\n try {\r\n openLink(url, { tryInstantView: true });\r\n return;\r\n } catch {\r\n // Fall back to default behaviour if Telegram specific API is not available.\r\n }\r\n await super.openExternalLink(url);\r\n }\r\n\r\n override async openInternalLink(url: string): Promise<void> {\r\n postEvent('web_app_open_tg_link', { path_full: url });\r\n }\r\n\r\n enableDebug(state: boolean): void {\r\n try {\r\n state ? closingBehavior.enableConfirmation() : closingBehavior.disableConfirmation();\r\n } catch {\r\n // Ignore unsupported environments.\r\n }\r\n }\r\n\r\n override supports(capability: MiniAppCapability): boolean {\r\n switch (capability) {\r\n case 'haptics':\r\n return isFeatureAvailable(hapticFeedback.selectionChanged);\r\n case 'popup':\r\n return isFeatureAvailable(popup.show);\r\n case 'qrScanner':\r\n return isFeatureAvailable(qrScanner.open);\r\n case 'closeApp':\r\n return isFeatureAvailable(miniApp.close);\r\n case 'backButton':\r\n return backButton.isSupported();\r\n case 'backButtonVisibility':\r\n return backButton.hide.isSupported();\r\n case 'bindCssVariables':\r\n return true;\r\n case 'openExternalLink':\r\n return isFeatureAvailable(openLink);\r\n case 'openInternalLink':\r\n return true;\r\n case 'requestFullscreen':\r\n return Boolean(\r\n (typeof rawViewport.requestFullscreen === 'function')\r\n || viewport.requestFullscreen?.isAvailable?.(),\r\n );\r\n case 'verticalSwipes':\r\n return Boolean(\r\n swipeBehavior.enableVertical.isAvailable()\r\n || swipeBehavior.disableVertical.isAvailable(),\r\n );\r\n case 'viewVisibility':\r\n return true;\r\n case 'shareUrl':\r\n return typeof shareURLSdk === 'function';\r\n case 'shareStory':\r\n return typeof shareStorySdk === 'function';\r\n case 'copyTextToClipboard':\r\n return typeof copyTextToClipboardSdk === 'function';\r\n case 'downloadFile':\r\n return typeof downloadFileSdk === 'function';\r\n case 'addToHomeScreen':\r\n return typeof addToHomeScreenSdk?.isAvailable === 'function'\r\n ? addToHomeScreenSdk.isAvailable()\r\n : typeof addToHomeScreenSdk === 'function';\r\n case 'checkHomeScreenStatus':\r\n return typeof checkHomeScreenStatusSdk === 'function';\r\n case 'requestPhone': {\r\n return Boolean(isFeatureAvailable(requestPhoneAccess) || isFeatureAvailable(requestContact));\r\n }\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n override bindCssVariables(mapper?: (key: string) => string): void {\r\n if (this.cssVariablesBound) {\r\n return;\r\n }\r\n\r\n try {\r\n themeParams.bindCssVars(mapper);\r\n this.cssVariablesBound = true;\r\n } catch (error) {\r\n if (error instanceof Error && /css variables are already bound/i.test(error.message)) {\r\n this.cssVariablesBound = true;\r\n return;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n override vibrateImpact(style: ImpactHapticFeedbackStyle): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.impactOccurred(style);\r\n }\r\n }\r\n\r\n override vibrateNotification(type: NotificationHapticFeedbackType): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.notificationOccurred(type);\r\n }\r\n }\r\n\r\n override vibrateSelection(): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.selectionChanged();\r\n }\r\n }\r\n\r\n override async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\r\n const popupResult = ensureFeature(popup.show, {\r\n title: options.title,\r\n message: options.message,\r\n buttons: options.buttons?.map((button) => ({\r\n id: button.id,\r\n text: button.text ?? button.id,\r\n type: button.type ?? 'default',\r\n })),\r\n });\r\n\r\n if (!popupResult.ok) {\r\n return super.showPopup(options);\r\n }\r\n\r\n const response = await popupResult.value;\r\n return response ?? null;\r\n }\r\n\r\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\r\n let result: string | null = null;\r\n const closeOnCapture = options?.closeOnCapture ?? true;\r\n\r\n const qrScannerResult = ensureFeature(qrScanner.open, {\r\n onCaptured: (qr) => {\r\n result = qr;\r\n if (closeOnCapture) {\r\n void ensureFeature(qrScanner.close);\r\n }\r\n },\r\n });\r\n\r\n if (!qrScannerResult.ok) {\r\n return super.scanQRCode(options);\r\n }\r\n\r\n await qrScannerResult.value;\r\n\r\n return result;\r\n }\r\n\r\n override async closeApp(): Promise<void> {\r\n const closeResult = ensureFeature(miniApp.close);\r\n if (closeResult.ok) {\r\n return;\r\n }\r\n\r\n await super.closeApp();\r\n }\r\n\r\n override getInitData(): string | undefined {\r\n try {\r\n return initData.raw();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override getLaunchParams(): unknown {\r\n try {\r\n return retrieveLaunchParams();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override decodeStartParam(param: string): unknown {\r\n try {\r\n return decodeStartParam(param);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override requestFullscreen(): void {\r\n void this.requestFullscreenInternal();\r\n }\r\n\r\n override getViewportInsets(): MiniAppViewportInsets | undefined {\r\n try {\r\n const safeArea = viewport.safeAreaInsets();\r\n const contentSafeArea = viewport.contentSafeAreaInsets();\r\n return {\r\n safeArea,\r\n contentSafeArea,\r\n };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override onViewportChange(callback: (state: { height: number; stableHeight: number }) => void): () => void {\r\n const disposers: Array<() => void> = [];\r\n const fallbackHeight = () => (typeof window !== 'undefined'\r\n ? (window.visualViewport?.height ?? window.innerHeight)\r\n : 0);\r\n\r\n const notify = (state?: { height?: number; stableHeight?: number }) => {\r\n const heightCandidate = state?.height ?? this.safeHeightFromSdk();\r\n const stableCandidate = state?.stableHeight ?? this.stableHeightFromSdk();\r\n\r\n const height = Number.isFinite(heightCandidate) ? (heightCandidate as number) : fallbackHeight();\r\n const stableHeight = Number.isFinite(stableCandidate) && (stableCandidate as number) > 0\r\n ? (stableCandidate as number)\r\n : height;\r\n\r\n callback({ height, stableHeight });\r\n };\r\n\r\n const ensureMounted = async () => {\r\n try {\r\n await ensureViewportMounted(this.getViewportMountOptions());\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] ensureViewportMounted failed:', error);\r\n }\r\n };\r\n\r\n void ensureMounted().finally(() => notify());\r\n\r\n const { sdkViewport } = this.getViewportMountOptions();\r\n\r\n if (typeof sdkViewport.on === 'function') {\r\n try {\r\n const off = sdkViewport.on('change', (next) => notify(next as { height?: number; stableHeight?: number }));\r\n if (typeof off === 'function') {\r\n disposers.push(off);\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] viewport.on(change) subscription failed:', error);\r\n }\r\n }\r\n\r\n try {\r\n if (typeof sdkViewport.height?.sub === 'function') {\r\n disposers.push(sdkViewport.height.sub(() => notify()));\r\n }\r\n if (typeof sdkViewport.stableHeight?.sub === 'function') {\r\n disposers.push(sdkViewport.stableHeight.sub(() => notify()));\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] viewport signal subscriptions failed:', error);\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n const onResize = () => notify();\r\n window.visualViewport?.addEventListener('resize', onResize);\r\n window.addEventListener('resize', onResize);\r\n disposers.push(() => {\r\n window.visualViewport?.removeEventListener('resize', onResize);\r\n window.removeEventListener('resize', onResize);\r\n });\r\n }\r\n\r\n return () => {\r\n disposers.forEach((dispose) => {\r\n try {\r\n dispose();\r\n } catch {\r\n /* ignore */\r\n }\r\n });\r\n };\r\n }\r\n\r\n override onAppearanceChange(\r\n callback: (appearance: 'dark' | 'light' | undefined) => void,\r\n ): () => void {\r\n this.appearanceListeners.add(callback);\r\n callback(this.environment.appearance as 'dark' | 'light' | undefined);\r\n return () => {\r\n this.appearanceListeners.delete(callback);\r\n };\r\n }\r\n\r\n override setBackButtonVisibility(visible: boolean): void {\r\n if (!backButton.isSupported()) {\r\n return;\r\n }\r\n\r\n if (visible) {\r\n backButton.show();\r\n } else {\r\n backButton.hide();\r\n }\r\n }\r\n\r\n override enableVerticalSwipes(): void {\r\n try {\r\n const sdkSwipe = swipeBehavior as typeof swipeBehavior & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void;\r\n enableVertical?: () => void;\r\n };\r\n\r\n if (typeof sdkSwipe.isSupported === 'function' && sdkSwipe.isSupported()) {\r\n if (typeof sdkSwipe.isMounted === 'function' && !sdkSwipe.isMounted()) {\r\n sdkSwipe.mount?.();\r\n }\r\n sdkSwipe.enableVertical?.();\r\n } else if (swipeBehavior.enableVertical.isAvailable()) {\r\n swipeBehavior.enableVertical();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] enableVerticalSwipes failed:', error);\r\n }\r\n }\r\n\r\n override disableVerticalSwipes(): void {\r\n try {\r\n const sdkSwipe = swipeBehavior as typeof swipeBehavior & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void;\r\n disableVertical?: () => void;\r\n };\r\n\r\n if (typeof sdkSwipe.isSupported === 'function' && sdkSwipe.isSupported()) {\r\n if (typeof sdkSwipe.isMounted === 'function' && !sdkSwipe.isMounted()) {\r\n sdkSwipe.mount?.();\r\n }\r\n sdkSwipe.disableVertical?.();\r\n } else if (swipeBehavior.disableVertical.isAvailable()) {\r\n swipeBehavior.disableVertical();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] disableVerticalSwipes failed:', error);\r\n }\r\n }\r\n\r\n override onViewHide(callback: () => void): () => void {\r\n this.viewHideListeners.add(callback);\r\n return () => {\r\n this.viewHideListeners.delete(callback);\r\n };\r\n }\r\n\r\n override onViewRestore(callback: () => void): () => void {\r\n this.viewRestoreListeners.add(callback);\r\n return () => {\r\n this.viewRestoreListeners.delete(callback);\r\n };\r\n }\r\n\r\n override shareUrl(url: string, text?: string): void {\r\n return shareURLSdk(url, text);\r\n }\r\n\r\n override async downloadFile(url: string, filename: string): Promise<void> {\r\n const result = ensureFeature(downloadFileSdk, url, filename);\r\n if (result.ok) {\r\n try {\r\n await result.value;\r\n return;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram downloadFile failed:', error);\r\n }\r\n }\r\n\r\n await super.downloadFile(url, filename);\r\n }\r\n\r\n override async shareStory(mediaUrl: string, options?: MiniAppShareStoryOptions): Promise<void> {\r\n const text = options?.telegram?.text ?? options?.text;\r\n const widgetLink = options?.telegram?.widgetLink\r\n ?? (options?.link\r\n ? {\r\n url: options.link.url,\r\n ...(options.link.name ? { name: options.link.name } : {}),\r\n }\r\n : undefined);\r\n\r\n shareStorySdk(mediaUrl, {\r\n ...(text ? { text } : {}),\r\n ...(widgetLink ? { widgetLink } : {}),\r\n });\r\n }\r\n\r\n override async addToHomeScreen(): Promise<boolean> {\r\n const isAvailable = typeof addToHomeScreenSdk?.isAvailable === 'function'\r\n ? addToHomeScreenSdk.isAvailable()\r\n : true;\r\n\r\n if (!isAvailable) {\r\n return super.addToHomeScreen();\r\n }\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const cleanup = () => {\r\n off('home_screen_added', handleSuccess);\r\n off('home_screen_failed', handleFail);\r\n };\r\n\r\n const handleSuccess = () => {\r\n cleanup();\r\n resolve(true);\r\n };\r\n\r\n const handleFail = () => {\r\n cleanup();\r\n resolve(false);\r\n };\r\n\r\n on('home_screen_added', handleSuccess);\r\n on('home_screen_failed', handleFail);\r\n\r\n try {\r\n addToHomeScreenSdk();\r\n } catch (error) {\r\n cleanup();\r\n console.warn('[tvm-app-adapter] Telegram addToHomeScreen failed:', error);\r\n resolve(false);\r\n }\r\n });\r\n }\r\n\r\n override async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\r\n try {\r\n const status = await checkHomeScreenStatusSdk();\r\n if (typeof status === 'string') {\r\n return status;\r\n }\r\n if (typeof status === 'boolean') {\r\n return status ? 'added' : 'not_added';\r\n }\r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram checkHomeScreenStatus failed:', error);\r\n return 'unknown';\r\n }\r\n }\r\n\r\n override async requestPhone(): Promise<string | null> {\r\n const contactFeature = ensureFeature(requestContact);\r\n if (!contactFeature.ok) {\r\n return super.requestPhone();\r\n }\r\n\r\n if (requestPhoneAccess) {\r\n const accessFeature = ensureFeature(requestPhoneAccess);\r\n if (accessFeature.ok) {\r\n try {\r\n await accessFeature.value;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestPhone access failed:', error);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const result = await contactFeature.value;\r\n if (!result || typeof result !== 'object') {\r\n return null;\r\n }\r\n\r\n const contact = (result as {\r\n contact?: {\r\n phoneNumber?: unknown;\r\n phone_number?: unknown;\r\n phone?: unknown;\r\n };\r\n phoneNumber?: unknown;\r\n phone_number?: unknown;\r\n phone?: unknown;\r\n }).contact;\r\n\r\n const phone = (contact?.phoneNumber ?? contact?.phone_number ?? contact?.phone\r\n ?? (result as { phoneNumber?: unknown }).phoneNumber\r\n ?? (result as { phone_number?: unknown }).phone_number\r\n ?? (result as { phone?: unknown }).phone);\r\n\r\n return typeof phone === 'string' && phone ? phone : null;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestPhone failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setupAppearanceWatcher(): void {\r\n this.appearanceWatcherDispose?.();\r\n\r\n if (typeof themeParams.isDark?.sub === 'function') {\r\n const disposer = themeParams.isDark.sub(() => {\r\n const appearance = themeParams.isDark() ? 'dark' : 'light';\r\n this.environment.appearance = appearance;\r\n this.notifyAppearance(appearance);\r\n });\r\n this.appearanceWatcherDispose = this.registerDisposable(disposer);\r\n }\r\n }\r\n\r\n private notifyAppearance(appearance: 'dark' | 'light' | undefined): void {\r\n for (const listener of this.appearanceListeners) {\r\n listener(appearance);\r\n }\r\n }\r\n\r\n private setupActiveWatcher(): void {\r\n this.activeWatcherDispose?.();\r\n\r\n const activeSignal = miniApp.isActive as typeof miniApp.isActive & {\r\n sub?: (callback: () => void) => () => void;\r\n };\r\n\r\n const invoke = () => {\r\n try {\r\n const isActive = miniApp.isActive();\r\n if (isActive) {\r\n this.notifyViewRestore();\r\n } else {\r\n this.notifyViewHide();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] miniApp.isActive() failed:', error);\r\n }\r\n };\r\n\r\n if (typeof activeSignal?.sub === 'function') {\r\n const disposer = activeSignal.sub(() => invoke());\r\n this.activeWatcherDispose = this.registerDisposable(disposer);\r\n invoke();\r\n return;\r\n }\r\n\r\n try {\r\n invoke();\r\n } catch {\r\n // Ignore unsupported environments.\r\n }\r\n }\r\n\r\n private async prepareViewport(): Promise<void> {\r\n try {\r\n await bindViewportCssVars({\r\n ...this.getViewportMountOptions(),\r\n bindCssVars: typeof viewport.bindCssVars === 'function' ? viewport.bindCssVars : undefined,\r\n });\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] prepareViewport failed:', error);\r\n }\r\n }\r\n\r\n private async requestFullscreenInternal(): Promise<void> {\r\n try {\r\n const viewportOptions = this.getViewportMountOptions();\r\n await ensureViewportMounted(viewportOptions);\r\n\r\n const { sdkViewport } = viewportOptions;\r\n\r\n const canUseRaw = typeof sdkViewport.isSupported === 'function' ? sdkViewport.isSupported() : false;\r\n\r\n if (canUseRaw && typeof sdkViewport.requestFullscreen === 'function') {\r\n await sdkViewport.requestFullscreen();\r\n } else if (viewport.requestFullscreen && viewport.requestFullscreen.isAvailable?.()) {\r\n await viewport.requestFullscreen();\r\n } else {\r\n postEvent('web_app_request_fullscreen');\r\n }\r\n\r\n this.disableVerticalSwipes();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestFullscreen failed:', error);\r\n }\r\n }\r\n\r\n private getViewportMountOptions(): {\r\n sdkViewport: typeof rawViewport & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void | Promise<void>;\r\n requestFullscreen?: () => Promise<void> | void;\r\n on?: (event: 'change', cb: (state: { height?: number; stableHeight?: number }) => void) => (() => void) | void;\r\n height?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n stableHeight?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n };\r\n fallbackMount: () => Promise<void>;\r\n } {\r\n const sdkViewport = rawViewport as typeof rawViewport & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void | Promise<void>;\r\n requestFullscreen?: () => Promise<void> | void;\r\n on?: (event: 'change', cb: (state: { height?: number; stableHeight?: number }) => void) => (() => void) | void;\r\n height?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n stableHeight?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n };\r\n\r\n return {\r\n sdkViewport,\r\n fallbackMount: async () => {\r\n if (viewport.mount?.isAvailable?.()) {\r\n await viewport.mount();\r\n }\r\n },\r\n };\r\n }\r\n\r\n private safeHeightFromSdk(): number | undefined {\r\n try {\r\n if (typeof rawViewport.height === 'function') {\r\n return rawViewport.height();\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n private stableHeightFromSdk(): number | undefined {\r\n try {\r\n if (typeof rawViewport.stableHeight === 'function') {\r\n return rawViewport.stableHeight();\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n private notifyViewHide(): void {\r\n for (const listener of this.viewHideListeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] onViewHide listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n private notifyViewRestore(): void {\r\n for (const listener of this.viewRestoreListeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] onViewRestore listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n protected override onDestroy(): void {\r\n this.appearanceWatcherDispose?.();\r\n this.appearanceWatcherDispose = undefined;\r\n this.activeWatcherDispose?.();\r\n this.activeWatcherDispose = undefined;\r\n this.appearanceListeners.clear();\r\n this.viewHideListeners.clear();\r\n this.viewRestoreListeners.clear();\r\n this.backHandlers.clear();\r\n super.onDestroy();\r\n }\r\n}\r\n","export type FeatureCallable<T extends (...args: any[]) => unknown> = T & {\n isAvailable?: () => boolean;\n};\n\nexport type FeatureCallResult<T extends (...args: any[]) => unknown> =\n | { ok: true; value: ReturnType<T> }\n | { ok: false };\n\nexport function isFeatureAvailable<T extends (...args: any[]) => unknown>(\n feature: FeatureCallable<T> | T | null | undefined,\n): feature is FeatureCallable<T> {\n if (typeof feature !== 'function') {\n return false;\n }\n\n const candidate = feature as FeatureCallable<T>;\n if (typeof candidate.isAvailable === 'function') {\n try {\n return candidate.isAvailable();\n } catch (error) {\n console.warn('[tvm-app-adapter] feature availability check failed:', error);\n return false;\n }\n }\n\n return true;\n}\n\nexport function ensureFeature<T extends (...args: any[]) => unknown>(\n feature: FeatureCallable<T> | T | null | undefined,\n ...args: Parameters<T>\n): FeatureCallResult<T> {\n if (!isFeatureAvailable(feature as FeatureCallable<T>)) {\n return { ok: false };\n }\n\n try {\n const value = (feature as T)(...args);\n return { ok: true, value };\n } catch (error) {\n console.warn('[tvm-app-adapter] feature call failed:', error);\n return { ok: false };\n }\n}\n","type ViewportController = {\n isSupported?: () => boolean;\n isMounted?: () => boolean;\n mount?: () => void | Promise<void>;\n};\n\nexport interface ViewportMountOptions {\n sdkViewport?: ViewportController;\n fallbackMount?: () => void | Promise<void>;\n}\n\nexport async function ensureViewportMounted(options: ViewportMountOptions): Promise<void> {\n const { sdkViewport, fallbackMount } = options;\n\n if (sdkViewport?.isSupported?.()) {\n if (typeof sdkViewport.isMounted === 'function' && sdkViewport.isMounted()) {\n return;\n }\n\n if (typeof sdkViewport.mount === 'function') {\n await sdkViewport.mount();\n }\n return;\n }\n\n if (typeof fallbackMount === 'function') {\n await fallbackMount();\n }\n}\n\nexport interface ViewportCssBindingOptions extends ViewportMountOptions {\n bindCssVars?: (mapper?: (key: string) => string) => void;\n mapper?: (key: string) => string;\n}\n\nexport async function bindViewportCssVars(options: ViewportCssBindingOptions): Promise<void> {\n await ensureViewportMounted(options);\n\n if (typeof options.bindCssVars !== 'function') {\n return;\n }\n\n try {\n options.bindCssVars(options.mapper);\n } catch (error) {\n if (error instanceof Error && /css variables are already bound/i.test(error.message)) {\n return;\n }\n throw error;\n }\n}\n","import bridge, {\r\n AnyRequestMethodName,\r\n parseURLSearchParamsForGetLaunchParams,\r\n \r\n ShowStoryBoxOptions,\r\n \r\n TapticNotificationType,\r\n \r\n TapticVibrationPowerType,\r\n \r\n type AppearanceType,\r\n type GetLaunchParamsResponse,\r\n type ParentConfigData,\r\n type VKBridgeSubscribeHandler,\r\n} from '@vkontakte/vk-bridge';\r\n\r\nimport { getVkPixelCode } from '@/config/vkAnalytics';\r\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\r\nimport type {\r\n MiniAppCapability,\r\n MiniAppEnvironmentInfo,\r\n MiniAppInitOptions,\r\n MiniAppQrScanOptions,\r\n MiniAppShareStoryOptions,\r\n} from '@/types/miniApp';\r\nimport { isBridgeMethodSupported, type BridgeSupportsAsync } from '@/lib/bridge';\r\nimport { computeCombinedSafeArea, createSafeAreaWatcher, readCssSafeArea } from '@/lib/safeArea';\r\n\r\nconst ANALYTICS_EVENT_NAME_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,63}$/i;\r\nconst ANALYTICS_FALLBACK_EVENT = 'VK_ANALYTICS_EVENT';\r\n\r\ntype VkAnalyticsMethod = 'VKWebAppConversionHit' | 'VKWebAppRetargetingPixel';\r\ntype VkAnalyticsEnvelope = {\r\n method: VkAnalyticsMethod;\r\n params: Record<string, unknown>;\r\n};\r\n\r\nexport class VKMiniAppAdapter extends BaseMiniAppAdapter {\r\n private configSafeArea?: MiniAppEnvironmentInfo['safeArea'];\r\n private stopViewportTracking?: () => void;\r\n private readonly supportsAsync?: BridgeSupportsAsync<AnyRequestMethodName> = typeof bridge.supportsAsync === 'function'\r\n ? bridge.supportsAsync.bind(bridge)\r\n : undefined;\r\n private pixelCodeWarningShown = false;\r\n\r\n override computeSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n const baseSafeArea = this.computeBaseSafeArea();\r\n const overlayInsets = this.resolveOverlayInsets();\r\n\r\n if (overlayInsets) {\r\n return computeCombinedSafeArea({\r\n environment: baseSafeArea,\r\n minimum: overlayInsets,\r\n });\r\n }\r\n\r\n return baseSafeArea;\r\n }\r\n private unsubscribe?: () => void;\r\n private launchParams?: GetLaunchParamsResponse;\r\n private queryParams?: Record<string, unknown>;\r\n private readonly viewHideListeners = new Set<() => void>();\r\n private readonly viewRestoreListeners = new Set<() => void>();\r\n\r\n constructor() {\r\n super('vk');\r\n }\r\n\r\n override async init(_options?: MiniAppInitOptions): Promise<void> {\r\n if (this.ready) {\r\n return;\r\n }\r\n\r\n const handler: VKBridgeSubscribeHandler = (event) => this.handleBridgeEvent(event);\r\n bridge.subscribe(handler);\r\n this.unsubscribe = this.registerDisposable(() => bridge.unsubscribe(handler));\r\n\r\n let initialConfig: ParentConfigData | undefined;\r\n try {\r\n initialConfig = (await bridge.send('VKWebAppGetConfig')) as ParentConfigData;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VKWebAppGetConfig failed:', error);\r\n }\r\n\r\n try {\r\n const initResult = (await bridge.send('VKWebAppInit')) as { result?: boolean } | undefined;\r\n if (initResult && 'result' in initResult && initResult.result === false) {\r\n console.warn('[tvm-app-adapter] VKWebAppInit returned result=false.');\r\n }\r\n } catch (error) {\r\n console.error('[tvm-app-adapter] VKWebAppInit failed:', error);\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n throw error;\r\n }\r\n\r\n let launchParams: GetLaunchParamsResponse;\r\n try {\r\n launchParams = await bridge.send('VKWebAppGetLaunchParams');\r\n } catch (error) {\r\n console.error('[tvm-app-adapter] VKWebAppGetLaunchParams failed:', error);\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n throw error;\r\n }\r\n\r\n const search = typeof window !== 'undefined' ? window.location.search : '';\r\n const queryParams = parseURLSearchParamsForGetLaunchParams(search);\r\n\r\n this.launchParams = launchParams;\r\n this.queryParams = queryParams as Record<string, unknown>;\r\n this.environment = this.composeEnvironment(launchParams, queryParams, initialConfig);\r\n this.configSafeArea = this.environment.safeArea;\r\n const combinedSafeArea = this.computeSafeArea();\r\n this.environment.safeArea = combinedSafeArea;\r\n this.applyAppearance(this.environment.appearance, initialConfig?.scheme);\r\n this.notifyEnvironmentChanged();\r\n\r\n this.ready = true;\r\n this.startViewportTracking();\r\n }\r\n\r\n override async vibrateImpact(style: TapticVibrationPowerType): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticImpactOccurred')) {\r\n bridge.send('VKWebAppTapticImpactOccurred', { style });\r\n }\r\n }\r\n\r\n override async vibrateNotification(type: TapticNotificationType): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticNotificationOccurred')) {\r\n bridge.send('VKWebAppTapticNotificationOccurred', { type });\r\n }\r\n }\r\n\r\n override async vibrateSelection(): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticSelectionChanged')) {\r\n bridge.send('VKWebAppTapticSelectionChanged');\r\n }\r\n }\r\n\r\n override async setColors(colors: { header?: string; background?: string }): Promise<void> {\r\n const { header, background } = colors;\r\n\r\n if (header || background) {\r\n const canApplyViewSettings = await this.supportsBridgeMethod('VKWebAppSetViewSettings');\r\n\r\n if (canApplyViewSettings) {\r\n const statusBarStyle: AppearanceType = header\r\n ? this.resolveStatusBarStyle(header)\r\n : this.environment.appearance?.includes('dark') ? 'light' : 'dark';\r\n\r\n await bridge.send('VKWebAppSetViewSettings', {\r\n status_bar_style: statusBarStyle,\r\n ...(header ? { action_bar_color: header } : {}),\r\n ...(background ? { navigation_bar_color: background } : {}),\r\n });\r\n }\r\n }\r\n\r\n await super.setColors(colors);\r\n }\r\n\r\n override getEnvironment(): MiniAppEnvironmentInfo {\r\n return {\r\n ...this.environment,\r\n isWebView: bridge.isWebView(),\r\n };\r\n }\r\n\r\n override getLaunchParams(): unknown {\r\n if (!this.launchParams) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n launchParams: this.launchParams,\r\n queryParams: this.queryParams,\r\n };\r\n }\r\n\r\n override async openExternalLink(url: string): Promise<void> {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.style.display = 'none';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n }\r\n\r\n override async supports(capability: MiniAppCapability): Promise<boolean> {\r\n switch (capability) {\r\n case 'haptics': {\r\n const [impact, notification, selection] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppTapticImpactOccurred'),\r\n this.supportsBridgeMethod('VKWebAppTapticNotificationOccurred'),\r\n this.supportsBridgeMethod('VKWebAppTapticSelectionChanged'),\r\n ]);\r\n return impact || notification || selection;\r\n }\r\n case 'qrScanner':\r\n return this.supportsBridgeMethod('VKWebAppOpenCodeReader');\r\n case 'requestPhone': {\r\n const [supportsPhoneNumber, supportsPersonalCard] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppGetPhoneNumber'),\r\n this.supportsBridgeMethod('VKWebAppGetPersonalCard'),\r\n ]);\r\n return supportsPhoneNumber || supportsPersonalCard;\r\n }\r\n case 'notifications':\r\n return this.supportsBridgeMethod('VKWebAppAllowNotifications');\r\n case 'shareUrl':\r\n return this.supportsBridgeMethod('VKWebAppShare');\r\n case 'shareStory':\r\n return this.supportsBridgeMethod('VKWebAppShowStoryBox');\r\n case 'downloadFile':\r\n return this.supportsBridgeMethod('VKWebAppDownloadFile');\r\n case 'addToHomeScreen':\r\n return this.supportsBridgeMethod('VKWebAppAddToHomeScreen');\r\n case 'denyNotifications':\r\n return this.supportsBridgeMethod('VKWebAppDenyNotifications');\r\n case 'openExternalLink':\r\n return true;\r\n case 'viewVisibility':\r\n return true;\r\n default:\r\n return await super.supports(capability);\r\n }\r\n }\r\n\r\n override async requestPhone(): Promise<string | null> {\r\n const [supportsPhoneNumber, supportsPersonalCard] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppGetPhoneNumber'),\r\n this.supportsBridgeMethod('VKWebAppGetPersonalCard'),\r\n ]);\r\n if (!supportsPhoneNumber && !supportsPersonalCard) {\r\n return super.requestPhone();\r\n }\r\n\r\n try {\r\n if (supportsPhoneNumber) {\r\n const result = await bridge.send('VKWebAppGetPhoneNumber');\r\n const phoneNumber = (result as { phone_number?: unknown }).phone_number;\r\n return typeof phoneNumber === 'string' && phoneNumber ? phoneNumber : null;\r\n }\r\n\r\n const card = await bridge.send('VKWebAppGetPersonalCard', { type: ['phone'] });\r\n const phone = (card as { phone?: unknown }).phone;\r\n return typeof phone === 'string' && phone ? phone : null;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK requestPhone failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n override async requestNotificationsPermission(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppAllowNotifications');\r\n if (!supported) {\r\n return super.requestNotificationsPermission();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppAllowNotifications');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK allow notifications failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async addToHomeScreen(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppAddToHomeScreen');\r\n if (!supported) {\r\n console.warn('[tvm-app-adapter] VK addToHomeScreen not supported');\r\n return super.addToHomeScreen();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppAddToHomeScreen');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK addToHomeScreen failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async denyNotifications(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppDenyNotifications');\r\n if (!supported) {\r\n return super.denyNotifications();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppDenyNotifications');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK deny notifications failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\r\n const supportsQrScanner = await this.supportsBridgeMethod('VKWebAppOpenCodeReader');\r\n \r\n if (!supportsQrScanner) {\r\n return super.scanQRCode(options);\r\n }\r\n\r\n let result: string | null = null;\r\n\r\n try {\r\n const data = await bridge.send('VKWebAppOpenCodeReader')\r\n if (data.code_data) {\r\n result = data.code_data;\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n override onViewHide(callback: () => void): () => void {\r\n this.viewHideListeners.add(callback);\r\n return () => {\r\n this.viewHideListeners.delete(callback);\r\n };\r\n }\r\n\r\n override onViewRestore(callback: () => void): () => void {\r\n this.viewRestoreListeners.add(callback);\r\n return () => {\r\n this.viewRestoreListeners.delete(callback);\r\n };\r\n }\r\n\r\n override async shareStory(mediaUrl: string, _options?: MiniAppShareStoryOptions): Promise<void> {\r\n const options = _options;\r\n const vkOptions = options?.vk;\r\n\r\n const fallbackAttachment = options?.link\r\n ? {\r\n type: 'url',\r\n text: 'open',\r\n url: options.link.url,\r\n }\r\n : undefined;\r\n\r\n const fallbackStickers = options?.text\r\n ? [{\r\n sticker_type: 'native',\r\n sticker: {\r\n action_type: 'text',\r\n action: {\r\n text: options.text,\r\n style: 'classic',\r\n background_style: 'none',\r\n },\r\n transform: {\r\n gravity: 'center_bottom',\r\n translation_y: -0.2,\r\n },\r\n },\r\n }]\r\n : undefined;\r\n\r\n const bridgeOptions: ShowStoryBoxOptions = {\r\n background_type: vkOptions?.backgroundType ?? 'image',\r\n url: mediaUrl,\r\n locked: vkOptions?.locked ?? true,\r\n ...((vkOptions?.attachment ?? fallbackAttachment)\r\n ? { attachment: (vkOptions?.attachment ?? fallbackAttachment) as ShowStoryBoxOptions['attachment'] }\r\n : {}),\r\n ...((vkOptions?.stickers ?? fallbackStickers)\r\n ? { stickers: (vkOptions?.stickers ?? fallbackStickers) as ShowStoryBoxOptions['stickers'] }\r\n : {}),\r\n };\r\n\r\n await bridge.send('VKWebAppShowStoryBox', bridgeOptions);\r\n }\r\n\r\n override shareUrl(url: string, text?: string): void {\r\n void this.shareUrlInternal(url, text);\r\n }\r\n\r\n private async shareUrlInternal(url: string, text?: string): Promise<void> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppShare');\r\n if (!supported) {\r\n super.shareUrl(url, text ?? '');\r\n return;\r\n }\r\n\r\n try {\r\n await bridge.send('VKWebAppShare', {\r\n link: url,\r\n ...(text ? { text } : {}),\r\n });\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK shareUrl failed:', error);\r\n super.shareUrl(url, text ?? '');\r\n }\r\n }\r\n\r\n override async downloadFile(url: string, filename: string): Promise<void> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppDownloadFile');\r\n if (!supported) {\r\n await super.downloadFile(url, filename);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppDownloadFile', { url, filename });\r\n const result = (response as { result?: boolean } | undefined)?.result;\r\n if (result === false) {\r\n throw new Error('VKWebAppDownloadFile returned result=false');\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK downloadFile failed:', error);\r\n await super.downloadFile(url, filename);\r\n }\r\n }\r\n\r\n override trackConversionEvent(event: string, payload?: Record<string, unknown>): void {\r\n const normalizedEvent = this.normalizeAnalyticsEventName(event);\r\n if (!normalizedEvent) {\r\n return;\r\n }\r\n\r\n const envelope: VkAnalyticsEnvelope = {\r\n method: 'VKWebAppConversionHit',\r\n params: {\r\n event: normalizedEvent,\r\n params: this.normalizeAnalyticsPayload(payload),\r\n },\r\n };\r\n\r\n this.dispatchAnalytics(envelope);\r\n }\r\n\r\n override trackPixelEvent(event: string, payload?: Record<string, unknown>): void {\r\n const pixelCode = getVkPixelCode();\r\n if (!pixelCode) {\r\n if (!this.pixelCodeWarningShown) {\r\n console.warn('[VKAnalytics] VK pixel code is not configured. Call configureVkPixel() before tracking.');\r\n this.pixelCodeWarningShown = true;\r\n }\r\n return;\r\n }\r\n\r\n const normalizedEvent = this.normalizeAnalyticsEventName(event);\r\n if (!normalizedEvent) {\r\n return;\r\n }\r\n\r\n const envelope: VkAnalyticsEnvelope = {\r\n method: 'VKWebAppRetargetingPixel',\r\n params: {\r\n pixel_code: pixelCode,\r\n type: normalizedEvent,\r\n data: this.normalizeAnalyticsPayload(payload),\r\n },\r\n };\r\n\r\n this.pixelCodeWarningShown = false;\r\n this.dispatchAnalytics(envelope);\r\n }\r\n\r\n private dispatchAnalytics(envelope: VkAnalyticsEnvelope): void {\r\n if (typeof bridge.isWebView === 'function') {\r\n try {\r\n if (!bridge.isWebView()) {\r\n this.emitAnalyticsFallback(envelope);\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('[VKAnalytics] bridge.isWebView check failed:', error);\r\n this.emitAnalyticsFallback(envelope);\r\n return;\r\n }\r\n }\r\n\r\n void this.safeBridgeSend(envelope.method, envelope.params);\r\n }\r\n\r\n private emitAnalyticsFallback(envelope: VkAnalyticsEnvelope): void {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const detail = {\r\n ...envelope,\r\n timestamp: Date.now(),\r\n };\r\n\r\n if (typeof window.dispatchEvent === 'function' && typeof window.CustomEvent === 'function') {\r\n window.dispatchEvent(new CustomEvent(ANALYTICS_FALLBACK_EVENT, { detail }));\r\n return;\r\n }\r\n\r\n try {\r\n window.postMessage({ type: ANALYTICS_FALLBACK_EVENT, detail }, '*');\r\n } catch (error) {\r\n console.warn('[VKAnalytics] fallback dispatch failed', error);\r\n }\r\n }\r\n\r\n private normalizeAnalyticsEventName(event: string): string | null {\r\n if (typeof event !== 'string') {\r\n return null;\r\n }\r\n\r\n const trimmed = event.trim();\r\n if (!trimmed || !ANALYTICS_EVENT_NAME_PATTERN.test(trimmed)) {\r\n console.warn(`[VKAnalytics] Invalid event name: \"${event}\"`);\r\n return null;\r\n }\r\n\r\n return trimmed;\r\n }\r\n\r\n private normalizeAnalyticsPayload(payload?: Record<string, unknown>): Record<string, unknown> {\r\n if (!this.isPlainObject(payload)) {\r\n return {};\r\n }\r\n\r\n return { ...payload };\r\n }\r\n\r\n private isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n }\r\n\r\n private async safeBridgeSend(method: VkAnalyticsMethod, params: Record<string, unknown>): Promise<void> {\r\n try {\r\n const supported = await this.supportsBridgeMethod(method as AnyRequestMethodName);\r\n if (!supported) {\r\n return;\r\n }\r\n\r\n await bridge.send(method as AnyRequestMethodName, params as never);\r\n } catch (error) {\r\n console.warn(`[VKAnalytics] ${method} failed`, error);\r\n }\r\n }\r\n\r\n private composeEnvironment(\r\n launchParams: GetLaunchParamsResponse,\r\n queryParams: ReturnType<typeof parseURLSearchParamsForGetLaunchParams>,\r\n config?: ParentConfigData,\r\n ): MiniAppEnvironmentInfo {\r\n const language = queryParams.vk_language ?? launchParams.vk_language;\r\n const platform = queryParams.vk_platform ?? launchParams.vk_platform;\r\n const appId = queryParams.vk_app_id ?? launchParams.vk_app_id;\r\n const prefersDark = typeof window !== 'undefined' && typeof window.matchMedia === 'function'\r\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\r\n : false;\r\n const appearance = this.normalizeAppearance(config?.appearance, config?.scheme) ?? (prefersDark ? 'dark' : 'light');\r\n const configSafeArea = this.extractSafeAreaFromConfig(config);\r\n return {\r\n platform: 'vk',\r\n sdkVersion: platform ? String(platform) : undefined,\r\n appVersion: typeof appId === 'number' ? `vk-app-${appId}` : undefined,\r\n languageCode: language ? String(language) : undefined,\r\n appearance,\r\n isWebView: bridge.isWebView(),\r\n safeArea: configSafeArea,\r\n };\r\n }\r\n\r\n private handleBridgeEvent(event: Parameters<VKBridgeSubscribeHandler>[0]): void {\r\n const { type, data } = event.detail ?? {};\r\n\r\n if (type === 'VKWebAppViewHide') {\r\n this.notifyVisibilityListeners(this.viewHideListeners);\r\n return;\r\n }\r\n\r\n if (type === 'VKWebAppViewRestore') {\r\n this.notifyVisibilityListeners(this.viewRestoreListeners);\r\n return;\r\n }\r\n\r\n if (type === 'VKWebAppUpdateConfig' && data) {\r\n const config = data as ParentConfigData;\r\n this.updateEnvironmentFromConfig(config);\r\n }\r\n }\r\n\r\n private updateEnvironmentFromConfig(config: ParentConfigData): void {\r\n if (!this.environment) {\r\n return;\r\n }\r\n\r\n const nextAppearance = this.normalizeAppearance(config.appearance, config.scheme);\r\n let changed = false;\r\n\r\n if (nextAppearance && nextAppearance !== this.environment.appearance) {\r\n this.environment.appearance = nextAppearance;\r\n changed = true;\r\n }\r\n\r\n const prevSafeArea = this.environment.safeArea;\r\n const nextSafeArea = this.extractSafeAreaFromConfig(config);\r\n if (nextSafeArea) {\r\n this.configSafeArea = nextSafeArea;\r\n this.environment.safeArea = nextSafeArea;\r\n } else {\r\n this.configSafeArea = undefined;\r\n this.environment.safeArea = undefined;\r\n }\r\n\r\n const combinedSafeArea = this.computeSafeArea() ?? {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n };\r\n const prevForComparison = prevSafeArea;\r\n const safeAreaChanged =\r\n !prevForComparison ||\r\n prevForComparison.top !== combinedSafeArea.top ||\r\n prevForComparison.right !== combinedSafeArea.right ||\r\n prevForComparison.bottom !== combinedSafeArea.bottom ||\r\n prevForComparison.left !== combinedSafeArea.left;\r\n\r\n if (safeAreaChanged) {\r\n this.environment.safeArea = combinedSafeArea;\r\n changed = true;\r\n } else {\r\n this.environment.safeArea = prevSafeArea;\r\n }\r\n\r\n this.applyAppearance(this.environment.appearance, config.scheme);\r\n\r\n if (changed) {\r\n this.notifyEnvironmentChanged();\r\n }\r\n }\r\n\r\n private applyAppearance(appearance?: string, scheme?: string): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n if (appearance) {\r\n document.documentElement.dataset.vkAppearance = appearance;\r\n document.documentElement.classList.toggle('dark', appearance === 'dark');\r\n }\r\n\r\n if (scheme) {\r\n document.documentElement.dataset.vkScheme = scheme;\r\n if (!appearance) {\r\n const normalized = this.normalizeAppearance(undefined, scheme);\r\n document.documentElement.classList.toggle('dark', normalized === 'dark');\r\n }\r\n }\r\n }\r\n\r\n private resolveStatusBarStyle(color: string): AppearanceType {\r\n const hex = color.replace('#', '');\r\n const normalized = hex.length === 3\r\n ? hex.split('').map((symbol) => symbol + symbol).join('')\r\n : hex.slice(0, 6);\r\n\r\n const r = parseInt(normalized.slice(0, 2), 16) / 255;\r\n const g = parseInt(normalized.slice(2, 4), 16) / 255;\r\n const b = parseInt(normalized.slice(4, 6), 16) / 255;\r\n\r\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n return luminance > 0.6 ? 'dark' : 'light';\r\n }\r\n\r\n private normalizeAppearance(\r\n rawAppearance?: string | null,\r\n scheme?: string | null,\r\n ): 'dark' | 'light' | undefined {\r\n const normalized = rawAppearance?.toLowerCase();\r\n if (normalized === 'dark' || normalized === 'light') {\r\n return normalized;\r\n }\r\n\r\n const normalizedScheme = scheme?.toLowerCase();\r\n if (normalizedScheme) {\r\n if (normalizedScheme.includes('dark') || normalizedScheme.includes('space_gray')) {\r\n return 'dark';\r\n }\r\n return 'light';\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private extractSafeAreaFromConfig(config?: ParentConfigData): MiniAppEnvironmentInfo['safeArea'] | undefined {\r\n const rawInsets = config && 'insets' in config\r\n ? (config as { insets?: { top?: number; right?: number; bottom?: number; left?: number } }).insets\r\n : undefined;\r\n\r\n if (!rawInsets) {\r\n return undefined;\r\n }\r\n\r\n const { top = 0, right = 0, bottom = 0, left = 0 } = rawInsets;\r\n const values = [top, right, bottom, left].map((value) => (typeof value === 'number' ? value : Number(value) || 0));\r\n const hasInsets = values.some((value) => value !== 0);\r\n\r\n if (!hasInsets) {\r\n return undefined;\r\n }\r\n\r\n const [nTop, nRight, nBottom, nLeft] = values;\r\n return { top: nTop, right: nRight, bottom: nBottom, left: nLeft };\r\n }\r\n\r\n private notifyVisibilityListeners(listeners: Set<() => void>): void {\r\n for (const listener of listeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK visibility listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n private computeBaseSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n return computeCombinedSafeArea({\r\n environment: this.configSafeArea,\r\n viewport: this.getViewportInsets?.(),\r\n css: readCssSafeArea(),\r\n });\r\n }\r\n\r\n private startViewportTracking(): void {\r\n this.stopViewportTracking?.();\r\n\r\n const dispose = createSafeAreaWatcher({\r\n getSafeArea: () => this.computeSafeArea(),\r\n onChange: (next) => {\r\n this.environment.safeArea = next;\r\n this.notifyEnvironmentChanged();\r\n },\r\n });\r\n\r\n if (dispose) {\r\n this.stopViewportTracking = this.registerDisposable(dispose);\r\n }\r\n }\r\n\r\n private resolveOverlayInsets(): { top: number; right: number } | undefined {\r\n if (typeof window === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n if (!bridge.isWebView()) {\r\n return undefined;\r\n }\r\n\r\n if (!this.isLikelyMobilePlatform()) {\r\n return undefined;\r\n }\r\n\r\n const viewportWidth = window.innerWidth || document.documentElement?.clientWidth || 0;\r\n if (!viewportWidth) {\r\n return undefined;\r\n }\r\n\r\n const overlayBreakpoint = 880;\r\n if (viewportWidth > overlayBreakpoint) {\r\n return undefined;\r\n }\r\n\r\n const orientationQuery = window.matchMedia?.('(orientation: landscape)');\r\n const isLandscape = Boolean(orientationQuery?.matches);\r\n\r\n const top = isLandscape ? 48 : 56;\r\n const right = isLandscape ? 72 : 88;\r\n\r\n return { top, right };\r\n }\r\n\r\n private isLikelyMobilePlatform(): boolean {\r\n const platform = (this.resolveLaunchParam('vk_platform') ?? '').toLowerCase();\r\n const device = (this.resolveLaunchParam('vk_viewer_device') ?? '').toLowerCase();\r\n const isLayer = this.resolveLaunchParam('vk_is_layer') === '1';\r\n\r\n if (isLayer) {\r\n return false;\r\n }\r\n\r\n const mobilePattern = /(iphone|ipad|ios|android|mobile)/i;\r\n const desktopPattern = /(desktop|web|tablet)/i;\r\n\r\n const matchesMobilePlatform = mobilePattern.test(platform) || mobilePattern.test(device);\r\n const matchesDesktopPlatform = desktopPattern.test(platform) || desktopPattern.test(device);\r\n\r\n if (!matchesMobilePlatform) {\r\n return false;\r\n }\r\n\r\n return !matchesDesktopPlatform;\r\n }\r\n\r\n private resolveLaunchParam(key: string): string | undefined {\r\n const queryValue = this.queryParams?.[key];\r\n if (typeof queryValue === 'string' && queryValue) {\r\n return queryValue;\r\n }\r\n\r\n const launchValue = this.launchParams ? (this.launchParams as Record<string, unknown>)[key] : undefined;\r\n if (typeof launchValue === 'string' && launchValue) {\r\n return launchValue;\r\n }\r\n\r\n if (typeof launchValue === 'number') {\r\n return String(launchValue);\r\n }\r\n\r\n if (typeof launchValue === 'boolean') {\r\n return launchValue ? '1' : '0';\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private supportsBridgeMethod(method: AnyRequestMethodName): Promise<boolean> {\r\n return isBridgeMethodSupported(method, this.supportsAsync);\r\n }\r\n\r\n protected override onDestroy(): void {\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n this.stopViewportTracking?.();\r\n this.stopViewportTracking = undefined;\r\n this.viewHideListeners.clear();\r\n this.viewRestoreListeners.clear();\r\n super.onDestroy();\r\n }\r\n}\r\n","let pixelCode: string | null = null;\n\nexport function setVkPixelCode(next: string | null | undefined): void {\n if (typeof next !== 'string') {\n pixelCode = null;\n return;\n }\n\n const normalized = next.trim();\n pixelCode = normalized || null;\n}\n\nexport function getVkPixelCode(): string | null {\n return pixelCode;\n}\n","export type BridgeSupportsAsync<Method extends string = string> = (method: Method) => Promise<boolean>;\n\nexport async function isBridgeMethodSupported<Method extends string = string>(\n method: Method,\n supportsAsync?: BridgeSupportsAsync<Method>,\n): Promise<boolean> {\n if (typeof supportsAsync !== 'function') {\n return false;\n }\n\n try {\n return await supportsAsync(method);\n } catch (error) {\n console.warn('[tvm-app-adapter] bridge.supportsAsync failed:', error);\n return false;\n }\n}\n","import jsQR from \"jsqr\";\n\nimport { BaseMiniAppAdapter } from './baseAdapter';\nimport type { MiniAppCapability, MiniAppQrScanOptions } from '@/types/miniApp';\nimport { triggerFileDownload } from '@/lib/download';\n\nexport class WebMiniAppAdapter extends BaseMiniAppAdapter {\n private deferredPrompt: BeforeInstallPromptEvent | null = null;\n\n constructor() {\n super(\"web\", {\n sdkVersion: navigator.userAgent,\n languageCode: navigator.language,\n isWebView: false,\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeinstallprompt', (event: Event) => {\n event.preventDefault();\n this.deferredPrompt = event as BeforeInstallPromptEvent;\n });\n }\n }\n\n override supports(capability: MiniAppCapability): boolean | Promise<boolean> {\n switch (capability) {\n case 'copyTextToClipboard':\n return typeof navigator !== 'undefined' && Boolean(navigator.clipboard?.writeText);\n case 'downloadFile':\n return typeof document !== 'undefined';\n case 'shareUrl':\n return typeof navigator !== 'undefined' && (Boolean(navigator.share) || Boolean(navigator.clipboard?.writeText));\n case 'addToHomeScreen':\n return /android/i.test(navigator.userAgent) && Boolean(this.deferredPrompt);\n case 'checkHomeScreenStatus':\n return true;\n default:\n return super.supports(capability);\n }\n }\n\n override async downloadFile(url: string, filename: string): Promise<void> {\n try {\n await triggerFileDownload(url, filename, { preferBlob: true });\n } catch (error) {\n console.warn('[mini-app-template] Web downloadFile fallback:', error);\n await super.downloadFile(url, filename);\n }\n }\n\n override scanQRCode(_options?: MiniAppQrScanOptions): Promise<string | null> {\n return new Promise(async (resolve) => {\n if (typeof document === 'undefined') {\n resolve(null);\n return;\n }\n\n // ===============================================\n // SAVE BODY STATE\n // ===============================================\n const prevOverflow = document.body.style.overflow;\n const prevPos = document.body.style.position;\n const prevTouch = document.body.style.touchAction;\n const prevWidth = document.body.style.width;\n const prevHtmlOverflow = document.documentElement.style.overflow;\n\n // ===============================================\n // DISABLE PAGE SCROLL\n // ===============================================\n document.body.style.overflow = \"hidden\";\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.touchAction = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n\n // ===============================================\n // CREATE FULLSCREEN OVERLAY\n // ===============================================\n const overlay = document.createElement(\"div\");\n overlay.id = \"qr-overlay\";\n overlay.style.position = \"fixed\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.right = \"0\";\n overlay.style.bottom = \"0\";\n overlay.style.zIndex = \"999999999\";\n overlay.style.background = \"rgba(0,0,0,0.92)\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n \n overlay.style.display = \"flex\";\n overlay.style.flexDirection = \"column\";\n overlay.style.alignItems = \"center\";\n overlay.style.justifyContent = \"center\";\n overlay.style.overflow = \"hidden\"; \n overlay.style.backdropFilter = \"blur(3px)\";\n document.body.appendChild(overlay);\n\n // ===============================================\n // CLOSE BUTTON (TOP RIGHT)\n // ===============================================\n const closeBtn = document.createElement(\"button\");\n closeBtn.innerText = \"✕\";\n closeBtn.style.position = \"absolute\";\n closeBtn.style.top = \"22px\";\n closeBtn.style.right = \"22px\";\n closeBtn.style.fontSize = \"32px\";\n closeBtn.style.color = \"white\";\n closeBtn.style.background = \"transparent\";\n closeBtn.style.border = \"none\";\n closeBtn.style.cursor = \"pointer\";\n closeBtn.style.zIndex = \"9999999999\";\n overlay.appendChild(closeBtn);\n\n // ===============================================\n // CENTER SCAN AREA\n // ===============================================\n const scanSize = Math.min(Math.floor(Math.min(window.innerWidth, window.innerHeight) * 0.72), 320);\n const scanBox = document.createElement(\"div\");\n scanBox.style.width = `${scanSize}px`;\n scanBox.style.height = `${scanSize}px`;\n scanBox.style.position = \"relative\";\n scanBox.style.flex = \"0 0 auto\";\n scanBox.style.borderRadius = \"18px\";\n scanBox.style.overflow = \"hidden\";\n overlay.appendChild(scanBox);\n\n const scanArea = document.createElement(\"div\");\n scanArea.style.position = \"absolute\";\n scanArea.style.inset = \"0\";\n scanArea.style.zIndex = \"1\";\n scanArea.style.background = \"#000\";\n scanBox.appendChild(scanArea);\n\n const video = document.createElement(\"video\");\n video.setAttribute(\"playsinline\", \"true\");\n video.autoplay = true;\n video.muted = true;\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"cover\";\n video.style.position = \"absolute\";\n video.style.inset = \"0\";\n scanArea.appendChild(video);\n\n // ===============================================\n // WHITE TELEGRAM-LIKE FRAME\n // ===============================================\n const frame = document.createElement(\"div\");\n frame.style.position = \"absolute\";\n frame.style.top = \"0\";\n frame.style.left = \"0\";\n frame.style.right = \"0\";\n frame.style.bottom = \"0\";\n frame.style.border = \"3px solid rgba(255,255,255,0.9)\";\n frame.style.borderRadius = \"18px\";\n frame.style.pointerEvents = \"none\";\n frame.style.zIndex = \"3\";\n scanBox.appendChild(frame);\n\n // ===============================================\n // SCAN LINE ANIMATION\n // ===============================================\n const line = document.createElement(\"div\");\n line.style.position = \"absolute\";\n line.style.left = \"0\";\n line.style.right = \"0\";\n line.style.height = \"2px\";\n line.style.background = \"rgba(255,255,255,0.85)\";\n line.style.borderRadius = \"2px\";\n line.style.animation = \"qr-line 2s infinite\";\n line.style.zIndex = \"4\";\n scanBox.appendChild(line);\n\n const styleTag = document.createElement(\"style\");\n styleTag.innerHTML = `\n @keyframes qr-line {\n 0% { top: 0; }\n 50% { top: calc(100% - 2px); }\n 100% { top: 0; }\n }\n `;\n document.head.appendChild(styleTag);\n\n // ===============================================\n // \"POINT CAMERA\" TEXT\n // ===============================================\n const hint = document.createElement(\"div\");\n hint.innerText = \"Наведите камеру на QR-код\";\n hint.style.color = \"white\";\n hint.style.marginTop = \"30px\";\n hint.style.fontSize = \"17px\";\n hint.style.opacity = \"0.9\";\n overlay.appendChild(hint);\n\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n let stream: MediaStream | null = null;\n let rafId: number | null = null;\n let lastScanAt = 0;\n\n let closed = false;\n const finalize = async (result: string | null) => {\n if (closed) {\n return;\n }\n closed = true;\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n }\n video.srcObject = null;\n overlay.remove();\n styleTag.remove();\n\n document.body.style.overflow = prevOverflow;\n document.body.style.position = prevPos;\n document.body.style.width = prevWidth;\n document.body.style.touchAction = prevTouch;\n document.documentElement.style.overflow = prevHtmlOverflow;\n\n resolve(result);\n };\n\n const removeFromBag = this.registerDisposable(() => {\n void finalize(null);\n });\n\n const closeScanner = (result: string | null) => {\n void finalize(result);\n removeFromBag();\n };\n\n closeBtn.onclick = () => closeScanner(null);\n\n // ===============================================\n // START CAM\n // ===============================================\n try {\n const constraints: MediaStreamConstraints[] = [\n { video: { facingMode: { ideal: \"environment\" } }, audio: false },\n { video: { facingMode: \"environment\" }, audio: false },\n { video: true, audio: false },\n ];\n\n let lastError: unknown = null;\n for (const constraint of constraints) {\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraint);\n break;\n } catch (error) {\n lastError = error;\n }\n }\n\n if (!stream) {\n throw lastError instanceof Error ? lastError : new Error(\"Unable to access camera\");\n }\n\n video.srcObject = stream;\n await video.play();\n\n const scanFrame = (now: number) => {\n if (closed) {\n return;\n }\n if (now - lastScanAt >= 100 && context && video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (width > 0 && height > 0) {\n canvas.width = width;\n canvas.height = height;\n context.drawImage(video, 0, 0, width, height);\n const imageData = context.getImageData(0, 0, width, height);\n const result = jsQR(imageData.data, width, height, {\n inversionAttempts: \"attemptBoth\",\n });\n if (result?.data) {\n closeScanner(result.data);\n return;\n }\n lastScanAt = now;\n }\n }\n rafId = requestAnimationFrame(scanFrame);\n };\n\n rafId = requestAnimationFrame(scanFrame);\n } catch (error) {\n console.error(\"QR Start error\", error);\n closeScanner(null);\n }\n });\n }\n shareUrl(url: string, text: string): void {\n if (navigator.share) {\n try {\n navigator.share({ title: text, text, url });\n return;\n } catch (err) {\n console.warn('Share cancelled or failed:', err);\n }\n }\n\n const payload = text ? `${text}\\n${url}` : url;\n this.copyTextToClipboard(payload).catch((err) => {\n console.warn('Share fallback (clipboard) failed:', err);\n });\n }\n\n override async addToHomeScreen(): Promise<boolean> {\n const isAndroid = /android/i.test(navigator.userAgent);\n if (!isAndroid || !this.deferredPrompt) {\n return super.addToHomeScreen();\n }\n\n try {\n this.deferredPrompt.prompt();\n const choice = await this.deferredPrompt.userChoice;\n this.deferredPrompt = null;\n return choice?.outcome === 'accepted';\n } catch (error) {\n console.warn('[tvm-app-adapter] Web addToHomeScreen failed:', error);\n this.deferredPrompt = null;\n return false;\n }\n }\n\n override async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\n try {\n const isStandalone =\n (typeof window !== 'undefined' && window.matchMedia?.('(display-mode: standalone)').matches) ||\n // iOS Safari specific flag\n (typeof navigator !== 'undefined' && (navigator as unknown as { standalone?: boolean }).standalone === true);\n\n if (isStandalone) {\n return 'added';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n}\n\n// Minimal BeforeInstallPromptEvent typing to avoid lib.dom dependency mismatch.\ninterface BeforeInstallPromptEvent extends Event {\n prompt(): Promise<void>;\n userChoice: Promise<{ outcome?: 'accepted' | 'dismissed'; platform?: string }>;\n}\n","import { MaxMiniAppAdapter } from '@/adapters/maxAdapter';\r\nimport { ShellMiniAppAdapter } from '@/adapters/shellAdapter';\r\nimport { TelegramMiniAppAdapter } from '@/adapters/telegramAdapter';\r\nimport { VKMiniAppAdapter } from '@/adapters/vkAdapter';\r\nimport { WebMiniAppAdapter } from '@/adapters/webAdapter';\r\nimport { setVkPixelCode } from '@/config/vkAnalytics';\nimport type { MiniAppAdapter, MiniAppPlatform } from '@/types/miniApp';\nimport { readShellPlatform } from '@/lib/shell';\n\nconst CONFIRMED_PLATFORM_STORAGE_KEY = 'mini-app-adapter:confirmed-platform';\nconst CONFIRMED_PLATFORM_TTL_MS = 30 * 60 * 1000;\n\nexport interface CreateAdapterOptions {\n platform?: MiniAppPlatform;\n vk?: {\n pixelCode?: string;\n };\n}\n\nexport function detectPlatform(): MiniAppPlatform {\n if (typeof window === 'undefined') {\n return 'web';\n }\n\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const hashParams = (() => {\r\n const hash = window.location.hash.startsWith('#')\r\n ? window.location.hash.slice(1)\r\n : window.location.hash;\r\n return new URLSearchParams(hash);\r\n })();\r\n\r\n const getParam = (name: string): string | null =>\r\n searchParams.get(name) ?? hashParams.get(name);\r\n\r\n const hasParam = (...names: string[]): boolean => names.some((name) => getParam(name));\n const readConfirmedPlatform = (): MiniAppPlatform | null => {\n try {\n const raw = window.sessionStorage.getItem(CONFIRMED_PLATFORM_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as { platform?: MiniAppPlatform; ts?: number };\n if (!parsed?.platform || typeof parsed.ts !== 'number') {\n return null;\n }\n if (Date.now() - parsed.ts > CONFIRMED_PLATFORM_TTL_MS) {\n return null;\n }\n return parsed.platform;\n } catch {\n return null;\n }\n };\n const persistConfirmedPlatform = (platform: MiniAppPlatform): void => {\n if (platform === 'web') {\n return;\n }\n try {\n window.sessionStorage.setItem(\n CONFIRMED_PLATFORM_STORAGE_KEY,\n JSON.stringify({ platform, ts: Date.now() }),\n );\n } catch {\n // Ignore storage errors.\n }\n };\n\n const shellPlatform = readShellPlatform();\n if (shellPlatform) {\n persistConfirmedPlatform(shellPlatform);\n return shellPlatform;\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n const hasNativeBridge =\n typeof (window as typeof window & { NativeBridge?: { postMessage?: unknown } }).NativeBridge?.postMessage ===\r\n 'function';\r\n\n if (hasNativeBridge) {\n if (userAgent.includes('android')) {\n persistConfirmedPlatform('shell_android');\n return 'shell_android';\n }\n persistConfirmedPlatform('shell_ios');\n return 'shell_ios';\n }\n\n const telegramGlobals = window as typeof window & {\n TelegramWebviewProxy?: unknown;\n TelegramGameProxy?: unknown;\n };\n const hasTelegramGlobal =\n Boolean(window.Telegram?.WebApp)\n || typeof telegramGlobals.TelegramWebviewProxy !== 'undefined'\n || typeof telegramGlobals.TelegramGameProxy !== 'undefined';\n const hasTelegramParams = hasParam('tgWebAppPlatform', 'tgWebAppVersion', 'tgWebAppData', 'tgWebAppLanguage');\n if (\n hasTelegramGlobal\n || hasTelegramParams\n || userAgent.includes('telegram')\n ) {\n persistConfirmedPlatform('telegram');\n return 'telegram';\n }\n\n if (window.WebApp) {\n persistConfirmedPlatform('max');\n return 'max';\n }\n\n if ((window as typeof window & { MaxMiniApp?: unknown }).MaxMiniApp) {\n persistConfirmedPlatform('max');\n return 'max';\n }\n\n const hasVkParams = hasParam('vk_app_id', 'vk_platform', 'vk_user_id', 'vk_language', 'sign');\n const hasVkUserAgentSignal =\n userAgent.includes('vkclient')\n || userAgent.includes('vk-android')\n || userAgent.includes('vkontakte');\n if (hasVkParams || hasVkUserAgentSignal) {\n persistConfirmedPlatform('vk');\n return 'vk';\n }\n\n const confirmedPlatform = readConfirmedPlatform();\n if (confirmedPlatform && confirmedPlatform !== 'web') {\n return confirmedPlatform;\n }\n\n return 'web';\n}\n\r\n\r\nexport function createAdapter(): MiniAppAdapter;\r\nexport function createAdapter(platform: MiniAppPlatform): MiniAppAdapter;\r\nexport function createAdapter(options: CreateAdapterOptions): MiniAppAdapter;\r\nexport function createAdapter(input?: MiniAppPlatform | CreateAdapterOptions): MiniAppAdapter {\r\n const options = normalizeCreateAdapterOptions(input);\r\n const platform = options.platform ?? detectPlatform();\r\n\r\n if (platform === 'vk') {\r\n setVkPixelCode(options.vk?.pixelCode ?? null);\r\n }\r\n\r\n switch (platform) {\r\n case 'shell_ios':\r\n case 'shell_android':\r\n return new ShellMiniAppAdapter(platform);\r\n case 'telegram':\r\n return new TelegramMiniAppAdapter();\r\n case 'vk':\r\n return new VKMiniAppAdapter();\r\n case 'max':\r\n return new MaxMiniAppAdapter();\r\n default:\r\n return new WebMiniAppAdapter();\r\n }\r\n}\r\n\r\nfunction normalizeCreateAdapterOptions(input?: MiniAppPlatform | CreateAdapterOptions): CreateAdapterOptions {\r\n if (!input) {\r\n return {};\r\n }\r\n\r\n if (typeof input === 'string') {\r\n return { platform: input };\r\n }\r\n\r\n return input;\r\n}\r\n","import { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react';\n\nimport type { MiniAppAdapter } from '@/types/miniApp';\nimport { setActiveAdapter } from '@/registry';\n\nconst AdapterContext = createContext<MiniAppAdapter | null>(null);\n\ninterface AdapterProviderProps {\n adapter: MiniAppAdapter;\n children: ReactNode;\n}\n\nexport function AdapterProvider({ adapter, children }: AdapterProviderProps) {\n const proxiedAdapter = useMemo(() => {\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n }) as MiniAppAdapter;\n }, [adapter]);\n\n useEffect(() => {\n setActiveAdapter(proxiedAdapter);\n return () => {\n setActiveAdapter(null);\n if (typeof proxiedAdapter.destroy === 'function') {\n try {\n proxiedAdapter.destroy();\n } catch (error) {\n console.warn('[tvm-app-adapter] adapter destroy failed:', error);\n }\n }\n };\n }, [proxiedAdapter]);\n\n return <AdapterContext.Provider value={proxiedAdapter}>{children}</AdapterContext.Provider>;\n}\n\nexport function useMiniAppAdapter(): MiniAppAdapter {\n const adapter = useContext(AdapterContext);\n if (!adapter) {\n throw new Error('useMiniAppAdapter must be used inside <AdapterProvider/>.');\n }\n return adapter;\n}\n","import type { MiniAppAdapter } from '@/types/miniApp';\n\nlet currentAdapter: MiniAppAdapter | null = null;\n\nexport function setActiveAdapter(adapter: MiniAppAdapter | null): void {\n currentAdapter = adapter;\n}\n\nexport function getActiveAdapter(): MiniAppAdapter | null {\n return currentAdapter;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useMiniAppAdapter } from '@/components/AdapterProvider';\n\nexport type ThemePreference = 'system' | 'light' | 'dark';\n\nconst STORAGE_KEY = 'loyalka-theme-preference';\n\nexport function useAdapterTheme() {\n const adapter = useMiniAppAdapter();\n\n const [systemPrefersDark, setSystemPrefersDark] = useState<boolean>(() => {\n const { appearance } = adapter.getEnvironment();\n if (adapter.onAppearanceChange && appearance) {\n return appearance === 'dark';\n }\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n return false;\n });\n\n const [preference, setPreferenceState] = useState<ThemePreference>(() => {\n try {\n const saved = localStorage.getItem(STORAGE_KEY) as ThemePreference | null;\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved;\n } catch {}\n return 'system';\n });\n\n useEffect(() => {\n if (adapter.onAppearanceChange) {\n return adapter.onAppearanceChange((appearance) => {\n if (appearance) {\n setSystemPrefersDark(appearance === 'dark');\n }\n });\n }\n\n if (typeof window !== 'undefined' && window.matchMedia) {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = (event: MediaQueryListEvent) => setSystemPrefersDark(event.matches);\n media.addEventListener('change', handleChange);\n return () => media.removeEventListener('change', handleChange);\n }\n\n return undefined;\n }, [adapter]);\n\n const isDark = useMemo(() => {\n if (preference === 'dark' || (preference === 'system' && systemPrefersDark)) {\n return true;\n }\n return false;\n }, [preference, systemPrefersDark]);\n\n const appearance: 'dark' | 'light' = isDark ? 'dark' : 'light';\n\n useEffect(() => {\n const root = document.documentElement;\n if (isDark) {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }, [isDark]);\n\n const setPreference = useCallback((pref: ThemePreference) => {\n setPreferenceState(pref);\n try {\n localStorage.setItem(STORAGE_KEY, pref);\n } catch {}\n }, []);\n\n const toggle = useCallback(() => {\n document.documentElement.classList.add('theme-transition');\n setTimeout(() => {\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transition');\n }, 400);\n }, 50);\n\n const root = document.documentElement;\n const styles = getComputedStyle(root);\n const primaryColor = styles.getPropertyValue('--primary').trim();\n const backgroundColor = styles.getPropertyValue('--background').trim();\n\n adapter.setColors({\n header: primaryColor,\n background: backgroundColor,\n footer: backgroundColor,\n });\n setPreference(preference === 'dark' ? 'light' : 'dark');\n }, [adapter, preference, setPreference]);\n\n return {\n isDark,\n appearance,\n preference,\n setPreference,\n toggle,\n } as const;\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useMiniAppAdapter } from '@/components/AdapterProvider';\nimport type { MiniAppEnvironmentInfo } from '@/types/miniApp';\n\ntype SafeAreaInsets = NonNullable<MiniAppEnvironmentInfo['safeArea']>;\n\nconst ZERO_SAFE_AREA: SafeAreaInsets = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport function useSafeArea() {\n const adapter = useMiniAppAdapter();\n\n const computeSafeArea = useCallback(\n () => adapter.computeSafeArea() ?? ZERO_SAFE_AREA,\n [adapter],\n );\n\n const [safeArea, setSafeArea] = useState<SafeAreaInsets>(computeSafeArea);\n\n useEffect(() => {\n setSafeArea(computeSafeArea());\n const unsubscribe = adapter.subscribe?.(() => {\n setSafeArea(computeSafeArea());\n });\n\n return () => unsubscribe?.();\n }, [adapter, computeSafeArea]);\n\n return safeArea ?? ZERO_SAFE_AREA;\n}","import type { MiniAppPlatform } from '@/types/miniApp';\nimport { detectPlatform } from '@/adapters';\nimport { getActiveAdapter } from '@/registry';\n\nlet cachedPlatform: MiniAppPlatform | null = null;\n\nexport function getPlatform(): MiniAppPlatform {\n const adapter = getActiveAdapter();\n if (adapter) {\n if (adapter.platform !== 'web') {\n cachedPlatform = adapter.platform;\n }\n return adapter.platform;\n }\n\n if (cachedPlatform && cachedPlatform !== 'web') {\n return cachedPlatform;\n }\n\n const detectedPlatform = detectPlatform();\n if (detectedPlatform !== 'web') {\n cachedPlatform = detectedPlatform;\n }\n return detectedPlatform;\n}\n","import type { MiniAppAdapter } from '@/types/miniApp';\nimport { getActiveAdapter } from '@/registry';\nimport { getPlatform } from './platform';\nimport { getVkPixelCode as readVkPixelCode, setVkPixelCode } from '@/config/vkAnalytics';\n\ntype AnalyticsPayload = Record<string, unknown>;\n\nexport function configureVkPixel(pixelCode: string): void {\n setVkPixelCode(pixelCode);\n}\n\nexport function getVkPixelCode(): string | null {\n return readVkPixelCode();\n}\n\nexport function trackConversionEvent(event: string, payload?: Record<string, unknown>): void {\n const adapter = resolveVkAdapter();\n adapter?.trackConversionEvent(event, payload as AnalyticsPayload | undefined);\n}\n\nexport function trackPixelEvent(event: string, payload?: Record<string, unknown>): void {\n const adapter = resolveVkAdapter();\n adapter?.trackPixelEvent(event, payload as AnalyticsPayload | undefined);\n}\n\nfunction resolveVkAdapter(): MiniAppAdapter | null {\n const adapter = getActiveAdapter();\n if (adapter) {\n return adapter.platform === 'vk' ? adapter : null;\n }\n\n if (getPlatform() !== 'vk') {\n return null;\n }\n\n return null;\n}\n"],"mappings":"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","names":["bridge","bridge","off","pixelCode","useEffect","useMemo","appearance","useEffect","useMemo","useCallback","useEffect","useState","useCallback","useState","useEffect","pixelCode"]}
1
+ {"version":3,"sources":["../src/lib/disposables.ts","../src/lib/download.ts","../src/lib/safeArea.ts","../src/lib/shell.ts","../src/adapters/baseAdapter.ts","../src/adapters/maxAdapter.ts","../src/adapters/shellAdapter.ts","../src/adapters/telegramAdapter.ts","../src/lib/features.ts","../src/lib/viewport.ts","../src/adapters/vkAdapter.ts","../src/config/vkAnalytics.ts","../src/lib/bridge.ts","../src/adapters/webAdapter.ts","../src/adapters/index.ts","../src/components/AdapterProvider.tsx","../src/registry.ts","../src/hooks/useAdapterTheme.ts","../src/hooks/useSafeArea.ts","../src/platform.ts","../src/analytics.ts"],"sourcesContent":["export type Disposable = (() => void) | { dispose: () => void } | null | undefined;\n\nexport class DisposableBag {\n private disposers = new Set<() => void>();\n\n add(disposable: Disposable): () => void {\n if (!disposable) {\n return () => {};\n }\n\n const dispose = typeof disposable === 'function'\n ? disposable\n : typeof disposable.dispose === 'function'\n ? disposable.dispose.bind(disposable)\n : undefined;\n\n if (!dispose) {\n return () => {};\n }\n\n let called = false;\n const wrapped = () => {\n if (called) {\n return;\n }\n called = true;\n try {\n dispose();\n } catch (error) {\n console.warn('[tvm-app-adapter] disposable failed:', error);\n } finally {\n this.disposers.delete(wrapped);\n }\n };\n\n this.disposers.add(wrapped);\n return wrapped;\n }\n\n disposeAll(): void {\n for (const disposer of Array.from(this.disposers)) {\n try {\n disposer();\n } catch (error) {\n console.warn('[tvm-app-adapter] disposeAll failed:', error);\n }\n }\n this.disposers.clear();\n }\n}\n","const isClient = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nfunction getFallbackFileName(url: string, provided?: string): string {\n if (provided && provided.trim().length > 0) {\n return provided;\n }\n try {\n const parsed = new URL(url);\n const path = parsed.pathname.split('/').filter(Boolean).pop();\n if (path) {\n return path;\n }\n } catch {\n // Ignore parse errors and fall back to generic name.\n }\n return 'download';\n}\n\nfunction triggerAnchorDownload(href: string, fileName: string, { targetBlank }: { targetBlank: boolean }): void {\n if (!isClient) {\n return;\n }\n\n const anchor = document.createElement('a');\n anchor.href = href;\n anchor.download = fileName;\n anchor.rel = 'noopener noreferrer';\n if (targetBlank) {\n anchor.target = '_blank';\n }\n\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n}\n\nexport interface TriggerFileDownloadOptions {\n preferBlob?: boolean;\n}\n\nexport async function triggerFileDownload(url: string, fileName?: string, options?: TriggerFileDownloadOptions): Promise<void> {\n if (!url) {\n return;\n }\n\n const safeFileName = getFallbackFileName(url, fileName);\n const preferBlob = options?.preferBlob ?? false;\n\n if (!isClient) {\n if (typeof window !== 'undefined') {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (preferBlob && typeof fetch === 'function') {\n try {\n const response = await fetch(url, { credentials: 'include' });\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.status}`);\n }\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n triggerAnchorDownload(objectUrl, safeFileName, { targetBlank: false });\n setTimeout(() => URL.revokeObjectURL(objectUrl), 30_000);\n return;\n } catch (error) {\n console.warn('[tvm-app-adapter] blob download failed, falling back to direct link:', error);\n }\n }\n\n triggerAnchorDownload(url, safeFileName, { targetBlank: true });\n}\n","import type { MiniAppEnvironmentInfo, MiniAppViewportInsets } from '@/types/miniApp';\n\nconst SAFE_AREA_EDGES = ['top', 'right', 'bottom', 'left'] as const;\ntype SafeAreaEdge = (typeof SAFE_AREA_EDGES)[number];\nexport type SafeArea = Record<SafeAreaEdge, number>;\ntype PartialSafeArea = Partial<Record<SafeAreaEdge, number>>;\n\nconst DEFAULT_SAFE_AREA: SafeArea = { top: 0, right: 0, bottom: 0, left: 0 };\n\nfunction cloneSafeArea(source: SafeArea): SafeArea {\n return { ...source };\n}\n\nfunction addSafeArea(target: SafeArea, source?: PartialSafeArea): void {\n if (!source) {\n return;\n }\n for (const edge of SAFE_AREA_EDGES) {\n const value = source[edge];\n if (typeof value === 'number' && Number.isFinite(value)) {\n target[edge] += value;\n }\n }\n}\n\nfunction applyMinimum(target: SafeArea, source?: PartialSafeArea): void {\n if (!source) {\n return;\n }\n for (const edge of SAFE_AREA_EDGES) {\n const value = source[edge];\n if (typeof value === 'number' && Number.isFinite(value)) {\n target[edge] = Math.max(target[edge], value);\n }\n }\n}\n\nfunction areSafeAreasEqual(a?: SafeArea, b?: SafeArea): boolean {\n if (!a || !b) {\n return false;\n }\n return SAFE_AREA_EDGES.every((edge) => a[edge] === b[edge]);\n}\n\nexport interface ComputeSafeAreaOptions {\n environment?: Partial<MiniAppEnvironmentInfo['safeArea']>;\n viewport?: MiniAppViewportInsets;\n additions?: PartialSafeArea;\n minimum?: PartialSafeArea;\n css?: PartialSafeArea;\n}\n\nexport function computeCombinedSafeArea(options: ComputeSafeAreaOptions = {}): SafeArea {\n const safeArea = cloneSafeArea(DEFAULT_SAFE_AREA);\n\n addSafeArea(safeArea, options.environment as PartialSafeArea | undefined);\n\n if (options.viewport) {\n addSafeArea(safeArea, options.viewport.safeArea);\n addSafeArea(safeArea, options.viewport.contentSafeArea);\n }\n\n addSafeArea(safeArea, options.additions);\n\n applyMinimum(safeArea, options.css);\n applyMinimum(safeArea, options.minimum);\n\n return safeArea;\n}\n\nexport function readCssSafeArea(): SafeArea | undefined {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return undefined;\n }\n\n const styles = getComputedStyle(document.documentElement);\n const readEdge = (prop: string) => {\n const value = parseFloat(styles.getPropertyValue(prop));\n return Number.isFinite(value) ? value : 0;\n };\n\n const top = readEdge('--safe-area-inset-top');\n const right = readEdge('--safe-area-inset-right');\n const bottom = readEdge('--safe-area-inset-bottom');\n const left = readEdge('--safe-area-inset-left');\n\n if (top || right || bottom || left) {\n return { top, right, bottom, left };\n }\n\n return undefined;\n}\n\nexport interface SafeAreaWatcherOptions {\n getSafeArea: () => MiniAppEnvironmentInfo['safeArea'] | undefined;\n onChange: (safeArea: MiniAppEnvironmentInfo['safeArea']) => void;\n windowObj?: Window & typeof globalThis;\n events?: Array<'resize' | 'orientationchange'>;\n}\n\nfunction normalizeSafeArea(value?: MiniAppEnvironmentInfo['safeArea']): SafeArea | undefined {\n if (!value) {\n return undefined;\n }\n\n const safeArea: SafeArea = { ...DEFAULT_SAFE_AREA };\n addSafeArea(safeArea, value as PartialSafeArea);\n return safeArea;\n}\n\nexport function createSafeAreaWatcher(options: SafeAreaWatcherOptions): (() => void) | undefined {\n const targetWindow = options.windowObj ?? (typeof window !== 'undefined' ? window : undefined);\n if (!targetWindow) {\n return undefined;\n }\n\n let previous = normalizeSafeArea(options.getSafeArea());\n if (previous) {\n options.onChange(previous);\n previous = cloneSafeArea(previous);\n }\n\n const handler = () => {\n const next = normalizeSafeArea(options.getSafeArea());\n if (!next) {\n return;\n }\n\n if (!previous || !areSafeAreasEqual(previous, next)) {\n options.onChange(next);\n previous = cloneSafeArea(next);\n }\n };\n\n handler();\n\n const events = options.events ?? ['resize', 'orientationchange'];\n for (const eventName of events) {\n targetWindow.addEventListener(eventName, handler);\n }\n\n return () => {\n for (const eventName of events) {\n targetWindow.removeEventListener(eventName, handler);\n }\n };\n}\n","import type { MiniAppPlatform } from '@/types/miniApp';\n\nexport type ShellPlatform = 'shell_ios' | 'shell_android';\n\nconst SHELL_PLATFORMS: readonly ShellPlatform[] = ['shell_ios', 'shell_android'] as const;\nconst SHELL_QR_TIMEOUT_MS = 60_000;\n\ntype ShellBridgeCommand =\n | {\n type: 'storeToken';\n payload?: ShellStoreTokenPayload;\n }\n | {\n type: 'requestPushPermission';\n }\n | {\n type: 'openNativeQR';\n };\n\nexport interface ShellStoreTokenPayload {\n token?: string;\n [key: string]: unknown;\n}\n\ninterface NativeShellBridge {\n postMessage(message: ShellBridgeCommand): void;\n}\n\ntype ShellWindow = Window &\n Record<string, unknown> & {\n NativeBridge?: NativeShellBridge;\n nativePlatform?: ShellPlatform;\n nativePushToken?: (token: string) => void;\n nativeDeepLink?: (path: string) => void;\n nativeQRResult?: (value: string) => void;\n nativeAppActive?: () => void;\n nativeAppBackground?: () => void;\n };\n\ntype PushListener = (token: string) => void;\ntype DeepLinkListener = (path: string) => void;\ntype VoidListener = () => void;\n\ntype PendingQrRequest = {\n resolve: (value: string) => void;\n reject: (reason: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\nconst pushListeners = new Set<PushListener>();\nconst deepLinkListeners = new Set<DeepLinkListener>();\nconst activeListeners = new Set<VoidListener>();\nconst backgroundListeners = new Set<VoidListener>();\n\nlet lastPushToken: string | null = null;\n\nlet pendingQrRequest: PendingQrRequest | null = null;\n\nexport interface ShellBridgeConfig {\n platformFlag: string;\n pushTokenCallback: string;\n qrResultCallback: string;\n deepLinkCallback: string;\n appActiveCallback: string;\n appBackgroundCallback: string;\n}\n\nconst DEFAULT_BRIDGE_CONFIG: ShellBridgeConfig = {\n platformFlag: 'nativePlatform',\n pushTokenCallback: 'nativePushToken',\n qrResultCallback: 'nativeQRResult',\n deepLinkCallback: 'nativeDeepLink',\n appActiveCallback: 'nativeAppActive',\n appBackgroundCallback: 'nativeAppBackground',\n};\n\nlet bridgeConfig: ShellBridgeConfig = { ...DEFAULT_BRIDGE_CONFIG };\n\ntype BridgeCallbackKey =\n | 'pushTokenCallback'\n | 'deepLinkCallback'\n | 'appActiveCallback'\n | 'appBackgroundCallback'\n | 'qrResultCallback';\n\nlet installedCallbackNames: Partial<Record<BridgeCallbackKey, string>> = {};\n\nfunction notifyPushListeners(token: string): void {\n lastPushToken = token;\n for (const listener of pushListeners) {\n try {\n listener(token);\n } catch (error) {\n console.warn('[tvm-app-adapter] push token listener failed:', error);\n }\n }\n}\n\nexport interface ShellAPI {\n openNativeQR(): Promise<string>;\n onPushToken(callback: PushListener): () => void;\n onDeepLink(callback: DeepLinkListener): () => void;\n onAppActive(callback: VoidListener): () => void;\n onAppBackground(callback: VoidListener): () => void;\n}\n\nexport function configureShellBridge(config: Partial<ShellBridgeConfig>): void {\n bridgeConfig = { ...bridgeConfig, ...config };\n installGlobalCallbacks();\n}\n\nexport function isShell(platform: MiniAppPlatform): platform is ShellPlatform {\n return SHELL_PLATFORMS.includes(platform as ShellPlatform);\n}\n\nexport function isShellIOS(platform: MiniAppPlatform): platform is 'shell_ios' {\n return platform === 'shell_ios';\n}\n\nexport function isShellAndroid(platform: MiniAppPlatform): platform is 'shell_android' {\n return platform === 'shell_android';\n}\n\nexport function readShellPlatform(): ShellPlatform | undefined {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n return undefined;\n }\n const platform = (shellWindow as Record<string, unknown>)[bridgeConfig.platformFlag];\n if (platform === 'shell_ios' || platform === 'shell_android') {\n return platform;\n }\n return undefined;\n}\n\ntype PlatformResolver = MiniAppPlatform | (() => MiniAppPlatform);\n\nexport function createShellAPI(platform: PlatformResolver): ShellAPI {\n installGlobalCallbacks();\n\n const resolvePlatform = typeof platform === 'function' ? platform : () => platform;\n\n return {\n async openNativeQR(): Promise<string> {\n const currentPlatform = resolvePlatform();\n if (isShell(currentPlatform)) {\n return openNativeQrViaBridge();\n }\n return startHtml5Qrcode();\n },\n onPushToken(callback: PushListener): () => void {\n pushListeners.add(callback);\n if (lastPushToken) {\n queueMicrotask(() => {\n try {\n callback(lastPushToken as string);\n } catch (error) {\n console.warn('[tvm-app-adapter] push token listener failed:', error);\n }\n });\n }\n return () => pushListeners.delete(callback);\n },\n onDeepLink(callback: DeepLinkListener): () => void {\n deepLinkListeners.add(callback);\n return () => deepLinkListeners.delete(callback);\n },\n onAppActive(callback: VoidListener): () => void {\n activeListeners.add(callback);\n return () => activeListeners.delete(callback);\n },\n onAppBackground(callback: VoidListener): () => void {\n backgroundListeners.add(callback);\n return () => backgroundListeners.delete(callback);\n },\n };\n}\n\nexport const shell = createShellAPI(() => readShellPlatform() ?? 'web');\n\nexport function storeShellToken(payload?: ShellStoreTokenPayload): boolean {\n return sendBridgeCommand({ type: 'storeToken', payload });\n}\n\nexport function requestShellPushPermission(): boolean {\n return sendBridgeCommand({ type: 'requestPushPermission' });\n}\n\nfunction getShellWindow(): ShellWindow | null {\n return typeof window === 'undefined' ? null : (window as unknown as ShellWindow);\n}\n\nfunction getNativeBridge(): NativeShellBridge | null {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n return null;\n }\n const bridge = shellWindow.NativeBridge;\n if (!bridge || typeof bridge.postMessage !== 'function') {\n return null;\n }\n return bridge;\n}\n\nfunction sendBridgeCommand(command: ShellBridgeCommand): boolean {\n const bridge = getNativeBridge();\n if (!bridge) {\n return false;\n }\n try {\n bridge.postMessage(command);\n return true;\n } catch (error) {\n console.warn('[tvm-app-adapter] NativeBridge.postMessage failed:', error);\n return false;\n }\n}\n\nfunction installGlobalCallbacks(): void {\n const shellWindow = getShellWindow();\n if (!shellWindow) {\n installedCallbackNames = {};\n return;\n }\n\n const target = shellWindow as ShellWindow & Record<string, unknown>;\n\n const assignCallback = (\n key: BridgeCallbackKey,\n handler: (...args: unknown[]) => void,\n ) => {\n const nextName = bridgeConfig[key];\n const previousName = installedCallbackNames[key];\n if (previousName && previousName !== nextName) {\n delete target[previousName];\n }\n installedCallbackNames[key] = nextName;\n target[nextName] = handler;\n };\n\n assignCallback('pushTokenCallback', (token: unknown) => {\n if (typeof token !== 'string') {\n return;\n }\n console.log('[tvm-app-adapter] nativePushToken', token);\n notifyPushListeners(token);\n });\n\n assignCallback('deepLinkCallback', (path: unknown) => {\n if (typeof path !== 'string') {\n return;\n }\n for (const listener of deepLinkListeners) {\n try {\n listener(path);\n } catch (error) {\n console.warn('[tvm-app-adapter] deep link listener failed:', error);\n }\n }\n });\n\n assignCallback('appActiveCallback', () => {\n for (const listener of activeListeners) {\n try {\n listener();\n } catch (error) {\n console.warn('[tvm-app-adapter] app active listener failed:', error);\n }\n }\n });\n\n assignCallback('appBackgroundCallback', () => {\n for (const listener of backgroundListeners) {\n try {\n listener();\n } catch (error) {\n console.warn('[tvm-app-adapter] app background listener failed:', error);\n }\n }\n });\n\n assignCallback('qrResultCallback', (value: unknown) => {\n if (typeof value !== 'string') {\n return;\n }\n if (!pendingQrRequest) {\n return;\n }\n clearTimeout(pendingQrRequest.timeoutId);\n pendingQrRequest.resolve(value);\n pendingQrRequest = null;\n });\n}\n\nfunction openNativeQrViaBridge(): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n if (pendingQrRequest) {\n pendingQrRequest.reject(new Error('QR request superseded by a new call.'));\n clearTimeout(pendingQrRequest.timeoutId);\n pendingQrRequest = null;\n }\n\n if (!sendBridgeCommand({ type: 'openNativeQR' })) {\n reject(new Error('Native bridge is unavailable.'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n if (pendingQrRequest) {\n pendingQrRequest.reject(new Error('Native QR request timed out.'));\n pendingQrRequest = null;\n }\n }, SHELL_QR_TIMEOUT_MS);\n\n pendingQrRequest = { resolve, reject, timeoutId };\n });\n}\n\nasync function startHtml5Qrcode(): Promise<string> {\n if (typeof document === 'undefined') {\n throw new Error('QR scanning requires a browser environment.');\n }\n\n const [{ Html5Qrcode }] = await Promise.all([import('html5-qrcode')]);\n\n return new Promise<string>((resolve, reject) => {\n const elementId = `native-shell-qr-${Date.now()}`;\n const overlay = document.createElement('div');\n overlay.style.position = 'fixed';\n overlay.style.inset = '0';\n overlay.style.background = 'rgba(0, 0, 0, 0.9)';\n overlay.style.display = 'flex';\n overlay.style.flexDirection = 'column';\n overlay.style.alignItems = 'center';\n overlay.style.justifyContent = 'center';\n overlay.style.zIndex = '2147483647';\n overlay.style.backdropFilter = 'blur(2px)';\n\n const reader = document.createElement('div');\n reader.id = elementId;\n reader.style.width = '280px';\n reader.style.height = '280px';\n reader.style.borderRadius = '16px';\n reader.style.overflow = 'hidden';\n reader.style.position = 'relative';\n\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.textContent = '✕';\n closeButton.style.position = 'absolute';\n closeButton.style.top = '16px';\n closeButton.style.right = '16px';\n closeButton.style.background = 'transparent';\n closeButton.style.border = 'none';\n closeButton.style.color = '#fff';\n closeButton.style.fontSize = '28px';\n closeButton.style.cursor = 'pointer';\n\n overlay.appendChild(closeButton);\n overlay.appendChild(reader);\n document.body.appendChild(overlay);\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n let disposed = false;\n const scanner = new Html5Qrcode(elementId);\n\n const cleanup = async (result?: string, error?: Error) => {\n if (disposed) {\n return;\n }\n disposed = true;\n\n try {\n await scanner.stop();\n const maybeClear = (scanner as unknown as { clear?: () => Promise<void> | void }).clear;\n if (typeof maybeClear === 'function') {\n await Promise.resolve(maybeClear.call(scanner));\n }\n } catch {\n // Ignore stop errors.\n }\n\n overlay.remove();\n document.body.style.overflow = previousOverflow;\n\n if (typeof result === 'string') {\n resolve(result);\n } else if (error) {\n reject(error);\n } else {\n reject(new Error('QR scanning was cancelled.'));\n }\n };\n\n closeButton.addEventListener('click', () => {\n void cleanup(undefined, new Error('QR scanning was cancelled by the user.'));\n });\n\n scanner\n .start(\n { facingMode: 'environment' },\n { fps: 10, qrbox: { width: 240, height: 240 } },\n (decodedText: string) => {\n void cleanup(decodedText);\n },\n () => {}\n )\n .catch((error: unknown) => {\n const cause = error instanceof Error ? error : new Error('Unable to start HTML5 QR scanner.');\n void cleanup(undefined, cause);\n });\n });\n}\n","import type {\r\n ImpactHapticFeedbackStyle,\r\n NotificationHapticFeedbackType,\r\n} from '@tma.js/bridge';\r\n\r\nimport {\r\n type MiniAppLaunchParams,\r\n type MiniAppShareStoryOptions,\r\n type MiniAppAdapter,\r\n type MiniAppCapability,\r\n type MiniAppEnvironmentInfo,\r\n type MiniAppInitOptions,\r\n type MiniAppPlatform,\r\n type MiniAppPopupOptions,\r\n type MiniAppQrScanOptions,\r\n type MiniAppViewportInsets,\r\n} from '@/types/miniApp';\r\nimport { DisposableBag, type Disposable } from '@/lib/disposables';\r\nimport { triggerFileDownload } from '@/lib/download';\r\nimport { computeCombinedSafeArea, readCssSafeArea } from '@/lib/safeArea';\r\nimport { createShellAPI, type ShellAPI } from '@/lib/shell';\r\n\r\nexport abstract class BaseMiniAppAdapter implements MiniAppAdapter {\r\n protected ready = false;\r\n\r\n protected environment: MiniAppEnvironmentInfo;\r\n\r\n private listeners = new Set<() => void>();\r\n\r\n private readonly disposables = new DisposableBag();\r\n\r\n readonly shell: ShellAPI;\r\n\r\n protected constructor(platform: MiniAppPlatform, environment?: Partial<MiniAppEnvironmentInfo>) {\r\n this.shell = createShellAPI(platform);\r\n this.environment = {\r\n platform,\r\n ...environment,\r\n };\r\n\r\n if (typeof window !== 'undefined') {\r\n const resizeHandler = () => this.notifyEnvironmentChanged();\r\n window.addEventListener('resize', resizeHandler);\r\n this.registerDisposable(() => window.removeEventListener('resize', resizeHandler));\r\n\r\n if (platform !== 'web') {\r\n const cleanup = this.applyScrollGuards();\r\n if (cleanup) {\r\n this.registerDisposable(cleanup);\r\n }\r\n }\r\n }\r\n }\r\n\r\n supports(capability: MiniAppCapability): boolean | Promise<boolean> {\r\n switch (capability) {\r\n case 'openExternalLink':\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n get platform(): MiniAppPlatform {\r\n return this.environment.platform;\r\n }\r\n\r\n async init(_options?: MiniAppInitOptions): Promise<void> {\r\n this.ready = true;\r\n }\r\n\r\n isReady(): boolean {\r\n return this.ready;\r\n }\r\n\r\n getEnvironment(): MiniAppEnvironmentInfo {\r\n return { ...this.environment };\r\n }\r\n\r\n destroy(): void {\r\n try {\r\n this.onDestroy();\r\n } finally {\r\n this.disposables.disposeAll();\r\n this.listeners.clear();\r\n this.ready = false;\r\n }\r\n }\r\n\r\n subscribe(listener: () => void): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n async setColors(colors: { header?: string; background?: string }): Promise<void> {\r\n if (colors.background) {\r\n document.body.style.backgroundColor = colors.background;\r\n }\r\n if (colors.header) {\r\n const meta = document.querySelector('meta[name=\"theme-color\"]');\r\n if (meta) {\r\n meta.setAttribute('content', colors.header);\r\n }\r\n }\r\n }\r\n\r\n onBackButton(callback: () => void): () => void {\r\n const handler = () => callback();\r\n window.addEventListener('popstate', handler);\r\n return () => window.removeEventListener('popstate', handler);\r\n }\r\n\r\n onPushToken(callback: (token: string) => void): () => void {\r\n return this.shell.onPushToken(callback);\r\n }\r\n\r\n onDeepLink(callback: (path: string) => void): () => void {\r\n return this.shell.onDeepLink(callback);\r\n }\r\n\r\n async openExternalLink(url: string): Promise<void> {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n }\r\n \r\n async openInternalLink(url: string): Promise<void> {\r\n window.open(url, '_self', 'noopener,noreferrer');\r\n }\r\n\r\n async closeApp(): Promise<void> {\r\n if (window.history.length > 1) {\r\n window.history.back();\r\n } else {\r\n window.close();\r\n }\r\n }\r\n\r\n setBackButtonVisibility(_visible: boolean): void {\r\n // No-op by default.\r\n }\r\n\r\n onAppearanceChange(callback: (appearance: 'dark' | 'light' | undefined) => void): () => void {\r\n callback(this.environment.appearance as 'dark' | 'light' | undefined);\r\n return () => {};\r\n }\r\n\r\n getInitData(): string | undefined {\r\n return undefined;\r\n }\r\n\r\n getLaunchParams(): MiniAppLaunchParams | undefined {\r\n return {\r\n customLaunchParams: this.readCustomUrlParams(),\r\n };\r\n }\r\n\r\n decodeStartParam(_param: string): unknown {\r\n return undefined;\r\n }\r\n\r\n requestFullscreen(): void {\r\n // No-op by default.\r\n }\r\n\r\n onViewportChange(callback: (state: { height: number; stableHeight: number }) => void): () => void {\r\n if (typeof window === 'undefined') {\r\n return () => {};\r\n }\r\n\r\n const fallbackHeight = () => window.visualViewport?.height ?? window.innerHeight;\r\n\r\n const notify = () => {\r\n const height = fallbackHeight();\r\n callback({ height, stableHeight: height });\r\n };\r\n\r\n notify();\r\n\r\n const onResize = () => notify();\r\n window.visualViewport?.addEventListener('resize', onResize);\r\n window.visualViewport?.addEventListener('scroll', onResize);\r\n window.addEventListener('resize', onResize);\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', onResize);\r\n window.visualViewport?.removeEventListener('scroll', onResize);\r\n window.removeEventListener('resize', onResize);\r\n };\r\n }\r\n\r\n getViewportInsets(): MiniAppViewportInsets | undefined {\r\n return undefined;\r\n }\r\n\r\n shareMessage(_message: string): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n shareUrl(_url: string, _text: string): void {\r\n // No-op by default.\r\n }\r\n\r\n\r\n async downloadFile(url: string, filename: string): Promise<void> {\r\n await triggerFileDownload(url, filename);\r\n }\r\n\r\n shareStory(_mediaUrl: string, _options?: MiniAppShareStoryOptions): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n trackConversionEvent(_event: string, _payload?: Record<string, unknown>): void {\r\n // No-op by default; platform-specific adapters can override.\r\n }\r\n\r\n trackPixelEvent(_event: string, _payload?: Record<string, unknown>): void {\r\n // No-op by default; platform-specific adapters can override.\r\n }\r\n\r\n copyTextToClipboard(text: string): Promise<void> {\r\n return navigator.clipboard.writeText(text).catch(() => {\r\n // Fallback for older browsers\r\n const textarea = document.createElement('textarea');\r\n textarea.value = text;\r\n textarea.style.position = 'fixed'; // Prevent scrolling to bottom of page in MS Edge.\r\n document.body.appendChild(textarea);\r\n textarea.focus();\r\n textarea.select();\r\n try {\r\n document.execCommand('copy');\r\n } catch {\r\n // Ignore errors\r\n }\r\n document.body.removeChild(textarea);\r\n });\r\n }\r\n\r\n computeSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n const viewportInsets = this.getViewportInsets?.();\r\n const cssSafeArea = readCssSafeArea();\r\n\r\n return computeCombinedSafeArea({\r\n environment: this.environment.safeArea,\r\n viewport: viewportInsets,\r\n css: cssSafeArea,\r\n });\r\n }\r\n\r\n bindCssVariables(_mapper?: (key: string) => string): void {\r\n // No-op by default.\r\n }\r\n\r\n vibrateImpact(_style: ImpactHapticFeedbackStyle): void {\r\n navigator.vibrate?.(10);\r\n }\r\n\r\n vibrateNotification(_type: NotificationHapticFeedbackType): void {\r\n navigator.vibrate?.([10, 30, 10]);\r\n }\r\n\r\n vibrateSelection(): void {\r\n navigator.vibrate?.(5);\r\n }\r\n\r\n onViewHide(_callback: () => void): () => void {\r\n return () => {};\r\n }\r\n\r\n onViewRestore(_callback: () => void): () => void {\r\n return () => {};\r\n }\r\n\r\n async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\r\n const message = [options.title, options.message].filter(Boolean).join('\\n\\n');\r\n window.alert(message);\r\n const firstButton = options.buttons?.[0];\r\n return firstButton?.id ?? 'ok';\r\n }\r\n\r\n async scanQRCode(_options?: MiniAppQrScanOptions): Promise<string | null> {\r\n return null;\r\n }\r\n\r\n async requestPhone(): Promise<string | null> {\r\n return null;\r\n }\r\n\r\n async requestNotificationsPermission(): Promise<boolean> {\r\n if (typeof Notification === 'undefined' || typeof Notification.requestPermission !== 'function') {\r\n return false;\r\n }\r\n\r\n try {\r\n const permission = await Notification.requestPermission();\r\n return permission === 'granted';\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] requestNotificationsPermission fallback failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async addToHomeScreen(): Promise<boolean> {\r\n // Браузерный универсальный промпт отсутствует\r\n return false;\r\n }\r\n\r\n async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\r\n return 'unknown';\r\n }\r\n\r\n async denyNotifications(): Promise<boolean> {\r\n // Браузер не предоставляет API для принудительного отключения ранее выданного разрешения\r\n // уведомлений, поэтому по умолчанию возвращаем false.\r\n console.warn('[tvm-app-adapter] denyNotifications fallback is not supported in this environment.');\r\n return false;\r\n }\r\n\r\n enableVerticalSwipes(): void {\r\n // No-op by default.\r\n }\r\n\r\n disableVerticalSwipes(): void {\r\n // No-op by default.\r\n }\r\n\r\n protected notifyEnvironmentChanged(): void {\r\n for (const listener of this.listeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] environment listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n protected onDestroy(): void {\r\n // Subclasses can override to run synchronous teardown before shared disposables flush.\r\n }\r\n\r\n protected registerDisposable(disposable: Disposable): () => void {\r\n return this.disposables.add(disposable);\r\n }\r\n\r\n protected readCustomUrlParams(isServiceParam?: (key: string) => boolean): Record<string, unknown> {\r\n if (typeof window === 'undefined') {\r\n return {};\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n const append = (source: URLSearchParams) => {\r\n const keys = new Set<string>();\r\n for (const [key] of source.entries()) {\r\n keys.add(key);\r\n }\r\n\r\n for (const key of keys) {\r\n if (isServiceParam?.(key)) {\r\n continue;\r\n }\r\n\r\n const values = source.getAll(key);\r\n if (!values.length) {\r\n continue;\r\n }\r\n\r\n result[key] = values.length === 1 ? values[0] : values;\r\n }\r\n };\r\n\r\n append(new URLSearchParams(window.location.search));\r\n\r\n const hash = window.location.hash.startsWith('#')\r\n ? window.location.hash.slice(1)\r\n : window.location.hash;\r\n\r\n if (hash && hash.includes('=')) {\r\n append(new URLSearchParams(hash));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private applyScrollGuards(): (() => void) | undefined {\r\n if (typeof document === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n const html = document.documentElement;\r\n const body = document.body;\r\n if (!html || !body) {\r\n return undefined;\r\n }\r\n\r\n const prevHtmlOverscroll = html.style.overscrollBehaviorY;\r\n const prevBodyOverscroll = body.style.overscrollBehaviorY;\r\n const prevBodyTouchAction = body.style.touchAction;\r\n\r\n html.style.overscrollBehaviorY = 'none';\r\n body.style.overscrollBehaviorY = 'none';\r\n body.style.touchAction = 'manipulation';\r\n\r\n return () => {\r\n html.style.overscrollBehaviorY = prevHtmlOverscroll;\r\n body.style.overscrollBehaviorY = prevBodyOverscroll;\r\n body.style.touchAction = prevBodyTouchAction;\r\n };\r\n }\r\n}\r\n","import type {\n ImpactHapticFeedbackStyle,\n NotificationHapticFeedbackType,\n} from '@tma.js/bridge';\n\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\nimport type {\n MiniAppCapability,\n MiniAppEnvironmentInfo,\n MiniAppInitOptions,\n MiniAppLaunchParams,\n MiniAppPopupOptions,\n MiniAppQrScanOptions,\n} from '@/types/miniApp';\n\ntype MaxBackButtonPayload = {\n needConfirmation?: boolean;\n};\n\ninterface MaxBackButton {\n isVisible?: boolean;\n show?: () => void;\n hide?: () => void;\n onClick?: (handler: (payload: MaxBackButtonPayload) => void) => (() => void) | void;\n offClick?: (handler: (payload: MaxBackButtonPayload) => void) => void;\n}\n\ninterface MaxHapticFeedback {\n impactOccurred?: (style: ImpactHapticFeedbackStyle, disableVibrationFallback?: boolean) => Promise<unknown>;\n notificationOccurred?: (\n type: NotificationHapticFeedbackType,\n disableVibrationFallback?: boolean,\n ) => Promise<unknown>;\n selectionChanged?: (disableVibrationFallback?: boolean) => Promise<unknown>;\n}\n\ninterface MaxWebApp {\n version?: string;\n platform?: string;\n initData?: string;\n initDataUnsafe?: {\n query_id?: string;\n start_param?: string;\n user?: {\n language_code?: string;\n first_name?: string;\n last_name?: string;\n username?: string;\n };\n };\n ready?: () => void;\n close?: () => void;\n enableClosingConfirmation?: () => void;\n disableClosingConfirmation?: () => void;\n openExternalLink?: (url: string) => void;\n openMaxLink?: (url: string) => void;\n downloadFile?: (url: string, fileName: string) => Promise<unknown>;\n shareContent?: (payload: { text: string; link?: string; requestId: string }) => Promise<unknown>;\n shareMaxContent?: (payload: { text: string; link?: string; requestId: string }) => Promise<unknown>;\n openCodeReader?: (allowFileSelect?: boolean) => Promise<{ requestId: string; value?: string }>;\n requestPhoneNumber?: () => Promise<unknown>;\n BackButton?: MaxBackButton;\n HapticFeedback?: MaxHapticFeedback;\n}\n\ntype MaxPhoneRequestEventDetail = {\n providePromise: (promise: Promise<unknown>) => void;\n};\n\nfunction getMaxBridge(): MaxWebApp | undefined {\n return (window as typeof window & { WebApp?: MaxWebApp }).WebApp;\n}\n\nexport class MaxMiniAppAdapter extends BaseMiniAppAdapter {\n private readonly backHandlers = new Map<() => void, () => void>();\n private initData?: string;\n private initDataUnsafe?: MaxWebApp['initDataUnsafe'];\n\n constructor() {\n super('max');\n }\n\n override async init(_options?: MiniAppInitOptions): Promise<void> {\n if (this.ready) {\n return;\n }\n\n const bridge = getMaxBridge();\n bridge?.ready?.();\n\n this.initData = bridge?.initData;\n this.initDataUnsafe = bridge?.initDataUnsafe;\n\n const environment: MiniAppEnvironmentInfo = {\n platform: 'max',\n sdkVersion: bridge?.version,\n appVersion: bridge?.version,\n languageCode: bridge?.initDataUnsafe?.user?.language_code,\n isWebView: true,\n };\n\n this.environment = environment;\n this.ready = true;\n }\n\n override supports(capability: MiniAppCapability): boolean {\n const bridge = getMaxBridge();\n\n switch (capability) {\n case 'haptics':\n return Boolean(bridge?.HapticFeedback?.impactOccurred);\n case 'qrScanner':\n return typeof bridge?.openCodeReader === 'function';\n case 'closeApp':\n return typeof bridge?.close === 'function';\n case 'backButton':\n return Boolean(bridge?.BackButton?.onClick);\n case 'backButtonVisibility':\n return Boolean(bridge?.BackButton?.show && bridge.BackButton.hide);\n case 'openInternalLink':\n return typeof bridge?.openMaxLink === 'function';\n case 'downloadFile':\n return typeof bridge?.downloadFile === 'function';\n case 'requestPhone':\n if (!bridge) {\n return false;\n }\n return typeof bridge.requestPhoneNumber === 'function' || typeof window !== 'undefined';\n case 'popup':\n return false;\n default:\n return false;\n }\n }\n\n override getInitData(): string | undefined {\n return this.initData;\n }\n\n override getLaunchParams(): MiniAppLaunchParams | undefined {\n return {\n launchParams: this.initDataUnsafe,\n customLaunchParams: this.readCustomUrlParams(),\n };\n }\n\n override onBackButton(callback: () => void): () => void {\n const bridge = getMaxBridge();\n if (!bridge?.BackButton?.onClick) {\n return super.onBackButton(callback);\n }\n\n const wrapped = () => callback();\n const disposer = bridge.BackButton.onClick(wrapped);\n bridge.BackButton.show?.();\n\n const removeFromBag = this.registerDisposable(() => {\n if (typeof disposer === 'function') {\n disposer();\n } else {\n bridge.BackButton?.offClick?.(wrapped);\n }\n this.backHandlers.delete(callback);\n if (!this.backHandlers.size) {\n bridge.BackButton?.hide?.();\n }\n });\n\n this.backHandlers.set(callback, removeFromBag);\n return removeFromBag;\n }\n\n override setBackButtonVisibility(visible: boolean): void {\n const bridge = getMaxBridge();\n if (!bridge?.BackButton) {\n return;\n }\n visible ? bridge.BackButton.show?.() : bridge.BackButton.hide?.();\n }\n\n override async openExternalLink(url: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.openExternalLink) {\n bridge.openExternalLink(url);\n return;\n }\n await super.openExternalLink(url);\n }\n\n override async openInternalLink(url: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.openMaxLink) {\n bridge.openMaxLink(url);\n return;\n }\n await super.openInternalLink(url);\n }\n\n override async closeApp(): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.close) {\n bridge.close();\n return;\n }\n await super.closeApp();\n }\n\n override vibrateImpact(style: ImpactHapticFeedbackStyle): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.impactOccurred) {\n super.vibrateImpact(style);\n return;\n }\n void bridge.HapticFeedback.impactOccurred(style).catch((error) => {\n console.warn('[mini-app-template] MAX impact haptic failed:', error);\n });\n }\n\n override vibrateNotification(type: NotificationHapticFeedbackType): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.notificationOccurred) {\n super.vibrateNotification(type);\n return;\n }\n void bridge.HapticFeedback.notificationOccurred(type).catch((error) => {\n console.warn('[mini-app-template] MAX notification haptic failed:', error);\n });\n }\n\n override vibrateSelection(): void {\n const bridge = getMaxBridge();\n if (!bridge?.HapticFeedback?.selectionChanged) {\n super.vibrateSelection();\n return;\n }\n void bridge.HapticFeedback.selectionChanged().catch((error) => {\n console.warn('[mini-app-template] MAX selection haptic failed:', error);\n });\n }\n\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\n const bridge = getMaxBridge();\n if (!bridge?.openCodeReader) {\n return super.scanQRCode(options);\n }\n\n try {\n const result = await bridge.openCodeReader(options?.closeOnCapture !== false);\n return result?.value ?? null;\n } catch (error) {\n console.warn('[mini-app-template] MAX QR scanner failed:', error);\n return null;\n }\n }\n\n override async requestPhone(): Promise<string | null> {\n const bridge = getMaxBridge();\n if (bridge?.requestPhoneNumber) {\n try {\n const response = await bridge.requestPhoneNumber();\n return this.extractPhone(response);\n } catch (error) {\n console.warn('[mini-app-template] MAX requestPhone failed:', error);\n return null;\n }\n }\n\n return this.requestPhoneViaEvent();\n }\n\n override async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\n // MAX bridge does not expose a native popup API yet.\n return super.showPopup(options);\n }\n\n override async downloadFile(url: string, filename: string): Promise<void> {\n const bridge = getMaxBridge();\n if (bridge?.downloadFile) {\n try {\n await bridge.downloadFile(url, filename);\n return;\n } catch (error) {\n console.warn('[mini-app-template] MAX downloadFile failed:', error);\n }\n }\n\n await super.downloadFile(url, filename);\n }\n\n private async requestPhoneViaEvent(): Promise<string | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n let providedPromise: Promise<unknown> | undefined;\n const detail: MaxPhoneRequestEventDetail = {\n providePromise: (promise) => {\n providedPromise = promise;\n },\n };\n\n window.dispatchEvent(new CustomEvent<MaxPhoneRequestEventDetail>('WebAppRequestPhone', { detail }));\n\n if (!providedPromise) {\n console.warn('[mini-app-template] MAX requestPhone not handled: native promise missing');\n return null;\n }\n\n try {\n const result = await providedPromise;\n return this.extractPhone(result);\n } catch (error) {\n console.warn('[mini-app-template] MAX requestPhone promise rejected:', error);\n return null;\n }\n }\n\n private extractPhone(data: unknown): string | null {\n if (typeof data === 'string') {\n return data || null;\n }\n\n if (!data || typeof data !== 'object') {\n return null;\n }\n\n const directPhone = (data as { phone?: unknown; phone_number?: unknown; phoneNumber?: unknown }).phone\n ?? (data as { phone_number?: unknown }).phone_number\n ?? (data as { phoneNumber?: unknown }).phoneNumber;\n\n if (typeof directPhone === 'string' && directPhone) {\n return directPhone;\n }\n\n const contact = (data as { contact?: unknown }).contact;\n if (contact && typeof contact === 'object') {\n const nested = (contact as {\n phone?: unknown;\n phone_number?: unknown;\n phoneNumber?: unknown;\n }).phone\n ?? (contact as { phone_number?: unknown }).phone_number\n ?? (contact as { phoneNumber?: unknown }).phoneNumber;\n\n if (typeof nested === 'string' && nested) {\n return nested;\n }\n }\n\n return null;\n }\n\n protected override onDestroy(): void {\n this.backHandlers.clear();\n super.onDestroy();\n }\n}\n","import { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\nimport type { MiniAppCapability } from '@/types/miniApp';\nimport { requestShellPushPermission } from '@/lib/shell';\n\nexport class ShellMiniAppAdapter extends BaseMiniAppAdapter {\n constructor(platform: 'shell_ios' | 'shell_android') {\n super(platform, {\n isWebView: true,\n hasNativeQR: true,\n hasPush: true,\n hasWidgets: true,\n });\n }\n\n override supports(capability: MiniAppCapability): boolean | Promise<boolean> {\n switch (capability) {\n case 'qrScanner':\n return true;\n case 'notifications':\n return true;\n default:\n return super.supports(capability);\n }\n }\n\n override async scanQRCode(): Promise<string | null> {\n try {\n const value = await this.shell.openNativeQR();\n return value ?? null;\n } catch (error) {\n console.warn('[tvm-app-adapter] shell.openNativeQR failed:', error);\n return null;\n }\n }\n\n override async requestNotificationsPermission(): Promise<boolean> {\n return requestShellPushPermission();\n }\n}\n","import type {\r\n ImpactHapticFeedbackStyle,\r\n NotificationHapticFeedbackType,\r\n} from '@tma.js/bridge';\r\n\r\nimport {\r\n backButton,\r\n emitEvent,\r\n hapticFeedback,\r\n init as initSDK,\r\n initData,\r\n mockTelegramEnv,\r\n miniApp,\r\n openLink,\r\n popup,\r\n qrScanner,\r\n postEvent,\r\n retrieveLaunchParams,\r\n setDebug,\r\n themeParams,\r\n viewport,\r\n} from '@tma.js/sdk-react';\r\nimport {\r\n decodeStartParam,\r\n closingBehavior,\r\n requestContact,\r\n requestPhoneAccess,\r\n swipeBehavior,\r\n viewport as rawViewport,\r\n shareURL as shareURLSdk,\r\n copyTextToClipboard as copyTextToClipboardSdk,\r\n downloadFile as downloadFileSdk,\r\n shareStory as shareStorySdk,\r\n addToHomeScreen as addToHomeScreenSdk,\r\n checkHomeScreenStatus as checkHomeScreenStatusSdk,\r\n on,\r\n off,\r\n} from '@tma.js/sdk';\r\n\r\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\r\nimport type {\r\n MiniAppCapability,\r\n MiniAppEnvironmentInfo,\r\n MiniAppInitOptions,\r\n MiniAppLaunchParams,\r\n MiniAppPopupOptions,\r\n MiniAppQrScanOptions,\r\n MiniAppShareStoryOptions,\r\n MiniAppViewportInsets,\r\n} from '@/types/miniApp';\r\nimport { ensureFeature, isFeatureAvailable } from '@/lib/features';\r\nimport { bindViewportCssVars, ensureViewportMounted } from '@/lib/viewport';\r\nexport class TelegramMiniAppAdapter extends BaseMiniAppAdapter {\r\n private readonly backHandlers = new Map<() => void, () => void>();\r\n private cssVariablesBound = false;\r\n private readonly appearanceListeners = new Set<\r\n (appearance: 'dark' | 'light' | undefined) => void\r\n >();\r\n private appearanceWatcherDispose?: () => void;\r\n private readonly viewHideListeners = new Set<() => void>();\r\n private readonly viewRestoreListeners = new Set<() => void>();\r\n private activeWatcherDispose?: () => void;\r\n\r\n constructor() {\r\n super('telegram');\r\n }\r\n\r\n override async init(options?: MiniAppInitOptions): Promise<void> {\r\n if (this.ready) {\r\n return;\r\n }\r\n\r\n const debug = Boolean(options?.debug);\r\n const eruda = Boolean(options?.eruda);\r\n const mockForMacOS = Boolean(options?.mockForMacOS);\r\n\r\n setDebug(debug);\r\n initSDK();\r\n\r\n if (!miniApp.isSupported()) {\r\n console.warn('[tvm-app-adapter] miniApp feature is not supported; falling back to limited mode.');\r\n }\r\n\r\n if (eruda) {\r\n void import('eruda').then(({ default: erudaInstance }) => {\r\n erudaInstance.init();\r\n erudaInstance.position({ x: window.innerWidth - 150, y: window.innerHeight - 150 });\r\n });\r\n }\r\n\r\n if (mockForMacOS) {\r\n let firstThemeSent = false;\r\n mockTelegramEnv({\r\n onEvent(event, next) {\r\n if (event.name === 'web_app_request_theme') {\r\n let tp: Record<string, string | undefined> = {};\r\n if (firstThemeSent) {\r\n tp = themeParams.state();\r\n } else {\r\n firstThemeSent = true;\r\n tp ||= retrieveLaunchParams().tgWebAppThemeParams;\r\n }\r\n return emitEvent('theme_changed', { theme_params: tp as Record<string, `#${string}` | undefined> });\r\n }\r\n\r\n if (event.name === 'web_app_request_safe_area') {\r\n return emitEvent('safe_area_changed', { left: 0, top: 0, right: 0, bottom: 0 });\r\n }\r\n\r\n next();\r\n },\r\n });\r\n }\r\n\r\n initData.restore();\r\n\r\n miniApp.ready();\r\n\r\n const launchParams = retrieveLaunchParams();\r\n let appearance: string | undefined;\r\n try {\r\n appearance = miniApp.isDark() ? 'dark' : 'light';\r\n } catch {\r\n appearance = undefined;\r\n }\r\n\r\n const environment: MiniAppEnvironmentInfo = {\r\n platform: 'telegram',\r\n sdkVersion: launchParams.tgWebAppVersion,\r\n languageCode: initData.user()?.language_code,\r\n appearance,\r\n isWebView: true,\r\n };\r\n this.environment = environment;\r\n this.notifyAppearance(environment.appearance as 'dark' | 'light' | undefined);\r\n\r\n backButton.mount.ifAvailable();\r\n\r\n if (miniApp.mount.isAvailable()) {\r\n themeParams.mount();\r\n miniApp.mount();\r\n this.bindCssVariables();\r\n }\r\n\r\n await this.prepareViewport();\r\n\r\n this.setupAppearanceWatcher();\r\n this.setupActiveWatcher();\r\n\r\n this.ready = true;\r\n }\r\n\r\n override async setColors(colors: { header?: string; background?: string; footer?: string }): Promise<void> {\r\n const fallback: { header?: string; background?: string; footer?: string } = {};\r\n\r\n if (colors.header) {\r\n if (miniApp.setHeaderColor.isAvailable()) {\r\n const headerColor = miniApp.setHeaderColor.supports?.('rgb') ? colors.header : 'bg_color';\r\n const { ok } = ensureFeature(miniApp.setHeaderColor, headerColor);\r\n if (!ok) {\r\n fallback.header = colors.header;\r\n }\r\n } else {\r\n fallback.header = colors.header;\r\n }\r\n }\r\n\r\n if (colors.background) {\r\n if (miniApp.setBgColor.isAvailable()) {\r\n const { ok } = ensureFeature(miniApp.setBgColor, colors.background);\r\n if (!ok) {\r\n fallback.background = colors.background;\r\n }\r\n } else {\r\n fallback.background = colors.background;\r\n }\r\n }\r\n\r\n if (colors.footer) {\r\n if (miniApp.setBgColor.isAvailable()) {\r\n const { ok } = ensureFeature(miniApp.setBottomBarColorFp, colors.footer);\r\n if (!ok) {\r\n fallback.footer = colors.footer;\r\n }\r\n } else {\r\n fallback.footer = colors.footer;\r\n }\r\n }\r\n\r\n if (fallback.header || fallback.background) {\r\n await super.setColors(fallback);\r\n }\r\n }\r\n\r\n override copyTextToClipboard(text: string): Promise<void> {\r\n return copyTextToClipboardSdk(text);\r\n }\r\n\r\n override onBackButton(callback: () => void): () => void {\r\n if (!backButton.isSupported()) {\r\n return super.onBackButton(callback);\r\n }\r\n\r\n const dispose = backButton.onClick(() => callback());\r\n\r\n const removeFromBag = this.registerDisposable(() => {\r\n if (typeof dispose === 'function') {\r\n dispose();\r\n }\r\n this.backHandlers.delete(callback);\r\n if (!this.backHandlers.size) {\r\n backButton.hide();\r\n }\r\n });\r\n\r\n this.backHandlers.set(callback, removeFromBag);\r\n return removeFromBag;\r\n }\r\n\r\n override async openExternalLink(url: string): Promise<void> {\r\n try {\r\n openLink(url, { tryInstantView: true });\r\n return;\r\n } catch {\r\n // Fall back to default behaviour if Telegram specific API is not available.\r\n }\r\n await super.openExternalLink(url);\r\n }\r\n\r\n override async openInternalLink(url: string): Promise<void> {\r\n postEvent('web_app_open_tg_link', { path_full: url });\r\n }\r\n\r\n enableDebug(state: boolean): void {\r\n try {\r\n state ? closingBehavior.enableConfirmation() : closingBehavior.disableConfirmation();\r\n } catch {\r\n // Ignore unsupported environments.\r\n }\r\n }\r\n\r\n override supports(capability: MiniAppCapability): boolean {\r\n switch (capability) {\r\n case 'haptics':\r\n return isFeatureAvailable(hapticFeedback.selectionChanged);\r\n case 'popup':\r\n return isFeatureAvailable(popup.show);\r\n case 'qrScanner':\r\n return isFeatureAvailable(qrScanner.open);\r\n case 'closeApp':\r\n return isFeatureAvailable(miniApp.close);\r\n case 'backButton':\r\n return backButton.isSupported();\r\n case 'backButtonVisibility':\r\n return backButton.hide.isSupported();\r\n case 'bindCssVariables':\r\n return true;\r\n case 'openExternalLink':\r\n return isFeatureAvailable(openLink);\r\n case 'openInternalLink':\r\n return true;\r\n case 'requestFullscreen':\r\n return Boolean(\r\n (typeof rawViewport.requestFullscreen === 'function')\r\n || viewport.requestFullscreen?.isAvailable?.(),\r\n );\r\n case 'verticalSwipes':\r\n return Boolean(\r\n swipeBehavior.enableVertical.isAvailable()\r\n || swipeBehavior.disableVertical.isAvailable(),\r\n );\r\n case 'viewVisibility':\r\n return true;\r\n case 'shareUrl':\r\n return typeof shareURLSdk === 'function';\r\n case 'shareStory':\r\n return typeof shareStorySdk === 'function';\r\n case 'copyTextToClipboard':\r\n return typeof copyTextToClipboardSdk === 'function';\r\n case 'downloadFile':\r\n return typeof downloadFileSdk === 'function';\r\n case 'addToHomeScreen':\r\n return typeof addToHomeScreenSdk?.isAvailable === 'function'\r\n ? addToHomeScreenSdk.isAvailable()\r\n : typeof addToHomeScreenSdk === 'function';\r\n case 'checkHomeScreenStatus':\r\n return typeof checkHomeScreenStatusSdk === 'function';\r\n case 'requestPhone': {\r\n return Boolean(isFeatureAvailable(requestPhoneAccess) || isFeatureAvailable(requestContact));\r\n }\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n override bindCssVariables(mapper?: (key: string) => string): void {\r\n if (this.cssVariablesBound) {\r\n return;\r\n }\r\n\r\n try {\r\n themeParams.bindCssVars(mapper);\r\n this.cssVariablesBound = true;\r\n } catch (error) {\r\n if (error instanceof Error && /css variables are already bound/i.test(error.message)) {\r\n this.cssVariablesBound = true;\r\n return;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n override vibrateImpact(style: ImpactHapticFeedbackStyle): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.impactOccurred(style);\r\n }\r\n }\r\n\r\n override vibrateNotification(type: NotificationHapticFeedbackType): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.notificationOccurred(type);\r\n }\r\n }\r\n\r\n override vibrateSelection(): void {\r\n if (this.supports('haptics')) {\r\n hapticFeedback.selectionChanged();\r\n }\r\n }\r\n\r\n override async showPopup(options: MiniAppPopupOptions): Promise<string | null> {\r\n const popupResult = ensureFeature(popup.show, {\r\n title: options.title,\r\n message: options.message,\r\n buttons: options.buttons?.map((button) => ({\r\n id: button.id,\r\n text: button.text ?? button.id,\r\n type: button.type ?? 'default',\r\n })),\r\n });\r\n\r\n if (!popupResult.ok) {\r\n return super.showPopup(options);\r\n }\r\n\r\n const response = await popupResult.value;\r\n return response ?? null;\r\n }\r\n\r\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\r\n let result: string | null = null;\r\n const closeOnCapture = options?.closeOnCapture ?? true;\r\n\r\n const qrScannerResult = ensureFeature(qrScanner.open, {\r\n onCaptured: (qr) => {\r\n result = qr;\r\n if (closeOnCapture) {\r\n void ensureFeature(qrScanner.close);\r\n }\r\n },\r\n });\r\n\r\n if (!qrScannerResult.ok) {\r\n return super.scanQRCode(options);\r\n }\r\n\r\n await qrScannerResult.value;\r\n\r\n return result;\r\n }\r\n\r\n override async closeApp(): Promise<void> {\r\n const closeResult = ensureFeature(miniApp.close);\r\n if (closeResult.ok) {\r\n return;\r\n }\r\n\r\n await super.closeApp();\r\n }\r\n\r\n override getInitData(): string | undefined {\r\n try {\r\n return initData.raw();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override getLaunchParams(): MiniAppLaunchParams | undefined {\r\n const customFromUrl = this.readCustomUrlParams((key) => key.toLowerCase().startsWith('tgwebapp'));\r\n let customFromStartParam: Record<string, unknown> = {};\r\n\r\n try {\r\n const launchParams = retrieveLaunchParams() as { tgWebAppStartParam?: unknown };\r\n const startParam = launchParams.tgWebAppStartParam;\r\n if (typeof startParam === 'string' && startParam) {\r\n customFromStartParam = this.normalizeDecodedStartParam(startParam);\r\n }\r\n\r\n return {\r\n launchParams,\r\n customLaunchParams: {\r\n ...customFromUrl,\r\n ...customFromStartParam,\r\n },\r\n };\r\n } catch {\r\n return {\r\n customLaunchParams: {\r\n ...customFromUrl,\r\n ...customFromStartParam,\r\n },\r\n };\r\n }\r\n }\r\n\r\n override decodeStartParam(param: string): unknown {\r\n try {\r\n return decodeStartParam(param);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override requestFullscreen(): void {\r\n void this.requestFullscreenInternal();\r\n }\r\n\r\n override getViewportInsets(): MiniAppViewportInsets | undefined {\r\n try {\r\n const safeArea = viewport.safeAreaInsets();\r\n const contentSafeArea = viewport.contentSafeAreaInsets();\r\n return {\r\n safeArea,\r\n contentSafeArea,\r\n };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n override onViewportChange(callback: (state: { height: number; stableHeight: number }) => void): () => void {\r\n const disposers: Array<() => void> = [];\r\n const fallbackHeight = () => (typeof window !== 'undefined'\r\n ? (window.visualViewport?.height ?? window.innerHeight)\r\n : 0);\r\n\r\n const notify = (state?: { height?: number; stableHeight?: number }) => {\r\n const heightCandidate = state?.height ?? this.safeHeightFromSdk();\r\n const stableCandidate = state?.stableHeight ?? this.stableHeightFromSdk();\r\n\r\n const height = Number.isFinite(heightCandidate) ? (heightCandidate as number) : fallbackHeight();\r\n const stableHeight = Number.isFinite(stableCandidate) && (stableCandidate as number) > 0\r\n ? (stableCandidate as number)\r\n : height;\r\n\r\n callback({ height, stableHeight });\r\n };\r\n\r\n const ensureMounted = async () => {\r\n try {\r\n await ensureViewportMounted(this.getViewportMountOptions());\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] ensureViewportMounted failed:', error);\r\n }\r\n };\r\n\r\n void ensureMounted().finally(() => notify());\r\n\r\n const { sdkViewport } = this.getViewportMountOptions();\r\n\r\n if (typeof sdkViewport.on === 'function') {\r\n try {\r\n const off = sdkViewport.on('change', (next) => notify(next as { height?: number; stableHeight?: number }));\r\n if (typeof off === 'function') {\r\n disposers.push(off);\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] viewport.on(change) subscription failed:', error);\r\n }\r\n }\r\n\r\n try {\r\n if (typeof sdkViewport.height?.sub === 'function') {\r\n disposers.push(sdkViewport.height.sub(() => notify()));\r\n }\r\n if (typeof sdkViewport.stableHeight?.sub === 'function') {\r\n disposers.push(sdkViewport.stableHeight.sub(() => notify()));\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] viewport signal subscriptions failed:', error);\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n const onResize = () => notify();\r\n window.visualViewport?.addEventListener('resize', onResize);\r\n window.addEventListener('resize', onResize);\r\n disposers.push(() => {\r\n window.visualViewport?.removeEventListener('resize', onResize);\r\n window.removeEventListener('resize', onResize);\r\n });\r\n }\r\n\r\n return () => {\r\n disposers.forEach((dispose) => {\r\n try {\r\n dispose();\r\n } catch {\r\n /* ignore */\r\n }\r\n });\r\n };\r\n }\r\n\r\n override onAppearanceChange(\r\n callback: (appearance: 'dark' | 'light' | undefined) => void,\r\n ): () => void {\r\n this.appearanceListeners.add(callback);\r\n callback(this.environment.appearance as 'dark' | 'light' | undefined);\r\n return () => {\r\n this.appearanceListeners.delete(callback);\r\n };\r\n }\r\n\r\n override setBackButtonVisibility(visible: boolean): void {\r\n if (!backButton.isSupported()) {\r\n return;\r\n }\r\n\r\n if (visible) {\r\n backButton.show();\r\n } else {\r\n backButton.hide();\r\n }\r\n }\r\n\r\n override enableVerticalSwipes(): void {\r\n try {\r\n const sdkSwipe = swipeBehavior as typeof swipeBehavior & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void;\r\n enableVertical?: () => void;\r\n };\r\n\r\n if (typeof sdkSwipe.isSupported === 'function' && sdkSwipe.isSupported()) {\r\n if (typeof sdkSwipe.isMounted === 'function' && !sdkSwipe.isMounted()) {\r\n sdkSwipe.mount?.();\r\n }\r\n sdkSwipe.enableVertical?.();\r\n } else if (swipeBehavior.enableVertical.isAvailable()) {\r\n swipeBehavior.enableVertical();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] enableVerticalSwipes failed:', error);\r\n }\r\n }\r\n\r\n override disableVerticalSwipes(): void {\r\n try {\r\n const sdkSwipe = swipeBehavior as typeof swipeBehavior & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void;\r\n disableVertical?: () => void;\r\n };\r\n\r\n if (typeof sdkSwipe.isSupported === 'function' && sdkSwipe.isSupported()) {\r\n if (typeof sdkSwipe.isMounted === 'function' && !sdkSwipe.isMounted()) {\r\n sdkSwipe.mount?.();\r\n }\r\n sdkSwipe.disableVertical?.();\r\n } else if (swipeBehavior.disableVertical.isAvailable()) {\r\n swipeBehavior.disableVertical();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] disableVerticalSwipes failed:', error);\r\n }\r\n }\r\n\r\n override onViewHide(callback: () => void): () => void {\r\n this.viewHideListeners.add(callback);\r\n return () => {\r\n this.viewHideListeners.delete(callback);\r\n };\r\n }\r\n\r\n override onViewRestore(callback: () => void): () => void {\r\n this.viewRestoreListeners.add(callback);\r\n return () => {\r\n this.viewRestoreListeners.delete(callback);\r\n };\r\n }\r\n\r\n override shareUrl(url: string, text?: string): void {\r\n return shareURLSdk(url, text);\r\n }\r\n\r\n override async downloadFile(url: string, filename: string): Promise<void> {\r\n const result = ensureFeature(downloadFileSdk, url, filename);\r\n if (result.ok) {\r\n try {\r\n await result.value;\r\n return;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram downloadFile failed:', error);\r\n }\r\n }\r\n\r\n await super.downloadFile(url, filename);\r\n }\r\n\r\n override async shareStory(mediaUrl: string, options?: MiniAppShareStoryOptions): Promise<void> {\r\n const text = options?.telegram?.text ?? options?.text;\r\n const widgetLink = options?.telegram?.widgetLink\r\n ?? (options?.link\r\n ? {\r\n url: options.link.url,\r\n ...(options.link.name ? { name: options.link.name } : {}),\r\n }\r\n : undefined);\r\n\r\n shareStorySdk(mediaUrl, {\r\n ...(text ? { text } : {}),\r\n ...(widgetLink ? { widgetLink } : {}),\r\n });\r\n }\r\n\r\n override async addToHomeScreen(): Promise<boolean> {\r\n const isAvailable = typeof addToHomeScreenSdk?.isAvailable === 'function'\r\n ? addToHomeScreenSdk.isAvailable()\r\n : true;\r\n\r\n if (!isAvailable) {\r\n return super.addToHomeScreen();\r\n }\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const cleanup = () => {\r\n off('home_screen_added', handleSuccess);\r\n off('home_screen_failed', handleFail);\r\n };\r\n\r\n const handleSuccess = () => {\r\n cleanup();\r\n resolve(true);\r\n };\r\n\r\n const handleFail = () => {\r\n cleanup();\r\n resolve(false);\r\n };\r\n\r\n on('home_screen_added', handleSuccess);\r\n on('home_screen_failed', handleFail);\r\n\r\n try {\r\n addToHomeScreenSdk();\r\n } catch (error) {\r\n cleanup();\r\n console.warn('[tvm-app-adapter] Telegram addToHomeScreen failed:', error);\r\n resolve(false);\r\n }\r\n });\r\n }\r\n\r\n override async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\r\n try {\r\n const status = await checkHomeScreenStatusSdk();\r\n if (typeof status === 'string') {\r\n return status;\r\n }\r\n if (typeof status === 'boolean') {\r\n return status ? 'added' : 'not_added';\r\n }\r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram checkHomeScreenStatus failed:', error);\r\n return 'unknown';\r\n }\r\n }\r\n\r\n override async requestPhone(): Promise<string | null> {\r\n const contactFeature = ensureFeature(requestContact);\r\n if (!contactFeature.ok) {\r\n return super.requestPhone();\r\n }\r\n\r\n if (requestPhoneAccess) {\r\n const accessFeature = ensureFeature(requestPhoneAccess);\r\n if (accessFeature.ok) {\r\n try {\r\n await accessFeature.value;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestPhone access failed:', error);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const result = await contactFeature.value;\r\n if (!result || typeof result !== 'object') {\r\n return null;\r\n }\r\n\r\n const contact = (result as {\r\n contact?: {\r\n phoneNumber?: unknown;\r\n phone_number?: unknown;\r\n phone?: unknown;\r\n };\r\n phoneNumber?: unknown;\r\n phone_number?: unknown;\r\n phone?: unknown;\r\n }).contact;\r\n\r\n const phone = (contact?.phoneNumber ?? contact?.phone_number ?? contact?.phone\r\n ?? (result as { phoneNumber?: unknown }).phoneNumber\r\n ?? (result as { phone_number?: unknown }).phone_number\r\n ?? (result as { phone?: unknown }).phone);\r\n\r\n return typeof phone === 'string' && phone ? phone : null;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestPhone failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private setupAppearanceWatcher(): void {\r\n this.appearanceWatcherDispose?.();\r\n\r\n if (typeof themeParams.isDark?.sub === 'function') {\r\n const disposer = themeParams.isDark.sub(() => {\r\n const appearance = themeParams.isDark() ? 'dark' : 'light';\r\n this.environment.appearance = appearance;\r\n this.notifyAppearance(appearance);\r\n });\r\n this.appearanceWatcherDispose = this.registerDisposable(disposer);\r\n }\r\n }\r\n\r\n private notifyAppearance(appearance: 'dark' | 'light' | undefined): void {\r\n for (const listener of this.appearanceListeners) {\r\n listener(appearance);\r\n }\r\n }\r\n\r\n private setupActiveWatcher(): void {\r\n this.activeWatcherDispose?.();\r\n\r\n const activeSignal = miniApp.isActive as typeof miniApp.isActive & {\r\n sub?: (callback: () => void) => () => void;\r\n };\r\n\r\n const invoke = () => {\r\n try {\r\n const isActive = miniApp.isActive();\r\n if (isActive) {\r\n this.notifyViewRestore();\r\n } else {\r\n this.notifyViewHide();\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] miniApp.isActive() failed:', error);\r\n }\r\n };\r\n\r\n if (typeof activeSignal?.sub === 'function') {\r\n const disposer = activeSignal.sub(() => invoke());\r\n this.activeWatcherDispose = this.registerDisposable(disposer);\r\n invoke();\r\n return;\r\n }\r\n\r\n try {\r\n invoke();\r\n } catch {\r\n // Ignore unsupported environments.\r\n }\r\n }\r\n\r\n private async prepareViewport(): Promise<void> {\r\n try {\r\n await bindViewportCssVars({\r\n ...this.getViewportMountOptions(),\r\n bindCssVars: typeof viewport.bindCssVars === 'function' ? viewport.bindCssVars : undefined,\r\n });\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] prepareViewport failed:', error);\r\n }\r\n }\r\n\r\n private async requestFullscreenInternal(): Promise<void> {\r\n try {\r\n const viewportOptions = this.getViewportMountOptions();\r\n await ensureViewportMounted(viewportOptions);\r\n\r\n const { sdkViewport } = viewportOptions;\r\n\r\n const canUseRaw = typeof sdkViewport.isSupported === 'function' ? sdkViewport.isSupported() : false;\r\n\r\n if (canUseRaw && typeof sdkViewport.requestFullscreen === 'function') {\r\n await sdkViewport.requestFullscreen();\r\n } else if (viewport.requestFullscreen && viewport.requestFullscreen.isAvailable?.()) {\r\n await viewport.requestFullscreen();\r\n } else {\r\n postEvent('web_app_request_fullscreen');\r\n }\r\n\r\n this.disableVerticalSwipes();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] Telegram requestFullscreen failed:', error);\r\n }\r\n }\r\n\r\n private getViewportMountOptions(): {\r\n sdkViewport: typeof rawViewport & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void | Promise<void>;\r\n requestFullscreen?: () => Promise<void> | void;\r\n on?: (event: 'change', cb: (state: { height?: number; stableHeight?: number }) => void) => (() => void) | void;\r\n height?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n stableHeight?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n };\r\n fallbackMount: () => Promise<void>;\r\n } {\r\n const sdkViewport = rawViewport as typeof rawViewport & {\r\n isSupported?: () => boolean;\r\n isMounted?: () => boolean;\r\n mount?: () => void | Promise<void>;\r\n requestFullscreen?: () => Promise<void> | void;\r\n on?: (event: 'change', cb: (state: { height?: number; stableHeight?: number }) => void) => (() => void) | void;\r\n height?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n stableHeight?: (() => number) & { sub?: (cb: () => void) => () => void };\r\n };\r\n\r\n return {\r\n sdkViewport,\r\n fallbackMount: async () => {\r\n if (viewport.mount?.isAvailable?.()) {\r\n await viewport.mount();\r\n }\r\n },\r\n };\r\n }\r\n\r\n private safeHeightFromSdk(): number | undefined {\r\n try {\r\n if (typeof rawViewport.height === 'function') {\r\n return rawViewport.height();\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n private stableHeightFromSdk(): number | undefined {\r\n try {\r\n if (typeof rawViewport.stableHeight === 'function') {\r\n return rawViewport.stableHeight();\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n }\r\n\r\n private notifyViewHide(): void {\r\n for (const listener of this.viewHideListeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] onViewHide listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n private normalizeDecodedStartParam(startParam: string): Record<string, unknown> {\r\n let decoded: unknown;\r\n\r\n try {\r\n decoded = decodeStartParam(startParam);\r\n } catch {\r\n decoded = startParam;\r\n }\r\n\r\n if (decoded && typeof decoded === 'object' && !Array.isArray(decoded)) {\r\n return { ...(decoded as Record<string, unknown>) };\r\n }\r\n\r\n if (typeof decoded === 'string' && decoded) {\r\n const parsed = this.parseQueryString(decoded);\r\n if (Object.keys(parsed).length) {\r\n return parsed;\r\n }\r\n return { startParam: decoded };\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private parseQueryString(value: string): Record<string, unknown> {\r\n const normalized = value.startsWith('?') ? value.slice(1) : value;\r\n const params = new URLSearchParams(normalized);\r\n const result: Record<string, unknown> = {};\r\n\r\n const keys = new Set<string>();\r\n for (const [key] of params.entries()) {\r\n keys.add(key);\r\n }\r\n\r\n for (const key of keys) {\r\n const values = params.getAll(key);\r\n if (!values.length) {\r\n continue;\r\n }\r\n result[key] = values.length === 1 ? values[0] : values;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private notifyViewRestore(): void {\r\n for (const listener of this.viewRestoreListeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] onViewRestore listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n protected override onDestroy(): void {\r\n this.appearanceWatcherDispose?.();\r\n this.appearanceWatcherDispose = undefined;\r\n this.activeWatcherDispose?.();\r\n this.activeWatcherDispose = undefined;\r\n this.appearanceListeners.clear();\r\n this.viewHideListeners.clear();\r\n this.viewRestoreListeners.clear();\r\n this.backHandlers.clear();\r\n super.onDestroy();\r\n }\r\n}\r\n","export type FeatureCallable<T extends (...args: any[]) => unknown> = T & {\n isAvailable?: () => boolean;\n};\n\nexport type FeatureCallResult<T extends (...args: any[]) => unknown> =\n | { ok: true; value: ReturnType<T> }\n | { ok: false };\n\nexport function isFeatureAvailable<T extends (...args: any[]) => unknown>(\n feature: FeatureCallable<T> | T | null | undefined,\n): feature is FeatureCallable<T> {\n if (typeof feature !== 'function') {\n return false;\n }\n\n const candidate = feature as FeatureCallable<T>;\n if (typeof candidate.isAvailable === 'function') {\n try {\n return candidate.isAvailable();\n } catch (error) {\n console.warn('[tvm-app-adapter] feature availability check failed:', error);\n return false;\n }\n }\n\n return true;\n}\n\nexport function ensureFeature<T extends (...args: any[]) => unknown>(\n feature: FeatureCallable<T> | T | null | undefined,\n ...args: Parameters<T>\n): FeatureCallResult<T> {\n if (!isFeatureAvailable(feature as FeatureCallable<T>)) {\n return { ok: false };\n }\n\n try {\n const value = (feature as T)(...args);\n return { ok: true, value };\n } catch (error) {\n console.warn('[tvm-app-adapter] feature call failed:', error);\n return { ok: false };\n }\n}\n","type ViewportController = {\n isSupported?: () => boolean;\n isMounted?: () => boolean;\n mount?: () => void | Promise<void>;\n};\n\nexport interface ViewportMountOptions {\n sdkViewport?: ViewportController;\n fallbackMount?: () => void | Promise<void>;\n}\n\nexport async function ensureViewportMounted(options: ViewportMountOptions): Promise<void> {\n const { sdkViewport, fallbackMount } = options;\n\n if (sdkViewport?.isSupported?.()) {\n if (typeof sdkViewport.isMounted === 'function' && sdkViewport.isMounted()) {\n return;\n }\n\n if (typeof sdkViewport.mount === 'function') {\n await sdkViewport.mount();\n }\n return;\n }\n\n if (typeof fallbackMount === 'function') {\n await fallbackMount();\n }\n}\n\nexport interface ViewportCssBindingOptions extends ViewportMountOptions {\n bindCssVars?: (mapper?: (key: string) => string) => void;\n mapper?: (key: string) => string;\n}\n\nexport async function bindViewportCssVars(options: ViewportCssBindingOptions): Promise<void> {\n await ensureViewportMounted(options);\n\n if (typeof options.bindCssVars !== 'function') {\n return;\n }\n\n try {\n options.bindCssVars(options.mapper);\n } catch (error) {\n if (error instanceof Error && /css variables are already bound/i.test(error.message)) {\n return;\n }\n throw error;\n }\n}\n","import bridge, {\r\n AnyRequestMethodName,\r\n parseURLSearchParamsForGetLaunchParams,\r\n \r\n ShowStoryBoxOptions,\r\n \r\n TapticNotificationType,\r\n \r\n TapticVibrationPowerType,\r\n \r\n type AppearanceType,\r\n type GetLaunchParamsResponse,\r\n type ParentConfigData,\r\n type VKBridgeSubscribeHandler,\r\n} from '@vkontakte/vk-bridge';\r\n\r\nimport { getVkPixelCode } from '@/config/vkAnalytics';\r\nimport { BaseMiniAppAdapter } from '@/adapters/baseAdapter';\r\nimport type {\r\n MiniAppCapability,\r\n MiniAppEnvironmentInfo,\r\n MiniAppInitOptions,\r\n MiniAppLaunchParams,\r\n MiniAppQrScanOptions,\r\n MiniAppShareStoryOptions,\r\n} from '@/types/miniApp';\r\nimport { isBridgeMethodSupported, type BridgeSupportsAsync } from '@/lib/bridge';\r\nimport { computeCombinedSafeArea, createSafeAreaWatcher, readCssSafeArea } from '@/lib/safeArea';\r\n\r\nconst ANALYTICS_EVENT_NAME_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,63}$/i;\r\nconst ANALYTICS_FALLBACK_EVENT = 'VK_ANALYTICS_EVENT';\r\n\r\ntype VkAnalyticsMethod = 'VKWebAppConversionHit' | 'VKWebAppRetargetingPixel';\r\ntype VkAnalyticsEnvelope = {\r\n method: VkAnalyticsMethod;\r\n params: Record<string, unknown>;\r\n};\r\n\r\nexport class VKMiniAppAdapter extends BaseMiniAppAdapter {\r\n private configSafeArea?: MiniAppEnvironmentInfo['safeArea'];\r\n private stopViewportTracking?: () => void;\r\n private readonly supportsAsync?: BridgeSupportsAsync<AnyRequestMethodName> = typeof bridge.supportsAsync === 'function'\r\n ? bridge.supportsAsync.bind(bridge)\r\n : undefined;\r\n private pixelCodeWarningShown = false;\r\n\r\n override computeSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n const baseSafeArea = this.computeBaseSafeArea();\r\n const overlayInsets = this.resolveOverlayInsets();\r\n\r\n if (overlayInsets) {\r\n return computeCombinedSafeArea({\r\n environment: baseSafeArea,\r\n minimum: overlayInsets,\r\n });\r\n }\r\n\r\n return baseSafeArea;\r\n }\r\n private unsubscribe?: () => void;\r\n private launchParams?: GetLaunchParamsResponse;\r\n private queryParams?: Record<string, unknown>;\r\n private readonly viewHideListeners = new Set<() => void>();\r\n private readonly viewRestoreListeners = new Set<() => void>();\r\n\r\n constructor() {\r\n super('vk');\r\n }\r\n\r\n override async init(_options?: MiniAppInitOptions): Promise<void> {\r\n if (this.ready) {\r\n return;\r\n }\r\n\r\n const handler: VKBridgeSubscribeHandler = (event) => this.handleBridgeEvent(event);\r\n bridge.subscribe(handler);\r\n this.unsubscribe = this.registerDisposable(() => bridge.unsubscribe(handler));\r\n\r\n let initialConfig: ParentConfigData | undefined;\r\n try {\r\n initialConfig = (await bridge.send('VKWebAppGetConfig')) as ParentConfigData;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VKWebAppGetConfig failed:', error);\r\n }\r\n\r\n try {\r\n const initResult = (await bridge.send('VKWebAppInit')) as { result?: boolean } | undefined;\r\n if (initResult && 'result' in initResult && initResult.result === false) {\r\n console.warn('[tvm-app-adapter] VKWebAppInit returned result=false.');\r\n }\r\n } catch (error) {\r\n console.error('[tvm-app-adapter] VKWebAppInit failed:', error);\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n throw error;\r\n }\r\n\r\n let launchParams: GetLaunchParamsResponse;\r\n try {\r\n launchParams = await bridge.send('VKWebAppGetLaunchParams');\r\n } catch (error) {\r\n console.error('[tvm-app-adapter] VKWebAppGetLaunchParams failed:', error);\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n throw error;\r\n }\r\n\r\n const search = typeof window !== 'undefined' ? window.location.search : '';\r\n const queryParams = parseURLSearchParamsForGetLaunchParams(search);\r\n\r\n this.launchParams = launchParams;\r\n this.queryParams = queryParams as Record<string, unknown>;\r\n this.environment = this.composeEnvironment(launchParams, queryParams, initialConfig);\r\n this.configSafeArea = this.environment.safeArea;\r\n const combinedSafeArea = this.computeSafeArea();\r\n this.environment.safeArea = combinedSafeArea;\r\n this.applyAppearance(this.environment.appearance, initialConfig?.scheme);\r\n this.notifyEnvironmentChanged();\r\n\r\n this.ready = true;\r\n this.startViewportTracking();\r\n }\r\n\r\n override async vibrateImpact(style: TapticVibrationPowerType): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticImpactOccurred')) {\r\n bridge.send('VKWebAppTapticImpactOccurred', { style });\r\n }\r\n }\r\n\r\n override async vibrateNotification(type: TapticNotificationType): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticNotificationOccurred')) {\r\n bridge.send('VKWebAppTapticNotificationOccurred', { type });\r\n }\r\n }\r\n\r\n override async vibrateSelection(): Promise<void> {\r\n if (await this.supportsBridgeMethod('VKWebAppTapticSelectionChanged')) {\r\n bridge.send('VKWebAppTapticSelectionChanged');\r\n }\r\n }\r\n\r\n override async setColors(colors: { header?: string; background?: string }): Promise<void> {\r\n const { header, background } = colors;\r\n\r\n if (header || background) {\r\n const canApplyViewSettings = await this.supportsBridgeMethod('VKWebAppSetViewSettings');\r\n\r\n if (canApplyViewSettings) {\r\n const statusBarStyle: AppearanceType = header\r\n ? this.resolveStatusBarStyle(header)\r\n : this.environment.appearance?.includes('dark') ? 'light' : 'dark';\r\n\r\n await bridge.send('VKWebAppSetViewSettings', {\r\n status_bar_style: statusBarStyle,\r\n ...(header ? { action_bar_color: header } : {}),\r\n ...(background ? { navigation_bar_color: background } : {}),\r\n });\r\n }\r\n }\r\n\r\n await super.setColors(colors);\r\n }\r\n\r\n override getEnvironment(): MiniAppEnvironmentInfo {\r\n return {\r\n ...this.environment,\r\n isWebView: bridge.isWebView(),\r\n };\r\n }\r\n\r\n override getLaunchParams(): MiniAppLaunchParams | undefined {\r\n if (!this.launchParams) {\r\n return {\r\n customLaunchParams: this.readCustomUrlParams((key) => {\r\n const normalized = key.toLowerCase();\r\n return normalized.startsWith('vk_') || normalized === 'sign';\r\n }),\r\n };\r\n }\r\n\r\n return {\r\n launchParams: {\r\n bridge: this.launchParams,\r\n query: this.queryParams,\r\n },\r\n customLaunchParams: this.readCustomUrlParams((key) => {\r\n const normalized = key.toLowerCase();\r\n return normalized.startsWith('vk_') || normalized === 'sign';\r\n }),\r\n };\r\n }\r\n\r\n override async openExternalLink(url: string): Promise<void> {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.style.display = 'none';\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n }\r\n\r\n override async supports(capability: MiniAppCapability): Promise<boolean> {\r\n switch (capability) {\r\n case 'haptics': {\r\n const [impact, notification, selection] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppTapticImpactOccurred'),\r\n this.supportsBridgeMethod('VKWebAppTapticNotificationOccurred'),\r\n this.supportsBridgeMethod('VKWebAppTapticSelectionChanged'),\r\n ]);\r\n return impact || notification || selection;\r\n }\r\n case 'qrScanner':\r\n return this.supportsBridgeMethod('VKWebAppOpenCodeReader');\r\n case 'requestPhone': {\r\n const [supportsPhoneNumber, supportsPersonalCard] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppGetPhoneNumber'),\r\n this.supportsBridgeMethod('VKWebAppGetPersonalCard'),\r\n ]);\r\n return supportsPhoneNumber || supportsPersonalCard;\r\n }\r\n case 'notifications':\r\n return this.supportsBridgeMethod('VKWebAppAllowNotifications');\r\n case 'shareUrl':\r\n return this.supportsBridgeMethod('VKWebAppShare');\r\n case 'shareStory':\r\n return this.supportsBridgeMethod('VKWebAppShowStoryBox');\r\n case 'downloadFile':\r\n return this.supportsBridgeMethod('VKWebAppDownloadFile');\r\n case 'addToHomeScreen':\r\n return this.supportsBridgeMethod('VKWebAppAddToHomeScreen');\r\n case 'denyNotifications':\r\n return this.supportsBridgeMethod('VKWebAppDenyNotifications');\r\n case 'openExternalLink':\r\n return true;\r\n case 'viewVisibility':\r\n return true;\r\n default:\r\n return await super.supports(capability);\r\n }\r\n }\r\n\r\n override async requestPhone(): Promise<string | null> {\r\n const [supportsPhoneNumber, supportsPersonalCard] = await Promise.all([\r\n this.supportsBridgeMethod('VKWebAppGetPhoneNumber'),\r\n this.supportsBridgeMethod('VKWebAppGetPersonalCard'),\r\n ]);\r\n if (!supportsPhoneNumber && !supportsPersonalCard) {\r\n return super.requestPhone();\r\n }\r\n\r\n try {\r\n if (supportsPhoneNumber) {\r\n const result = await bridge.send('VKWebAppGetPhoneNumber');\r\n const phoneNumber = (result as { phone_number?: unknown }).phone_number;\r\n return typeof phoneNumber === 'string' && phoneNumber ? phoneNumber : null;\r\n }\r\n\r\n const card = await bridge.send('VKWebAppGetPersonalCard', { type: ['phone'] });\r\n const phone = (card as { phone?: unknown }).phone;\r\n return typeof phone === 'string' && phone ? phone : null;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK requestPhone failed:', error);\r\n return null;\r\n }\r\n }\r\n\r\n override async requestNotificationsPermission(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppAllowNotifications');\r\n if (!supported) {\r\n return super.requestNotificationsPermission();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppAllowNotifications');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK allow notifications failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async addToHomeScreen(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppAddToHomeScreen');\r\n if (!supported) {\r\n console.warn('[tvm-app-adapter] VK addToHomeScreen not supported');\r\n return super.addToHomeScreen();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppAddToHomeScreen');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK addToHomeScreen failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async denyNotifications(): Promise<boolean> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppDenyNotifications');\r\n if (!supported) {\r\n return super.denyNotifications();\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppDenyNotifications');\r\n if (response && typeof response === 'object' && 'result' in response) {\r\n return Boolean((response as { result?: unknown }).result);\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK deny notifications failed:', error);\r\n return false;\r\n }\r\n }\r\n\r\n override async scanQRCode(options?: MiniAppQrScanOptions): Promise<string | null> {\r\n const supportsQrScanner = await this.supportsBridgeMethod('VKWebAppOpenCodeReader');\r\n \r\n if (!supportsQrScanner) {\r\n return super.scanQRCode(options);\r\n }\r\n\r\n let result: string | null = null;\r\n\r\n try {\r\n const data = await bridge.send('VKWebAppOpenCodeReader')\r\n if (data.code_data) {\r\n result = data.code_data;\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n override onViewHide(callback: () => void): () => void {\r\n this.viewHideListeners.add(callback);\r\n return () => {\r\n this.viewHideListeners.delete(callback);\r\n };\r\n }\r\n\r\n override onViewRestore(callback: () => void): () => void {\r\n this.viewRestoreListeners.add(callback);\r\n return () => {\r\n this.viewRestoreListeners.delete(callback);\r\n };\r\n }\r\n\r\n override async shareStory(mediaUrl: string, _options?: MiniAppShareStoryOptions): Promise<void> {\r\n const options = _options;\r\n const vkOptions = options?.vk;\r\n\r\n const fallbackAttachment = options?.link\r\n ? {\r\n type: 'url',\r\n text: 'open',\r\n url: options.link.url,\r\n }\r\n : undefined;\r\n\r\n const fallbackStickers = options?.text\r\n ? [{\r\n sticker_type: 'native',\r\n sticker: {\r\n action_type: 'text',\r\n action: {\r\n text: options.text,\r\n style: 'classic',\r\n background_style: 'none',\r\n },\r\n transform: {\r\n gravity: 'center_bottom',\r\n translation_y: -0.2,\r\n },\r\n },\r\n }]\r\n : undefined;\r\n\r\n const bridgeOptions: ShowStoryBoxOptions = {\r\n background_type: vkOptions?.backgroundType ?? 'image',\r\n url: mediaUrl,\r\n locked: vkOptions?.locked ?? true,\r\n ...((vkOptions?.attachment ?? fallbackAttachment)\r\n ? { attachment: (vkOptions?.attachment ?? fallbackAttachment) as ShowStoryBoxOptions['attachment'] }\r\n : {}),\r\n ...((vkOptions?.stickers ?? fallbackStickers)\r\n ? { stickers: (vkOptions?.stickers ?? fallbackStickers) as ShowStoryBoxOptions['stickers'] }\r\n : {}),\r\n };\r\n\r\n await bridge.send('VKWebAppShowStoryBox', bridgeOptions);\r\n }\r\n\r\n override shareUrl(url: string, text?: string): void {\r\n void this.shareUrlInternal(url, text);\r\n }\r\n\r\n private async shareUrlInternal(url: string, text?: string): Promise<void> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppShare');\r\n if (!supported) {\r\n super.shareUrl(url, text ?? '');\r\n return;\r\n }\r\n\r\n try {\r\n await bridge.send('VKWebAppShare', {\r\n link: url,\r\n ...(text ? { text } : {}),\r\n });\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK shareUrl failed:', error);\r\n super.shareUrl(url, text ?? '');\r\n }\r\n }\r\n\r\n override async downloadFile(url: string, filename: string): Promise<void> {\r\n const supported = await this.supportsBridgeMethod('VKWebAppDownloadFile');\r\n if (!supported) {\r\n await super.downloadFile(url, filename);\r\n return;\r\n }\r\n\r\n try {\r\n const response = await bridge.send('VKWebAppDownloadFile', { url, filename });\r\n const result = (response as { result?: boolean } | undefined)?.result;\r\n if (result === false) {\r\n throw new Error('VKWebAppDownloadFile returned result=false');\r\n }\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK downloadFile failed:', error);\r\n await super.downloadFile(url, filename);\r\n }\r\n }\r\n\r\n override trackConversionEvent(event: string, payload?: Record<string, unknown>): void {\r\n const normalizedEvent = this.normalizeAnalyticsEventName(event);\r\n if (!normalizedEvent) {\r\n return;\r\n }\r\n\r\n const envelope: VkAnalyticsEnvelope = {\r\n method: 'VKWebAppConversionHit',\r\n params: {\r\n event: normalizedEvent,\r\n params: this.normalizeAnalyticsPayload(payload),\r\n },\r\n };\r\n\r\n this.dispatchAnalytics(envelope);\r\n }\r\n\r\n override trackPixelEvent(event: string, payload?: Record<string, unknown>): void {\r\n const pixelCode = getVkPixelCode();\r\n if (!pixelCode) {\r\n if (!this.pixelCodeWarningShown) {\r\n console.warn('[VKAnalytics] VK pixel code is not configured. Call configureVkPixel() before tracking.');\r\n this.pixelCodeWarningShown = true;\r\n }\r\n return;\r\n }\r\n\r\n const normalizedEvent = this.normalizeAnalyticsEventName(event);\r\n if (!normalizedEvent) {\r\n return;\r\n }\r\n\r\n const envelope: VkAnalyticsEnvelope = {\r\n method: 'VKWebAppRetargetingPixel',\r\n params: {\r\n pixel_code: pixelCode,\r\n type: normalizedEvent,\r\n data: this.normalizeAnalyticsPayload(payload),\r\n },\r\n };\r\n\r\n this.pixelCodeWarningShown = false;\r\n this.dispatchAnalytics(envelope);\r\n }\r\n\r\n private dispatchAnalytics(envelope: VkAnalyticsEnvelope): void {\r\n if (typeof bridge.isWebView === 'function') {\r\n try {\r\n if (!bridge.isWebView()) {\r\n this.emitAnalyticsFallback(envelope);\r\n return;\r\n }\r\n } catch (error) {\r\n console.warn('[VKAnalytics] bridge.isWebView check failed:', error);\r\n this.emitAnalyticsFallback(envelope);\r\n return;\r\n }\r\n }\r\n\r\n void this.safeBridgeSend(envelope.method, envelope.params);\r\n }\r\n\r\n private emitAnalyticsFallback(envelope: VkAnalyticsEnvelope): void {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const detail = {\r\n ...envelope,\r\n timestamp: Date.now(),\r\n };\r\n\r\n if (typeof window.dispatchEvent === 'function' && typeof window.CustomEvent === 'function') {\r\n window.dispatchEvent(new CustomEvent(ANALYTICS_FALLBACK_EVENT, { detail }));\r\n return;\r\n }\r\n\r\n try {\r\n window.postMessage({ type: ANALYTICS_FALLBACK_EVENT, detail }, '*');\r\n } catch (error) {\r\n console.warn('[VKAnalytics] fallback dispatch failed', error);\r\n }\r\n }\r\n\r\n private normalizeAnalyticsEventName(event: string): string | null {\r\n if (typeof event !== 'string') {\r\n return null;\r\n }\r\n\r\n const trimmed = event.trim();\r\n if (!trimmed || !ANALYTICS_EVENT_NAME_PATTERN.test(trimmed)) {\r\n console.warn(`[VKAnalytics] Invalid event name: \"${event}\"`);\r\n return null;\r\n }\r\n\r\n return trimmed;\r\n }\r\n\r\n private normalizeAnalyticsPayload(payload?: Record<string, unknown>): Record<string, unknown> {\r\n if (!this.isPlainObject(payload)) {\r\n return {};\r\n }\r\n\r\n return { ...payload };\r\n }\r\n\r\n private isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n }\r\n\r\n private async safeBridgeSend(method: VkAnalyticsMethod, params: Record<string, unknown>): Promise<void> {\r\n try {\r\n const supported = await this.supportsBridgeMethod(method as AnyRequestMethodName);\r\n if (!supported) {\r\n return;\r\n }\r\n\r\n await bridge.send(method as AnyRequestMethodName, params as never);\r\n } catch (error) {\r\n console.warn(`[VKAnalytics] ${method} failed`, error);\r\n }\r\n }\r\n\r\n private composeEnvironment(\r\n launchParams: GetLaunchParamsResponse,\r\n queryParams: ReturnType<typeof parseURLSearchParamsForGetLaunchParams>,\r\n config?: ParentConfigData,\r\n ): MiniAppEnvironmentInfo {\r\n const language = queryParams.vk_language ?? launchParams.vk_language;\r\n const platform = queryParams.vk_platform ?? launchParams.vk_platform;\r\n const appId = queryParams.vk_app_id ?? launchParams.vk_app_id;\r\n const prefersDark = typeof window !== 'undefined' && typeof window.matchMedia === 'function'\r\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\r\n : false;\r\n const appearance = this.normalizeAppearance(config?.appearance, config?.scheme) ?? (prefersDark ? 'dark' : 'light');\r\n const configSafeArea = this.extractSafeAreaFromConfig(config);\r\n return {\r\n platform: 'vk',\r\n sdkVersion: platform ? String(platform) : undefined,\r\n appVersion: typeof appId === 'number' ? `vk-app-${appId}` : undefined,\r\n languageCode: language ? String(language) : undefined,\r\n appearance,\r\n isWebView: bridge.isWebView(),\r\n safeArea: configSafeArea,\r\n };\r\n }\r\n\r\n private handleBridgeEvent(event: Parameters<VKBridgeSubscribeHandler>[0]): void {\r\n const { type, data } = event.detail ?? {};\r\n\r\n if (type === 'VKWebAppViewHide') {\r\n this.notifyVisibilityListeners(this.viewHideListeners);\r\n return;\r\n }\r\n\r\n if (type === 'VKWebAppViewRestore') {\r\n this.notifyVisibilityListeners(this.viewRestoreListeners);\r\n return;\r\n }\r\n\r\n if (type === 'VKWebAppUpdateConfig' && data) {\r\n const config = data as ParentConfigData;\r\n this.updateEnvironmentFromConfig(config);\r\n }\r\n }\r\n\r\n private updateEnvironmentFromConfig(config: ParentConfigData): void {\r\n if (!this.environment) {\r\n return;\r\n }\r\n\r\n const nextAppearance = this.normalizeAppearance(config.appearance, config.scheme);\r\n let changed = false;\r\n\r\n if (nextAppearance && nextAppearance !== this.environment.appearance) {\r\n this.environment.appearance = nextAppearance;\r\n changed = true;\r\n }\r\n\r\n const prevSafeArea = this.environment.safeArea;\r\n const nextSafeArea = this.extractSafeAreaFromConfig(config);\r\n if (nextSafeArea) {\r\n this.configSafeArea = nextSafeArea;\r\n this.environment.safeArea = nextSafeArea;\r\n } else {\r\n this.configSafeArea = undefined;\r\n this.environment.safeArea = undefined;\r\n }\r\n\r\n const combinedSafeArea = this.computeSafeArea() ?? {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n };\r\n const prevForComparison = prevSafeArea;\r\n const safeAreaChanged =\r\n !prevForComparison ||\r\n prevForComparison.top !== combinedSafeArea.top ||\r\n prevForComparison.right !== combinedSafeArea.right ||\r\n prevForComparison.bottom !== combinedSafeArea.bottom ||\r\n prevForComparison.left !== combinedSafeArea.left;\r\n\r\n if (safeAreaChanged) {\r\n this.environment.safeArea = combinedSafeArea;\r\n changed = true;\r\n } else {\r\n this.environment.safeArea = prevSafeArea;\r\n }\r\n\r\n this.applyAppearance(this.environment.appearance, config.scheme);\r\n\r\n if (changed) {\r\n this.notifyEnvironmentChanged();\r\n }\r\n }\r\n\r\n private applyAppearance(appearance?: string, scheme?: string): void {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n if (appearance) {\r\n document.documentElement.dataset.vkAppearance = appearance;\r\n document.documentElement.classList.toggle('dark', appearance === 'dark');\r\n }\r\n\r\n if (scheme) {\r\n document.documentElement.dataset.vkScheme = scheme;\r\n if (!appearance) {\r\n const normalized = this.normalizeAppearance(undefined, scheme);\r\n document.documentElement.classList.toggle('dark', normalized === 'dark');\r\n }\r\n }\r\n }\r\n\r\n private resolveStatusBarStyle(color: string): AppearanceType {\r\n const hex = color.replace('#', '');\r\n const normalized = hex.length === 3\r\n ? hex.split('').map((symbol) => symbol + symbol).join('')\r\n : hex.slice(0, 6);\r\n\r\n const r = parseInt(normalized.slice(0, 2), 16) / 255;\r\n const g = parseInt(normalized.slice(2, 4), 16) / 255;\r\n const b = parseInt(normalized.slice(4, 6), 16) / 255;\r\n\r\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n return luminance > 0.6 ? 'dark' : 'light';\r\n }\r\n\r\n private normalizeAppearance(\r\n rawAppearance?: string | null,\r\n scheme?: string | null,\r\n ): 'dark' | 'light' | undefined {\r\n const normalized = rawAppearance?.toLowerCase();\r\n if (normalized === 'dark' || normalized === 'light') {\r\n return normalized;\r\n }\r\n\r\n const normalizedScheme = scheme?.toLowerCase();\r\n if (normalizedScheme) {\r\n if (normalizedScheme.includes('dark') || normalizedScheme.includes('space_gray')) {\r\n return 'dark';\r\n }\r\n return 'light';\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private extractSafeAreaFromConfig(config?: ParentConfigData): MiniAppEnvironmentInfo['safeArea'] | undefined {\r\n const rawInsets = config && 'insets' in config\r\n ? (config as { insets?: { top?: number; right?: number; bottom?: number; left?: number } }).insets\r\n : undefined;\r\n\r\n if (!rawInsets) {\r\n return undefined;\r\n }\r\n\r\n const { top = 0, right = 0, bottom = 0, left = 0 } = rawInsets;\r\n const values = [top, right, bottom, left].map((value) => (typeof value === 'number' ? value : Number(value) || 0));\r\n const hasInsets = values.some((value) => value !== 0);\r\n\r\n if (!hasInsets) {\r\n return undefined;\r\n }\r\n\r\n const [nTop, nRight, nBottom, nLeft] = values;\r\n return { top: nTop, right: nRight, bottom: nBottom, left: nLeft };\r\n }\r\n\r\n private notifyVisibilityListeners(listeners: Set<() => void>): void {\r\n for (const listener of listeners) {\r\n try {\r\n listener();\r\n } catch (error) {\r\n console.warn('[tvm-app-adapter] VK visibility listener failed:', error);\r\n }\r\n }\r\n }\r\n\r\n private computeBaseSafeArea(): MiniAppEnvironmentInfo['safeArea'] {\r\n return computeCombinedSafeArea({\r\n environment: this.configSafeArea,\r\n viewport: this.getViewportInsets?.(),\r\n css: readCssSafeArea(),\r\n });\r\n }\r\n\r\n private startViewportTracking(): void {\r\n this.stopViewportTracking?.();\r\n\r\n const dispose = createSafeAreaWatcher({\r\n getSafeArea: () => this.computeSafeArea(),\r\n onChange: (next) => {\r\n this.environment.safeArea = next;\r\n this.notifyEnvironmentChanged();\r\n },\r\n });\r\n\r\n if (dispose) {\r\n this.stopViewportTracking = this.registerDisposable(dispose);\r\n }\r\n }\r\n\r\n private resolveOverlayInsets(): { top: number; right: number } | undefined {\r\n if (typeof window === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n if (!bridge.isWebView()) {\r\n return undefined;\r\n }\r\n\r\n if (!this.isLikelyMobilePlatform()) {\r\n return undefined;\r\n }\r\n\r\n const viewportWidth = window.innerWidth || document.documentElement?.clientWidth || 0;\r\n if (!viewportWidth) {\r\n return undefined;\r\n }\r\n\r\n const overlayBreakpoint = 880;\r\n if (viewportWidth > overlayBreakpoint) {\r\n return undefined;\r\n }\r\n\r\n const orientationQuery = window.matchMedia?.('(orientation: landscape)');\r\n const isLandscape = Boolean(orientationQuery?.matches);\r\n\r\n const top = isLandscape ? 48 : 56;\r\n const right = isLandscape ? 72 : 88;\r\n\r\n return { top, right };\r\n }\r\n\r\n private isLikelyMobilePlatform(): boolean {\r\n const platform = (this.resolveLaunchParam('vk_platform') ?? '').toLowerCase();\r\n const device = (this.resolveLaunchParam('vk_viewer_device') ?? '').toLowerCase();\r\n const isLayer = this.resolveLaunchParam('vk_is_layer') === '1';\r\n\r\n if (isLayer) {\r\n return false;\r\n }\r\n\r\n const mobilePattern = /(iphone|ipad|ios|android|mobile)/i;\r\n const desktopPattern = /(desktop|web|tablet)/i;\r\n\r\n const matchesMobilePlatform = mobilePattern.test(platform) || mobilePattern.test(device);\r\n const matchesDesktopPlatform = desktopPattern.test(platform) || desktopPattern.test(device);\r\n\r\n if (!matchesMobilePlatform) {\r\n return false;\r\n }\r\n\r\n return !matchesDesktopPlatform;\r\n }\r\n\r\n private resolveLaunchParam(key: string): string | undefined {\r\n const queryValue = this.queryParams?.[key];\r\n if (typeof queryValue === 'string' && queryValue) {\r\n return queryValue;\r\n }\r\n\r\n const launchValue = this.launchParams ? (this.launchParams as Record<string, unknown>)[key] : undefined;\r\n if (typeof launchValue === 'string' && launchValue) {\r\n return launchValue;\r\n }\r\n\r\n if (typeof launchValue === 'number') {\r\n return String(launchValue);\r\n }\r\n\r\n if (typeof launchValue === 'boolean') {\r\n return launchValue ? '1' : '0';\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private supportsBridgeMethod(method: AnyRequestMethodName): Promise<boolean> {\r\n return isBridgeMethodSupported(method, this.supportsAsync);\r\n }\r\n\r\n protected override onDestroy(): void {\r\n this.unsubscribe?.();\r\n this.unsubscribe = undefined;\r\n this.stopViewportTracking?.();\r\n this.stopViewportTracking = undefined;\r\n this.viewHideListeners.clear();\r\n this.viewRestoreListeners.clear();\r\n super.onDestroy();\r\n }\r\n}\r\n","let pixelCode: string | null = null;\n\nexport function setVkPixelCode(next: string | null | undefined): void {\n if (typeof next !== 'string') {\n pixelCode = null;\n return;\n }\n\n const normalized = next.trim();\n pixelCode = normalized || null;\n}\n\nexport function getVkPixelCode(): string | null {\n return pixelCode;\n}\n","export type BridgeSupportsAsync<Method extends string = string> = (method: Method) => Promise<boolean>;\n\nexport async function isBridgeMethodSupported<Method extends string = string>(\n method: Method,\n supportsAsync?: BridgeSupportsAsync<Method>,\n): Promise<boolean> {\n if (typeof supportsAsync !== 'function') {\n return false;\n }\n\n try {\n return await supportsAsync(method);\n } catch (error) {\n console.warn('[tvm-app-adapter] bridge.supportsAsync failed:', error);\n return false;\n }\n}\n","import jsQR from \"jsqr\";\n\nimport { BaseMiniAppAdapter } from './baseAdapter';\nimport type { MiniAppCapability, MiniAppQrScanOptions } from '@/types/miniApp';\nimport { triggerFileDownload } from '@/lib/download';\n\nexport class WebMiniAppAdapter extends BaseMiniAppAdapter {\n private deferredPrompt: BeforeInstallPromptEvent | null = null;\n\n constructor() {\n super(\"web\", {\n sdkVersion: navigator.userAgent,\n languageCode: navigator.language,\n isWebView: false,\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeinstallprompt', (event: Event) => {\n event.preventDefault();\n this.deferredPrompt = event as BeforeInstallPromptEvent;\n });\n }\n }\n\n override supports(capability: MiniAppCapability): boolean | Promise<boolean> {\n switch (capability) {\n case 'copyTextToClipboard':\n return typeof navigator !== 'undefined' && Boolean(navigator.clipboard?.writeText);\n case 'downloadFile':\n return typeof document !== 'undefined';\n case 'shareUrl':\n return typeof navigator !== 'undefined' && (Boolean(navigator.share) || Boolean(navigator.clipboard?.writeText));\n case 'addToHomeScreen':\n return /android/i.test(navigator.userAgent) && Boolean(this.deferredPrompt);\n case 'checkHomeScreenStatus':\n return true;\n default:\n return super.supports(capability);\n }\n }\n\n override async downloadFile(url: string, filename: string): Promise<void> {\n try {\n await triggerFileDownload(url, filename, { preferBlob: true });\n } catch (error) {\n console.warn('[mini-app-template] Web downloadFile fallback:', error);\n await super.downloadFile(url, filename);\n }\n }\n\n override scanQRCode(_options?: MiniAppQrScanOptions): Promise<string | null> {\n return new Promise(async (resolve) => {\n if (typeof document === 'undefined') {\n resolve(null);\n return;\n }\n\n // ===============================================\n // SAVE BODY STATE\n // ===============================================\n const prevOverflow = document.body.style.overflow;\n const prevPos = document.body.style.position;\n const prevTouch = document.body.style.touchAction;\n const prevWidth = document.body.style.width;\n const prevHtmlOverflow = document.documentElement.style.overflow;\n\n // ===============================================\n // DISABLE PAGE SCROLL\n // ===============================================\n document.body.style.overflow = \"hidden\";\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.touchAction = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n\n // ===============================================\n // CREATE FULLSCREEN OVERLAY\n // ===============================================\n const overlay = document.createElement(\"div\");\n overlay.id = \"qr-overlay\";\n overlay.style.position = \"fixed\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.right = \"0\";\n overlay.style.bottom = \"0\";\n overlay.style.zIndex = \"999999999\";\n overlay.style.background = \"rgba(0,0,0,0.92)\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n \n overlay.style.display = \"flex\";\n overlay.style.flexDirection = \"column\";\n overlay.style.alignItems = \"center\";\n overlay.style.justifyContent = \"center\";\n overlay.style.overflow = \"hidden\"; \n overlay.style.backdropFilter = \"blur(3px)\";\n document.body.appendChild(overlay);\n\n // ===============================================\n // CLOSE BUTTON (TOP RIGHT)\n // ===============================================\n const closeBtn = document.createElement(\"button\");\n closeBtn.innerText = \"✕\";\n closeBtn.style.position = \"absolute\";\n closeBtn.style.top = \"22px\";\n closeBtn.style.right = \"22px\";\n closeBtn.style.fontSize = \"32px\";\n closeBtn.style.color = \"white\";\n closeBtn.style.background = \"transparent\";\n closeBtn.style.border = \"none\";\n closeBtn.style.cursor = \"pointer\";\n closeBtn.style.zIndex = \"9999999999\";\n overlay.appendChild(closeBtn);\n\n // ===============================================\n // CENTER SCAN AREA\n // ===============================================\n const scanSize = Math.min(Math.floor(Math.min(window.innerWidth, window.innerHeight) * 0.72), 320);\n const scanBox = document.createElement(\"div\");\n scanBox.style.width = `${scanSize}px`;\n scanBox.style.height = `${scanSize}px`;\n scanBox.style.position = \"relative\";\n scanBox.style.flex = \"0 0 auto\";\n scanBox.style.borderRadius = \"18px\";\n scanBox.style.overflow = \"hidden\";\n overlay.appendChild(scanBox);\n\n const scanArea = document.createElement(\"div\");\n scanArea.style.position = \"absolute\";\n scanArea.style.inset = \"0\";\n scanArea.style.zIndex = \"1\";\n scanArea.style.background = \"#000\";\n scanBox.appendChild(scanArea);\n\n const video = document.createElement(\"video\");\n video.setAttribute(\"playsinline\", \"true\");\n video.autoplay = true;\n video.muted = true;\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"cover\";\n video.style.position = \"absolute\";\n video.style.inset = \"0\";\n scanArea.appendChild(video);\n\n // ===============================================\n // WHITE TELEGRAM-LIKE FRAME\n // ===============================================\n const frame = document.createElement(\"div\");\n frame.style.position = \"absolute\";\n frame.style.top = \"0\";\n frame.style.left = \"0\";\n frame.style.right = \"0\";\n frame.style.bottom = \"0\";\n frame.style.border = \"3px solid rgba(255,255,255,0.9)\";\n frame.style.borderRadius = \"18px\";\n frame.style.pointerEvents = \"none\";\n frame.style.zIndex = \"3\";\n scanBox.appendChild(frame);\n\n // ===============================================\n // SCAN LINE ANIMATION\n // ===============================================\n const line = document.createElement(\"div\");\n line.style.position = \"absolute\";\n line.style.left = \"0\";\n line.style.right = \"0\";\n line.style.height = \"2px\";\n line.style.background = \"rgba(255,255,255,0.85)\";\n line.style.borderRadius = \"2px\";\n line.style.animation = \"qr-line 2s infinite\";\n line.style.zIndex = \"4\";\n scanBox.appendChild(line);\n\n const styleTag = document.createElement(\"style\");\n styleTag.innerHTML = `\n @keyframes qr-line {\n 0% { top: 0; }\n 50% { top: calc(100% - 2px); }\n 100% { top: 0; }\n }\n `;\n document.head.appendChild(styleTag);\n\n // ===============================================\n // \"POINT CAMERA\" TEXT\n // ===============================================\n const hint = document.createElement(\"div\");\n hint.innerText = \"Наведите камеру на QR-код\";\n hint.style.color = \"white\";\n hint.style.marginTop = \"30px\";\n hint.style.fontSize = \"17px\";\n hint.style.opacity = \"0.9\";\n overlay.appendChild(hint);\n\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n let stream: MediaStream | null = null;\n let rafId: number | null = null;\n let lastScanAt = 0;\n\n let closed = false;\n const finalize = async (result: string | null) => {\n if (closed) {\n return;\n }\n closed = true;\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n }\n video.srcObject = null;\n overlay.remove();\n styleTag.remove();\n\n document.body.style.overflow = prevOverflow;\n document.body.style.position = prevPos;\n document.body.style.width = prevWidth;\n document.body.style.touchAction = prevTouch;\n document.documentElement.style.overflow = prevHtmlOverflow;\n\n resolve(result);\n };\n\n const removeFromBag = this.registerDisposable(() => {\n void finalize(null);\n });\n\n const closeScanner = (result: string | null) => {\n void finalize(result);\n removeFromBag();\n };\n\n closeBtn.onclick = () => closeScanner(null);\n\n // ===============================================\n // START CAM\n // ===============================================\n try {\n const constraints: MediaStreamConstraints[] = [\n { video: { facingMode: { ideal: \"environment\" } }, audio: false },\n { video: { facingMode: \"environment\" }, audio: false },\n { video: true, audio: false },\n ];\n\n let lastError: unknown = null;\n for (const constraint of constraints) {\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraint);\n break;\n } catch (error) {\n lastError = error;\n }\n }\n\n if (!stream) {\n throw lastError instanceof Error ? lastError : new Error(\"Unable to access camera\");\n }\n\n video.srcObject = stream;\n await video.play();\n\n const scanFrame = (now: number) => {\n if (closed) {\n return;\n }\n if (now - lastScanAt >= 100 && context && video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (width > 0 && height > 0) {\n canvas.width = width;\n canvas.height = height;\n context.drawImage(video, 0, 0, width, height);\n const imageData = context.getImageData(0, 0, width, height);\n const result = jsQR(imageData.data, width, height, {\n inversionAttempts: \"attemptBoth\",\n });\n if (result?.data) {\n closeScanner(result.data);\n return;\n }\n lastScanAt = now;\n }\n }\n rafId = requestAnimationFrame(scanFrame);\n };\n\n rafId = requestAnimationFrame(scanFrame);\n } catch (error) {\n console.error(\"QR Start error\", error);\n closeScanner(null);\n }\n });\n }\n shareUrl(url: string, text: string): void {\n if (navigator.share) {\n try {\n navigator.share({ title: text, text, url });\n return;\n } catch (err) {\n console.warn('Share cancelled or failed:', err);\n }\n }\n\n const payload = text ? `${text}\\n${url}` : url;\n this.copyTextToClipboard(payload).catch((err) => {\n console.warn('Share fallback (clipboard) failed:', err);\n });\n }\n\n override async addToHomeScreen(): Promise<boolean> {\n const isAndroid = /android/i.test(navigator.userAgent);\n if (!isAndroid || !this.deferredPrompt) {\n return super.addToHomeScreen();\n }\n\n try {\n this.deferredPrompt.prompt();\n const choice = await this.deferredPrompt.userChoice;\n this.deferredPrompt = null;\n return choice?.outcome === 'accepted';\n } catch (error) {\n console.warn('[tvm-app-adapter] Web addToHomeScreen failed:', error);\n this.deferredPrompt = null;\n return false;\n }\n }\n\n override async checkHomeScreenStatus(): Promise<'added' | 'not_added' | 'unknown' | string> {\n try {\n const isStandalone =\n (typeof window !== 'undefined' && window.matchMedia?.('(display-mode: standalone)').matches) ||\n // iOS Safari specific flag\n (typeof navigator !== 'undefined' && (navigator as unknown as { standalone?: boolean }).standalone === true);\n\n if (isStandalone) {\n return 'added';\n }\n return 'unknown';\n } catch {\n return 'unknown';\n }\n }\n}\n\n// Minimal BeforeInstallPromptEvent typing to avoid lib.dom dependency mismatch.\ninterface BeforeInstallPromptEvent extends Event {\n prompt(): Promise<void>;\n userChoice: Promise<{ outcome?: 'accepted' | 'dismissed'; platform?: string }>;\n}\n","import { MaxMiniAppAdapter } from '@/adapters/maxAdapter';\r\nimport { ShellMiniAppAdapter } from '@/adapters/shellAdapter';\r\nimport { TelegramMiniAppAdapter } from '@/adapters/telegramAdapter';\r\nimport { VKMiniAppAdapter } from '@/adapters/vkAdapter';\r\nimport { WebMiniAppAdapter } from '@/adapters/webAdapter';\r\nimport { setVkPixelCode } from '@/config/vkAnalytics';\nimport type { MiniAppAdapter, MiniAppPlatform } from '@/types/miniApp';\nimport { readShellPlatform } from '@/lib/shell';\n\nconst CONFIRMED_PLATFORM_STORAGE_KEY = 'mini-app-adapter:confirmed-platform';\nconst CONFIRMED_PLATFORM_TTL_MS = 30 * 60 * 1000;\n\nexport interface CreateAdapterOptions {\n platform?: MiniAppPlatform;\n vk?: {\n pixelCode?: string;\n };\n}\n\nexport function detectPlatform(): MiniAppPlatform {\n if (typeof window === 'undefined') {\n return 'web';\n }\n\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const hashParams = (() => {\r\n const hash = window.location.hash.startsWith('#')\r\n ? window.location.hash.slice(1)\r\n : window.location.hash;\r\n return new URLSearchParams(hash);\r\n })();\r\n\r\n const getParam = (name: string): string | null =>\r\n searchParams.get(name) ?? hashParams.get(name);\r\n\r\n const hasParam = (...names: string[]): boolean => names.some((name) => getParam(name));\n const readConfirmedPlatform = (): MiniAppPlatform | null => {\n try {\n const raw = window.sessionStorage.getItem(CONFIRMED_PLATFORM_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as { platform?: MiniAppPlatform; ts?: number };\n if (!parsed?.platform || typeof parsed.ts !== 'number') {\n return null;\n }\n if (Date.now() - parsed.ts > CONFIRMED_PLATFORM_TTL_MS) {\n return null;\n }\n return parsed.platform;\n } catch {\n return null;\n }\n };\n const persistConfirmedPlatform = (platform: MiniAppPlatform): void => {\n if (platform === 'web') {\n return;\n }\n try {\n window.sessionStorage.setItem(\n CONFIRMED_PLATFORM_STORAGE_KEY,\n JSON.stringify({ platform, ts: Date.now() }),\n );\n } catch {\n // Ignore storage errors.\n }\n };\n\n const shellPlatform = readShellPlatform();\n if (shellPlatform) {\n persistConfirmedPlatform(shellPlatform);\n return shellPlatform;\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n const hasNativeBridge =\n typeof (window as typeof window & { NativeBridge?: { postMessage?: unknown } }).NativeBridge?.postMessage ===\r\n 'function';\r\n\n if (hasNativeBridge) {\n if (userAgent.includes('android')) {\n persistConfirmedPlatform('shell_android');\n return 'shell_android';\n }\n persistConfirmedPlatform('shell_ios');\n return 'shell_ios';\n }\n\n const telegramGlobals = window as typeof window & {\n TelegramWebviewProxy?: unknown;\n TelegramGameProxy?: unknown;\n };\n const hasTelegramGlobal =\n Boolean(window.Telegram?.WebApp)\n || typeof telegramGlobals.TelegramWebviewProxy !== 'undefined'\n || typeof telegramGlobals.TelegramGameProxy !== 'undefined';\n const hasTelegramParams = hasParam('tgWebAppPlatform', 'tgWebAppVersion', 'tgWebAppData', 'tgWebAppLanguage');\n if (\n hasTelegramGlobal\n || hasTelegramParams\n || userAgent.includes('telegram')\n ) {\n persistConfirmedPlatform('telegram');\n return 'telegram';\n }\n\n if (window.WebApp) {\n persistConfirmedPlatform('max');\n return 'max';\n }\n\n if ((window as typeof window & { MaxMiniApp?: unknown }).MaxMiniApp) {\n persistConfirmedPlatform('max');\n return 'max';\n }\n\n const hasVkParams = hasParam('vk_app_id', 'vk_platform', 'vk_user_id', 'vk_language', 'sign');\n const hasVkUserAgentSignal =\n userAgent.includes('vkclient')\n || userAgent.includes('vk-android')\n || userAgent.includes('vkontakte');\n if (hasVkParams || hasVkUserAgentSignal) {\n persistConfirmedPlatform('vk');\n return 'vk';\n }\n\n const confirmedPlatform = readConfirmedPlatform();\n if (confirmedPlatform && confirmedPlatform !== 'web') {\n return confirmedPlatform;\n }\n\n return 'web';\n}\n\r\n\r\nexport function createAdapter(): MiniAppAdapter;\r\nexport function createAdapter(platform: MiniAppPlatform): MiniAppAdapter;\r\nexport function createAdapter(options: CreateAdapterOptions): MiniAppAdapter;\r\nexport function createAdapter(input?: MiniAppPlatform | CreateAdapterOptions): MiniAppAdapter {\r\n const options = normalizeCreateAdapterOptions(input);\r\n const platform = options.platform ?? detectPlatform();\r\n\r\n if (platform === 'vk') {\r\n setVkPixelCode(options.vk?.pixelCode ?? null);\r\n }\r\n\r\n switch (platform) {\r\n case 'shell_ios':\r\n case 'shell_android':\r\n return new ShellMiniAppAdapter(platform);\r\n case 'telegram':\r\n return new TelegramMiniAppAdapter();\r\n case 'vk':\r\n return new VKMiniAppAdapter();\r\n case 'max':\r\n return new MaxMiniAppAdapter();\r\n default:\r\n return new WebMiniAppAdapter();\r\n }\r\n}\r\n\r\nfunction normalizeCreateAdapterOptions(input?: MiniAppPlatform | CreateAdapterOptions): CreateAdapterOptions {\r\n if (!input) {\r\n return {};\r\n }\r\n\r\n if (typeof input === 'string') {\r\n return { platform: input };\r\n }\r\n\r\n return input;\r\n}\r\n","import { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react';\n\nimport type { MiniAppAdapter } from '@/types/miniApp';\nimport { setActiveAdapter } from '@/registry';\n\nconst AdapterContext = createContext<MiniAppAdapter | null>(null);\n\ninterface AdapterProviderProps {\n adapter: MiniAppAdapter;\n children: ReactNode;\n}\n\nexport function AdapterProvider({ adapter, children }: AdapterProviderProps) {\n const proxiedAdapter = useMemo(() => {\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n }) as MiniAppAdapter;\n }, [adapter]);\n\n useEffect(() => {\n setActiveAdapter(proxiedAdapter);\n return () => {\n setActiveAdapter(null);\n if (typeof proxiedAdapter.destroy === 'function') {\n try {\n proxiedAdapter.destroy();\n } catch (error) {\n console.warn('[tvm-app-adapter] adapter destroy failed:', error);\n }\n }\n };\n }, [proxiedAdapter]);\n\n return <AdapterContext.Provider value={proxiedAdapter}>{children}</AdapterContext.Provider>;\n}\n\nexport function useMiniAppAdapter(): MiniAppAdapter {\n const adapter = useContext(AdapterContext);\n if (!adapter) {\n throw new Error('useMiniAppAdapter must be used inside <AdapterProvider/>.');\n }\n return adapter;\n}\n","import type { MiniAppAdapter } from '@/types/miniApp';\n\nlet currentAdapter: MiniAppAdapter | null = null;\n\nexport function setActiveAdapter(adapter: MiniAppAdapter | null): void {\n currentAdapter = adapter;\n}\n\nexport function getActiveAdapter(): MiniAppAdapter | null {\n return currentAdapter;\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useMiniAppAdapter } from '@/components/AdapterProvider';\n\nexport type ThemePreference = 'system' | 'light' | 'dark';\n\nconst STORAGE_KEY = 'loyalka-theme-preference';\n\nexport function useAdapterTheme() {\n const adapter = useMiniAppAdapter();\n\n const [systemPrefersDark, setSystemPrefersDark] = useState<boolean>(() => {\n const { appearance } = adapter.getEnvironment();\n if (adapter.onAppearanceChange && appearance) {\n return appearance === 'dark';\n }\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n return false;\n });\n\n const [preference, setPreferenceState] = useState<ThemePreference>(() => {\n try {\n const saved = localStorage.getItem(STORAGE_KEY) as ThemePreference | null;\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved;\n } catch {}\n return 'system';\n });\n\n useEffect(() => {\n if (adapter.onAppearanceChange) {\n return adapter.onAppearanceChange((appearance) => {\n if (appearance) {\n setSystemPrefersDark(appearance === 'dark');\n }\n });\n }\n\n if (typeof window !== 'undefined' && window.matchMedia) {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = (event: MediaQueryListEvent) => setSystemPrefersDark(event.matches);\n media.addEventListener('change', handleChange);\n return () => media.removeEventListener('change', handleChange);\n }\n\n return undefined;\n }, [adapter]);\n\n const isDark = useMemo(() => {\n if (preference === 'dark' || (preference === 'system' && systemPrefersDark)) {\n return true;\n }\n return false;\n }, [preference, systemPrefersDark]);\n\n const appearance: 'dark' | 'light' = isDark ? 'dark' : 'light';\n\n useEffect(() => {\n const root = document.documentElement;\n if (isDark) {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }, [isDark]);\n\n const setPreference = useCallback((pref: ThemePreference) => {\n setPreferenceState(pref);\n try {\n localStorage.setItem(STORAGE_KEY, pref);\n } catch {}\n }, []);\n\n const toggle = useCallback(() => {\n document.documentElement.classList.add('theme-transition');\n setTimeout(() => {\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transition');\n }, 400);\n }, 50);\n\n const root = document.documentElement;\n const styles = getComputedStyle(root);\n const primaryColor = styles.getPropertyValue('--primary').trim();\n const backgroundColor = styles.getPropertyValue('--background').trim();\n\n adapter.setColors({\n header: primaryColor,\n background: backgroundColor,\n footer: backgroundColor,\n });\n setPreference(preference === 'dark' ? 'light' : 'dark');\n }, [adapter, preference, setPreference]);\n\n return {\n isDark,\n appearance,\n preference,\n setPreference,\n toggle,\n } as const;\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useMiniAppAdapter } from '@/components/AdapterProvider';\nimport type { MiniAppEnvironmentInfo } from '@/types/miniApp';\n\ntype SafeAreaInsets = NonNullable<MiniAppEnvironmentInfo['safeArea']>;\n\nconst ZERO_SAFE_AREA: SafeAreaInsets = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\nexport function useSafeArea() {\n const adapter = useMiniAppAdapter();\n\n const computeSafeArea = useCallback(\n () => adapter.computeSafeArea() ?? ZERO_SAFE_AREA,\n [adapter],\n );\n\n const [safeArea, setSafeArea] = useState<SafeAreaInsets>(computeSafeArea);\n\n useEffect(() => {\n setSafeArea(computeSafeArea());\n const unsubscribe = adapter.subscribe?.(() => {\n setSafeArea(computeSafeArea());\n });\n\n return () => unsubscribe?.();\n }, [adapter, computeSafeArea]);\n\n return safeArea ?? ZERO_SAFE_AREA;\n}","import type { MiniAppPlatform } from '@/types/miniApp';\nimport { detectPlatform } from '@/adapters';\nimport { getActiveAdapter } from '@/registry';\n\nlet cachedPlatform: MiniAppPlatform | null = null;\n\nexport function getPlatform(): MiniAppPlatform {\n const adapter = getActiveAdapter();\n if (adapter) {\n if (adapter.platform !== 'web') {\n cachedPlatform = adapter.platform;\n }\n return adapter.platform;\n }\n\n if (cachedPlatform && cachedPlatform !== 'web') {\n return cachedPlatform;\n }\n\n const detectedPlatform = detectPlatform();\n if (detectedPlatform !== 'web') {\n cachedPlatform = detectedPlatform;\n }\n return detectedPlatform;\n}\n","import type { MiniAppAdapter } from '@/types/miniApp';\nimport { getActiveAdapter } from '@/registry';\nimport { getPlatform } from './platform';\nimport { getVkPixelCode as readVkPixelCode, setVkPixelCode } from '@/config/vkAnalytics';\n\ntype AnalyticsPayload = Record<string, unknown>;\n\nexport function configureVkPixel(pixelCode: string): void {\n setVkPixelCode(pixelCode);\n}\n\nexport function getVkPixelCode(): string | null {\n return readVkPixelCode();\n}\n\nexport function trackConversionEvent(event: string, payload?: Record<string, unknown>): void {\n const adapter = resolveVkAdapter();\n adapter?.trackConversionEvent(event, payload as AnalyticsPayload | undefined);\n}\n\nexport function trackPixelEvent(event: string, payload?: Record<string, unknown>): void {\n const adapter = resolveVkAdapter();\n adapter?.trackPixelEvent(event, payload as AnalyticsPayload | undefined);\n}\n\nfunction resolveVkAdapter(): MiniAppAdapter | null {\n const adapter = getActiveAdapter();\n if (adapter) {\n return adapter.platform === 'vk' ? adapter : null;\n }\n\n if (getPlatform() !== 'vk') {\n return null;\n }\n\n return null;\n}\n"],"mappings":"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","names":["bridge","bridge","off","pixelCode","useEffect","useMemo","appearance","useEffect","useMemo","useCallback","useEffect","useState","useCallback","useState","useEffect","pixelCode"]}