From 0207f5259a3a54be5cc6f26d7ff3818e891d9130 Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 21 Jan 2026 08:41:40 +0300 Subject: [PATCH 1/3] Update Layout.tsx --- src/components/layout/Layout.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx index d191908..813cecb 100644 --- a/src/components/layout/Layout.tsx +++ b/src/components/layout/Layout.tsx @@ -9,7 +9,7 @@ import TicketNotificationBell from '../TicketNotificationBell' import AnimatedBackground from '../AnimatedBackground' import { contestsApi } from '../../api/contests' import { pollsApi } from '../../api/polls' -import { brandingApi, getCachedBranding, setCachedBranding, preloadLogo } from '../../api/branding' +import { brandingApi, getCachedBranding, setCachedBranding, preloadLogo, isLogoPreloaded } from '../../api/branding' import { wheelApi } from '../../api/wheel' import { themeColorsApi } from '../../api/themeColors' import { promoApi } from '../../api/promo' @@ -240,8 +240,8 @@ export default function Layout({ children }: LayoutProps) { } }, []) - // State to track if logo image has loaded - const [logoLoaded, setLogoLoaded] = useState(false) + // State to track if logo image has loaded - start with true if already preloaded + const [logoLoaded, setLogoLoaded] = useState(() => isLogoPreloaded()) // Fetch branding settings with localStorage cache for instant load const { data: branding } = useQuery({ From 7ae5411006edd5bb3f191e7e0804675cb9aff9d4 Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 21 Jan 2026 08:42:02 +0300 Subject: [PATCH 2/3] Update branding.ts --- src/api/branding.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/api/branding.ts b/src/api/branding.ts index 9bfe29e..c0f6e02 100644 --- a/src/api/branding.ts +++ b/src/api/branding.ts @@ -18,6 +18,21 @@ export interface FullscreenEnabled { const BRANDING_CACHE_KEY = 'cabinet_branding' const LOGO_PRELOADED_KEY = 'cabinet_logo_preloaded' +// Check if logo was already preloaded in this session +export const isLogoPreloaded = (): boolean => { + try { + const cached = getCachedBranding() + if (!cached?.has_custom_logo || !cached?.logo_url) { + return false + } + const logoUrl = `${import.meta.env.VITE_API_URL || ''}${cached.logo_url}` + const preloaded = sessionStorage.getItem(LOGO_PRELOADED_KEY) + return preloaded === logoUrl + } catch { + return false + } +} + // Get cached branding from localStorage export const getCachedBranding = (): BrandingInfo | null => { try { From 94a8671d9ed61f29e66be4ea22f91216bdcee00a Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 21 Jan 2026 08:42:36 +0300 Subject: [PATCH 3/3] Update Login.tsx --- src/pages/Login.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 7b98c03..a3683a3 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -3,7 +3,7 @@ import { useNavigate, useLocation } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { useQuery } from '@tanstack/react-query' import { useAuthStore } from '../store/auth' -import { brandingApi, getCachedBranding, setCachedBranding, preloadLogo, type BrandingInfo } from '../api/branding' +import { brandingApi, getCachedBranding, setCachedBranding, preloadLogo, isLogoPreloaded, type BrandingInfo } from '../api/branding' import { getAndClearReturnUrl } from '../utils/token' import LanguageSwitcher from '../components/LanguageSwitcher' import TelegramLoginButton from '../components/TelegramLoginButton' @@ -19,7 +19,7 @@ export default function Login() { const [error, setError] = useState('') const [isLoading, setIsLoading] = useState(false) const [isTelegramWebApp, setIsTelegramWebApp] = useState(false) - const [logoLoaded, setLogoLoaded] = useState(false) + const [logoLoaded, setLogoLoaded] = useState(() => isLogoPreloaded()) // Получаем URL для возврата после авторизации const getReturnUrl = useCallback(() => {