From 890d54c011d48cd180b3cdddfd1c5db2738f8d4b Mon Sep 17 00:00:00 2001 From: Christopher Date: Thu, 22 Jan 2026 04:39:28 -0800 Subject: [PATCH] feat: add banner upload functionality and replace SynapsisLogo with logo image in admin and login pages --- src/app/admin/page.tsx | 50 ++++++++++++++++++++++++++++++++++++++ src/app/login/page.tsx | 29 +--------------------- src/components/Sidebar.tsx | 4 +-- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 4d516d3..66af812 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -63,6 +63,8 @@ export default function AdminPage() { bannerUrl: '', }); const [savingSettings, setSavingSettings] = useState(false); + const [isUploadingBanner, setIsUploadingBanner] = useState(false); + const [bannerUploadError, setBannerUploadError] = useState(null); useEffect(() => { fetch('/api/admin/me') @@ -181,6 +183,39 @@ export default function AdminPage() { } }; + const handleBannerUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + event.target.value = ''; + if (!file) return; + + setBannerUploadError(null); + setIsUploadingBanner(true); + + try { + const formData = new FormData(); + formData.append('file', file); + const res = await fetch('/api/media/upload', { + method: 'POST', + body: formData, + }); + const data = await res.json(); + + if (!res.ok || !data.url) { + throw new Error(data.error || 'Upload failed'); + } + + setNodeSettings((prev) => ({ + ...prev, + bannerUrl: data.media?.url || data.url, + })); + } catch (error) { + console.error('Banner upload failed', error); + setBannerUploadError('Upload failed. Please try again.'); + } finally { + setIsUploadingBanner(false); + } + }; + const handleUserAction = async (id: string, action: 'suspend' | 'unsuspend' | 'silence' | 'unsilence') => { const needsReason = action === 'suspend' || action === 'silence'; const reason = needsReason ? window.prompt('Reason (optional):') || '' : ''; @@ -471,6 +506,21 @@ export default function AdminPage() { onChange={e => setNodeSettings({ ...nodeSettings, bannerUrl: e.target.value })} placeholder="https://" /> +
+ + {bannerUploadError && ( + {bannerUploadError} + )} +
{nodeSettings.bannerUrl && (
( - - - - - - - - - - - - - - - -); - export default function LoginPage() { const router = useRouter(); const [mode, setMode] = useState<'login' | 'register'>('login'); @@ -85,7 +58,7 @@ export default function LoginPage() { {/* Logo */}
- + Synapsis Synapsis

diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 1233a63..8b2823d 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -3,7 +3,7 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { useAuth } from '@/lib/contexts/AuthContext'; -import { HomeIcon, SearchIcon, BellIcon, UserIcon, ShieldIcon, SynapsisLogo } from './Icons'; +import { HomeIcon, SearchIcon, BellIcon, UserIcon, ShieldIcon } from './Icons'; export function Sidebar() { const { user, isAdmin } = useAuth(); @@ -15,7 +15,7 @@ export function Sidebar() { return (