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('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.'); } } };