Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 47 additions & 34 deletions app/login/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client";

import { useState, Suspense } from "react";
import { signIn } from "next-auth/react";
import { useState, Suspense, useEffect } from "react";
import { signIn, getProviders } from "next-auth/react";
import { useRouter, useSearchParams } from "next/navigation";
import Link from "next/link";

Expand All @@ -10,7 +10,16 @@ function LoginContent() {
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const [providers, setProviders] = useState<any>(null);
const router = useRouter();

useEffect(() => {
const fetchProviders = async () => {
const p = await getProviders();
setProviders(p);
};
fetchProviders();
}, []);
const searchParams = useSearchParams();
const callbackUrl = searchParams.get("callbackUrl") || "/dashboard";

Expand Down Expand Up @@ -51,39 +60,43 @@ function LoginContent() {
</div>

<div className="mt-8 space-y-6">
<button
onClick={handleGoogleSignIn}
className="w-full flex items-center justify-center gap-3 py-3 px-4 bg-white text-gray-900 rounded-lg font-semibold hover:bg-gray-100 transition-all shadow-md"
>
<svg className="w-5 h-5" viewBox="0 0 24 24">
<path
fill="#4285F4"
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
/>
<path
fill="#34A853"
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
/>
<path
fill="#FBBC05"
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l3.66-2.84z"
/>
<path
fill="#EA4335"
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
/>
</svg>
Sign in with Google
</button>
{providers?.google && (
<>
<button
onClick={handleGoogleSignIn}
className="w-full flex items-center justify-center gap-3 py-3 px-4 bg-white text-gray-900 rounded-lg font-semibold hover:bg-gray-100 transition-all shadow-md"
>
<svg className="w-5 h-5" viewBox="0 0 24 24">
<path
fill="#4285F4"
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
/>
<path
fill="#34A853"
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
/>
<path
fill="#FBBC05"
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l3.66-2.84z"
/>
<path
fill="#EA4335"
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
/>
</svg>
Sign in with Google
</button>

<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t border-primary/30"></span>
</div>
<div className="relative flex justify-center text-sm">
<span className="px-2 bg-background-alt text-foreground-muted">Or continue with email</span>
</div>
</div>
<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t border-primary/30"></span>
</div>
<div className="relative flex justify-center text-sm">
<span className="px-2 bg-background-alt text-foreground-muted">Or continue with email</span>
</div>
</div>
</>
)}

<form className="space-y-4" onSubmit={handleSubmit}>
{error && (
Expand Down
Binary file modified dev_server.log
Binary file not shown.
19 changes: 13 additions & 6 deletions lib/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@ import bcrypt from "bcryptjs";

export const authOptions: NextAuthOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID || "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET || "",
}),
...(process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET
? [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
]
: []),
CredentialsProvider({
name: "credentials",
credentials: {
Expand Down Expand Up @@ -91,12 +95,15 @@ export const authOptions: NextAuthOptions = {
callbacks: {
async signIn({ user, account }) {
if (account?.provider === "google") {
const [existingUser] = await db.select().from(users).where(eq(users.email, user.email!)).limit(1);
if (!user.email) {
return false;
}
const [existingUser] = await db.select().from(users).where(eq(users.email, user.email)).limit(1);

if (!existingUser) {
const isAdmin = user.email === process.env.ADMIN_EMAIL;
await db.insert(users).values({
email: user.email!,
email: user.email,
name: user.name,
image: user.image,
status: isAdmin ? "APPROVED" : "PENDING",
Expand Down
2 changes: 2 additions & 0 deletions scripts/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ function main() {
ADMIN_EMAIL: 'admin@virtuehearts.org',
ADMIN_PASSWORD: 'InitialAdminPassword123!',
OPENROUTER_API_KEY: 'sk-or-v1-placeholder',
GOOGLE_CLIENT_ID: '',
GOOGLE_CLIENT_SECRET: '',
};

let updated = false;
Expand Down