Skip to content

Commit ee88353

Browse files
chore: Add separate login / signup screens (#331)
1 parent 258b9cf commit ee88353

File tree

5 files changed

+74
-4
lines changed

5 files changed

+74
-4
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
- Added seperate page for signup. [#311](https://github.com/sourcebot-dev/sourcebot/pull/331)
12+
1013
## [4.1.1] - 2025-06-03
1114

1215
### Added

packages/web/src/app/login/components/loginForm.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ interface LoginFormProps {
2222
callbackUrl?: string;
2323
error?: string;
2424
providers: Array<{ id: string; name: string }>;
25+
context: "login" | "signup";
2526
}
2627

27-
export const LoginForm = ({ callbackUrl, error, providers }: LoginFormProps) => {
28+
export const LoginForm = ({ callbackUrl, error, providers, context }: LoginFormProps) => {
2829
const captureEvent = useCaptureEvent();
2930
const onSignInWithOauth = useCallback((provider: string) => {
3031
signIn(provider, {
@@ -77,9 +78,11 @@ export const LoginForm = ({ callbackUrl, error, providers }: LoginFormProps) =>
7778
<div className="flex flex-col items-center justify-center w-full">
7879
<div className="mb-6 flex flex-col items-center">
7980
<SourcebotLogo
80-
className="h-12 sm:h-16"
81+
className="h-12 sm:h-16 mb-3"
8182
/>
82-
<h2 className="text-lg font-bold text-center">Sign in to your account</h2>
83+
<h2 className="text-lg font-medium text-center">
84+
{context === "login" ? "Sign in to your account" : "Create a new account"}
85+
</h2>
8386
</div>
8487
{env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT !== undefined && (
8588
<div className="w-full sm:w-[500px] max-w-[500px]">
@@ -120,6 +123,17 @@ export const LoginForm = ({ callbackUrl, error, providers }: LoginFormProps) =>
120123
] : [])
121124
]}
122125
/>
126+
<p className="text-sm text-muted-foreground mt-8">
127+
{context === "login" ?
128+
<>
129+
No account yet? <Link className="underline" href="/signup">Sign up</Link>
130+
</>
131+
:
132+
<>
133+
Already have an account? <Link className="underline" href="/login">Sign in</Link>
134+
</>
135+
}
136+
</p>
123137
</Card>
124138
{env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT !== undefined && (
125139
<p className="text-xs text-muted-foreground mt-8">By signing in, you agree to the <Link className="underline" href={TERMS_OF_SERVICE_URL} target="_blank">Terms of Service</Link> and <Link className="underline" href={PRIVACY_POLICY_URL} target="_blank">Privacy Policy</Link>.</p>

packages/web/src/app/login/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export default async function Login({ searchParams }: LoginProps) {
4040
callbackUrl={searchParams.callbackUrl}
4141
error={searchParams.error}
4242
providers={providerData}
43+
context="login"
4344
/>
4445
</div>
4546
<Footer />

packages/web/src/app/signup/page.tsx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { auth } from "@/auth";
2+
import { LoginForm } from "../login/components/loginForm";
3+
import { redirect } from "next/navigation";
4+
import { getProviders } from "@/auth";
5+
import { Footer } from "@/app/components/footer";
6+
import { createLogger } from "@sourcebot/logger";
7+
8+
const logger = createLogger('signup-page');
9+
10+
interface LoginProps {
11+
searchParams: {
12+
callbackUrl?: string;
13+
error?: string;
14+
}
15+
}
16+
17+
export default async function Signup({ searchParams }: LoginProps) {
18+
const session = await auth();
19+
if (session) {
20+
logger.info("Session found in signup page, redirecting to home");
21+
return redirect("/");
22+
}
23+
24+
const providers = getProviders();
25+
const providerData = providers
26+
.map((provider) => {
27+
if (typeof provider === "function") {
28+
const providerInfo = provider()
29+
return { id: providerInfo.id, name: providerInfo.name }
30+
} else {
31+
return { id: provider.id, name: provider.name }
32+
}
33+
});
34+
35+
return (
36+
<div className="flex flex-col min-h-screen bg-backgroundSecondary">
37+
<div className="flex-1 flex flex-col items-center p-4 sm:p-12 w-full">
38+
<LoginForm
39+
callbackUrl={searchParams.callbackUrl}
40+
error={searchParams.error}
41+
providers={providerData}
42+
context="signup"
43+
/>
44+
</div>
45+
<Footer />
46+
</div>
47+
)
48+
}

packages/web/src/middleware.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ export async function middleware(request: NextRequest) {
1010
return NextResponse.next();
1111
}
1212

13-
if (url.pathname.startsWith('/login') || url.pathname.startsWith('/redeem')) {
13+
if (
14+
url.pathname.startsWith('/login') ||
15+
url.pathname.startsWith('/redeem') ||
16+
url.pathname.startsWith('/signup')
17+
) {
1418
return NextResponse.next();
1519
}
1620

0 commit comments

Comments
 (0)