diff --git a/.gitignore b/.gitignore index 52b5bce..d3b91dc 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ coverage/ tmp/ temp/ miniapp/ + +# AI & Agents context +.ai/ diff --git a/src/components/ConnectionModal.tsx b/src/components/ConnectionModal.tsx index 3b5ccb4..a0a10dc 100644 --- a/src/components/ConnectionModal.tsx +++ b/src/components/ConnectionModal.tsx @@ -145,23 +145,16 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { queryFn: () => subscriptionApi.getAppConfig(), }) - // Detect platform ONCE on mount (stable reference) const detectedPlatform = useMemo(() => detectPlatform(), []) - // Set initial app based on detected platform - AFTER appConfig loads useEffect(() => { if (!appConfig?.platforms || selectedApp) return - - // Priority: detected platform > first available platform let platform = detectedPlatform if (!platform || !appConfig.platforms[platform]?.length) { platform = platformOrder.find(p => appConfig.platforms[p]?.length > 0) || null } - if (!platform || !appConfig.platforms[platform]?.length) return - const apps = appConfig.platforms[platform] - // Select featured app or first app for the detected platform const app = apps.find(a => a.isFeatured) || apps[0] if (app) setSelectedApp(app) }, [appConfig, detectedPlatform, selectedApp]) @@ -174,7 +167,6 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { setShowAppSelector(false) }, []) - // Keyboard: Escape to close (PC) useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { @@ -187,7 +179,6 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { return () => document.removeEventListener('keydown', handleKeyDown) }, [handleClose, handleBack, showAppSelector]) - // Telegram back button (Android) useEffect(() => { if (!webApp?.BackButton) return const handler = showAppSelector ? handleBack : handleClose @@ -199,7 +190,6 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { } }, [webApp, handleClose, handleBack, showAppSelector]) - // Scroll lock useEffect(() => { document.body.style.overflow = 'hidden' return () => { document.body.style.overflow = '' } @@ -214,7 +204,6 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { const availablePlatforms = useMemo(() => { if (!appConfig?.platforms) return [] const available = platformOrder.filter(key => appConfig.platforms[key]?.length > 0) - // Put detected platform first if (detectedPlatform && available.includes(detectedPlatform)) { return [detectedPlatform, ...available.filter(p => p !== detectedPlatform)] } @@ -256,7 +245,6 @@ export default function ConnectionModal({ onClose }: ConnectionModalProps) { // Wrapper component const Wrapper = ({ children }: { children: React.ReactNode }) => { if (isMobile) { - // Mobile fullscreen const content = (