diff options
| author | MohamedBassem <me@mbassem.com> | 2024-02-09 15:32:04 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-02-09 15:32:04 +0000 |
| commit | 4fae8f04f546d2b3f6053870d93385fa36af4742 (patch) | |
| tree | fbf91f3c3c3d2bd85e9e4cfc8200d275a78fb700 /packages/web/app/dashboard | |
| parent | b25f17509e704eb41523bf455a33804cabf8aaca (diff) | |
| download | karakeep-4fae8f04f546d2b3f6053870d93385fa36af4742.tar.zst | |
[ui] Adding the favourites and archive pages
Diffstat (limited to 'packages/web/app/dashboard')
9 files changed, 132 insertions, 58 deletions
diff --git a/packages/web/app/dashboard/bookmarks/archive/page.tsx b/packages/web/app/dashboard/bookmarks/archive/page.tsx new file mode 100644 index 00000000..0d105fbd --- /dev/null +++ b/packages/web/app/dashboard/bookmarks/archive/page.tsx @@ -0,0 +1,5 @@ +import Bookmarks from "../components/Bookmarks"; + +export default async function ArchivedBookmarkPage() { + return <Bookmarks title="Archive" archived={true} favourited={false} />; +} diff --git a/packages/web/app/dashboard/bookmarks/components/Bookmarks.tsx b/packages/web/app/dashboard/bookmarks/components/Bookmarks.tsx new file mode 100644 index 00000000..6a9ffe1b --- /dev/null +++ b/packages/web/app/dashboard/bookmarks/components/Bookmarks.tsx @@ -0,0 +1,38 @@ +import { redirect } from "next/navigation"; +import BookmarksGrid from "./BookmarksGrid"; +import { authOptions } from "@/lib/auth"; +import { getServerSession } from "next-auth"; +import { getBookmarks } from "@/lib/services/bookmarks"; +import { ZGetBookmarksRequest } from "@/lib/types/api/bookmarks"; + +export default async function Bookmarks({ + favourited, + archived, + title, +}: ZGetBookmarksRequest & { title: string }) { + const session = await getServerSession(authOptions); + if (!session) { + redirect("/"); + } + const bookmarks = await getBookmarks(session.user.id, { + favourited, + archived, + }); + + if (bookmarks.length == 0) { + // TODO: This needs to be polished + return ( + <> + <div className="container pb-4 text-2xl">{title}</div> + <div className="container">No bookmarks</div> + </> + ); + } + + return ( + <> + <div className="container pb-4 text-2xl">{title}</div> + <BookmarksGrid bookmarks={bookmarks} /> + </> + ); +} diff --git a/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx b/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx index f52ef910..11845ca3 100644 --- a/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx +++ b/packages/web/app/dashboard/bookmarks/components/BookmarksGrid.tsx @@ -1,7 +1,3 @@ -import { getServerSession } from "next-auth"; -import { redirect } from "next/navigation"; -import { authOptions } from "@/lib/auth"; -import { getBookmarks } from "@/lib/services/bookmarks"; import LinkCard from "./LinkCard"; import { ZBookmark } from "@/lib/types/api/bookmarks"; @@ -12,13 +8,11 @@ function renderBookmark(bookmark: ZBookmark) { } } -export default async function BookmarksGrid() { - const session = await getServerSession(authOptions); - if (!session) { - redirect("/"); - } - const bookmarks = await getBookmarks(session.user.id); - +export default function BookmarksGrid({ + bookmarks, +}: { + bookmarks: ZBookmark[]; +}) { return ( <div className="container grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4"> {bookmarks.map((b) => renderBookmark(b))} diff --git a/packages/web/app/dashboard/bookmarks/favourites/page.tsx b/packages/web/app/dashboard/bookmarks/favourites/page.tsx new file mode 100644 index 00000000..990b087d --- /dev/null +++ b/packages/web/app/dashboard/bookmarks/favourites/page.tsx @@ -0,0 +1,5 @@ +import Bookmarks from "../components/Bookmarks"; + +export default async function FavouritesBookmarkPage() { + return <Bookmarks title="Favourites" archived={false} favourited={true} />; +} diff --git a/packages/web/app/dashboard/bookmarks/layout.tsx b/packages/web/app/dashboard/bookmarks/layout.tsx new file mode 100644 index 00000000..14f7bb40 --- /dev/null +++ b/packages/web/app/dashboard/bookmarks/layout.tsx @@ -0,0 +1,23 @@ +import React from "react"; +import AddLink from "./components/AddLink"; +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Remember - Bookmarks", +}; + +export default function BookmarksLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + <div className="flex flex-col"> + <div> + <AddLink /> + </div> + <hr /> + <div className="mt-4">{children}</div> + </div> + ); +} diff --git a/packages/web/app/dashboard/bookmarks/page.tsx b/packages/web/app/dashboard/bookmarks/page.tsx index b9eabfe8..3d125fad 100644 --- a/packages/web/app/dashboard/bookmarks/page.tsx +++ b/packages/web/app/dashboard/bookmarks/page.tsx @@ -1,20 +1,5 @@ -import AddLink from "./components/AddLink"; -import BookmarksGrid from "./components/BookmarksGrid"; -import type { Metadata } from "next"; +import Bookmarks from "./components/Bookmarks"; -export const metadata: Metadata = { - title: "Remember - Bookmarks", -}; - -export default async function Bookmarks() { - return ( - <div className="flex flex-col"> - <div> - <AddLink /> - </div> - <div> - <BookmarksGrid /> - </div> - </div> - ); +export default async function BookmarksPage() { + return <Bookmarks title="Bookmarks" archived={false} favourited={false} />; } diff --git a/packages/web/app/dashboard/components/Sidebar.tsx b/packages/web/app/dashboard/components/Sidebar.tsx index c2abe1e1..3b4e1649 100644 --- a/packages/web/app/dashboard/components/Sidebar.tsx +++ b/packages/web/app/dashboard/components/Sidebar.tsx @@ -2,27 +2,8 @@ import { Button } from "@/components/ui/button"; import { authOptions } from "@/lib/auth"; import { Archive, MoreHorizontal, Star, Tag, Home, Brain } from "lucide-react"; import { getServerSession } from "next-auth"; -import Link from "next/link"; import { redirect } from "next/navigation"; - -function SidebarItem({ - name, - logo, - path, -}: { - name: string; - logo: React.ReactNode; - path: string; -}) { - return ( - <li className="rounded-lg px-3 py-2 hover:bg-slate-100"> - <Link href={path} className="flex w-full space-x-2"> - {logo} - <span className="my-auto"> {name} </span> - </Link> - </li> - ); -} +import SidebarItem from "./SidebarItem"; export default async function Sidebar() { const session = await getServerSession(authOptions); @@ -39,9 +20,21 @@ export default async function Sidebar() { <hr /> <div> <ul className="mt-5 space-y-2 text-sm font-medium"> - <SidebarItem logo={<Home />} name="Home" path="#" /> - <SidebarItem logo={<Star />} name="Favourites" path="#" /> - <SidebarItem logo={<Archive />} name="Archived" path="#" /> + <SidebarItem + logo={<Home />} + name="Home" + path="/dashboard/bookmarks" + /> + <SidebarItem + logo={<Star />} + name="Favourites" + path="/dashboard/bookmarks/favourites" + /> + <SidebarItem + logo={<Archive />} + name="Archive" + path="/dashboard/bookmarks/archive" + /> <SidebarItem logo={<Tag />} name="Tags" path="#" /> </ul> </div> diff --git a/packages/web/app/dashboard/components/SidebarItem.tsx b/packages/web/app/dashboard/components/SidebarItem.tsx new file mode 100644 index 00000000..e6a00d72 --- /dev/null +++ b/packages/web/app/dashboard/components/SidebarItem.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { cn } from "@/lib/utils"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +export default function SidebarItem({ + name, + logo, + path, +}: { + name: string; + logo: React.ReactNode; + path: string; +}) { + const currentPath = usePathname(); + return ( + <li + className={cn( + "rounded-lg hover:bg-slate-100", + path == currentPath ? "bg-slate-100" : "", + )} + > + <Link href={path} className="flex w-full space-x-2 px-3 py-2"> + {logo} + <span className="my-auto"> {name} </span> + </Link> + </li> + ); +} diff --git a/packages/web/app/dashboard/layout.tsx b/packages/web/app/dashboard/layout.tsx index 220949c7..87c88a4b 100644 --- a/packages/web/app/dashboard/layout.tsx +++ b/packages/web/app/dashboard/layout.tsx @@ -1,15 +1,16 @@ -import Bookmarks from "@/app/dashboard/bookmarks/page"; -import Sidebar from "@/app/dashboard/components/Sidebar"; +import Sidebar from "./components/Sidebar"; -export default async function Dashboard() { +export default async function Dashboard({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { return ( <div className="flex h-screen w-screen"> <div className="flex-none"> <Sidebar /> </div> - <div className="flex-1 bg-gray-100"> - <Bookmarks /> - </div> + <div className="flex-1 bg-gray-100">{children}</div> </div> ); } |
