Advertisement
Wonkiest29

hook nextjs

May 6th, 2025
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use client"
  2. import { useEffect, useState } from "react";
  3. import { useSignal, initData, init } from '@telegram-apps/sdk-react';
  4.  
  5. export function useTelegram() {
  6.   // SDK signals
  7.   const initDataRaw = useSignal(initData.raw);
  8.   const initDataState = useSignal(initData.state);
  9.  
  10.   // State
  11.   const [isLoading, setIsLoading] = useState(true);
  12.   const [error, setError] = useState<string | null>(null);
  13.   const [tg, setTg] = useState<any>(null);
  14.   const [isBrowser, setIsBrowser] = useState(false);
  15.   const [fallbackUser, setFallbackUser] = useState<any>(undefined);
  16.  
  17.   const user = initDataState?.user;
  18.  
  19.   useEffect(() => {
  20.     // Initialize the SDK only on the client side
  21.     if (typeof window !== 'undefined') {
  22.       try {
  23.         setIsBrowser(true);
  24.        
  25.         // Check if we're inside Telegram WebApp environment
  26.         if (!window.Telegram?.WebApp) {
  27.           console.warn('⚠️ Not running inside Telegram WebApp environment');
  28.           setError('Not in Telegram Web App');
  29.           setIsLoading(false);
  30.           return;
  31.         }
  32.        
  33.         // Fix for URL parameters issue
  34.         try {
  35.           // Manual approach to get initData from URL if needed
  36.           const urlParams = new URLSearchParams(window.location.search);
  37.           const tgWebAppData = urlParams.get('tgWebAppData');
  38.           if (tgWebAppData && !window.Telegram.WebApp.initData) {
  39.             console.log('📝 Setting initData from URL parameter');
  40.             window.Telegram.WebApp.initData = tgWebAppData;
  41.           }
  42.         } catch (e) {
  43.           console.warn('Failed to parse URL params:', e);
  44.         }
  45.        
  46.         // Initialize the SDK
  47.         init();
  48.         setTg(window.Telegram?.WebApp);
  49.        
  50.         // Setup fallback user data
  51.         if (window.Telegram?.WebApp?.initDataUnsafe?.user) {
  52.           const telegramUser = window.Telegram.WebApp.initDataUnsafe.user;
  53.           setFallbackUser({
  54.             id: telegramUser.id,
  55.             firstName: telegramUser.first_name,
  56.             lastName: telegramUser.last_name,
  57.             username: telegramUser.username
  58.           });
  59.         }
  60.        
  61.         // Debug logging
  62.         console.log('Telegram WebApp object:', window.Telegram?.WebApp ? 'Available ✓' : 'Not available ✗');
  63.         console.log('URL Search Params:', window.location.search);
  64.         console.log('InitData:', window.Telegram?.WebApp?.initData || 'Not available');
  65.        
  66.         // Set a timeout to check if init data was loaded
  67.         const timeoutId = setTimeout(() => {
  68.           if (!initDataRaw && !initDataState?.user && !fallbackUser) {
  69.             console.error('❌ Failed to retrieve init data after timeout');
  70.             setError('LaunchParamsRetrieveError: Unable to retrieve launch parameters. Please open this app from Telegram.');
  71.             setIsLoading(false);
  72.           }
  73.         }, 1500);
  74.        
  75.         return () => clearTimeout(timeoutId);
  76.       } catch (err) {
  77.         console.error('❌ Error initializing Telegram SDK:', err);
  78.         setError(err instanceof Error ? err.message : 'Unknown error initializing Telegram SDK');
  79.         setIsLoading(false);
  80.       }
  81.     }
  82.   }, []);
  83.  
  84.   // Effect to process init data once available
  85.   useEffect(() => {
  86.     if (!isBrowser) return;
  87.    
  88.     // Log when data changes
  89.     console.log('Init data updated:', {
  90.       hasInitDataRaw: !!initDataRaw,
  91.       hasUser: !!user,
  92.       hasFallbackUser: !!fallbackUser,
  93.       userDetails: user ? { id: user.id, firstName: user.firstName } : null
  94.     });
  95.    
  96.     // Set loading/error states based on data
  97.     if (initDataRaw === null && !fallbackUser) {
  98.       // SDK has determined we're not in Telegram
  99.       setError('Not in Telegram Web App');
  100.       setIsLoading(false);
  101.     } else if (initDataState?.user || fallbackUser) {
  102.       // Successfully got user data
  103.       setIsLoading(false);
  104.       setError(null);
  105.     }
  106.   }, [initDataRaw, initDataState, user, fallbackUser, isBrowser]);
  107.  
  108.   return {
  109.     tg,
  110.     // Use SDK user or fallback to our state-based user
  111.     user: user || fallbackUser,
  112.     initData: initDataState,
  113.     initDataRaw,
  114.     isLoading,
  115.     error
  116.   };
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement