diff --git a/src/app/admin/accounting/clients/page.tsx b/src/app/admin/accounting/clients/page.tsx index 5c80dad..e2b5bd6 100644 --- a/src/app/admin/accounting/clients/page.tsx +++ b/src/app/admin/accounting/clients/page.tsx @@ -39,7 +39,7 @@ export default function ClientsPage() { const [errors, setErrors] = useState>({}); const [successMsg, setSuccessMsg] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/commissions/page.tsx b/src/app/admin/accounting/commissions/page.tsx index 90c8886..b58a945 100644 --- a/src/app/admin/accounting/commissions/page.tsx +++ b/src/app/admin/accounting/commissions/page.tsx @@ -16,7 +16,7 @@ export default function CommissionsPage() { const [filterStaff, setFilterStaff] = useState(''); const [staff, setStaff] = useState([]); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/documents/page.tsx b/src/app/admin/accounting/documents/page.tsx index e5b49ae..0b1fb3a 100644 --- a/src/app/admin/accounting/documents/page.tsx +++ b/src/app/admin/accounting/documents/page.tsx @@ -17,7 +17,7 @@ export default function DocumentsPage() { const [saving, setSaving] = useState(false); const [form, setForm] = useState({ document_type: 'sales_agreement', title: '', year: String(new Date().getFullYear()), person: '', file_url: '', notes: '' }); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/expenses/page.tsx b/src/app/admin/accounting/expenses/page.tsx index 8cf1020..8a7c2c9 100644 --- a/src/app/admin/accounting/expenses/page.tsx +++ b/src/app/admin/accounting/expenses/page.tsx @@ -24,7 +24,7 @@ export default function ExpensesPage() { const [errors, setErrors] = useState>({}); const [successMsg, setSuccessMsg] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/invoices/page.tsx b/src/app/admin/accounting/invoices/page.tsx index 0c2423c..4cd434b 100644 --- a/src/app/admin/accounting/invoices/page.tsx +++ b/src/app/admin/accounting/invoices/page.tsx @@ -26,7 +26,7 @@ function InvoicesContent() { const [payErrors, setPayErrors] = useState>({}); const [successMsg, setSuccessMsg] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/orders/page.tsx b/src/app/admin/accounting/orders/page.tsx index faa3e68..f79e542 100644 --- a/src/app/admin/accounting/orders/page.tsx +++ b/src/app/admin/accounting/orders/page.tsx @@ -32,7 +32,7 @@ function OrdersContent() { invoicing_schedule: 'single', next_invoice_date: '', staff_id: '', po_number: '', notes: '', }); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/page.tsx b/src/app/admin/accounting/page.tsx index 322339d..dcb81ae 100644 --- a/src/app/admin/accounting/page.tsx +++ b/src/app/admin/accounting/page.tsx @@ -26,7 +26,7 @@ export default function AccountingDashboard() { const [loadingData, setLoadingData] = useState(true); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/accounting/reconciliation/page.tsx b/src/app/admin/accounting/reconciliation/page.tsx index b41a2c4..b7ebac6 100644 --- a/src/app/admin/accounting/reconciliation/page.tsx +++ b/src/app/admin/accounting/reconciliation/page.tsx @@ -14,7 +14,7 @@ export default function ReconciliationPage() { const [uploading, setUploading] = useState(false); const [summary, setSummary] = useState<{ matched: number; unmatched: number } | null>(null); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/accounting/reports/page.tsx b/src/app/admin/accounting/reports/page.tsx index 2696fae..2d12c99 100644 --- a/src/app/admin/accounting/reports/page.tsx +++ b/src/app/admin/accounting/reports/page.tsx @@ -16,7 +16,7 @@ export default function ReportsPage() { const [startDate, setStartDate] = useState(`${new Date().getFullYear()}-01-01`); const [endDate, setEndDate] = useState(new Date().toISOString().split('T')[0]); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); async function loadReport() { setLoadingData(true); diff --git a/src/app/admin/accounting/staff/page.tsx b/src/app/admin/accounting/staff/page.tsx index 4119baf..182c9e6 100644 --- a/src/app/admin/accounting/staff/page.tsx +++ b/src/app/admin/accounting/staff/page.tsx @@ -22,7 +22,7 @@ export default function StaffPage() { const [errors, setErrors] = useState>({}); const [successMsg, setSuccessMsg] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/adops/ios/page.tsx b/src/app/admin/adops/ios/page.tsx index 3e9cb93..69ae287 100644 --- a/src/app/admin/adops/ios/page.tsx +++ b/src/app/admin/adops/ios/page.tsx @@ -33,7 +33,7 @@ export default function AdOpsIOsPage() { page_url: '', newsletter_issue_date: '', }); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/adops/notifications/page.tsx b/src/app/admin/adops/notifications/page.tsx index 4f03190..9cd3ed4 100644 --- a/src/app/admin/adops/notifications/page.tsx +++ b/src/app/admin/adops/notifications/page.tsx @@ -10,7 +10,7 @@ export default function AdOpsNotificationsPage() { const [notifications, setNotifications] = useState([]); const [loadingData, setLoadingData] = useState(true); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/adops/page.tsx b/src/app/admin/adops/page.tsx index a3da375..c9ff599 100644 --- a/src/app/admin/adops/page.tsx +++ b/src/app/admin/adops/page.tsx @@ -22,7 +22,7 @@ export default function AdOpsDashboardPage() { const [filterSite, setFilterSite] = useState(''); const [filterStatus, setFilterStatus] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/adops/products/page.tsx b/src/app/admin/adops/products/page.tsx index 0597737..1b85463 100644 --- a/src/app/admin/adops/products/page.tsx +++ b/src/app/admin/adops/products/page.tsx @@ -21,7 +21,7 @@ export default function AdOpsProductsPage() { const [saving, setSaving] = useState(false); const [form, setForm] = useState({ site: '', product_type: '', name: '', description: '', dimensions: '', duration_days: '', sort_order: '0' }); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/analytics/page.tsx b/src/app/admin/analytics/page.tsx index 0fe0344..bdf85df 100644 --- a/src/app/admin/analytics/page.tsx +++ b/src/app/admin/analytics/page.tsx @@ -138,7 +138,7 @@ export default function AdminAnalyticsPage() { const [error, setError] = useState(null); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const fetchAnalytics = useCallback(async () => { diff --git a/src/app/admin/articles/page.tsx b/src/app/admin/articles/page.tsx index 9a61c13..18f2443 100644 --- a/src/app/admin/articles/page.tsx +++ b/src/app/admin/articles/page.tsx @@ -79,7 +79,7 @@ export default function AdminArticlesPage() { const [newSaving, setNewSaving] = useState(false); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error', message: string) => { diff --git a/src/app/admin/audit-log/page.tsx b/src/app/admin/audit-log/page.tsx index 9ff9994..8b1dc49 100644 --- a/src/app/admin/audit-log/page.tsx +++ b/src/app/admin/audit-log/page.tsx @@ -282,7 +282,7 @@ export default function AuditLogPage() { const PAGE_SIZE = 25; useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const fetchLogs = useCallback(async () => { diff --git a/src/app/admin/banned-terms/page.tsx b/src/app/admin/banned-terms/page.tsx index 5b8813f..490a123 100644 --- a/src/app/admin/banned-terms/page.tsx +++ b/src/app/admin/banned-terms/page.tsx @@ -69,7 +69,7 @@ export default function BannedTermsPage() { }, [searchTerm, filterBanLevel, filterSiteScope, filterActive]); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/company-coverage/page.tsx b/src/app/admin/company-coverage/page.tsx index 4807474..8d16552 100644 --- a/src/app/admin/company-coverage/page.tsx +++ b/src/app/admin/company-coverage/page.tsx @@ -87,7 +87,7 @@ export default function CompanyCoveragePage() { }, [activeTab]); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/company-tracker/page.tsx b/src/app/admin/company-tracker/page.tsx index 5238eeb..de2542b 100644 --- a/src/app/admin/company-tracker/page.tsx +++ b/src/app/admin/company-tracker/page.tsx @@ -144,7 +144,7 @@ export default function CompanyTrackerPage() { }, [activeTab, queueStatus, queueSiteFilter]); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/content-status/page.tsx b/src/app/admin/content-status/page.tsx index c0094df..6505bcd 100644 --- a/src/app/admin/content-status/page.tsx +++ b/src/app/admin/content-status/page.tsx @@ -261,7 +261,7 @@ export default function ContentStatusPage() { }, []); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/email-analytics/page.tsx b/src/app/admin/email-analytics/page.tsx index 12b1c61..4893d5f 100644 --- a/src/app/admin/email-analytics/page.tsx +++ b/src/app/admin/email-analytics/page.tsx @@ -185,7 +185,7 @@ export default function EmailAnalyticsDashboard() { const [timeRange, setTimeRange] = useState<'3m' | '6m' | '12m'>('6m'); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const fetchData = useCallback(async () => { diff --git a/src/app/admin/email/domains/page.tsx b/src/app/admin/email/domains/page.tsx index 90a50e6..3e4dbd7 100644 --- a/src/app/admin/email/domains/page.tsx +++ b/src/app/admin/email/domains/page.tsx @@ -33,7 +33,7 @@ function DomainsContent() { const [addForm, setAddForm] = useState({ site: '', domain: '', domain_type: 'subdomain', is_primary: false, sort_order: 0 }); const [saving, setSaving] = useState(false); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/email/page.tsx b/src/app/admin/email/page.tsx index c0ca023..316e8b6 100644 --- a/src/app/admin/email/page.tsx +++ b/src/app/admin/email/page.tsx @@ -21,7 +21,7 @@ export default function EmailDashboard() { const [stats, setStats] = useState(null); const [loadingData, setLoadingData] = useState(true); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/email/send-log/page.tsx b/src/app/admin/email/send-log/page.tsx index 18866f2..5222d18 100644 --- a/src/app/admin/email/send-log/page.tsx +++ b/src/app/admin/email/send-log/page.tsx @@ -14,7 +14,7 @@ export default function SendLogPage() { const [filterSite, setFilterSite] = useState(''); const [filterStatus, setFilterStatus] = useState(''); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/email/suppressions/page.tsx b/src/app/admin/email/suppressions/page.tsx index a1c3936..5102840 100644 --- a/src/app/admin/email/suppressions/page.tsx +++ b/src/app/admin/email/suppressions/page.tsx @@ -23,7 +23,7 @@ export default function SuppressionsPage() { const [keywordForm, setKeywordForm] = useState({ keyword: '', keyword_type: 'unsubscribe' }); const [saving, setSaving] = useState(false); - useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); + useEffect(() => { if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); diff --git a/src/app/admin/forum-dashboard/page.tsx b/src/app/admin/forum-dashboard/page.tsx index 45d5043..52da887 100644 --- a/src/app/admin/forum-dashboard/page.tsx +++ b/src/app/admin/forum-dashboard/page.tsx @@ -178,7 +178,7 @@ export default function ForumDashboardPage() { const [error, setError] = useState(null); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const fetchStats = useCallback(async () => { diff --git a/src/app/admin/forum-moderation/page.tsx b/src/app/admin/forum-moderation/page.tsx index 9eab546..f05e04c 100644 --- a/src/app/admin/forum-moderation/page.tsx +++ b/src/app/admin/forum-moderation/page.tsx @@ -348,7 +348,7 @@ export default function ForumModerationPage() { }, [activeTab, threadFilter, replyFilter, page]); useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/admin/import/page.tsx b/src/app/admin/import/page.tsx index b333379..f97a351 100644 --- a/src/app/admin/import/page.tsx +++ b/src/app/admin/import/page.tsx @@ -57,7 +57,7 @@ export default function WPImportPage() { useEffect(() => { if (!loading && !user) { - router.replace('/account'); + router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); } }, [user, loading, router]); diff --git a/src/app/admin/newsletter/analytics/page.tsx b/src/app/admin/newsletter/analytics/page.tsx index efa7b46..64d9afa 100644 --- a/src/app/admin/newsletter/analytics/page.tsx +++ b/src/app/admin/newsletter/analytics/page.tsx @@ -178,7 +178,7 @@ export default function NewsletterAnalyticsPage() { const [sortDir, setSortDir] = useState<'asc' | 'desc'>('desc'); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const fetchData = useCallback(async () => { diff --git a/src/app/admin/newsletter/campaign-editor/page.tsx b/src/app/admin/newsletter/campaign-editor/page.tsx index f5a5e3e..8339656 100644 --- a/src/app/admin/newsletter/campaign-editor/page.tsx +++ b/src/app/admin/newsletter/campaign-editor/page.tsx @@ -105,7 +105,7 @@ export default function CampaignEditorPage() { const [previewCharCount, setPreviewCharCount] = useState(0); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error', message: string) => { diff --git a/src/app/admin/newsletter/page.tsx b/src/app/admin/newsletter/page.tsx index f39454b..344e3e4 100644 --- a/src/app/admin/newsletter/page.tsx +++ b/src/app/admin/newsletter/page.tsx @@ -101,7 +101,7 @@ export default function AdminNewsletterPage() { const [appliedTemplate, setAppliedTemplate] = useState(null); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); // Handle ?template= query param (from templates page "Use" button) diff --git a/src/app/admin/newsletter/templates/page.tsx b/src/app/admin/newsletter/templates/page.tsx index 2679494..7beb340 100644 --- a/src/app/admin/newsletter/templates/page.tsx +++ b/src/app/admin/newsletter/templates/page.tsx @@ -102,7 +102,7 @@ export default function NewsletterTemplatesPage() { const [previewTemplate, setPreviewTemplate] = useState(null); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error', message: string) => { diff --git a/src/app/admin/notifications/page.tsx b/src/app/admin/notifications/page.tsx index c9addd9..c8f05b0 100644 --- a/src/app/admin/notifications/page.tsx +++ b/src/app/admin/notifications/page.tsx @@ -289,7 +289,7 @@ export default function NotificationsPage() { // Auth guard useEffect(() => { - if (user === null) router.push('/login'); + if (user === null) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, router]); // Build notifications from live DB data diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 8c9c97d..92154db 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -227,7 +227,7 @@ export default function AdminDashboardPage() { useEffect(() => { if (!loading && !user) { - router.push('/login'); + router.push('/login?next=' + encodeURIComponent(window.location.pathname)); } }, [user, loading, router]); diff --git a/src/app/admin/roles/page.tsx b/src/app/admin/roles/page.tsx index 2ef7f86..d4e701f 100644 --- a/src/app/admin/roles/page.tsx +++ b/src/app/admin/roles/page.tsx @@ -209,7 +209,7 @@ export default function AdminRolesPage() { const [notification, setNotification] = useState<{ type: 'success' | 'error'; message: string } | null>(null); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error', message: string) => { diff --git a/src/app/admin/suspensions/page.tsx b/src/app/admin/suspensions/page.tsx index a0e36a2..2460a53 100644 --- a/src/app/admin/suspensions/page.tsx +++ b/src/app/admin/suspensions/page.tsx @@ -78,7 +78,7 @@ export default function AdminSuspensionsPage() { const [userSearch, setUserSearch] = useState(''); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error', message: string) => { diff --git a/src/app/admin/users/page.tsx b/src/app/admin/users/page.tsx index 31ee407..4c0ba6c 100644 --- a/src/app/admin/users/page.tsx +++ b/src/app/admin/users/page.tsx @@ -78,7 +78,7 @@ export default function AdminUsersPage() { const [editSaving, setEditSaving] = useState(false); useEffect(() => { - if (!loading && !user) router.replace('/account'); + if (!loading && !user) router.replace('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); const showNotification = (type: 'success' | 'error' | 'warning', message: string) => { diff --git a/src/app/admin/wp-users/page.tsx b/src/app/admin/wp-users/page.tsx index df9398d..8b8f82d 100644 --- a/src/app/admin/wp-users/page.tsx +++ b/src/app/admin/wp-users/page.tsx @@ -48,7 +48,7 @@ export default function WPUsersAdminPage() { }; useEffect(() => { - if (!loading && !user) router.push('/login'); + if (!loading && !user) router.push('/login?next=' + encodeURIComponent(window.location.pathname)); }, [user, loading, router]); useEffect(() => { diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 740e45b..813fcaa 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,7 +1,123 @@ -import { redirect } from "next/navigation"; +'use client'; -// /login is an alias for the canonical PR Firm / contributor login at -// /client-login. Server-side redirect so any existing bookmarks update. -export default function LoginPage() { - redirect("/client-login"); +import { Suspense, useState, useEffect } from 'react'; +import Link from 'next/link'; +import { useRouter, useSearchParams } from 'next/navigation'; +import Header from '@/components/Header'; +import Footer from '@/components/Footer'; +import { createClient } from '@/lib/supabase/client'; + +function safeNext(next: string | null): string { + if (!next) return '/'; + if (!next.startsWith('/') || next.startsWith('//')) return '/'; + return next; +} + +function LoginInner() { + const router = useRouter(); + const params = useSearchParams(); + const next = safeNext(params.get('next') || params.get('redirect') || params.get('redirect_to')); + const supabase = createClient(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + useEffect(() => { + supabase.auth.getUser().then(({ data: { user } }) => { + if (user) router.replace(next); + }); + }, [next, router, supabase]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + if (!email || !password) { + setError('Email and password are required.'); + return; + } + setLoading(true); + const { error: signInError } = await supabase.auth.signInWithPassword({ email, password }); + setLoading(false); + if (signInError) { + setError(signInError.message); + return; + } + window.location.href = next; + }; + + return ( + <> +
+
+
+
+

Sign in to Broadcast Beat

+

+ Editor and admin access. Forum members can also sign in here. +

+
+
+ {error && ( +
+ {error} +
+ )} +
+ + setEmail(e.target.value)} + autoComplete="email" + required + className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#3b82f6]" + /> +
+
+ + setPassword(e.target.value)} + autoComplete="current-password" + required + className="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-3 py-2 text-white font-body text-sm focus:outline-none focus:border-[#3b82f6]" + /> +
+ +

+ PR firm / contributor?{' '} + + Use the contributor portal + +

+
+
+
+