Skip to content

Mini Apps Integration

Official Telegram Mini Apps Documentation

Components

Alert

A component that shows message in a simple alert with a 'Close' button when is rendered.

vue
<script lang="ts" setup>
import { Alert } from 'vue-tg'

function handleAlertClose() {
  // ...
}
</script>

<template>
  <Alert message="Hello!" @close="handleAlertClose" />
</template>

Props

NameTypeRequiredDescription
messagestringtrueThe message to be displayed in the body of the alert popup.

Events

NameTypeDescription
close() => voidEmits when the opened popup is closed.

BackButton

A component that enables the back button when is rendered.

vue
<script lang="ts" setup>
import { BackButton } from 'vue-tg'

function handleBackButton() {
  // ...
}
</script>

<template>
  <BackButton @click="handleBackButton" />
</template>

Props

NameTypeRequiredDescription
visiblebooleanfalseShows whether the button is visible. Set to true by default.

Events

NameTypeDescription
click() => voidEmits when the back button is pressed.

BiometricManager

A component that init the biometric manager when is rendered.

vue
<script lang="ts" setup>
import { BiometricManager } from 'vue-tg'
  
const handleInit = () => {
  // ...
}
</script>

<template>
  <BiometricManager @init="handleInit" />
</template>

Events

NameTypeDescription
init() => voidEmits when the biometric manager is init.

ClosingConfirmation

A component that enables the confirmation dialog while the user is trying to close the Mini App.

vue
<script lang="ts" setup>
import { ClosingConfirmation } from 'vue-tg'
</script>

<template>
  <ClosingConfirmation />
</template>

Confirm

A component that shows message in a simple confirmation window with 'OK' and 'Cancel' buttons when is rendered.

vue
<script lang="ts" setup>
import { Confirm } from 'vue-tg'

function handleConfirmClose(ok: boolean) {
  // ...
}
</script>

<template>
  <Confirm message="Hello?" @close="handleConfirmClose" />
</template>

Props

NameTypeRequiredDescription
messagestringtrueThe message to be displayed in the body of the confirm popup.

Events

NameTypeDescription
close(ok: boolean) => voidEmits when the opened popup is closed.

ExpandedViewport

A component that expands the Mini App to the maximum available height when is rendered.

vue
<script lang="ts" setup>
import { ExpandedViewport } from 'vue-tg'
</script>

<template>
  <ExpandedViewport />
</template>

Props

NameTypeRequiredDescription
forcebooleanfalseKeep the viewport expanded despite user interaction. Set to false by default.
Note: does not prevent the Mini App from closing.

MainButton

A component that enables the main button when is rendered.

vue
<script lang="ts" setup>
import { MainButton } from 'vue-tg'

function handleMainButton() {
  // ...
}
</script>

<template>
  <MainButton @click="handleMainButton" />
</template>

Props

NameTypeRequiredDescription
visiblebooleanfalseShows whether the button is visible. Set to true by default.
disabledbooleanfalseShows whether the button is disable.
progressbooleanfalseShows whether the button is displaying a loading indicator.
textstringfalseCurrent button text.
colorstringfalseCurrent button color.
textColorstringfalseCurrent button text color.

Events

NameTypeDescription
click() => voidEmits when the main button is pressed.

A component that shows a native popup when is rendered.

vue
<script lang="ts" setup>
import { Popup } from 'vue-tg'

function handlePopupClose(buttonId: string) {
  // ...
}
</script>

<template>
  <Popup message="Hello" @close="handlePopupClose" />
</template>

Props

NameTypeRequiredDescription
messagestringtrueThe message to be displayed in the body of the popup.
titlestringfalseThe text to be displayed in the popup title.
buttonsPopupButton[] ↗falseList of buttons to be displayed in the popup.

Events

NameTypeDescription
close(buttonId: string) => voidEmits when the opened popup is closed.

ScanQr

A component that shows a native popup for scanning a QR code when is rendered.

vue
<script lang="ts" setup>
import { ScanQr } from 'vue-tg'

function handleScanResult(data: string) {
  // ...
}
</script>

<template>
  <ScanQr @result="handleScanResult" />
</template>

Props

