'use client'; import React, { useState, useEffect } from 'react'; import { Box, VStack, Spinner, Center, useToast } from '@chakra-ui/react'; import UserProfile from './UserProfile'; import Shop from './Shop'; import TransferBalance from './TransferBalance'; import { auth, getProfile, getShopItems, purchaseItem, transferBalance } from '../utils/api'; import { IUser } from '../../backend/models/User'; import { IShopItem } from '../../backend/models/ShopItem'; import { useTelegramWebApp } from '../hooks/useTelegramWebApp'; type SafeUser = Omit; export default function MainApp() { const [isLoading, setIsLoading] = useState(true); const [user, setUser] = useState(null); const [shopItems, setShopItems] = useState([]); const toast = useToast(); const { webApp, error: webAppError, isInitialized } = useTelegramWebApp(); useEffect(() => { if (webApp && isInitialized) { initApp(); } }, [webApp, isInitialized]); const initApp = async () => { try { setIsLoading(true); if (!webApp) { throw new Error('Telegram Web App не инициализирован'); } // Авторизация пользователя const { user: telegramUser } = webApp.initDataUnsafe; if (!telegramUser) { throw new Error('Пользователь не найден'); } const authResponse = await auth(telegramUser.id.toString(), telegramUser.username || 'anonymous'); // Получение данных пользователя и магазина const [profileData, shopData] = await Promise.all([ getProfile(), getShopItems() ]); setUser(profileData as SafeUser); setShopItems(shopData); // Сообщаем Telegram, что приложение готово webApp.ready(); } catch (error: any) { console.error('Initialization error:', error); toast({ title: 'Ошибка инициализации', description: error.message || 'Произошла ошибка при загрузке приложения', status: 'error', duration: 5000, isClosable: true, }); } finally { setIsLoading(false); } }; if (webAppError) { return (
{webAppError}
); } if (isLoading || !webApp || !isInitialized) { return (
); } if (!user) { return (
Пожалуйста, авторизуйтесь через Telegram или используйте демо-режим
); } return ( { try { const response = await purchaseItem(item._id.toString()); setUser(response.user as SafeUser); toast({ title: 'Успешная покупка', description: `Вы приобрели ${item.name}`, status: 'success', duration: 3000, isClosable: true, }); } catch (error: any) { toast({ title: 'Ошибка покупки', description: error.message || 'Произошла ошибка при покупке', status: 'error', duration: 3000, isClosable: true, }); } }} /> { try { const response = await transferBalance(username, amount); setUser(prev => ({ ...prev!, balance: response.balance } as SafeUser)); toast({ title: 'Успешный перевод', description: `Вы перевели ${amount} монет пользователю ${username}`, status: 'success', duration: 3000, isClosable: true, }); } catch (error: any) { toast({ title: 'Ошибка перевода', description: error.message || 'Произошла ошибка при переводе', status: 'error', duration: 3000, isClosable: true, }); } }} /> ); }