56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
"use client";
|
|
|
|
import { Suspense } from "react";
|
|
import { useSearchParams } from "next/navigation";
|
|
import Link from "next/link";
|
|
|
|
function LoginForm() {
|
|
const searchParams = useSearchParams();
|
|
const returnUrl = searchParams.get("returnUrl") ?? "/dashboard";
|
|
|
|
return (
|
|
<div className="container mx-auto px-4 py-12 max-w-md">
|
|
<h1 className="text-3xl font-bold text-neutral-900">Sign in</h1>
|
|
<p className="mt-2 text-neutral-600">
|
|
Placeholder login. Replace with OIDC/OAuth 2.0 when identity provider is configured.
|
|
</p>
|
|
<form action="/api/auth/mock-login" method="POST" className="mt-6 space-y-4">
|
|
<input type="hidden" name="returnUrl" value={returnUrl} />
|
|
<div>
|
|
<label htmlFor="role" className="block text-sm font-medium text-neutral-700">
|
|
Role (dev placeholder)
|
|
</label>
|
|
<select
|
|
id="role"
|
|
name="role"
|
|
className="mt-1 block w-full rounded border border-neutral-300 px-3 py-2 focus:border-primary-500 focus:ring-1 focus:ring-primary-500"
|
|
>
|
|
<option value="member">Member</option>
|
|
<option value="staff">Staff</option>
|
|
<option value="admin">Admin</option>
|
|
</select>
|
|
</div>
|
|
<button
|
|
type="submit"
|
|
className="w-full rounded-md bg-primary-600 px-4 py-2 text-sm font-medium text-white hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2"
|
|
>
|
|
Sign in
|
|
</button>
|
|
</form>
|
|
<p className="mt-4 text-sm text-neutral-500">
|
|
<Link href={returnUrl} className="text-primary-600 hover:underline">
|
|
Return to previous page
|
|
</Link>
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default function LoginPage() {
|
|
return (
|
|
<Suspense fallback={<div className="container mx-auto px-4 py-12 max-w-md">Loading...</div>}>
|
|
<LoginForm />
|
|
</Suspense>
|
|
);
|
|
}
|