Skip to content

JSX

npmJSRJSR Score

Используйте JSX для форматирования сообщений Telegram ботов и создания клавиатур. Вместо цепочки функций format, bold, italic пишите привычный HTML-подобный синтаксис, который компилируется в FormattableString и InlineKeyboard/Keyboard объекты GramIO.

Зависимость от React не требуется — пакет предоставляет собственный JSX-рантайм.

Установка

sh
npm install @gramio/jsx
sh
yarn add @gramio/jsx
sh
pnpm add @gramio/jsx
sh
bun add @gramio/jsx

Настройка

Добавьте JSX-рантайм в tsconfig.json:

json
{
    "compilerOptions": {
        "jsx": "react-jsx",
        "jsxImportSource": "@gramio/jsx"
    }
}

Файлы должны использовать расширение .tsx.

Использование

Форматирование текста

tsx
import { Bot } from "gramio";

const bot = new Bot(process.env.BOT_TOKEN!)
    .command("start", (context) =>
        context.send(<b>Привет!</b>)
    );

bot.start();

Все Telegram entities форматирования поддерживаются как JSX-элементы:

tsx
await context.send(
    <>
        <b>Жирный текст</b><br />
        <i>Курсив</i><br />
        <u>Подчёркнутый</u><br />
        <s>Зачёркнутый</s><br />
        <spoiler>Скрытый текст</spoiler><br />
        <code>инлайн код</code><br />
        <pre>{`блок кода
с несколькими строками`}</pre><br />
        <blockquote>Простая цитата</blockquote><br />
        <blockquote expandable>Раскрываемая цитата</blockquote><br />
        <a href="https://gramio.dev">GramIO</a><br />
        <mention id={123456789}>Пользователь</mention><br />
        <custom-emoji emojiId="5222106016283378623">эмодзи</custom-emoji>
    </>
);

Справочник элементов форматирования

ЭлементОписаниеПример
<b>Жирный текст<b>жирный</b>
<i>Курсив<i>курсив</i>
<u>Подчёркнутый текст<u>подчёркнутый</u>
<s>Зачёркнутый текст<s>зачёркнутый</s>
<spoiler>Спойлер (скрытый) текст<spoiler>скрытый</spoiler>
<code>Инлайн-код<code>код</code>
<pre>Блок кода<pre>блок кода</pre>
<blockquote>Цитата<blockquote>цитата</blockquote>
<a href="...">Гиперссылка<a href="https://gramio.dev">ссылка</a>
<mention id={...}>Упоминание пользователя по ID<mention id={123}>имя</mention>
<custom-emoji emojiId="...">Кастомный эмодзи<custom-emoji emojiId="123">эмодзи</custom-emoji>
<br />Перенос строкитекст<br />следующая строка

Элемент <blockquote> поддерживает опциональный проп expandable для раскрываемых цитат.

Поддерживается вложенность — например, <b><i>жирный курсив</i></b>.

Inline-клавиатура

Передайте элемент <keyboard inline> в reply_markup:

tsx
await context.send(
    <b>Выберите действие:</b>,
    {
        reply_markup: (
            <keyboard inline>
                <row>
                    <button callbackData="action1">Нажми</button>
                    <button url="https://gramio.dev">Открыть ссылку</button>
                </row>
                <row>
                    <button switchToCurrentChat="query">Инлайн-поиск</button>
                </row>
            </keyboard>
        ),
    }
);

Пропсы inline-кнопок

ПропТипОписание
callbackDatastringДанные для обработки нажатия
urlstringURL для открытия
webApp{ url: string }WebApp для открытия
loginUrlTelegramLoginUrlURL для авторизации
switchToChatstringПереключить инлайн-запрос в другой чат
switchToCurrentChatstringИнлайн-запрос в текущем чате
switchToChosenChatstring | TelegramSwitchInlineQueryChosenChatПереключить в выбранный чат
copyTextstringСкопировать текст в буфер
gameTelegramCallbackGameCallback-игра

Reply-клавиатура

Уберите проп inline у <keyboard>:

tsx
await context.send("Выберите вариант:", {
    reply_markup: (
        <keyboard oneTime placeholder="Выберите...">
            <row>
                <button requestContact>Отправить контакт</button>
                <button requestLocation>Отправить геолокацию</button>
            </row>
            <row>
                <button>Простая кнопка</button>
            </row>
        </keyboard>
    ),
});

Пропсы reply-клавиатуры

ПропТипОписание
persistentbooleanВсегда показывать клавиатуру
selectivebooleanПоказать только определённым пользователям
resizedbooleanПодогнать размер клавиатуры
oneTimebooleanСкрыть после нажатия кнопки
placeholderstringПлейсхолдер поля ввода

Пропсы reply-кнопок

ПропТипОписание
requestContactbooleanЗапросить телефон пользователя
requestLocationbooleanЗапросить геолокацию пользователя
requestChatTelegramKeyboardButtonRequestChatЗапросить выбор чата
requestPoll{ type: "quiz" | "regular" }Запросить создание опроса
webApp{ url: string }Открыть WebApp

Полный пример

tsx
import { Bot } from "gramio";

const bot = new Bot(process.env.BOT_TOKEN!)
    .command("start", (context) =>
        context.send(<b>Привет!</b>)
    )
    .command("demo", async (context) => {
        await context.reply(
            <>
                <b>Жирный текст</b><br />
                <i>Курсив</i><br />
                <u>Подчёркнутый</u><br />
                <s>Зачёркнутый</s><br />
                <spoiler><b>Жирный спойлер</b></spoiler><br />
                <a href="https://gramio.dev">GramIO</a><br />
                <mention id={context.from!.id}>Вы</mention><br />
                <code>print("Привет")</code><br />
                <pre>{`function greet() {
    console.log("Привет!");
}`}</pre>
            </>,
            {
                reply_markup: (
                    <keyboard inline>
                        <row>
                            <button callbackData="test">Нажми</button>
                            <button url="https://gramio.dev">Документация</button>
                        </row>
                    </keyboard>
                ),
            }
        );
    })
    .onStart(console.log);

bot.start();