aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web')
-rw-r--r--packages/web/app/dashboard/components/Sidebar.tsx16
-rw-r--r--packages/web/app/dashboard/components/SidebarProfileOptions.tsx35
-rw-r--r--packages/web/app/dashboard/layout.tsx2
-rw-r--r--packages/web/app/page.tsx27
-rw-r--r--packages/web/app/signin/components/SignInForm.tsx16
-rw-r--r--packages/web/app/signin/components/SignInProviderButton.tsx21
-rw-r--r--packages/web/app/signin/page.tsx19
-rw-r--r--packages/web/components/auth/login.tsx17
-rw-r--r--packages/web/components/auth/logout.tsx17
9 files changed, 111 insertions, 59 deletions
diff --git a/packages/web/app/dashboard/components/Sidebar.tsx b/packages/web/app/dashboard/components/Sidebar.tsx
index d2ec14a6..0563e26f 100644
--- a/packages/web/app/dashboard/components/Sidebar.tsx
+++ b/packages/web/app/dashboard/components/Sidebar.tsx
@@ -11,6 +11,8 @@ import {
import { redirect } from "next/navigation";
import SidebarItem from "./SidebarItem";
import { getServerAuthSession } from "@/server/auth";
+import Link from "next/link";
+import SidebarProfileOptions from "./SidebarProfileOptions";
export default async function Sidebar() {
const session = await getServerAuthSession();
@@ -20,10 +22,12 @@ export default async function Sidebar() {
return (
<aside className="flex h-full w-60 flex-col border-r p-4">
- <div className="mb-5 flex items-center rounded-lg px-1 text-slate-900">
- <Brain />
- <span className="ml-2 text-base font-semibold">Remember</span>
- </div>
+ <Link href={"/dashboard/bookmarks"}>
+ <div className="mb-5 flex items-center rounded-lg px-1 text-slate-900">
+ <Brain />
+ <span className="ml-2 text-base font-semibold">Remember</span>
+ </div>
+ </Link>
<hr />
<div>
<ul className="mt-5 space-y-2 text-sm font-medium">
@@ -52,9 +56,7 @@ export default async function Sidebar() {
</div>
<div className="mt-auto flex justify-between">
<div className="my-auto"> {session.user.name} </div>
- <Button variant="ghost" className="h-10">
- <MoreHorizontal />
- </Button>
+ <SidebarProfileOptions />
</div>
</aside>
);
diff --git a/packages/web/app/dashboard/components/SidebarProfileOptions.tsx b/packages/web/app/dashboard/components/SidebarProfileOptions.tsx
new file mode 100644
index 00000000..f931b63e
--- /dev/null
+++ b/packages/web/app/dashboard/components/SidebarProfileOptions.tsx
@@ -0,0 +1,35 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import { LogOut, MoreHorizontal } from "lucide-react";
+import { signOut } from "next-auth/react";
+
+export default function SidebarProfileOptions() {
+ return (
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Button variant="ghost">
+ <MoreHorizontal />
+ </Button>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent className="w-fit">
+ <DropdownMenuItem
+ onClick={() =>
+ signOut({
+ callbackUrl: "/",
+ })
+ }
+ >
+ <LogOut className="mr-2 size-4" />
+ <span>Sign Out</span>
+ </DropdownMenuItem>
+ </DropdownMenuContent>
+ </DropdownMenu>
+ );
+}
diff --git a/packages/web/app/dashboard/layout.tsx b/packages/web/app/dashboard/layout.tsx
index f39bd6fb..9d3568a5 100644
--- a/packages/web/app/dashboard/layout.tsx
+++ b/packages/web/app/dashboard/layout.tsx
@@ -10,7 +10,7 @@ export default async function Dashboard({
<div className="flex-none">
<Sidebar />
</div>
- <div className="flex-1 overflow-y-auto bg-gray-100">{children}</div>
+ <main className="flex-1 overflow-y-auto bg-gray-100">{children}</main>
</div>
);
}
diff --git a/packages/web/app/page.tsx b/packages/web/app/page.tsx
index ffc128a5..f467b64b 100644
--- a/packages/web/app/page.tsx
+++ b/packages/web/app/page.tsx
@@ -1,19 +1,12 @@
-import { LoginButton } from "@/components/auth/login";
-import { LogoutButton } from "@/components/auth/logout";
-import Link from "next/link";
+import { getServerAuthSession } from "@/server/auth";
+import { redirect } from "next/navigation";
-export default function Home() {
- return (
- <main className="flex min-h-screen flex-col items-center justify-between p-24">
- <div>
- <LoginButton />
- <br />
- <br />
- <LogoutButton />
- <br />
- <br />
- <Link href="/bookmarks">Bookmarks</Link>
- </div>
- </main>
- );
+export default async function Home() {
+ // TODO: Home currently just redirects between pages until we build a proper landing page
+ const session = await getServerAuthSession();
+ if (!session) {
+ redirect("/signin");
+ }
+
+ redirect("/dashboard/bookmarks");
}
diff --git a/packages/web/app/signin/components/SignInForm.tsx b/packages/web/app/signin/components/SignInForm.tsx
new file mode 100644
index 00000000..ea19dedb
--- /dev/null
+++ b/packages/web/app/signin/components/SignInForm.tsx
@@ -0,0 +1,16 @@
+import { getProviders, signIn } from "next-auth/react";
+import SignInProviderButton from "./SignInProviderButton";
+
+export default async function SignInForm() {
+ const providers = (await getProviders()) ?? [];
+
+ return (
+ <div>
+ {Object.values(providers).map((provider) => (
+ <div key={provider.name}>
+ <SignInProviderButton provider={provider} />
+ </div>
+ ))}
+ </div>
+ );
+}
diff --git a/packages/web/app/signin/components/SignInProviderButton.tsx b/packages/web/app/signin/components/SignInProviderButton.tsx
new file mode 100644
index 00000000..0831236c
--- /dev/null
+++ b/packages/web/app/signin/components/SignInProviderButton.tsx
@@ -0,0 +1,21 @@
+"use client";
+import { Button } from "@/components/ui/button";
+import { ClientSafeProvider, signIn } from "next-auth/react";
+
+export default function SignInProviderButton({
+ provider,
+}: {
+ provider: ClientSafeProvider;
+}) {
+ return (
+ <Button
+ onClick={() =>
+ signIn(provider.id, {
+ callbackUrl: "/",
+ })
+ }
+ >
+ Sign in with {provider.name}
+ </Button>
+ );
+}
diff --git a/packages/web/app/signin/page.tsx b/packages/web/app/signin/page.tsx
new file mode 100644
index 00000000..afe63dd3
--- /dev/null
+++ b/packages/web/app/signin/page.tsx
@@ -0,0 +1,19 @@
+import { Brain } from "lucide-react";
+import SignInForm from "./components/SignInForm";
+
+export default async function SignInPage() {
+ // TODO Add support for email and credential signin form
+ return (
+ <div className="flex min-h-screen flex-col items-center justify-center">
+ <div className="flex space-x-2">
+ <span>
+ <Brain size="30" className="h-full" />
+ </span>
+ <span className="text-4xl">Remember</span>
+ </div>
+ <div className="mt-20 flex w-96 flex-col items-center rounded-xl border border-gray-300 p-20">
+ <SignInForm />
+ </div>
+ </div>
+ );
+}
diff --git a/packages/web/components/auth/login.tsx b/packages/web/components/auth/login.tsx
deleted file mode 100644
index 4cd55546..00000000
--- a/packages/web/components/auth/login.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-"use client";
-import { signIn } from "next-auth/react";
-
-export const LoginButton = () => {
- return (
- <button
- className="btn btn-primary"
- onClick={() =>
- signIn(undefined, {
- callbackUrl: "/",
- })
- }
- >
- Sign in
- </button>
- );
-};
diff --git a/packages/web/components/auth/logout.tsx b/packages/web/components/auth/logout.tsx
deleted file mode 100644
index 8d627f68..00000000
--- a/packages/web/components/auth/logout.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-"use client";
-import { signOut } from "next-auth/react";
-
-export const LogoutButton = () => {
- return (
- <button
- className="btn btn-ghost normal-case"
- onClick={() =>
- signOut({
- callbackUrl: "/",
- })
- }
- >
- Sign Out
- </button>
- );
-};