CampFireID/app/hooks/useTelegramWebApp.ts
2025-03-16 13:03:09 +03:00

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