Skip to content

Commit 92a8c47

Browse files
committed
feat: require login for protected nav links
- Reputation, Pricing, x402, Dashboard, Invoices, Escrow redirect to /login?redirect=<page> - Wallet (/web-wallet) and API Docs (/docs) remain public - Home (/) remains public - Login page reads ?redirect param and sends user there after login
1 parent d03ed4d commit 92a8c47

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

src/app/login/LoginForm.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import { useState } from 'react';
44
import Link from 'next/link';
5-
import { useRouter } from 'next/navigation';
5+
import { useRouter, useSearchParams } from 'next/navigation';
66

77
export default function LoginForm() {
88
const router = useRouter();
9+
const searchParams = useSearchParams();
10+
const redirectTo = searchParams.get('redirect');
911
const [formData, setFormData] = useState({
1012
email: '',
1113
password: '',
@@ -43,8 +45,10 @@ export default function LoginForm() {
4345
localStorage.setItem('auth_token', data.token);
4446
}
4547

46-
// Redirect based on admin status
47-
if (data.merchant?.is_admin) {
48+
// Redirect based on admin status or redirect param
49+
if (redirectTo) {
50+
router.push(redirectTo);
51+
} else if (data.merchant?.is_admin) {
4852
router.push('/admin');
4953
} else {
5054
router.push('/dashboard');

src/components/Header.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ export default function Header() {
4747
router.push('/');
4848
};
4949

50+
const PUBLIC_ROUTES = new Set(['/', '/web-wallet', '/docs']);
51+
5052
const navigation = [
5153
{ name: 'Home', href: '/' },
5254
{ name: 'Wallet', href: '/web-wallet' },
@@ -68,6 +70,11 @@ export default function Header() {
6870

6971
const currentNav = isLoggedIn ? loggedInNavigation : navigation;
7072

73+
const getNavHref = (href: string) => {
74+
if (isLoggedIn || PUBLIC_ROUTES.has(href)) return href;
75+
return `/login?redirect=${encodeURIComponent(href)}`;
76+
};
77+
7178
return (
7279
<header className="bg-gray-900 border-b border-gray-800 sticky top-0 z-50">
7380
<nav className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8" aria-label="Top">
@@ -86,7 +93,7 @@ export default function Header() {
8693
{currentNav.map((item) => (
8794
<Link
8895
key={item.name}
89-
href={item.href}
96+
href={getNavHref(item.href)}
9097
className="text-sm font-medium text-gray-300 hover:text-white transition-colors"
9198
>
9299
{item.name}
@@ -219,7 +226,7 @@ export default function Header() {
219226
{currentNav.map((item) => (
220227
<Link
221228
key={item.name}
222-
href={item.href}
229+
href={getNavHref(item.href)}
223230
className="block px-3 py-2 text-base font-medium text-gray-300 hover:bg-gray-800 hover:text-white rounded-md transition-colors"
224231
onClick={() => setMobileMenuOpen(false)}
225232
>

0 commit comments

Comments
 (0)