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
17 changes: 10 additions & 7 deletions src/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,34 @@ export default async function HomePage() {
redirect("/dashboard");
}

return (
return (
<main className="min-h-screen flex flex-col items-center justify-center px-4">
<div className="max-w-2xl text-center">
<h1 className="text-5xl font-bold mb-4 text-white">DevTrack</h1>
<p className="text-xl text-slate-400 mb-8">
Open-source developer productivity dashboard. Track coding habits,
visualize GitHub contributions, and hit your goals.
</p>
<div className="flex gap-4 justify-center">

<div className="flex flex-col items-center gap-6">
<Link
href="/api/auth/signin/github?callbackUrl=/dashboard"
className="bg-white text-slate-900 px-6 py-3 rounded-lg font-semibold hover:bg-slate-100 transition"
href="/signin"
className="bg-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 transition"
>
Sign in with GitHub
Sign In
</Link>

<a
href="https://github.com/Priyanshu-byte-coder/devtrack"
target="_blank"
rel="noopener noreferrer"
className="border border-slate-600 text-white px-6 py-3 rounded-lg font-semibold hover:border-slate-400 transition"
className="text-sm text-slate-400 hover:text-slate-300"
>
View on GitHub
</a>
</div>
</div>
</main>
);
}

}
73 changes: 73 additions & 0 deletions src/app/signin/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
"use client";

import { signIn } from "next-auth/react";
import { useEffect } from "react";
import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";

export default function SignInPage() {
const { data: session, status } = useSession();
const router = useRouter();

useEffect(() => {
if (status === "authenticated") {
router.push("/dashboard");
}
}, [status, router]);

const handleGitHubSignIn = async () => {
await signIn("github", { callbackUrl: "/dashboard" });
};

const handleGoogleSignIn = async () => {
await signIn("google", { callbackUrl: "/dashboard" });
};

if (status === "loading") {
return (
<main className="min-h-screen flex items-center justify-center px-4 bg-gradient-to-br from-slate-950 to-slate-900">
<div className="text-slate-300">Loading...</div>
</main>
);
}

return (
<main className="min-h-screen flex items-center justify-center px-4 bg-gradient-to-br from-slate-950 to-slate-900">
<div className="w-full max-w-md">
<div className="bg-slate-800/50 backdrop-blur-md p-8 rounded-xl border border-slate-700/50">
<h1 className="text-3xl font-bold text-white mb-2">Welcome to DevTrack</h1>
<p className="text-slate-400 mb-8">Sign in to track your developer productivity</p>

<div className="flex flex-col gap-4">
<button
onClick={handleGitHubSignIn}
className="w-full bg-white text-slate-900 py-3 rounded-lg font-semibold hover:bg-slate-100 transition flex items-center justify-center gap-2"
>
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v 3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg>
Continue with GitHub
</button>

<button
onClick={handleGoogleSignIn}
className="w-full bg-white text-slate-900 py-3 rounded-lg font-semibold hover:bg-slate-100 transition flex items-center justify-center gap-2"
>
<svg className="w-5 h-5" viewBox="0 0 24 24">
<path fill="currentColor" 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="currentColor" 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="currentColor" 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.93l2.85-2.22.81-.62z" />
<path fill="currentColor" 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>
Continue with Google
</button>
</div>

<p className="text-xs text-slate-500 text-center mt-6">
By signing in, you agree to our terms
</p>
</div>
</div>
</main>
);
}
24 changes: 20 additions & 4 deletions src/lib/auth.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type NextAuthOptions } from "next-auth";
import GitHubProvider from "next-auth/providers/github";
import GoogleProvider from "next-auth/providers/google"; // ← New Import
import { supabaseAdmin } from "./supabase";

const SESSION_MAX_AGE = 30 * 24 * 60 * 60;
Expand All @@ -15,7 +16,20 @@ export const authOptions: NextAuthOptions = {
params: { scope: "read:user user:email repo" },
},
}),

GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID ?? "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? "",
authorization: {
params: {
prompt: "consent",
access_type: "offline",
response_type: "code",
},
},
}),
],

session: {
strategy: "jwt",
maxAge: SESSION_MAX_AGE,
Expand Down Expand Up @@ -56,9 +70,11 @@ export const authOptions: NextAuthOptions = {
async jwt({ token, account, profile }) {
if (account?.access_token) token.accessToken = account.access_token;
if (profile) {
const p = profile as { id: number; login: string };
token.githubId = String(p.id);
token.githubLogin = p.login;
if (account?.provider === "github") {
const p = profile as { id: number; login: string };
token.githubId = String(p.id);
token.githubLogin = p.login;
}
}
return token;
},
Expand All @@ -73,4 +89,4 @@ export const authOptions: NextAuthOptions = {
},
},
secret: process.env.NEXTAUTH_SECRET,
};
};
Loading