CampFireID/app/hooks/useTelegramWebApp.ts
2025-03-16 12:55:51 +03:00

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 };
}