65 lines
2.9 KiB
TypeScript
65 lines
2.9 KiB
TypeScript
import { TokenPack } from '../constants/tokenPacks';
|
||
import apiService from '../services/api';
|
||
import { getCurrentUserId } from '../constants/user';
|
||
import { sendTargetEvent } from './analyticsService';
|
||
|
||
export const paymentService = {
|
||
showBuyTokensPopup: async (pack: TokenPack, onSuccess?: (userData?: any) => void) => {
|
||
// Проверяем наличие Telegram WebApp
|
||
if (!window.Telegram?.WebApp) {
|
||
console.error('Telegram WebApp не доступен');
|
||
return;
|
||
}
|
||
|
||
const webApp = window.Telegram.WebApp;
|
||
const userId = getCurrentUserId();
|
||
|
||
try {
|
||
// Получаем ссылку на инвойс от бэкенда
|
||
const invoiceLink = await apiService.createInvoiceLink(
|
||
userId,
|
||
pack.price,
|
||
pack.tokens + pack.bonusTokens
|
||
);
|
||
|
||
// Открываем встроенный платеж Telegram без предварительного подтверждения
|
||
webApp.openInvoice(invoiceLink, async (status: 'paid' | 'cancelled' | 'failed' | 'pending') => {
|
||
if (status === 'paid') {
|
||
// Отправляем целевое событие о покупке токенов
|
||
// Значение value = 0.01 * pack.price (конвертация звезд в USD)
|
||
sendTargetEvent(10458, userId, 0.01 * pack.price, 'usd');
|
||
// Функция для выполнения одной попытки получения данных пользователя
|
||
const fetchUserData = async (attempt: number) => {
|
||
try {
|
||
console.log(`Попытка ${attempt}/5 получения данных пользователя...`);
|
||
const userData = await apiService.getUserInfo(userId);
|
||
|
||
if (onSuccess) {
|
||
onSuccess(userData);
|
||
}
|
||
} catch (error) {
|
||
console.error(`Ошибка при получении данных пользователя (попытка ${attempt}/5):`, error);
|
||
|
||
// Если это последняя попытка и произошла ошибка, вызываем onSuccess без параметров
|
||
if (attempt === 5 && onSuccess) {
|
||
onSuccess();
|
||
}
|
||
}
|
||
};
|
||
|
||
// Выполняем первую попытку сразу
|
||
fetchUserData(1);
|
||
|
||
// Выполняем остальные попытки с интервалом в 1 секунду
|
||
for (let i = 2; i <= 5; i++) {
|
||
setTimeout(() => fetchUserData(i), (i - 1) * 1000);
|
||
}
|
||
}
|
||
});
|
||
} catch (error) {
|
||
console.error('Ошибка при создании инвойса:', error);
|
||
webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.');
|
||
}
|
||
}
|
||
};
|