telegram-miniapp-tools
Version:
Tools for working with Telegram Miniapps
1,168 lines (1,167 loc) • 59.5 kB
TypeScript
export type Color = string | false;
/**
* Telegram application platform name.
*/
export type Platform = "android" | "android_x" | "ios" | "macos" | "tdesktop" | "unigram" | "unknown" | "web" | "weba" | string;
/**
* Telegram Mini Apps version in format like "\d+.\d+".
* @example "7.0"
*/
export type Version = string;
export type HomeScreenStatus = "unsupported" | "unknown" | "added" | "missed";
export type FullscreenError = "UNSUPPORTED" | "ALREADY_FULLSCREEN" | string;
/**
* The Telegram global object available on the `window`.
*
* Provides access to Telegram Web App features and methods.
*/
export interface Telegram {
WebApp: WebApp;
}
/**
* The Telegram Web App interface
*
* Provides methods and properties specific to the Web App interface.
*/
export interface WebApp {
/**
* A string with raw data transferred to the Web App, convenient for
* validating data. WARNING: Validate data from this field before using it
* on the bot's server.
*/
initData: string;
/**
* An object with input data transferred to the Web App. WARNING: Data from
* this field should not be trusted. You should only use data from initData
* on the bot's server and only after it has been validated.
*/
initDataUnsafe: WebAppInitData;
/**
* The version of the Bot API available in the user's Telegram app.
*/
version: Version;
/**
* The name of the platform of the user's Telegram app.
*/
platform: Platform;
/**
* The color scheme currently used in the Telegram app. Either “light” or
* “dark”. Also available as the CSS variable var(--tg-color-scheme).
*/
colorScheme: "light" | "dark";
/**
* An object containing the current theme settings used in the Telegram app.
*/
themeParams: ThemeParams;
/**
* True if the Web App is expanded to the maximum available height.
* False, if the Web App occupies part of the screen and can be expanded to the
* full height using the expand() method.
*/
isExpanded: boolean;
/**
* The current height of the visible area of the Web App.
* Also available in CSS as the variable var(--tg-viewport-height).
*
* The application can display just the top part of the Web App, with its
* lower part remaining outside the screen area. From this position, the
* user can “pull” the Web App to its maximum height, while the bot can do
* the same by calling the expand() method. As the position of the Web App
* changes, the current height value of the visible area will be updated in
* real time.
*
* Please note that the refresh rate of this value is not sufficient to
* smoothly follow the lower border of the window. It should not be used to
* pin interface elements to the bottom of the visible area. It's more
* appropriate to use the value of the viewportStableHeight field for this
* purpose.
*/
viewportHeight: number;
/**
* The height of the visible area of the Web App in its last stable state.
* Also available in CSS as a variable var(--tg-viewport-stable-height).
*
* The application can display just the top part of the Web App, with its
* lower part remaining outside the screen area. From this position, the
* user can “pull” the Web App to its maximum height, while the bot can do
* the same by calling the expand() method. Unlike the value of
* viewportHeight, the value of viewportStableHeight does not change as the
* position of the Web App changes with user gestures or during animations.
* The value of viewportStableHeight will be updated after all gestures and
* animations are completed and the Web App reaches its final size.
*
* Note the event viewportChanged with the passed parameter
* isStateStable=true, which will allow you to track when the stable state
* of the height of the visible area changes.
*/
viewportStableHeight: number;
/**
* Current header color in the #RRGGBB format.
*/
headerColor: string;
/**
* Current background color in the #RRGGBB format.
*/
backgroundColor: string;
/**
* Current bottom bar color in the #RRGGBB format.
*/
bottomBarColor: string;
/**
* True, if the confirmation dialog is enabled while the user is trying to
* close the Web App. False, if the confirmation dialog is disabled.
*/
isClosingConfirmationEnabled: boolean;
/**
* An object for controlling the back button which can be displayed in the
* header of the Web App in the Telegram interface.
*/
BackButton: BackButton;
/**
* An object for controlling the main button, which is displayed at the
* bottom of the Web App in the Telegram interface.
*/
MainButton: BottomButton;
/**
* An object for controlling the secondary button,
* which is displayed at the bottom of the Mini App in the Telegram interface.
*/
SecondaryButton: BottomButton;
/**
* An object for controlling the Settings item in the context menu of the
* Mini App in the Telegram interface.
*/
SettingsButton: SettingsButton;
/**
* An object for controlling haptic feedback.
*/
HapticFeedback: HapticFeedback;
/**
* An object for controlling cloud storage.
*/
CloudStorage: CloudStorage;
/**
* An object for controlling biometrics on the device.
*/
BiometricManager: BiometricManager;
/**
* Returns true if the user's app supports a version of the Bot API that is
* equal to or higher than the version passed as the parameter.
*/
isVersionAtLeast(version: Version): boolean;
/**
* A method that sets the app header color in the `#RRGGBB` format. You can
* also use keywords bg_color and secondary_bg_color.
*/
setHeaderColor(color: "bg_color" | "secondary_bg_color" | (string & {})): void;
/**
* A method that sets the app background color in the `#RRGGBB` format or
* you can use keywords bg_color, secondary_bg_color instead.
*/
setBackgroundColor(color: "bg_color" | "secondary_bg_color" | "bottom_bar_bg_color" | (string & {})): void;
/**
* A method that sets the app's bottom bar color in the #RRGGBB format.
* You can also use the keywords bg_color, secondary_bg_color and bottom_bar_bg_color.
*/
setBottomBarColor(color: "bg_color" | "secondary_bg_color" | (string & {})): void;
/**
* A method that enables a confirmation dialog while the user is trying to
* close the Web App.
*/
enableClosingConfirmation(): void;
/**
* A method that disables the confirmation dialog while the user is trying
* to close the Web App.
*/
disableClosingConfirmation(): void;
/**
* A method that sets the app event handler. Check the list of available
* events.
*/
onEvent<T extends EventNames>(eventType: T, eventHandler: EventParams[T]): void;
/** A method that deletes a previously set event handler. */
offEvent<T extends EventNames>(eventType: T, eventHandler: EventParams[T]): void;
/**
* A method used to send data to the bot. When this method is called, a
* service message is sent to the bot containing the data data of the length
* up to 4096 bytes, and the Web App is closed. See the field web_app_data
* in the class Message.
*
* This method is only available for Web Apps launched via a Keyboard
* button.
*/
sendData(data: unknown): void;
/**
* A method that inserts the bot's username and the specified inline query
* in the current chat's input field. Query may be empty, in which case only
* the bot's username will be inserted. If an optional choose_chat_types
* parameter was passed, the client prompts the user to choose a specific
* chat, then opens that chat and inserts the bot's username and the
* specified inline query in the input field. You can specify which types of
* chats the user will be able to choose from. It can be one or more of the
* following types: users, bots, groups, channels.
*/
switchInlineQuery(query: string, choose_chat_types?: Array<"users" | "bots" | "groups" | "channels">): void;
/**
* A method that opens a link in an external browser. The Web App will not
* be closed. If the optional `options` parameter is passed, additional
* preferences for opening the link can be specified.
*
* Note that this method can be called only in response to user interaction
* with the Web App interface (e.g., a click inside the Web App or on the
* main button).
*
* @param url The URL to be opened.
* @param options Optional settings for opening the link.
* @param options.tryInstantView Whether to attempt opening the link in Instant View mode (if supported).
* @param options.tryBrowser Specifies the preferred browser to open the link in. Supported values include:
* - 'google-chrome', 'chrome'
* - 'mozilla-firefox', 'firefox'
* - 'microsoft-edge', 'edge'
* - 'opera', 'opera-mini'
* - 'brave', 'brave-browser'
* - 'duckduckgo', 'duckduckgo-browser'
* - 'samsung', 'samsung-browser'
* - 'vivaldi', 'vivaldi-browser'
* - 'kiwi', 'kiwi-browser'
* - 'uc', 'uc-browser'
* - 'tor', 'tor-browser'
*/
openLink(url: string, options?: OpenLinkOptions): void;
/**
* A method that opens a telegram link inside Telegram app. The Web App will
* be closed.
*/
openTelegramLink(url: string): void;
/**
* A method that opens an invoice using the link url. The Web App will
* receive the event invoiceClosed when the invoice is closed. If an
* optional callback parameter was passed, the callback function will be
* called and the invoice status will be passed as the first argument.
*/
openInvoice(url: string, callback?: (status: InvoiceStatus) => unknown): void;
/**
* A method that shows a native popup described by the params argument of
* the type PopupParams. The Web App will receive the event popupClosed when
* the popup is closed. If an optional callback parameter was passed, the
* callback function will be called and the field id of the pressed button
* will be passed as the first argument.
*/
showPopup(params: PopupParams, callback?: (button_id: string) => void): void;
/**
* A method that shows message in a simple alert with a 'Close' button. If
* an optional callback parameter was passed, the callback function will be
* called when the popup is closed.
*/
showAlert(message: string, callback?: () => void): void;
/**
* A method that shows message in a simple confirmation window with 'OK' and
* 'Cancel' buttons. If an optional callback parameter was passed, the
* callback function will be called when the popup is closed and the first
* argument will be a boolean indicating whether the user pressed the 'OK'
* button.
*/
showConfirm(message: string, callback?: (ok: boolean) => void): void;
/**
* A method that shows a native popup for scanning a QR code described by
* the params argument of the type ScanQrPopupParams. The Web App will
* receive the event qrTextReceived every time the scanner catches a code
* with text data. If an optional callback parameter was passed, the
* callback function will be called and the text from the QR code will be
* passed as the first argument. Returning true inside this callback
* function causes the popup to be closed. Starting from **Bot API 7.7**,
* the Mini App will receive the scanQrPopupClosed event if the user closes
* the native popup for scanning a QR code.
*/
showScanQrPopup(params: ScanQrPopupParams, callback?: (data: string) => void): void;
/**
* A method that closes the native popup for scanning a QR code opened with
* the showScanQrPopup method. Run it if you received valid data in the
* event qrTextReceived.
*/
closeScanQrPopup(): void;
/** A method that opens the native story editor with the media specified in
* the media_url parameter as an HTTPS URL. An optional params argument of
* the type StoryShareParams describes additional sharing settings. */
shareToStory(media_url: string, params?: StoryShareParams): void;
/**
* A method that requests text from the clipboard. The Web App will receive
* the event clipboardTextReceived. If an optional callback parameter was
* passed, the callback function will be called and the text from the
* clipboard will be passed as the first argument.
*
* Note: this method can be called only for Web Apps launched from the
* attachment menu and only in response to a user interaction with the Web
* App interface (e.g. a click inside the Web App or on the main button).
*/
readTextFromClipboard(callback?: (data: string | null) => void): void;
/**
* A method that shows a native popup requesting permission for the bot to
* send messages to the user.
*
* @param callback If an optional callback parameter was passed, the
* callback function will be called when the popup is closed and the first
* argument will be a boolean indicating whether the user granted this
* access.
*/
requestWriteAccess(callback?: (success: boolean) => unknown): void;
/**
* A method that shows a native popup prompting the user for their phone
* number.
*
* @param callback If an optional callback parameter was passed, the
* callback function will be called when the popup is closed and the first
* argument will be a boolean indicating whether the user shared its phone
* number. The second argument, contingent upon success, will be an object
* detailing the shared contact information or a cancellation response.
*/
requestContact(callback?: (success: boolean, response: RequestContactResponse) => unknown): void;
/**
* A method that informs the Telegram app that the Web App is ready to be
* displayed. It is recommended to call this method as early as possible, as
* soon as all essential interface elements are loaded. Once this method is
* called, the loading placeholder is hidden and the Web App is shown. If
* the method is not called, the placeholder will be hidden only when the
* page is fully loaded.
*/
ready(): void;
/**
* A method that expands the Web App to the maximum available height. To
* find out if the Web App is expanded to the maximum height, refer to the
* value of the Telegram.WebApp.isExpanded parameter
*/
expand(): void;
/** A method that closes the Web App. */
close(): void;
/**
* `True`, if vertical swipes to close or minimize the Mini App are enabled.
* `False`, if vertical swipes to close or minimize the Mini App are
* disabled. In any case, the user will still be able to minimize and close
* the Mini App by swiping the Mini App's header.
*/
isVerticalSwipesEnabled: boolean;
/**
* **Bot API 7.7+** A method that enables vertical swipes to close or
* minimize the Mini App. For user convenience, it is recommended to always
* enable swipes unless they conflict with the Mini App's own gestures.
*/
enableVerticalSwipes(): void;
/**
* **Bot API 7.7+** A method that disables vertical swipes to close or
* minimize the Mini App. This method is useful if your Mini App uses swipe
* gestures that may conflict with the gestures for minimizing and closing
* the app.
*/
disableVerticalSwipes(): void;
/**
* **Bot API 8.0+** A method that requests opening the Mini App in fullscreen mode.
* Although the header is transparent in fullscreen mode, it is recommended that
* the Mini App sets the header color using the setHeaderColor method. This color
* helps determine a contrasting color for the status bar and other UI controls.
*/
requestFullscreen(): void;
/**
* **Bot API 8.0+** A method that requests exiting fullscreen mode.
*/
exitFullscreen(): void;
/**
* **Bot API 8.0+** A method that locks the Mini App’s orientation
* to its current mode (either portrait or landscape). Once locked,
* the orientation remains fixed, regardless of device rotation.
* This is useful if a stable orientation is needed during specific interactions.
*/
lockOrientation(): void;
/**
* **Bot API 8.0+** A method that unlocks the Mini App’s orientation,
* allowing it to follow the device's rotation freely. Use this to restore
* automatic orientation adjustments based on the device orientation.
*/
unlockOrientation(): void;
/**
* **Bot API 8.0+** A method that prompts the user to add the Mini App to
* the home screen.
*
* After successfully adding the icon, the `homeScreenAdded` event will be
* triggered if supported by the device. Note that if the device cannot
* determine the installation status, the event may not be received even
* if the icon has been added.
*/
addToHomeScreen(): void;
/**
* **Bot API 8.0+** A method that checks if adding to the home screen
* is supported and if the Mini App has already been added.
*
* @param {HomeScreenStatus} callback If an optional callback parameter was passed, the
* callback function will be called with a single argument **status**,
* which is a string indicating the home screen status.
*/
checkHomeScreenStatus(callback?: (status: HomeScreenStatus) => void): void;
/**
* **Bot API 8.0+** True, if the Mini App is currently being displayed in fullscreen mode.
*/
isFullscreen: boolean;
/**
* **Bot API 8.0+** An object representing the device's safe area insets,
* accounting for system UI elements like notches or navigation bars.
*/
safeAreaInset: SafeAreaInset;
/**
* **Bot API 8.0+** An object representing the safe area for displaying content within the app,
* free from overlapping Telegram UI elements.
*/
contentSafeAreaInset: ContentSafeAreaInset;
/**
* **Bot API 8.0+** A method that opens a dialog allowing the user
* to share a message provided by the bot. If an optional callback
* parameter is provided, the callback function will be called with
* a boolean as the first argument, indicating whether the message
* was successfully sent. The message id passed to this method must
* belong to a `PreparedInlineMessage` previously obtained via the
* Bot API method `savePreparedInlineMessage`.
*
* @param msgId
* @param callback - Optional callback function, called with a boolean indicating if the message was sent.
*/
shareMessage(msgId: string, callback?: (isSent: boolean) => unknown): void;
/**
* **Bot API 8.0+** A method that opens a dialog allowing the user
* to set the specified custom emoji as their status. An optional
* params argument of type `EmojiStatusParams` specifies additional settings,
* such as duration. If an optional callback parameter is provided,
* the callback function will be called with a boolean as the first argument,
* indicating whether the status was set.
*
* Note: this method opens a native dialog and cannot be used to set the emoji
* status without manual user interaction. For fully programmatic changes,
* you should instead use the Bot API method `setUserEmojiStatus` after
* obtaining authorization to do so via the Mini App method requestEmojiStatusAccess.
*
* @param customEmojiId - The ID of the custom emoji to set as status.
* @param params - Optional settings for the status, such as duration.
* @param callback - Optional callback function, called with a boolean indicating if the status was set.
*/
setEmojiStatus(customEmojiId: string, params?: EmojiStatusParams, callback?: (isSet: boolean) => unknown): void;
/**
* **Bot API 8.0+** A method that shows a native popup requesting permission
* for the bot to manage user's emoji status.
*
* If an optional callback parameter is passed, the callback function
* will be called when the popup is closed and the first argument will
* be a boolean indicating whether the user granted this access.
*
* @param callback - Optional callback function, called with a boolean indicating
* if access was granted.
*/
requestEmojiStatusAccess(callback?: (isGranted: boolean) => unknown): void;
/**
* **Bot API 8.0+** A method that displays a native popup prompting the user to download a
* file specified by the params argument of type DownloadFileParams.
*
* If an optional callback parameter is provided, the callback function
* will be called when the popup is closed, with the first argument as a
* boolean indicating whether the user accepted the download request.
*
* @param params
* @param callback
*/
downloadFile(params: DownloadFileParams, callback?: (isAccepted: boolean) => unknown): void;
}
export type ThemeChangedCallback = () => void;
export type ViewportChangedCallback = (eventData: {
isStateStable: boolean;
}) => void;
export type MainButtonClickedCallback = () => void;
export type SecondaryButtonClickedCallback = () => void;
export type BackButtonClickedCallback = () => void;
export type SettingsButtonClickedCallback = () => void;
export type InvoiceStatus = "paid" | "failed" | "pending" | "cancelled" | string;
export type InvoiceClosedCallback = (eventData: {
url: string;
status: InvoiceStatus;
}) => void;
export type PopupClosedCallback = (eventData: {
button_id: string | null;
}) => void;
export type QrTextReceivedCallback = (eventData: {
data: string;
}) => void;
export type ScanQrPopupClosedCallback = () => void;
export type ClipboardTextReceivedCallback = (eventData: {
data: string | null;
}) => void;
export type WriteAccessRequestedCallback = (eventData: {
status: WriteAccessRequestedStatus;
}) => void;
export type ContactRequestedCallback = (eventData: RequestContactResponse) => void;
export type BiometricManagerUpdatedCallback = () => void;
export type BiometricAuthRequestedCallback = (eventData: {
isAuthenticated: boolean;
biometricToken?: string;
}) => void;
export type BiometricTokenUpdatedCallback = (eventData: {
isUpdated: boolean;
}) => void;
export type HomeScreenCheckedCallback = (eventData: {
status: HomeScreenStatus;
}) => void;
export type HomeScreenAddedCallback = () => void;
export type FullscreenChangedCallback = () => void;
export type FullscreenFailedCallback = (eventData: {
error: FullscreenError;
}) => void;
export type CustomMethodInvokedCallback = (eventData: {
req_id: string;
result: Record<string, unknown>;
}) => void;
export type EmojiStatusParams = {
/**
* Duration in seconds for how long the emoji status should last.
*/
duration?: number;
};
export type ActivatedCallback = () => void;
export type DeactivatedCallback = () => void;
export type SafeAreaChangedCallback = () => void;
export type ContentSafeAreaChangedCallback = () => void;
export type AccelerometerStartedCallback = () => void;
export type AccelerometerStoppedCallback = () => void;
export type AccelerometerChangedCallback = () => void;
export type AccelerometerFailedCallback = (eventData: {
error: "UNSUPPORTED";
}) => void;
export type DeviceOrientationStartedCallback = () => void;
export type DeviceOrientationStoppedCallback = () => void;
export type DeviceOrientationChangedCallback = () => void;
export type DeviceOrientationFailedCallback = (eventData: {
error: "UNSUPPORTED";
}) => void;
export type GyroscopeStartedCallback = () => void;
export type GyroscopeStoppedCallback = () => void;
export type GyroscopeChangedCallback = () => void;
export type GyroscopeFailedCallback = (eventData: {
error: "UNSUPPORTED";
}) => void;
export type LocationManagerUpdatedCallback = () => void;
export type LocationRequestedCallback = (eventData: {
locationData: LocationData;
}) => void;
export type ShareMessageSentCallback = () => void;
export type ShareMessageFailedCallback = (eventData: {
error: "UNSUPPORTED" | "MESSAGE_EXPIRED" | "MESSAGE_SEND_FAILED" | "USER_DECLINED" | "UNKNOWN_ERROR";
}) => void;
export type EmojiStatusSetCallback = () => void;
export type EmojiStatusFailedCallback = (eventData: {
error: "UNSUPPORTED" | "SUGGESTED_EMOJI_INVALID" | "DURATION_INVALID" | "USER_DECLINED" | "SERVER_ERROR" | "UNKNOWN_ERROR";
}) => void;
export type EmojiStatusAccessRequestedCallback = (eventData: {
status: "allowed" | "cancelled";
}) => void;
export type FileDownloadRequestedCallback = (eventData: {
status: "downloading" | "cancelled";
}) => void;
/**
* This object describes the parameters for the file download request.
* Note: To ensure consistent file download behavior across platforms,
* it is recommended to include the HTTP header `Content-Disposition: attachment; filename="<file_name>"`
* in the server response. This header helps prompt the download action
* and suggests a file name for the downloaded file, especially on web platforms
* where forced downloads cannot always be guaranteed.
*/
export type DownloadFileParams = {
url: string;
file_name: string;
};
export type EventParams = {
invoiceClosed: InvoiceClosedCallback;
settingsButtonClicked: SettingsButtonClickedCallback;
backButtonClicked: BackButtonClickedCallback;
mainButtonClicked: MainButtonClickedCallback;
secondaryButtonClicked: SecondaryButtonClickedCallback;
viewportChanged: ViewportChangedCallback;
themeChanged: ThemeChangedCallback;
popupClosed: PopupClosedCallback;
qrTextReceived: QrTextReceivedCallback;
clipboardTextReceived: ClipboardTextReceivedCallback;
writeAccessRequested: WriteAccessRequestedCallback;
contactRequested: ContactRequestedCallback;
scanQrPopupClosed: ScanQrPopupClosedCallback;
activated: ActivatedCallback;
deactivated: DeactivatedCallback;
safeAreaChanged: SafeAreaChangedCallback;
contentSafeAreaChanged: ContentSafeAreaChangedCallback;
fullscreenChanged: FullscreenChangedCallback;
fullscreenFailed: FullscreenFailedCallback;
homeScreenAdded: HomeScreenAddedCallback;
homeScreenChecked: HomeScreenCheckedCallback;
accelerometerStarted: AccelerometerStartedCallback;
accelerometerStopped: AccelerometerStoppedCallback;
accelerometerChanged: AccelerometerChangedCallback;
accelerometerFailed: AccelerometerFailedCallback;
deviceOrientationStarted: DeviceOrientationStartedCallback;
deviceOrientationStopped: DeviceOrientationStoppedCallback;
deviceOrientationChanged: DeviceOrientationChangedCallback;
deviceOrientationFailed: DeviceOrientationFailedCallback;
gyroscopeStarted: GyroscopeStartedCallback;
gyroscopeStopped: GyroscopeStoppedCallback;
gyroscopeChanged: GyroscopeChangedCallback;
gyroscopeFailed: GyroscopeFailedCallback;
locationManagerUpdated: LocationManagerUpdatedCallback;
locationRequested: LocationRequestedCallback;
shareMessageSent: ShareMessageSentCallback;
shareMessageFailed: ShareMessageFailedCallback;
emojiStatusSet: EmojiStatusSetCallback;
emojiStatusFailed: EmojiStatusFailedCallback;
emojiStatusAccessRequested: EmojiStatusAccessRequestedCallback;
fileDownloadRequested: FileDownloadRequestedCallback;
customMethodInvoked: CustomMethodInvokedCallback;
};
export type EventNames = keyof EventParams;
/**
* Web Apps can adjust the appearance of the interface to match the Telegram
* user's app in real time. This object contains the user's current theme
* settings:
*/
export interface ThemeParams {
/**
* Background color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-bg-color)`.
*/
bg_color?: string;
/**
* Main text color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-text-color)`.
*/
text_color?: string;
/**
* Hint text color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-hint-color)`.
*/
hint_color?: string;
/**
* Link color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-link-color)`.
*/
link_color?: string;
/**
* Button color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-button-color)`.
*/
button_color?: string;
/**
* Button text color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-button-text-color)`.
*/
button_text_color?: string;
/**
* **Bot API 6.1+** Secondary background color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-secondary-bg-color)`.
*/
secondary_bg_color?: string;
/**
* **Bot API 7.0+** Header background color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-header-bg-color)`.
*/
header_bg_color?: string;
/**
* **Bot API 7.10+** Bottom background color in the #RRGGBB format.
* Also available as the CSS variable var(--tg-theme-bottom-bar-bg-color).
*/
bottom_bar_bg_color?: string;
/**
* **Bot API 7.0+** Accent text color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-accent-text-color)`.
*/
accent_text_color?: string;
/**
* **Bot API 7.0+** Background color for the section in the `#RRGGBB` format.
* It is recommended to use this in conjunction with *secondary_bg_color*.
* Also available as the CSS variable `var(--tg-theme-section-bg-color)`.
*/
section_bg_color?: string;
/**
* **Bot API 7.0+** Header text color for the section in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-section-header-text-color)`.
*/
section_header_text_color?: `#${string}`;
/**
* **Bot API 7.6+** Section separator color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-section-separator-color)`.
*/
section_separator_color?: string;
/**
* **Bot API 7.0+** Subtitle text color in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-subtitle-text-color)`.
*/
subtitle_text_color?: string;
/**
* **Bot API 7.0+** Text color for destructive actions in the `#RRGGBB` format.
* Also available as the CSS variable `var(--tg-theme-destructive-text-color)`.
*/
destructive_text_color?: string;
[key: string]: string | undefined;
}
/**
* This object describes the native popup.
*/
export interface PopupParams {
/**
* The text to be displayed in the popup title, 0-64 characters.
*/
title?: string;
/**
* The message to be displayed in the body of the popup, 1-256 characters.
*/
message: string;
/**
* List of buttons to be displayed in the popup, 1-3 buttons. Set to
* [{“type”:“close”}] by default.
*/
buttons?: PopupButton[];
}
/**
* This object describes the native popup button.
*/
export type PopupButton = {
/**
* Identifier of the button, 0-64 characters. Set to empty string by
* default. If the button is pressed, its id is returned in the callback
* and the popupClosed event.
*/
id?: string;
/**
* Type of the button. Set to default by default. Can be one of these
* values:
* - `default`, a button with the default style,
* - `ok`, a button with the localized text “OK”,
* - `close`, a button with the localized text “Close”,
* - `cancel`, a button with the localized text “Cancel”,
* - `destructive`, a button with a style that indicates a destructive
* action (e.g. “Remove”, “Delete”, etc.).
*/
type?: "default" | "ok" | "close" | "cancel" | "destructive";
/**
* The text to be displayed on the button, 0-64 characters. Required if
* type is default or destructive. Irrelevant for other types.
*/
text?: string;
} & ({
type: "default" | "destructive";
text: string;
} | {
type: "ok" | "close" | "cancel";
text?: string;
});
/**
* This object controls the back button, which can be displayed in the header of
* the Web App in the Telegram interface.
*/
export interface BackButton {
/**
* Shows whether the button is visible. Set to false by default.
*/
isVisible: boolean;
/**
* A method that sets the button press event handler. An alias for
* Telegram.WebApp.onEvent('backButtonClicked', callback)
*/
onClick(callback: VoidFunction): BackButton;
/**
* A method that removes the button press event handler. An alias for
* Telegram.WebApp.offEvent('backButtonClicked', callback)
*/
offClick(callback: VoidFunction): BackButton;
/**
* A method to make the button active and visible.
*/
show(): BackButton;
/**
* A method to hide the button.
*/
hide(): BackButton;
}
/**
* This object controls the main button, which is displayed at the bottom of the
* Web App in the Telegram interface.
*/
export interface BottomButton {
/** Current button text. Set to CONTINUE by default. */
text: string;
/** Current button color. Set to themeParams.button_color by default. */
color: string;
/**
* Current button text color. Set to themeParams.button_text_color by
* default.
*/
textColor: string;
/** Shows whether the button is visible. Set to false by default. */
isVisible: boolean;
/** Shows whether the button is active. Set to true by default. */
isActive: boolean;
/** Shows whether the button has a shine effect. Set to false by default. */
hasShineEffect: boolean;
/**
* Position of the secondary button. Not defined for the main button.
* It applies only if both the main and secondary buttons are visible. Set to left by default.
* Supported values:
* - left, displayed to the left of the main button,
* - right, displayed to the right of the main button,
* - top, displayed above the main button,
* - bottom, displayed below the main button.
*/
position?: "left" | "right" | "top" | "bottom";
/** Readonly. Shows whether the button is displaying a loading indicator. */
isProgressVisible: boolean;
/** A method to set the button text. */
setText(text: string): BottomButton;
/**
* A method that sets the button press event handler. An alias for
* Telegram.WebApp.onEvent('mainButtonClicked', callback)
*/
onClick(callback: () => void): BottomButton;
/** A method that deletes a previously set handler */
offClick(callback: () => void): BottomButton;
/**
* A method to make the button visible. Note that opening the Web App from
* the attachment menu hides the main button until the user interacts with
* the Web App interface.
*/
show(): BottomButton;
/** A method to hide the button. */
hide(): BottomButton;
/** A method to enable the button. */
enable(): BottomButton;
/** A method to disable the button. */
disable(): BottomButton;
/**
* A method to show a loading indicator on the button. It is recommended to
* display loading progress if the action tied to the button may take a long
* time. By default, the button is disabled while the action is in progress.
* If the parameter leaveActive=true is passed, the button remains enabled.
*/
showProgress(leaveActive?: boolean): BottomButton;
/** A method to hide the loading indicator. */
hideProgress(): BottomButton;
/**
* A method to set the button parameters. The params parameter is an object
* containing one or several fields that need to be changed:
* - text - button text;
* - color - button color;
* - text_color - button text color;
* - is_active - enable the button;
* - is_visible - show the button.
*/
setParams(params: MainButtonParams): BottomButton;
}
export interface MainButtonParams {
/** button text */
text?: string;
/** button color */
color?: Color;
/** button text color */
text_color?: Color;
/** enable shine effect */
has_shine_effect?: boolean;
/** position of the secondary button */
position?: "left" | "right" | "top" | "bottom";
/** enable the button */
is_active?: boolean;
/** show the button */
is_visible?: boolean;
}
/**
* This object controls the Settings item in the context menu of the Mini App in
* the Telegram interface.
*/
export interface SettingsButton {
/**
* Shows whether the context menu item is visible. Set to false by default.
*/
isVisible: boolean;
/**
* **Bot API 7.0+** A method that sets the press event handler for the
* Settings item in the context menu. An alias for
* `Telegram.WebApp.onEvent('settingsButtonClicked', callback)`
*/
onClick(callback: () => void): SettingsButton;
/**
* **Bot API 7.0+** A method that removes the press event handler from the
* Settings item in the context menu. An alias for
* `Telegram.WebApp.offEvent('settingsButtonClicked', callback)`
*/
offClick(callback: () => void): SettingsButton;
/**
* **Bot API 7.0+** A method to make the Settings item in the context menu
* visible.
*/
show(): SettingsButton;
/**
* **Bot API 7.0+** A method to hide the Settings item in the context menu.
*/
hide(): SettingsButton;
}
/**
* This object controls haptic feedback.
*/
export interface HapticFeedback {
/**
* A method tells that an impact occurred. The Telegram app may play the
* appropriate haptics based on style value passed. Style can be one of
* these values:
* - light, indicates a collision between small or lightweight UI objects,
* - medium, indicates a collision between medium-sized or medium-weight UI
* objects,
* - heavy, indicates a collision between large or heavyweight UI objects,
* - rigid, indicates a collision between hard or inflexible UI objects,
* - soft, indicates a collision between soft or flexible UI objects.
*/
impactOccurred(style: "light" | "medium" | "heavy" | "rigid" | "soft"): () => void;
/**
* A method tells that a task or action has succeeded, failed, or produced a
* warning. The Telegram app may play the appropriate haptics based on type
* value passed. Type can be one of these values:
* - error, indicates that a task or action has failed,
* - success, indicates that a task or action has completed successfully,
* - warning, indicates that a task or action produced a warning.
*/
notificationOccurred(type: "error" | "success" | "warning"): () => void;
/**
* A method tells that the user has changed a selection. The Telegram app
* may play the appropriate haptics.
*
* Do not use this feedback when the user makes or confirms a selection; use
* it only when the selection changes.
*/
selectionChanged(): void;
}
/**
* This object controls the cloud storage.
* Each bot can store up to 1024 items per user in the cloud storage.
*/
export interface CloudStorage {
/**
* A method that stores a value in the cloud storage using the specified
* key.
*
* @param key The key should contain 1-128 characters, only A-Z, a-z, 0-9, _
* and - are allowed.
* @param value The value should contain 0-4096 characters. You can store up
* to 1024 keys in the cloud storage.
* @param callback If an optional callback parameter was passed, the
* callback function will be called. In case of an error, the first argument
* will contain the error. In case of success, the first argument will be
* null and the second argument will be a boolean indicating whether the
* value was stored.
*/
setItem(key: string, value: string, callback?: CloudStorageSetItemCallback): void;
/**
* A method that receives a value from the cloud storage using the specified
* key.
*
* @param key The key should contain 1-128 characters, only A-Z, a-z, 0-9, _
* and - are allowed.
* @param callback In case of an error, the callback function will be called
* and the first argument will contain the error. In case of success, the
* first argument will be null and the value will be passed as the second
* argument.
*/
getItem(key: string, callback?: CloudStorageGetItemCallback): void;
/**
* A method that receives values from the cloud storage using the specified
* keys.
*
* @param keys The keys should contain 1-128 characters, only A-Z, a-z, 0-9,
* _ and - are allowed.
* @param callback In case of an error, the callback? function will be
* called and the first argument will contain the error. In case of success,
* the first argument will be null and the values will be passed as the
* second argument.
*/
getItems(keys: string[], callback?: CloudStorageGetItemsCallback): void;
/**
* A method that removes a value from the cloud storage using the specified
* key.
*
* @param key The key should contain 1-128 characters, only A-Z, a-z, 0-9, _
* and - are allowed.
* @param callback If an optional callback parameter was passed, the
* callback function will be called. In case of an error, the first argument
* will contain the error. In case of success, the first argument will be
* null and the second argument will be a boolean indicating whether the
* value was removed.
*/
removeItem(key: string, callback?: CloudStorageRemoveItemCallback): void;
/**
* A method that removes values from the cloud storage using the specified
* keys.
*
* @param keys The keys should contain 1-128 characters, only A-Z, a-z, 0-9,
* _ and - are allowed.
* @param callback If an optional callback parameter was passed, the
* callback function will be called. In case of an error, the first argument
* will contain the error. In case of success, the first argument will be
* null and the second argument will be a boolean indicating whether the
* values were removed.
*/
removeItems(keys: string[], callback?: CloudStorageRemoveItemsCallback): void;
/**
* A method that receives the list of all keys stored in the cloud storage.
*
* @param callback In case of an error, the callback function will be called
* and the first argument will contain the error. In case of success, the
* first argument will be null and the list of keys will be passed as the
* second argument.
*/
getKeys(callback?: CloudStorageGetKeysCallback): void;
}
export interface CloudStorageItems {
[key: string]: string;
}
export type CloudStorageSetItemCallback = (error: string | null, result?: boolean) => unknown;
export type CloudStorageGetItemCallback = (error: string | null, result?: string) => unknown;
export type CloudStorageGetItemsCallback = (error: string | null, result?: CloudStorageItems) => unknown;
export type CloudStorageRemoveItemCallback = (error: string | null, result?: boolean) => unknown;
export type CloudStorageRemoveItemsCallback = (error: string | null, result?: boolean) => unknown;
export type CloudStorageGetKeysCallback = (error: string | null, result?: string[]) => unknown;
/**
* This object controls biometrics on the device. Before the first use of this
* object, it needs to be initialized using the init method.
*/
export interface BiometricManager {
/**
* Shows whether biometrics object is initialized.
*/
isInited: boolean;
/**
* Shows whether biometrics is available on the current device.
*/
isBiometricAvailable: boolean;
/**
* The type of biometrics currently available on the device. Can be one of
* these values:
* - finger, fingerprint-based biometrics,
* - face, face-based biometrics,
* - unknown, biometrics of an unknown type.
*/
biometricType: BiometryType;
/**
* Shows whether permission to use biometrics has been requested.
*/
isAccessRequested: boolean;
/**
* Shows whether permission to use biometrics has been granted.
*/
isAccessGranted: boolean;
/**
* Shows whether the token is saved in secure storage on the device.
*/
isBiometricTokenSaved: boolean;
/**
* A unique device identifier that can be used to match the token to the
* device.
*/
deviceId: string;
/**
* A method that initializes the BiometricManager object. It should be
* called before the object's first use. If an optional callback parameter
* was passed, the callback function will be called when the object is
* initialized.
*/
init(callback?: () => void): BiometricManager;
/**
* A method that requests permission to use biometrics according to the
* params argument of type BiometricRequestAccessParams. If an optional
* callback parameter was passed, the callback function will be called and
* the first argument will be a boolean indicating whether the user granted
* access.
*/
requestAccess(params: BiometricRequestAccessParams, callback?: BiometricRequestAccessCallback): BiometricManager;
/**
* A method that authenticates the user using biometrics according to the
* params argument of type BiometricAuthenticateParams. If an optional
* callback parameter was passed, the callback function will be called and
* the first argument will be a boolean indicating whether the user
* authenticated successfully.
*
* If so, the second argument will be a biometric token.
*/
authenticate(params: BiometricAuthenticateParams, callback?: BiometricAuthenticateCallback): BiometricManager;
/**
* A method that updates the biometric token in secure storage on the
* device. To remove the token, pass an empty string. If an optional
* callback parameter was passed, the callback function will be called and
* the first argument will be a boolean indicating whether the token was
* updated.
*/
updateBiometricToken(token: string, callback?: BiometricUpdateBiometricTokenCallback): BiometricManager;
/**
* A method that opens the biometric access settings for bots. Useful when
* you need to request biometrics access to users who haven't granted it
* yet.
*
* Note that this method can be called only in response to user interaction
* with the Mini App interface (e.g. a click inside the Mini App or on the
* main button)
*/
openSettings(): BiometricManager;
}
export type BiometricRequestAccessCallback = (isAccessGranted: boolean) => void;
export type BiometricAuthenticateCallback = (isAuthenticated: boolean, biometricToken?: string) => void;
export type BiometricUpdateBiometricTokenCallback = (applied: boolean) => void;
export type BiometryType = "finger" | "face" | "unknown" | string;
export type WriteAccessRequestedStatus = "allowed" | "cancelled" | string;
/**
* This object describes the native popup for requesting permission to use
* biometrics.
*/
export interface BiometricRequestAccessParams {
/**
* The text to be displayed to a user in the popup describing why the bot
* needs access to biometrics, 0-128 characters.
*/
reason?: string;
}
/**
* This object describes the native popup for authenticating the user using
* biometrics.
*/
export interface BiometricAuthenticateParams {
/**
* The text to be displayed to a user in the popup describing why you are
* asking them to authenticate and what action you will be taking based on
* that authentication, 0-128 characters.
*/
reason?: string;
}
/**
* This object contains data that is transferred to the Web App when it is
* opened. It is empty if the Web App was launched from a keyboard button.
*/
export interface WebAppInitData {
/**
* A unique identifier for the Web App session, required for sending
* messages via the answerWebAppQuery method.
*/
query_id?: string;
/** An object containing data about the current user. */
user?: WebAppUser;
/**
* An object containing data about the chat partner of the current user in
* the chat where the bot was launched via the attachment menu. Returned
* only for Web Apps launched via the attachment menu.
*/
receiver?: WebAppUser;
/**
* An object containing data about the chat where the bot was launched via
* the attachment menu. Returned for supergroups, channels and group chats –
* only for Web Apps launched via the attachment menu.
*/
chat?: WebAppChat;
/**
* Type of the chat from which the Web App was opened. Can be either
* “sender” for a private chat with the user opening the link, “private”,
* “group”, “supergroup”, or “channel”. Returned only for Web Apps launched
* from direct links.
*/
chat_type?: "sender" | "private" | "group" | "supergroup" | "channel" | string;
/**
* Global identifier