NameTypeRequiredDescription
textstringfalseThe text to be displayed under the 'Scan QR' heading.

Events

NameTypeDescription
result(data: string) => voidEmits when the QR code scanner catches a code with text data.

SettingsButton

A component that enables the settings button when is rendered.

vue
<script lang="ts" setup>
import { SettingsButton } from 'vue-tg'

function handleSettingsButton() {
  // ...
}
</script>

<template>
  <SettingsButton @click="handleSettingsButton" />
</template>

Props

NameTypeRequiredDescription
visiblebooleanfalseShows whether the button is visible. Set to true by default.

Events

NameTypeDescription
click() => voidEmits when the settings button is pressed.

Composables

Field Mapping

FieldComposable
initDatauseWebApp
initDataUnsafeuseWebApp
versionuseWebApp
platformuseWebApp
colorSchemeuseWebAppTheme
themeParamsuseWebAppTheme
isExpandeduseWebAppViewport
viewportHeightuseWebAppViewport
viewportStableHeightuseWebAppViewport
headerColoruseWebAppTheme
backgroundColoruseWebAppTheme
isClosingConfirmationEnableduseWebAppClosingConfirmation
BackButtonuseWebAppBackButton
MainButtonuseWebAppMainButton
HapticFeedbackuseWebAppHapticFeedback
BiometricManageruseWebAppBiometricManager
isVersionAtLeastuseWebApp
setHeaderColoruseWebAppTheme
setBackgroundColoruseWebAppTheme
enableClosingConfirmationuseWebAppClosingConfirmation
disableClosingConfirmationuseWebAppClosingConfirmation
onEventuseWebApp
offEventHandled automagically 🪄
sendDatauseWebApp
switchInlineQueryuseWebAppNavigation
openLinkuseWebAppNavigation
openTelegramLinkuseWebAppNavigation
openInvoiceuseWebAppNavigation
showPopupuseWebAppPopup
showAlertuseWebAppPopup
showConfirmuseWebAppPopup
showScanQrPopupuseWebAppQrScanner
closeScanQrPopupuseWebAppQrScanner
readTextFromClipboarduseWebAppClipboard
requestWriteAccessuseWebAppRequests
requestContactuseWebAppRequests
readyuseWebApp
expanduseWebAppViewport
closeuseWebApp

Event Handling

Usage Example

ts
import { useWebAppTheme } from 'vue-tg'

const { onThemeChanged } = useWebAppTheme()

onThemeChanged(() => {
  // handle theme update
})

Mapping

Event nameHandler
themeChangeduseWebAppTheme → onThemeChanged
viewportChangeduseWebAppViewport → onViewportChanged
mainButtonClickeduseWebAppMainButton → onMainButtonClicked
backButtonClickeduseWebAppBackButton → onBackButtonClicked
settingsButtonClickeduseWebAppSettingsButton → onSettingsButtonClicked
invoiceCloseduseWebAppNavigation → onInvoiceClosed
popupCloseduseWebAppPopup → onPopupClosed
qrTextReceiveduseWebAppQrScanner → onQrTextReceived
clipboardTextReceiveduseWebAppClipboard → onClipboardTextReceived
writeAccessRequesteduseWebAppRequests → onWriteAccessRequested
contactRequesteduseWebAppRequests → onContactRequested
biometricManagerUpdateduseWebAppBiometricManager → onBiometricManagerUpdated
biometricAuthRequesteduseWebAppBiometricManager → onBiometricAuthRequested
biometricTokenUpdateduseWebAppBiometricManager → onBiometricTokenUpdated

useWebApp

ts
import { useWebApp } from 'vue-tg'

useWebApp(): Object

Returns

NameType
close() => void
initDatastring
initDataUnsafeWebAppInitData ↗
isVersionAtLeast(version: string) => boolean
onEventAvailable Events ↗
platformstring
ready() => void
sendData(data: string) => void
versionstring
isReady customReadonly<Ref<boolean>>
isPlatform custom(name: string) => boolean
isPlatformUnknown customboolean
canSendData customboolean

useWebAppBackButton

ts
import { useWebAppBackButton } from 'vue-tg'

useWebAppBackButton(): Object

Returns

