mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-29 18:13:47 +00:00
Phase 0: Remove ~920 lines of dead code (ThemeBentoPicker, PromoDiscountBadge, AdminLayout, SettingsSidebar, MovingGradient, EmptyState, miniapp API, unused types/functions/transitions/skeleton helpers). Fix API barrel file (add 20 missing exports). Phase 1: Add ErrorBoundary (app/page/widget levels), centralize constants, add axios timeout, fix staleTime:0 in React Query. Phase 2: Consolidate hexToHsl, extract email validation, fix duplicate code. Phase 3: Fix auth race condition (await checkAdminStatus), memoize useCurrency, add WebSocket message validation. Phase 4: Extract useBranding, useFeatureFlags, useScrollRestoration from AppShell. Phase 5: Remove all eslint-disable react-hooks/exhaustive-deps (14 total), simplify logger, remove deprecated hooks (useBackButton, useTelegramDnd, useTelegramWebApp). Dependencies: React 19, react-router 7, zustand 5, i18next 25, react-i18next 16, eslint-plugin-react-refresh 0.5. Remove unused @lottiefiles/dotlottie-react. Convert vite manualChunks to function-based approach for react-router v7 compat. Lint: Fix logger.ts no-unused-expressions, fix react-refresh/only-export-components in 6 Radix primitive files (const re-exports → direct re-exports), fix WebSocketProvider exhaustive-deps. Result: 0 errors, 0 warnings. Add CLAUDE.md to .gitignore.
111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
import {
|
|
init,
|
|
restoreInitData,
|
|
mountMiniApp,
|
|
miniAppReady,
|
|
mountThemeParams,
|
|
mountViewport,
|
|
expandViewport,
|
|
mountSwipeBehavior,
|
|
disableVerticalSwipes,
|
|
mountClosingBehavior,
|
|
disableClosingConfirmation,
|
|
mountBackButton,
|
|
bindThemeParamsCssVars,
|
|
bindViewportCssVars,
|
|
requestFullscreen,
|
|
isFullscreen,
|
|
} from '@telegram-apps/sdk-react';
|
|
import { AppWithNavigator } from './AppWithNavigator';
|
|
import { ErrorBoundary } from './components/ErrorBoundary';
|
|
import { initLogoPreload } from './api/branding';
|
|
import { getCachedFullscreenEnabled, isTelegramMobile } from './hooks/useTelegramSDK';
|
|
import './i18n';
|
|
import './styles/globals.css';
|
|
|
|
// HMR guard — prevent double init when Vite hot-reloads the module
|
|
const HMR_KEY = '__tg_sdk_initialized';
|
|
const alreadyInitialized = (window as unknown as Record<string, unknown>)[HMR_KEY] === true;
|
|
|
|
if (!alreadyInitialized) {
|
|
(window as unknown as Record<string, unknown>)[HMR_KEY] = true;
|
|
|
|
try {
|
|
init();
|
|
restoreInitData();
|
|
|
|
// Mount components — each in its own try/catch so one failure doesn't block others
|
|
try {
|
|
mountMiniApp();
|
|
} catch {
|
|
/* already mounted */
|
|
}
|
|
try {
|
|
mountThemeParams();
|
|
bindThemeParamsCssVars();
|
|
} catch {
|
|
/* already mounted */
|
|
}
|
|
try {
|
|
mountSwipeBehavior();
|
|
disableVerticalSwipes();
|
|
} catch {
|
|
/* already mounted */
|
|
}
|
|
try {
|
|
mountClosingBehavior();
|
|
disableClosingConfirmation();
|
|
} catch {
|
|
/* already mounted */
|
|
}
|
|
try {
|
|
mountBackButton();
|
|
} catch {
|
|
/* already mounted */
|
|
}
|
|
// 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();
|
|
} catch {
|
|
// Not in Telegram — ok
|
|
}
|
|
}
|
|
|
|
// Preload logo from cache immediately on page load
|
|
initLogoPreload();
|
|
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
retry: 1,
|
|
refetchOnWindowFocus: false,
|
|
},
|
|
},
|
|
});
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
<React.StrictMode>
|
|
<ErrorBoundary level="app">
|
|
<QueryClientProvider client={queryClient}>
|
|
<AppWithNavigator />
|
|
</QueryClientProvider>
|
|
</ErrorBoundary>
|
|
</React.StrictMode>,
|
|
);
|