onairos
Version:
The Onairos Library is a collection of functions that enable Applications to connect and communicate data with Onairos Identities via User Authorization. Integration for developers is seamless, simple and effective for all applications. LLM SDK capabiliti
100 lines (87 loc) • 3.71 kB
JavaScript
import React, { useCallback, useState } from 'react';
import { miniApp, openLink } from '@telegram-apps/sdk';
export default function GoogleButton({ onLoginSuccess = () => {} }) {
const [error, setError] = useState(null);
const handleTelegramAuth = useCallback(async () => {
setError(null);
// Check if we're in a Telegram Web App environment
if (typeof window !== 'undefined' && !window.Telegram?.WebApp) {
setError('Not running in Telegram Web App');
return;
}
// Check SDK initialization
if (!miniApp.isInitialized) {
setError('Telegram Mini App not initialized');
return;
}
try {
// Safely get Telegram Mini App data
const telegramAppUrl = miniApp.initData || '';
const botUsername = 'OnairosMiniApp';
// Log debug information
console.log('Telegram App URL:', telegramAppUrl);
console.log('Bot Username:', botUsername);
// Construct URL with error handling
let connectUrl;
try {
connectUrl = new URL('https://onairos.uk/othent-connect');
connectUrl.searchParams.append('tgAppUrl', encodeURIComponent(telegramAppUrl));
connectUrl.searchParams.append('botUsername', botUsername);
} catch (urlError) {
setError('Error constructing URL: ' + urlError.message);
return;
}
// Register event listener before opening link
const handleAppActive = () => {
try {
const startParam = miniApp.initDataUnsafe?.start_param;
console.log('Start param received:', startParam);
if (startParam) {
const authData = JSON.parse(decodeURIComponent(startParam));
if (authData) {
onLoginSuccess(authData);
}
}
} catch (error) {
setError('Error processing auth data: ' + error.message);
} finally {
miniApp.removeEvent('active', handleAppActive);
}
};
miniApp.onEvent('active', handleAppActive);
// Open link with error handling
await openLink(connectUrl.toString(), {
tryInstantView: false,
});
} catch (error) {
setError('Auth flow failed: ' + error.message);
console.error('Full error:', error);
}
}, [onLoginSuccess]);
return (
<div className="flex flex-col items-center">
{error && (
<div className="text-red-500 text-sm mb-2 px-4 py-2 bg-red-50 rounded">
{error}
</div>
)}
<button
onClick={handleTelegramAuth}
className="flex items-center justify-center px-4 py-2 border border-gray-300 rounded-full shadow-sm bg-white hover:bg-gray-50 relative"
type="button"
>
<svg
viewBox="0 0 24 24"
className="w-5 h-5 mr-2"
fill="#4285F4"
>
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" fill="#4285F4"/>
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/>
<path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/>
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/>
</svg>
<span className="text-gray-700">Continue with Google</span>
</button>
</div>
);
}