# Документация Telegram Mini Apps SDK

## Оглавление
1. [Установка и инициализация](#установка-и-инициализация)
   - [Установка пакета](#установка-пакета)
   - [Инициализация SDK](#инициализация-sdk)
2. [Основные концепции](#основные-концепции)
   - [Области (Scopes)](#области-scopes)
   - [Предварительные требования](#предварительные-требования)
   - [Доступность методов](#доступность-методов)
3. [Компоненты интерфейса](#компоненты-интерфейса)
   - [Back Button (Кнопка "Назад")](#back-button)
   - [Main Button (Основная кнопка)](#main-button)
   - [Secondary Button (Вторичная кнопка)](#secondary-button)
   - [Settings Button (Кнопка настроек)](#settings-button)
4. [Управление приложением](#управление-приложением)
   - [Mini App](#mini-app)
   - [Viewport (Область просмотра)](#viewport)
   - [Theme Params (Параметры темы)](#theme-params)
   - [Init Data (Данные инициализации)](#init-data)
5. [Хранение и безопасность](#хранение-и-безопасность)
   - [Cloud Storage (Облачное хранилище)](#cloud-storage)
   - [Privacy (Конфиденциальность)](#privacy)
6. [Взаимодействие с пользователем](#взаимодействие-с-пользователем)
   - [Haptic Feedback (Тактильный отклик)](#haptic-feedback)
   - [Popup (Всплывающее окно)](#popup)
   - [QR Scanner (Сканер QR-кодов)](#qr-scanner)
7. [Поведение приложения](#поведение-приложения)
   - [Closing Behavior (Поведение при закрытии)](#closing-behavior)
   - [Swipe Behavior (Поведение при свайпе)](#swipe-behavior)
8. [Дополнительные функции](#дополнительные-функции)
   - [Emoji Status](#emoji-status)
   - [Links (Ссылки)](#links)
   - [Invoice (Счета)](#invoice)

## Установка и инициализация

### Установка пакета

Перед установкой важно определить, какой пакет вам нужен. Это зависит от используемой библиотеки:

- React: \`@telegram-apps/sdk-react\`
- Vue: \`@telegram-apps/sdk-vue\`
- Svelte: \`@telegram-apps/sdk-svelte\`
- Для других случаев: \`@telegram-apps/sdk\`

Установка через npm:
\`\`\`bash
npm install @telegram-apps/sdk-react  # для React
# или
npm install @telegram-apps/sdk        # для других случаев
\`\`\`

> **Важно**: Не устанавливайте оба пакета одновременно, это может привести к ошибкам.

### Инициализация SDK

SDK требует ручной инициализации:

\`\`\`typescript
import { init } from '@telegram-apps/sdk';

init({
  acceptCustomStyles?: boolean, // принимать ли стили от Telegram
  version?: Version,           // максимальная поддерживаемая версия
  postEvent?: PostEventFn | 'strict' | 'non-strict' // функция отправки событий
});
\`\`\`

## Основные концепции

### Области (Scopes)

SDK использует концепцию областей (scopes) для группировки функциональности:

1. 💠**Компоненты** - экспортируются как переменная и набор функций:
\`\`\`typescript
import { backButton, showBackButton } from '@telegram-apps/sdk';

backButton.show();    // через переменную
showBackButton();     // через функцию
\`\`\`

2. ⚙️**Утилиты** - экспортируются как набор функций:
\`\`\`typescript
import { openLink, shareURL } from '@telegram-apps/sdk';
\`\`\`

### Предварительные требования

Для использования методов SDK необходимо:

1. SDK должен быть инициализирован
2. Код должен выполняться внутри Telegram Mini Apps
3. Для компонентов: родительский компонент должен быть смонтирован

### Доступность методов

Проверка доступности метода:

\`\`\`typescript
if (backButton.show.isAvailable()) {
  backButton.show();
}

// Или с автоматической проверкой
backButton.show.ifAvailable();
\`\`\`

## Компоненты интерфейса

### Back Button

Кнопка "Назад" в Telegram Mini Apps.

**Монтирование:**
\`\`\`typescript
if (backButton.mount.isAvailable()) {
  backButton.mount();
}
\`\`\`

**Управление видимостью:**
\`\`\`typescript
backButton.show();
backButton.hide();
backButton.isVisible(); // проверка видимости
\`\`\`

**Обработка кликов:**
\`\`\`typescript
function listener() {
  console.log('Clicked!');
}

const offClick = backButton.onClick(listener);
// или
backButton.onClick(listener);
backButton.offClick(listener);
\`\`\`

### Main Button

Основная кнопка в нижней части экрана.

**Монтирование:**
\`\`\`typescript
if (mainButton.mount.isAvailable()) {
  mainButton.mount();
}
\`\`\`

**Настройка параметров:**
\`\`\`typescript
mainButton.setParams({
  backgroundColor: '#000000',
  hasShineEffect: true,
  isEnabled: true,
  isLoaderVisible: true,
  isVisible: true,
  text: 'Нажми меня',
  textColor: '#ffffff'
});
\`\`\`

### Secondary Button

Вторичная кнопка для дополнительных действий.

**Монтирование:**
\`\`\`typescript
if (secondaryButton.mount.isAvailable()) {
  secondaryButton.mount();
}
\`\`\`

**Настройка параметров:**
\`\`\`typescript
secondaryButton.setParams({
  backgroundColor: '#000000',
  hasShineEffect: true,
  isEnabled: true,
  isLoaderVisible: true,
  isVisible: true,
  position: 'top',
  text: 'Дополнительное действие',
  textColor: '#ffffff'
});
\`\`\`

### Settings Button

Кнопка настроек в интерфейсе приложения.

**Монтирование:**
\`\`\`typescript
if (settingsButton.mount.isAvailable()) {
  settingsButton.mount();
}
\`\`\`

**Управление видимостью:**
\`\`\`typescript
settingsButton.show();
settingsButton.hide();
\`\`\`

## Управление приложением

### Mini App

Управление функциональностью Telegram Mini Apps.

**Монтирование:**
\`\`\`typescript
if (miniApp.mount.isAvailable()) {
  miniApp.mount();
}
\`\`\`

**CSS переменные:**
\`\`\`typescript
miniApp.bindCssVars(); // создает --tg-bg-color, --tg-header-color
// или
miniApp.bindCssVars(key => \`--my-prefix-${key}\`);
\`\`\`

**Управление цветами:**
\`\`\`typescript
miniApp.setHeaderColor('bg_color');
miniApp.setBackgroundColor('#ffffff');
\`\`\`

### Viewport

Управление областью просмотра.

**Монтирование:**
\`\`\`typescript
if (viewport.mount.isAvailable()) {
  viewport.mount();
}
\`\`\`

**CSS переменные:**
\`\`\`typescript
viewport.bindCssVars(); // создает --tg-viewport-height, --tg-viewport-width
\`\`\`

**Полноэкранный режим:**
\`\`\`typescript
await viewport.requestFullscreen();
await viewport.exitFullscreen();
\`\`\`

### Theme Params

Параметры темы приложения.

**Монтирование:**
\`\`\`typescript
if (themeParams.mount.isAvailable()) {
  themeParams.mount();
}
\`\`\`

**CSS переменные:**
\`\`\`typescript
themeParams.bindCssVars(); // создает --tg-theme-button-color и др.
\`\`\`

**Доступные параметры:**
\`\`\`typescript
themeParams.backgroundColor();
themeParams.textColor();
themeParams.buttonColor();
// и другие...
\`\`\`

### Init Data

Данные инициализации приложения.

**Восстановление состояния:**
\`\`\`typescript
initData.restore();
\`\`\`

**Парсинг данных:**
\`\`\`typescript
const data = parseInitData('auth_date=123&query_id=anQQ231vs&...');
\`\`\`

**Доступные данные:**
\`\`\`typescript
initData.user();      // информация о пользователе
initData.authDate();  // дата авторизации
initData.startParam(); // стартовый параметр
// и другие...
\`\`\`

## Хранение и безопасность

### Cloud Storage

Облачное хранилище для данных.

**Операции с данными:**
\`\`\`typescript
// Сохранение
await cloudStorage.setItem('key', 'value');

// Получение
const value = await cloudStorage.getItem('key');
const keys = await cloudStorage.getKeys();

// Удаление
await cloudStorage.deleteItem('key');
\`\`\`

### Privacy

Функции для работы с конфиденциальными данными.

**Запрос доступа:**
\`\`\`typescript
// Доступ к телефону
const phoneStatus = await requestPhoneAccess();

// Доступ к отправке сообщений
const writeStatus = await requestWriteAccess();

// Получение контакта
const contact = await requestContact();
\`\`\`

## Взаимодействие с пользователем

### Haptic Feedback

Тактильный отклик.

**Типы обратной связи:**
\`\`\`typescript
// Импульс
hapticFeedback.impactOccurred('medium');

// Уведомление
hapticFeedback.notificationOccurred('success');

// Изменение выбора
hapticFeedback.selectionChanged();
\`\`\`

### Popup

Всплывающие окна.

**Открытие окна:**
\`\`\`typescript
const result = await popup.open({
  title: 'Заголовок',
  message: 'Сообщение',
  buttons: [
    { id: 'ok', type: 'default', text: 'OK' }
  ]
});
\`\`\`

### QR Scanner

Сканер QR-кодов.

**Использование:**
\`\`\`typescript
// С callback
const result = await qrScanner.open({
  text: 'Отсканируйте QR-код',
  onCaptured(qr) {
    console.log('Отсканировано:', qr);
  }
});

// С promise
const qr = await qrScanner.open({
  text: 'Отсканируйте QR-код',
  capture: (qr) => qr === 'ожидаемый-код'
});
\`\`\`

## Поведение приложения

### Closing Behavior

Управление поведением при закрытии.

**Подтверждение закрытия:**
\`\`\`typescript
closingBehavior.enableConfirmation();
closingBehavior.disableConfirmation();
\`\`\`

### Swipe Behavior

Управление свайпами.

**Вертикальные свайпы:**
\`\`\`typescript
swipeBehavior.enableVertical();
swipeBehavior.disableVertical();
\`\`\`

## Дополнительные функции

### Emoji Status

Управление статусом эмодзи.

**Установка статуса:**
\`\`\`typescript
// Запрос доступа
const status = await requestEmojiStatusAccess();

// Установка статуса
await setEmojiStatus('5361800828313167608', 86400); // на 24 часа
\`\`\`

### Links

Работа со ссылками.

**Открытие ссылок:**
\`\`\`typescript
// Внешняя ссылка
openLink('https://telegram.org', {
  tryBrowser: 'chrome',
  tryInstantView: true
});

// Telegram ссылка
openTelegramLink('https://t.me/username');

// Поделиться
shareURL('https://t.me/channel', 'Описание');
\`\`\`

### Invoice

Работа со счетами.

**Открытие счета:**
\`\`\`typescript
// По slug
await invoice.open('invoice-slug');

// По URL
await invoice.open('https://t.me/invoice/slug', 'url');
\`\`\`
