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
/