<!DOCTYPE html>
Building Telegram Mini Apps with React
<br> body {<br> font-family: sans-serif;<br> }</p> <p>h1, h2, h3 {<br> margin-top: 30px;<br> }</p> <p>img {<br> max-width: 100%;<br> height: auto;<br> }</p> <p>pre {<br> background-color: #f5f5f5;<br> padding: 10px;<br> border-radius: 5px;<br> overflow-x: auto;<br> }<br>
Building Telegram Mini Apps with React
Introduction
Telegram, with its vast user base and robust API, offers an excellent platform for building engaging and functional mini apps. These apps, seamlessly integrated within Telegram chats, can enhance user experiences, streamline workflows, and provide valuable services. React, the popular JavaScript library for building user interfaces, empowers developers to create interactive and dynamic Telegram mini apps with ease.
This article will guide you through the process of building Telegram mini apps using React. We'll explore essential concepts, techniques, and tools, providing step-by-step instructions and code examples. By the end, you'll be equipped to create your own compelling Telegram mini apps.
Understanding the Basics
Telegram Bot API
The foundation of any Telegram mini app is the Telegram Bot API. This powerful API allows you to control bots, interact with users, and send messages within Telegram. You'll use this API to:
- Create and manage bots
- Receive and process user inputs (text, commands, media)
- Send messages, media, and other content
- Integrate with other services and APIs
To interact with the Telegram Bot API, you'll need to obtain a bot token. This token acts as your bot's unique identifier, allowing you to authenticate and manage its actions.
React: The UI Framework
React is a JavaScript library renowned for building user interfaces. Its component-based architecture allows you to create reusable UI elements, making development efficient and scalable. Here's why React is ideal for Telegram mini app development:
- Component-based architecture: Break down your UI into manageable, modular components, promoting code reusability and maintainability.
- Virtual DOM: React's virtual DOM efficiently updates the real DOM, optimizing performance and improving user experience.
-
State management: React provides tools like
useState
anduseReducer
to manage the state of your components, facilitating dynamic interactions. - Large ecosystem: Access a vast library of third-party components, tools, and frameworks to enhance your app's functionality.
Setting Up Your Development Environment
Before diving into coding, you need to set up your development environment. This involves installing necessary software and configuring your project.
- Node.js and npm
Download and install the latest version of Node.js from https://nodejs.org/ . Node.js comes bundled with npm (Node Package Manager), which you'll use to install and manage project dependencies.
Use the Create React App tool to generate a new React project:
npx create-react-app telegram-mini-app
This will create a directory named telegram-mini-app
containing your project files.
Install the node-telegram-bot-api
library using npm:
cd telegram-mini-app npm install node-telegram-bot-api
Building Your First Telegram Mini App
Let's create a simple Telegram mini app that responds to user messages. This app will take a user's input and echo it back, demonstrating basic bot functionality.
To create a bot, follow these steps:
- Access the BotFather in Telegram by searching for "BotFather" in your Telegram app.
- Use the "/newbot" command to start creating a new bot.
- Enter a name for your bot.
- Choose a username for your bot, which should end with "bot".
- The BotFather will provide you with your bot token, which is essential for interacting with the API. Keep this token private!
Here's an example:
In your src/App.js
file, create a React component that will handle the Telegram interaction:
import React, { useState, useEffect } from 'react';
import TelegramBot from 'node-telegram-bot-api';
const YOUR_BOT_TOKEN = 'YOUR_ACTUAL_BOT_TOKEN';
function App() {
const [message, setMessage] = useState('');
useEffect(() => {
const bot = new TelegramBot(YOUR_BOT_TOKEN, { polling: true });
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
bot.sendMessage(chatId, `You said: ${text}`);
});
}, []);
return (
<div classname="App">
<h1>
Telegram Mini App
</h1>
<p>
This app will echo back your messages.
</p>
<input =="" onchange="{(e)" type="text" value="{message}"/>
setMessage(e.target.value)} />
</div>
);
}
export default App;
Explanation:
-
Import the necessary libraries:
React
,useState
anduseEffect
for state management, andTelegramBot
from thenode-telegram-bot-api
library. -
Replace
YOUR_ACTUAL_BOT_TOKEN
with the actual token you received from the BotFather. -
Initialize a
TelegramBot
instance using your token and enable polling for incoming messages. -
The
useEffect
hook runs once on component mount and sets up a listener for incoming messages. It retrieves the message text and the chat ID from the message object. -
The
bot.sendMessage
function sends the echoed message back to the user.
- Run Your App
Start your React app by running the following command in your terminal:
npm start
This will launch your app in your browser. You can now access your bot in Telegram and start sending messages. It should echo back whatever you type.
Adding More Features and Complexity
The simple echo bot is a starting point. You can add more complex features to your Telegram mini app, like:
You can define different commands for your bot to respond to. For instance, you can add a "/start" command that welcomes the user:
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Welcome to my Telegram mini app!');
});
This code snippet listens for the "/start" command and sends a welcome message to the user.
- Using Inline Buttons
Make your app interactive by using inline buttons. You can provide users with choices within the chat itself:
bot.onText(/\/menu/, (msg) => {
const chatId = msg.chat.id;
const options = {
reply_markup: {
inline_keyboard: [
[{ text: 'Option 1', callback_data: 'option1' }],
[{ text: 'Option 2', callback_data: 'option2' }],
]
}
};
bot.sendMessage(chatId, 'Choose an option:', options);
});
bot.on('callback_query', (query) => {
const chatId = query.message.chat.id;
const data = query.data;
if (data === 'option1') {
bot.sendMessage(chatId, 'You selected Option 1.');
} else if (data === 'option2') {
bot.sendMessage(chatId, 'You selected Option 2.');
}
});
In this example:
-
The
/menu
command sends a message with two inline buttons. -
The
callback_data
property is used to identify the chosen option. -
A separate listener handles the
callback_query
event, processing the selected option and responding accordingly.
- Working with Forms
You can create forms within your Telegram mini app using the sendMessage
function and specifying the reply_markup
object. This object can include various elements, like text fields, buttons, and checkboxes, allowing users to input data.
bot.onText(/\/form/, (msg) => {
const chatId = msg.chat.id;
const options = {
reply_markup: {
force_reply: true, // Enable force reply
keyboard: [
[{ text: 'Submit', callback_data: 'submit' }]
]
}
};
bot.sendMessage(chatId, 'Please enter your name:', options);
});
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const text = msg.text;
if (msg.reply_to_message && msg.reply_to_message.text === 'Please enter your name:') {
bot.sendMessage(chatId, `Hello, ${text}!`);
}
});
In this example:
-
The
/form
command starts a form interaction. -
force_reply: true
forces users to reply to the message, facilitating form input. - The form message is sent with a "Submit" button.
- A listener checks if the incoming message is a reply to the form message, then processes the name input and sends a greeting.
- Displaying Images and Media
You can use the sendPhoto
, sendDocument
, and other similar functions in the Telegram Bot API to send images, documents, and other types of media to users.
bot.onText(/\/image/, (msg) => {
const chatId = msg.chat.id;
const imageURL = 'https://example.com/image.jpg';
bot.sendPhoto(chatId, imageURL);
});
This code sends a photo from the specified URL to the user. You can adapt this approach to send different types of media based on your app's requirements.
Example: Creating a Simple To-Do List App
To illustrate how to build a more complex Telegram mini app, let's create a simple to-do list app.
- Data Storage
You'll need a way to store your to-do list data. For simplicity, we'll use an in-memory array. In a real-world application, you might consider using a database or a cloud storage solution.
const tasks = [];
- Bot Logic
Let's define the basic logic for our to-do list app:
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Welcome to the To-Do List bot! What would you like to do?');
});
bot.onText(/\/add (.+)/, (msg, match) => {
const chatId = msg.chat.id;
const task = match[1]; // Extract the task from the command
tasks.push({
id: tasks.length + 1,
text: task,
completed: false
});
bot.sendMessage(chatId, `Added task: ${task}`);
});
bot.onText(/\/list/, (msg) => {
const chatId = msg.chat.id;
if (tasks.length === 0) {
bot.sendMessage(chatId, 'Your to-do list is empty!');
return;
}
let listMessage = 'Your to-do list:\n';
for (const task of tasks) {
listMessage += `- ${task.text} (${task.completed ? 'Completed' : 'Pending'})\n`;
}
bot.sendMessage(chatId, listMessage);
});
bot.onText(/\/complete (.+)/, (msg, match) => {
const chatId = msg.chat.id;
const taskId = parseInt(match[1]); // Extract the task ID
const taskIndex = tasks.findIndex((task) => task.id === taskId);
if (taskIndex === -1) {
bot.sendMessage(chatId, `Task with ID ${taskId} not found.`);
return;
}
tasks[taskIndex].completed = true;
bot.sendMessage(chatId, `Task ${taskId} marked as completed.`);
});
bot.onText(/\/delete (.+)/, (msg, match) => {
const chatId = msg.chat.id;
const taskId = parseInt(match[1]);
const taskIndex = tasks.findIndex((task) => task.id === taskId);
if (taskIndex === -1) {
bot.sendMessage(chatId, `Task with ID ${taskId} not found.`);
return;
}
tasks.splice(taskIndex, 1);
bot.sendMessage(chatId, `Task ${taskId} deleted.`);
});
In this code:
-
The
/start
command greets the user and provides a starting point. -
The
/add
command adds a new task to the list. -
The
/list
command displays the current to-do list. -
The
/complete
command marks a task as completed. -
The
/delete
command removes a task from the list.
- User Interface (React Component)
You can create a simple React component to visualize the to-do list:
import React, { useState, useEffect } from 'react';
import TelegramBot from 'node-telegram-bot-api';
const YOUR_BOT_TOKEN = 'YOUR_ACTUAL_BOT_TOKEN';
function App() {
const [tasks, setTasks] = useState([]);
useEffect(() => {
const bot = new TelegramBot(YOUR_BOT_TOKEN, { polling: true });
// Add listeners for bot commands and update tasks state
bot.onText(/\/add (.+)/, (msg, match) => {
// ... (code to add task and update tasks state)
});
// ... (other command listeners)
}, []);
return (
<div classname="App">
<h1>
Telegram To-Do List
</h1>
<ul>
{tasks.map((task) => (
<li key="{task.id}">
{task.text} ({task.completed ? 'Completed' : 'Pending'})
</li>
))}
</ul>
</div>
);
}
export default App;
This component:
-
Stores the
tasks
array in the state. -
Uses
useEffect
to set up the bot listeners. -
Renders the to-do list items using
tasks.map
.
Remember to implement the logic for handling each bot command within the useEffect
hook to update the tasks
state.
Key Concepts and Best Practices
Here are some important concepts and best practices to keep in mind when building Telegram mini apps with React:
- User Experience
Prioritize user experience by:
- Keeping the app concise and focused on a specific purpose.
- Using clear and concise language for commands and responses.
- Providing helpful instructions and error messages.
- Making the app visually appealing and easy to navigate.
Security is paramount:
- Never expose your bot token publicly.
- Validate user input to prevent malicious attacks.
- Handle sensitive data securely, using encryption if necessary.
Thorough testing and debugging are essential:
- Test your app thoroughly with different scenarios and user inputs.
- Use logging to track bot actions and identify errors.
- Consider using a debugger to step through code and analyze issues.
As your app grows, consider scalability:
- Use a database to store data and handle increasing user traffic.
- Employ load balancing and caching strategies for optimal performance.
- Design your code with modularity and reusability in mind.
Conclusion
Building Telegram mini apps with React opens up exciting opportunities to enhance user experiences and create innovative solutions within the Telegram ecosystem. By understanding the key concepts, tools, and best practices, you can develop interactive and engaging apps that provide value to your users.
Remember to prioritize user experience, security, testing, and scalability throughout your development process. With React's capabilities and the Telegram Bot API's power, you can create compelling mini apps that seamlessly integrate into the Telegram platform.