NameType
hideBackButton() => void
isBackButtonVisibleRef<boolean>
onBackButtonClicked(eventHandler: () => void) => void
showBackButton() => void

useWebAppBiometricManager

ts
import { useWebAppBiometricManager } from 'vue-tg'

useWebAppBiometricManager(): Object

Returns

NameType
isBiometricInitedReadonly<Ref<boolean>>
isBiometricAvailableReadonly<Ref<boolean>>
biometricTypeReadonly<Ref<"finger" | "face" | "unknown">>
isBiometricAccessRequestedReadonly<Ref<boolean>>
isBiometricAccessGrantedReadonly<Ref<boolean>>
isBiometricTokenSavedReadonly<Ref<boolean>>
biometricDeviceIdReadonly<Ref<string>>
initBiometric(callback?: () => void) => void
requestBiometricAccess(params: BiometricRequestAccessParams, callback?: (isAccessGranted: boolean) => void) => void
authenticateBiometric(params: BiometricAuthenticateParams, callback?: (isAuthenticated: boolean, biometricToken?: string) => void) => void
updateBiometricToken(token: string, callback?: (applied: boolean) => void) => void
openBiometricSettings() => void
onBiometricManagerUpdated(eventHandler: () => void) => void
onBiometricAuthRequested(eventHandler: OnBiometricAuthRequested)) => void
onBiometricTokenUpdated(eventHandler: OnBiometricTokenUpdated)) => void

useWebAppClipboard

ts
import { useWebAppClipboard } from 'vue-tg'

useWebAppClipboard(): Object

Returns

NameType
onClipboardTextReceived(eventHandler: OnClipboardTextReceivedCallback) => void
readTextFromClipboard(callback?: (data: null | string) => void) => void

useWebAppClosingConfirmation

ts
import { useWebAppClosingConfirmation } from 'vue-tg'

useWebAppClosingConfirmation(): Object

Returns

NameType
disableClosingConfirmation() => void
enableClosingConfirmation() => void
isClosingConfirmationEnabledRef<boolean>

useWebAppCloudStorage

ts
import { useWebAppCloudStorage } from 'vue-tg'

useWebAppCloudStorage(): Object

Returns

NameType
getStorageItem(key: string) => Promise<null | string>
getStorageItems(keys: string[]) => Promise<Record<string, string>>
getStorageKeys() => Promise<string[]>
removeStorageItem(key: string) => Promise<null | true>
removeStorageItems(keys: string[]) => Promise<null | true>
setStorageItem(key: string, value: string) => Promise<null | true>

useWebAppHapticFeedback

ts
import { useWebAppHapticFeedback } from 'vue-tg'

useWebAppHapticFeedback(): Object

Returns

NameType
impactOccurred(style: "light" | "medium" | "heavy" | "rigid" | "soft") => () => void
notificationOccurred(type: "error" | "success" | "warning") => () => void
selectionChanged() => void

useWebAppMainButton

ts
import { useWebAppMainButton } from 'vue-tg'

useWebAppMainButton(): Object

Returns

NameType
disableMainButton() => void
enableMainButton() => void
hideMainButton() => void
hideMainButtonProgress() => void
isMainButtonActiveRef<boolean>
isMainButtonProgressVisibleRef<boolean>
isMainButtonVisibleRef<boolean>
mainButtonColorRef<string>
mainButtonTextRef<string>
mainButtonTextColorRef<string>
onMainButtonClicked(eventHandler: () => void) => void
setMainButtonParams(params:MainButtonParams ↗) => void
setMainButtonText(text: string) => void
showMainButton() => void
showMainButtonProgress(leaveActive?: boolean) => void

useWebAppNavigation

ts
import { useWebAppNavigation } from 'vue-tg'

useWebAppNavigation(): Object

Returns

NameType
onInvoiceClosed(eventHandler:OnInvoiceClosedCallback) => void
openInvoice(url: string, callback: (url: string, status: "paid" | "cancelled" | "failed" | "pending") => void) => void
openLink(url: string, options?: { try_instant_view?: boolean }) => void
openTelegramLink(url: string) => void
switchInlineQuery(query: string, choose_chat_types?: ("users" | "bots" | "groups" | "channels")[]) => void

