diff --git a/moderation/frontend/src/App.jsx b/moderation/frontend/src/App.jsx index 58b8b90..5155aae 100644 --- a/moderation/frontend/src/App.jsx +++ b/moderation/frontend/src/App.jsx @@ -97,51 +97,72 @@ export default function App() { const chatSocketRef = useRef(null); const chatListRef = useRef(null); - const telegramApp = typeof window !== 'undefined' ? window.Telegram?.WebApp : null; - useEffect(() => { + let cancelled = false; + + const waitForInitData = async () => { + const start = Date.now(); + const timeout = 5000; + + while (Date.now() - start < timeout) { + const app = window.Telegram?.WebApp; + if (app?.initData && app.initData.length > 0) { + return app; + } + await new Promise((resolve) => setTimeout(resolve, 100)); + } + throw new Error('Telegram initData не передан (timeout)'); + }; + const init = async () => { try { - if (telegramApp) { - telegramApp.disableVerticalSwipes(); - telegramApp.ready(); - telegramApp.expand(); + const telegramApp = window.Telegram?.WebApp; + + if (!telegramApp) { + throw new Error('Откройте модераторский интерфейс из Telegram (бот @rbachbot).'); } - await new Promise((resolve) => setTimeout(resolve, 200)); + telegramApp.disableVerticalSwipes?.(); + telegramApp.ready?.(); + telegramApp.expand?.(); - const initData = telegramApp?.initData || ''; + const app = await waitForInitData(); + if (cancelled) return; - if (initData) { - const response = await verifyAuth(); - setUser(response.data.user); - setError(null); - setLoading(false); - return; + const initData = app.initData || ''; + + if (!initData) { + throw new Error('Откройте модераторский интерфейс из Telegram (бот @rbachbot).'); } - setError('Откройте модераторский интерфейс из Telegram (бот @rbachbot).'); + const response = await verifyAuth(); + if (cancelled) return; + + setUser(response.data.user); + setError(null); } catch (err) { + if (cancelled) return; console.error('Ошибка инициализации модератора:', err); - const serverMessage = err?.response?.data?.error; + const serverMessage = err?.response?.data?.error || err?.message; setError(serverMessage || 'Нет доступа. Убедитесь, что вы добавлены как администратор.'); } finally { - setLoading(false); - } - - if (telegramApp) { - telegramApp.MainButton.setText('Закрыть'); - telegramApp.MainButton.show(); - telegramApp.MainButton.onClick(() => telegramApp.close()); + if (!cancelled) { + setLoading(false); + const telegramApp = window.Telegram?.WebApp; + telegramApp?.MainButton?.setText?.('Закрыть'); + telegramApp?.MainButton?.show?.(); + telegramApp?.MainButton?.onClick?.(() => telegramApp.close()); + } } }; init(); return () => { - telegramApp?.MainButton?.hide(); + cancelled = true; + window.Telegram?.WebApp?.MainButton?.hide?.(); }; - }, [telegramApp]); + }, []); useEffect(() => { if (tab === 'users') {