mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-29 18:13:47 +00:00
fix: resolve SDK v3 mount errors, back button and fullscreen not working
- Обернуть каждый mount-вызов в safeMountSync() для защиты от ConcurrentCallError при HMR/повторной инициализации - Перенести requestFullscreen() внутрь mountViewport().then() — fullscreen требует смонтированный viewport, ранее вызывался через dynamic import с setTimeout до завершения mount - Стабилизировать обработчик BackButton через useRef + useCallback — navigate меняется каждый рендер, что вызывало постоянную пере-подписку и потерю обработчика
This commit is contained in:
54
src/main.tsx
54
src/main.tsx
@@ -17,6 +17,8 @@ import {
|
||||
mountMainButton,
|
||||
bindThemeParamsCssVars,
|
||||
bindViewportCssVars,
|
||||
requestFullscreen,
|
||||
isFullscreen,
|
||||
} from '@telegram-apps/sdk-react';
|
||||
import { AppWithNavigator } from './AppWithNavigator';
|
||||
import { initLogoPreload } from './api/branding';
|
||||
@@ -24,40 +26,52 @@ import { getCachedFullscreenEnabled, isTelegramMobile } from './hooks/useTelegra
|
||||
import './i18n';
|
||||
import './styles/globals.css';
|
||||
|
||||
// Safe mount helper — ignores "already mounted/mounting" errors (HMR, StrictMode)
|
||||
function safeMountSync(fn: () => void) {
|
||||
try {
|
||||
fn();
|
||||
} catch {
|
||||
// Already mounted or not available
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize Telegram SDK v3
|
||||
try {
|
||||
init();
|
||||
restoreInitData();
|
||||
|
||||
mountMiniApp();
|
||||
mountThemeParams();
|
||||
bindThemeParamsCssVars();
|
||||
mountSwipeBehavior();
|
||||
disableVerticalSwipes();
|
||||
mountClosingBehavior();
|
||||
disableClosingConfirmation();
|
||||
mountBackButton();
|
||||
mountMainButton();
|
||||
safeMountSync(() => mountMiniApp());
|
||||
safeMountSync(() => {
|
||||
mountThemeParams();
|
||||
bindThemeParamsCssVars();
|
||||
});
|
||||
safeMountSync(() => {
|
||||
mountSwipeBehavior();
|
||||
disableVerticalSwipes();
|
||||
});
|
||||
safeMountSync(() => {
|
||||
mountClosingBehavior();
|
||||
disableClosingConfirmation();
|
||||
});
|
||||
safeMountSync(() => mountBackButton());
|
||||
safeMountSync(() => mountMainButton());
|
||||
|
||||
// Viewport — async, fullscreen зависит от смонтированного viewport
|
||||
mountViewport()
|
||||
.then(() => {
|
||||
bindViewportCssVars();
|
||||
expandViewport();
|
||||
|
||||
// Auto-enter fullscreen if enabled in settings (mobile only)
|
||||
if (getCachedFullscreenEnabled() && isTelegramMobile()) {
|
||||
if (!isFullscreen()) {
|
||||
requestFullscreen();
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
|
||||
miniAppReady();
|
||||
|
||||
// Auto-enter fullscreen if enabled in settings (mobile only)
|
||||
if (getCachedFullscreenEnabled() && isTelegramMobile()) {
|
||||
import('@telegram-apps/sdk-react').then(({ requestFullscreen, isFullscreen }) => {
|
||||
setTimeout(() => {
|
||||
if (!isFullscreen()) {
|
||||
requestFullscreen();
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
} catch {
|
||||
// Not in Telegram — ok
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user