diff --git a/client/pages/AboutPage.jsx b/client/pages/AboutPage.jsx
index 61988bf..ae533df 100644
--- a/client/pages/AboutPage.jsx
+++ b/client/pages/AboutPage.jsx
@@ -1,18 +1,62 @@
import React, { useCallback, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
-import { ArrowLeft, ArrowUpCircle, CheckCircle2, Info, Sparkles } from 'lucide-react';
+import { ArrowLeft, ArrowUpCircle, CheckCircle2, Info, Loader2, Sparkles, AlertCircle } from 'lucide-react';
import { api } from '@/api';
import { useAuth } from '@/hooks/useAuth';
+import { APP_VERSION } from '@/lib/version';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
+function UpdateBadge({ status, loading }) {
+ if (loading) {
+ return (
+
+
+ Checking…
+
+ );
+ }
+ if (!status) return null;
+
+ if (status.has_update) {
+ return (
+
+
+ v{status.latest_version} available
+
+ );
+ }
+
+ if (status.up_to_date) {
+ return (
+
+
+ Up to date
+
+ );
+ }
+
+ // up_to_date is null — check failed
+ return (
+
+
+ Could not check
+
+ );
+}
export default function AboutPage() {
const { user } = useAuth();
- const [about, setAbout] = useState(null);
- const [loading, setLoading] = useState(true);
- const [updateStatus, setUpdateStatus] = useState(null);
+ const [about, setAbout] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [updateStatus, setUpdateStatus] = useState(null);
+ const [updateLoading, setUpdateLoading] = useState(true);
const load = useCallback(async () => {
setLoading(true);
@@ -26,9 +70,17 @@ export default function AboutPage() {
useEffect(() => { load(); }, [load]);
useEffect(() => {
- api.updateStatus().then(setUpdateStatus).catch(() => {});
+ setUpdateLoading(true);
+ api.updateStatus()
+ .then(setUpdateStatus)
+ .catch(() => setUpdateStatus(null))
+ .finally(() => setUpdateLoading(false));
}, []);
+ // Use Vite-injected APP_VERSION as the immediate source of truth.
+ // api.about() version is shown once loaded as a cross-check; they should always match.
+ const displayVersion = about?.version ?? APP_VERSION;
+
return (
@@ -52,30 +104,13 @@ export default function AboutPage() {
- {/* Version — with update status for admins */}
+ {/* Version card — shows immediately via APP_VERSION, update status alongside */}
Version
-
v{about?.version || '...'}
- {updateStatus && (
-
- )}
+
v{displayVersion}
+
+
+
@@ -104,7 +139,6 @@ export default function AboutPage() {
- {/* Only shown when the visitor is not signed in */}
{user == null && (