'use client'; import dynamic from 'next/dynamic'; import React, { useState, useEffect } from 'react'; import { Box, VStack, Spinner, Center, useToast } from '@chakra-ui/react'; 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'; // Динамический импорт компонентов для клиентской стороны const UserProfile = dynamic(() => import('./UserProfile'), { loading: () => , ssr: false }); const Shop = dynamic(() => import('./Shop'), { loading: () => , ssr: false }); const TransferBalance = dynamic(() => import('./TransferBalance'), { loading: () => , ssr: false }); 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 telegramUser = webApp.initDataUnsafe?.user; 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, }); } }} /> ); }