fix mini app bot father

This commit is contained in:
lendry
2026-06-26 11:08:10 +03:00
parent 489b4d4a23
commit 7ed7cbdd16
7 changed files with 174 additions and 31 deletions

View File

@@ -13,7 +13,9 @@ import {
fetchBotChatMessages,
sendBotMessage
} from '@/lib/api';
import { postEmbeddedAuthToIframe } from '@/lib/embedded-auth-bridge';
import { postEmbeddedAuthToIframe, EMBEDDED_AUTH_REQUEST } from '@/lib/embedded-auth-bridge';
import { AUTH_REFRESH_KEY, AUTH_SESSION_KEY, AUTH_TOKEN_KEY } from '@/lib/api';
import { normalizeMiniAppUrl, resolveMiniAppTargetOrigin } from '@/lib/mini-app-url';
import { extractMessageReplyMarkup, serializeInlineKeyboardMarkup } from '@/lib/bot-reply-markup';
import { resolveComposerMenuButton, type ComposerMenuButton } from '@/lib/bot-menu-button';
import { cn } from '@/lib/utils';
@@ -305,27 +307,44 @@ export function BotMiniAppSheet({
onClose
}: BotMiniAppSheetProps) {
const iframeRef = useRef<HTMLIFrameElement>(null);
const normalizedUrl = url ? normalizeMiniAppUrl(url) : null;
const resolvedAuthToken =
authToken ?? (typeof window !== 'undefined' ? window.localStorage.getItem(AUTH_TOKEN_KEY) : null);
const pushAuthToIframe = useCallback(() => {
if (!iframeRef.current || !authToken) return;
if (!iframeRef.current || !resolvedAuthToken) return;
postEmbeddedAuthToIframe(iframeRef.current, {
token: authToken,
refreshToken: authRefreshToken,
sessionId: authSessionId
token: resolvedAuthToken,
refreshToken: authRefreshToken ?? window.localStorage.getItem(AUTH_REFRESH_KEY),
sessionId: authSessionId ?? window.localStorage.getItem(AUTH_SESSION_KEY)
});
}, [authRefreshToken, authSessionId, authToken]);
}, [authRefreshToken, authSessionId, resolvedAuthToken]);
useEffect(() => {
function handleMessage(event: MessageEvent) {
if (event.origin !== window.location.origin) return;
if (event.data?.type !== 'lendry-id-embedded-auth-request') return;
const iframeOrigin = iframeRef.current
? resolveMiniAppTargetOrigin(iframeRef.current.getAttribute('src') || iframeRef.current.src, window.location.origin)
: window.location.origin;
if (event.origin !== iframeOrigin && event.origin !== window.location.origin) return;
if (event.data?.type !== EMBEDDED_AUTH_REQUEST) return;
pushAuthToIframe();
}
window.addEventListener('message', handleMessage);
return () => window.removeEventListener('message', handleMessage);
}, [pushAuthToIframe]);
if (!url) return null;
useEffect(() => {
if (!normalizedUrl || !resolvedAuthToken) return;
pushAuthToIframe();
const interval = window.setInterval(pushAuthToIframe, 350);
const timeout = window.setTimeout(() => window.clearInterval(interval), 3500);
return () => {
window.clearInterval(interval);
window.clearTimeout(timeout);
};
}, [normalizedUrl, pushAuthToIframe, resolvedAuthToken]);
if (!normalizedUrl) return null;
return (
<div className="fixed inset-0 z-[70] flex items-end justify-center bg-black/40 p-4 sm:items-center">
<div className="flex h-[min(88vh,720px)] w-full max-w-[520px] flex-col overflow-hidden rounded-[24px] bg-white shadow-2xl">
@@ -337,7 +356,7 @@ export function BotMiniAppSheet({
</div>
<iframe
ref={iframeRef}
src={url}
src={normalizedUrl}
title={title}
className="min-h-0 flex-1 border-0"
allow="clipboard-read; clipboard-write"