diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3ae7eb2 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +NEXTAUTH_URL=https://tomodachishare.trafficlunar.net +AUTH_SECRET=XXXXXXXXXXXXXXXX + +DISCORD_ID=XXXXXXXXXXXXXXXX +DISCORD_SECRET=XXXXXXXXXXXXXXXX +GITHUB_ID=XXXXXXXXXXXXXXXX +GITHUB_SECRET=XXXXXXXXXXXXXXXX \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5ef6a52..7b8da95 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +!.env.example # vercel .vercel diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..2ea33c3 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,23 @@ +import NextAuth, { AuthOptions } from "next-auth"; +import Discord from "next-auth/providers/discord"; +import Github from "next-auth/providers/github"; + +export const authOptions: AuthOptions = { + pages: { + signIn: "/login", + }, + providers: [ + Discord({ + clientId: process.env.DISCORD_ID!, + clientSecret: process.env.DISCORD_SECRET!, + }), + Github({ + clientId: process.env.GITHUB_ID!, + clientSecret: process.env.GITHUB_SECRET!, + }), + ], +}; + +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; diff --git a/src/app/components/login-buttons.tsx b/src/app/components/login-buttons.tsx new file mode 100644 index 0000000..2c3c4b5 --- /dev/null +++ b/src/app/components/login-buttons.tsx @@ -0,0 +1,19 @@ +"use client"; + +import { Icon } from "@iconify/react/dist/iconify.js"; +import { signIn } from "next-auth/react"; + +export default function LoginButtons() { + return ( +
+ + +
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index 111c5bf..8ecb0e5 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -13,5 +13,5 @@ body { } .button { - @apply flex justify-center items-center px-5 py-2 bg-orange-300 border-2 border-orange-400 rounded-full shadow-md hover:bg-orange-400; + @apply flex justify-center items-center px-5 py-2 bg-orange-300 border-2 border-orange-400 rounded-full shadow-md hover:bg-orange-400 transition cursor-pointer; } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..058c340 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,23 @@ +import { getServerSession } from "next-auth"; + +import { authOptions } from "../api/auth/[...nextauth]/route"; +import LoginButtons from "../components/login-buttons"; +import { redirect, RedirectType } from "next/navigation"; + +export default async function LoginPage() { + const session = await getServerSession(authOptions); + + // If the user is already logged in, redirect + if (session) { + redirect("/"); + } + + return ( +
+

Welcome to TomodachiShare!

+

Choose your login method

+ + +
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index dc83540..f803054 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,8 +1,9 @@ export default function Page() { return (
- {[...Array(3)].map(() => ( -
+ {/* testing purposes only */} + {[...Array(3)].map((_, index) => ( +
mii

Frieren