useWebAppPopup

ts
import { useWebAppPopup } from 'vue-tg'

useWebAppPopup(): Object

Returns

NameType
onPopupClosed(eventHandler:OnPopupClosedCallback) => void
showAlert(message: string, callback?: () => void) => void
showConfirm(message: string, callback?: (ok: boolean) => void) => void
showPopup(params: PopupParams, callback?: (button_id: string) => void) => void

useWebAppQrScanner

ts
import { useWebAppQrScanner } from 'vue-tg'

useWebAppQrScanner(): Object

Returns

NameType
closeScanQrPopup() => void
onQrTextReceived(eventHandler:OnQrTextReceivedCallback) => void
showScanQrPopup(params:ScanQrPopupParams ↗, callback?: (data: string) => void) => void

useWebAppRequests

ts
import { useWebAppRequests } from 'vue-tg'

useWebAppRequests(): Object

Returns

NameType
onContactRequested(eventHandler:OnContactRequestedCallback) => void
onWriteAccessRequested(eventHandler:OnWriteAccessRequestedCallback) => void
requestContact(callback?: (success: boolean) => void) => void
requestWriteAccess(callback?: (success: boolean) => void) => void

useWebAppSendData custom

Useful composable for universal data sending. execute just calls sendData and executeHttp sends an HTTP POST request to the specified URL.
Use canSendData from useWebApp to check that sending data in a service message (using execute) is available.

ts
import { useWebAppSendData } from 'vue-tg'

useWebAppSendData<D>(data, options): Object

Parameters

NameType
dataD
options{ serialize?: (data: D) => string }

Returns

NameType
errorRef<string>
execute() => void
executeHttp(callbackUrl: string, { closeAfter?: boolean }) => Promise<Response>

useWebAppSettingsButton

ts
import { useWebAppSettingsButton } from 'vue-tg'

useWebAppSettingsButton(): Object

Returns

NameType
hideSettingsButton() => void
isSettingsButtonVisibleRef<boolean>
onSettingsButtonClicked(eventHandler: () => void) => void
showSettingsButton() => void

useWebAppTheme

ts
import { useWebAppTheme } from 'vue-tg'

useWebAppTheme(): Object

Returns

NameType
backgroundColorRef<string>
colorSchemeReadonly<Ref<"light" | "dark">>
headerColorRef<string>
onThemeChanged(eventHandler: () => void) => void
setBackgroundColor(color: string | "bg_color" | "secondary_bg_color") => void
setHeaderColor(color: string | "bg_color" | "secondary_bg_color") => void
themeParamsReadonly<Ref<ThemeParams ↗>>

useWebAppViewport

ts
import { useWebAppViewport } from 'vue-tg'

useWebAppViewport(): Object

Returns

NameType
expand() => void
isExpandedReadonly<Ref<boolean>>
onViewportChanged(eventHandler:OnViewportChangedCallback) => void
viewportHeightReadonly<Ref<number>>
viewportStableHeightReadonly<Ref<number>>

Type Aliases

OnClipboardTextReceivedCallback

Ƭ OnClipboardTextReceivedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.datastring | null

OnContactRequestedCallback

Ƭ OnContactRequestedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.status"sent" | "cancelled"

OnInvoiceClosedCallback

Ƭ OnInvoiceClosedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.status"paid" | "cancelled" | "failed" | "pending"
eventData.urlstring

OnPopupClosedCallback

Ƭ OnPopupClosedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.button_idstring | null

OnQrTextReceivedCallback

Ƭ OnQrTextReceivedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.datastring

OnViewportChangedCallback

Ƭ OnViewportChangedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.isStateStableboolean

OnWriteAccessRequestedCallback

Ƭ OnWriteAccessRequestedCallback: (eventData) => void

Parameters
NameType
eventDataObject
eventData.status"allowed" | "cancelled"

OnBiometricAuthRequested

Ƭ OnBiometricAuthRequested: (eventData) => void

Parameters
NameType
isAuthenticatedboolean
biometricTokenstring | undefined

OnBiometricTokenUpdated

Ƭ OnBiometricTokenUpdated: (eventData) => void

Parameters
NameType
isUpdatedboolean