'use client'; import { Loader2 } from 'lucide-react'; import { InlineKeyboardButton, parseInlineKeyboardMarkup } from '@/lib/bot-reply-markup'; import { cn } from '@/lib/utils'; export function buildInlineButtonKey(messageId: number, rowIndex: number, buttonIndex: number) { return `${messageId}:${rowIndex}:${buttonIndex}`; } interface BotInlineKeyboardProps { markup: unknown; messageId: number; loadingButtonKey?: string | null; disabled?: boolean; onCallbackClick?: (callbackData: string, buttonKey: string) => void | Promise; onOpenMiniApp?: (url: string) => void; onOpenUrl?: (url: string) => void; } export function BotInlineKeyboard({ markup, messageId, loadingButtonKey = null, disabled = false, onCallbackClick, onOpenMiniApp, onOpenUrl }: BotInlineKeyboardProps) { const rows = parseInlineKeyboardMarkup(markup); if (!rows.length) return null; return (
{rows.map((row, rowIndex) => (
{row.map((button, buttonIndex) => ( ))}
))}
); } function InlineKeyboardButtonView({ button, buttonKey, fullWidth, loading, disabled, onCallbackClick, onOpenMiniApp, onOpenUrl }: { button: InlineKeyboardButton; buttonKey: string; fullWidth: boolean; loading: boolean; disabled: boolean; onCallbackClick?: (callbackData: string, buttonKey: string) => void | Promise; onOpenMiniApp?: (url: string) => void; onOpenUrl?: (url: string) => void; }) { const webAppUrl = button.web_app?.url; const callbackData = button.callback_data ?? button.callbackData; async function handleClick(event: React.MouseEvent) { event.preventDefault(); if (disabled || loading) return; if (webAppUrl) { if (onOpenMiniApp) { onOpenMiniApp(webAppUrl); } else { window.open(webAppUrl, '_blank', 'noopener,noreferrer'); } return; } if (button.url) { if (onOpenUrl) { onOpenUrl(button.url); } else { window.open(button.url, '_blank', 'noopener,noreferrer'); } return; } if (callbackData && onCallbackClick) { await onCallbackClick(callbackData, buttonKey); } } return ( ); }