mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
- Обернуть каждый mount-вызов в safeMountSync() для защиты от ConcurrentCallError при HMR/повторной инициализации - Перенести requestFullscreen() внутрь mountViewport().then() — fullscreen требует смонтированный viewport, ранее вызывался через dynamic import с setTimeout до завершения mount - Стабилизировать обработчик BackButton через useRef + useCallback — navigate меняется каждый рендер, что вызывало постоянную пере-подписку и потерю обработчика
83 lines
2.1 KiB
TypeScript
83 lines
2.1 KiB
TypeScript
import { useEffect, useRef, useCallback } from 'react';
|
|
import { BrowserRouter, useLocation, useNavigate } from 'react-router-dom';
|
|
import {
|
|
showBackButton,
|
|
hideBackButton,
|
|
onBackButtonClick,
|
|
offBackButtonClick,
|
|
} from '@telegram-apps/sdk-react';
|
|
import App from './App';
|
|
import { PlatformProvider } from './platform/PlatformProvider';
|
|
import { ThemeColorsProvider } from './providers/ThemeColorsProvider';
|
|
import { WebSocketProvider } from './providers/WebSocketProvider';
|
|
import { ToastProvider } from './components/Toast';
|
|
import { TooltipProvider } from './components/primitives/Tooltip';
|
|
import { isInTelegramWebApp } from './hooks/useTelegramSDK';
|
|
|
|
/**
|
|
* Manages Telegram BackButton visibility based on navigation location.
|
|
* Shows back button on non-root routes, hides on root.
|
|
*/
|
|
function TelegramBackButton() {
|
|
const location = useLocation();
|
|
const navigate = useNavigate();
|
|
const navigateRef = useRef(navigate);
|
|
navigateRef.current = navigate;
|
|
|
|
useEffect(() => {
|
|
const isRoot = location.pathname === '/' || location.pathname === '';
|
|
try {
|
|
if (isRoot) {
|
|
hideBackButton();
|
|
} else {
|
|
showBackButton();
|
|
}
|
|
} catch {
|
|
// Back button not mounted
|
|
}
|
|
}, [location]);
|
|
|
|
// Stable handler — ref prevents re-subscription on every render
|
|
const handler = useCallback(() => {
|
|
navigateRef.current(-1);
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
try {
|
|
onBackButtonClick(handler);
|
|
} catch {
|
|
// Back button not mounted
|
|
}
|
|
return () => {
|
|
try {
|
|
offBackButtonClick(handler);
|
|
} catch {
|
|
// Back button not mounted
|
|
}
|
|
};
|
|
}, [handler]);
|
|
|
|
return null;
|
|
}
|
|
|
|
export function AppWithNavigator() {
|
|
const isTelegram = isInTelegramWebApp();
|
|
|
|
return (
|
|
<BrowserRouter>
|
|
{isTelegram && <TelegramBackButton />}
|
|
<PlatformProvider>
|
|
<ThemeColorsProvider>
|
|
<TooltipProvider>
|
|
<ToastProvider>
|
|
<WebSocketProvider>
|
|
<App />
|
|
</WebSocketProvider>
|
|
</ToastProvider>
|
|
</TooltipProvider>
|
|
</ThemeColorsProvider>
|
|
</PlatformProvider>
|
|
</BrowserRouter>
|
|
);
|
|
}
|