diff --git a/admin/src/components/FeatureGate.tsx b/admin/src/components/FeatureGate.tsx index 3e94d14f..4364cdbe 100644 --- a/admin/src/components/FeatureGate.tsx +++ b/admin/src/components/FeatureGate.tsx @@ -1,5 +1,5 @@ import type { ReactNode } from 'react'; -import { Result, Button } from 'antd'; +import { Result, Button, Skeleton } from 'antd'; import { useNavigate } from 'react-router-dom'; import { SettingOutlined } from '@ant-design/icons'; import { useSettingsStore } from '@/stores/settings.store'; @@ -36,8 +36,8 @@ export default function FeatureGate({ feature, children }: FeatureGateProps) { const isSuperAdmin = hasAnyRole(user, ['SUPER_ADMIN']); const featureName = FEATURE_LABELS[feature] || feature; - // While loading or if settings haven't arrived yet, render children (optimistic) - if (loading || !settings) return <>{children}; + // Show skeleton while settings are loading to prevent briefly showing disabled features + if (loading || !settings) return ; if (settings[feature] === false) { return ( diff --git a/admin/src/components/media/AlbumCard.tsx b/admin/src/components/media/AlbumCard.tsx index d49dc774..e844e787 100644 --- a/admin/src/components/media/AlbumCard.tsx +++ b/admin/src/components/media/AlbumCard.tsx @@ -5,8 +5,8 @@ import type { PhotoAlbum } from '@/types/media'; /** Append JWT access token as query param for src URLs */ function getAuthenticatedUrl(url: string): string { - const { getTokens } = getAuthCallbacks(); - const { accessToken } = getTokens(); + const { getAccessToken } = getAuthCallbacks(); + const accessToken = getAccessToken(); if (!accessToken) return url; const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}token=${accessToken}`; diff --git a/admin/src/components/media/AlbumDetailDrawer.tsx b/admin/src/components/media/AlbumDetailDrawer.tsx index 6d8a4540..a8fda4ff 100644 --- a/admin/src/components/media/AlbumDetailDrawer.tsx +++ b/admin/src/components/media/AlbumDetailDrawer.tsx @@ -12,8 +12,8 @@ import type { PhotoAlbum, PhotoAlbumItem } from '@/types/media'; /** Append JWT access token as query param for src URLs */ function getAuthenticatedUrl(url: string): string { - const { getTokens } = getAuthCallbacks(); - const { accessToken } = getTokens(); + const { getAccessToken } = getAuthCallbacks(); + const accessToken = getAccessToken(); if (!accessToken) return url; const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}token=${accessToken}`; diff --git a/admin/src/components/media/PhotoCard.tsx b/admin/src/components/media/PhotoCard.tsx index 48aaac20..c1d14a92 100644 --- a/admin/src/components/media/PhotoCard.tsx +++ b/admin/src/components/media/PhotoCard.tsx @@ -13,8 +13,8 @@ import type { Photo } from '@/types/media'; /** Append JWT access token as query param for src URLs */ function getAuthenticatedUrl(url: string): string { - const { getTokens } = getAuthCallbacks(); - const { accessToken } = getTokens(); + const { getAccessToken } = getAuthCallbacks(); + const accessToken = getAccessToken(); if (!accessToken) return url; const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}token=${accessToken}`; diff --git a/admin/src/components/media/PhotoViewerModal.tsx b/admin/src/components/media/PhotoViewerModal.tsx index 04188293..1eaad448 100644 --- a/admin/src/components/media/PhotoViewerModal.tsx +++ b/admin/src/components/media/PhotoViewerModal.tsx @@ -5,8 +5,8 @@ import type { Photo } from '@/types/media'; /** Append JWT access token as query param for src URLs */ function getAuthenticatedUrl(url: string): string { - const { getTokens } = getAuthCallbacks(); - const { accessToken } = getTokens(); + const { getAccessToken } = getAuthCallbacks(); + const accessToken = getAccessToken(); if (!accessToken) return url; const separator = url.includes('?') ? '&' : '?'; return `${url}${separator}token=${accessToken}`; diff --git a/admin/src/components/media/VideoCard.tsx b/admin/src/components/media/VideoCard.tsx index 4617169e..1e8ad536 100644 --- a/admin/src/components/media/VideoCard.tsx +++ b/admin/src/components/media/VideoCard.tsx @@ -8,8 +8,8 @@ import ScheduleBadge from './ScheduleBadge'; /** Append JWT access token as query param for /