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 { 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({ 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(() => {