79 lines
2.0 KiB
TypeScript
79 lines
2.0 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState, useCallback } from 'react';
|
|
import type { WebApp } from '@twa-dev/types';
|
|
import { isDemoMode, getDemoWebApp } from '../utils/demo';
|
|
|
|
declare global {
|
|
interface Window {
|
|
Telegram?: {
|
|
WebApp?: WebApp;
|
|
};
|
|
}
|
|
}
|
|
|
|
export interface UseTelegramWebAppResult {
|
|
webApp: WebApp | null;
|
|
error: Error | null;
|
|
isLoading: boolean;
|
|
isInitialized: boolean;
|
|
}
|
|
|
|
export function useTelegramWebApp(): UseTelegramWebAppResult {
|
|
const [webApp, setWebApp] = useState<WebApp | null>(null);
|
|
const [error, setError] = useState<Error | null>(null);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
|
|
const initWebApp = useCallback(async () => {
|
|
try {
|
|
setIsLoading(true);
|
|
setError(null);
|
|
|
|
if (isDemoMode()) {
|
|
const demoWebApp = getDemoWebApp();
|
|
setWebApp(demoWebApp);
|
|
setIsInitialized(true);
|
|
return;
|
|
}
|
|
|
|
if (typeof window !== 'undefined') {
|
|
if (window.Telegram?.WebApp) {
|
|
setWebApp(window.Telegram.WebApp);
|
|
setIsInitialized(true);
|
|
} else {
|
|
throw new Error('Telegram WebApp не найден');
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error('Ошибка инициализации WebApp:', err);
|
|
setError(err instanceof Error ? err : new Error('Неизвестная ошибка'));
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
initWebApp();
|
|
}, [initWebApp]);
|
|
|
|
useEffect(() => {
|
|
if (!webApp) return;
|
|
|
|
const handleThemeChange = () => {
|
|
// Обновляем состояние при изменении темы
|
|
setWebApp(prevWebApp => {
|
|
if (!prevWebApp) return null;
|
|
return { ...prevWebApp };
|
|
});
|
|
};
|
|
|
|
webApp.onEvent('themeChanged', handleThemeChange);
|
|
|
|
return () => {
|
|
webApp.offEvent('themeChanged', handleThemeChange);
|
|
};
|
|
}, [webApp]);
|
|
|
|
return { webApp, error, isLoading, isInitialized };
|
|
}
|