95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import { isDemoMode, getDemoWebApp } from '../utils/demo';
|
|
import type { WebApp } from '@twa-dev/types';
|
|
|
|
declare global {
|
|
interface Window {
|
|
Telegram?: {
|
|
WebApp?: WebApp;
|
|
};
|
|
}
|
|
}
|
|
|
|
type SafeWebApp = Partial<Pick<WebApp,
|
|
| 'initData'
|
|
| 'initDataUnsafe'
|
|
| 'platform'
|
|
| 'colorScheme'
|
|
| 'themeParams'
|
|
| 'isExpanded'
|
|
| 'viewportHeight'
|
|
| 'viewportStableHeight'
|
|
| 'headerColor'
|
|
| 'backgroundColor'
|
|
| 'isClosingConfirmationEnabled'
|
|
| 'BackButton'
|
|
| 'MainButton'
|
|
| 'ready'
|
|
| 'expand'
|
|
| 'close'
|
|
>>;
|
|
|
|
export function useTelegramWebApp() {
|
|
const [webApp, setWebApp] = useState<SafeWebApp | null>(null);
|
|
const [error, setError] = useState<string | null>(null);
|
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
|
|
useEffect(() => {
|
|
let isMounted = true;
|
|
|
|
const initWebApp = async () => {
|
|
try {
|
|
if (isDemoMode()) {
|
|
if (isMounted) {
|
|
const demoWebApp = getDemoWebApp();
|
|
setWebApp(demoWebApp);
|
|
setIsInitialized(true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (typeof window !== 'undefined') {
|
|
// Проверяем наличие Telegram WebApp в глобальном объекте
|
|
if (window.Telegram?.WebApp) {
|
|
if (isMounted) {
|
|
setWebApp(window.Telegram.WebApp as SafeWebApp);
|
|
setIsInitialized(true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// Если WebApp не найден в глобальном объекте, пробуем импортировать SDK
|
|
const WebAppModule = await import('@twa-dev/sdk');
|
|
if (isMounted && WebAppModule.default) {
|
|
setWebApp(WebAppModule.default as SafeWebApp);
|
|
setIsInitialized(true);
|
|
} else {
|
|
throw new Error('WebApp не найден');
|
|
}
|
|
} catch (importError) {
|
|
console.error('SDK import error:', importError);
|
|
throw new Error('Ошибка импорта Telegram Web App SDK');
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error('WebApp initialization error:', err);
|
|
if (isMounted) {
|
|
setError('Ошибка инициализации Telegram Web App');
|
|
}
|
|
}
|
|
};
|
|
|
|
if (!isInitialized) {
|
|
initWebApp();
|
|
}
|
|
|
|
return () => {
|
|
isMounted = false;
|
|
};
|
|
}, [isInitialized]);
|
|
|
|
return { webApp, error, isInitialized };
|
|
}
|