aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2024-10-27 12:03:14 +0000
committerMohamed Bassem <me@mbassem.com>2024-10-27 12:03:14 +0000
commiteb7da996a7c2d617d276f296cac07a6fd5648664 (patch)
tree4711de55b6f5fed3ac0cf3539099a9c0f115647e
parent801ba36af5900c84af5a88dea37aa7d2f793fed9 (diff)
downloadkarakeep-eb7da996a7c2d617d276f296cac07a6fd5648664.tar.zst
ui: Redesign the settings page and move it to its own layout
-rw-r--r--apps/web/app/dashboard/settings/page.tsx60
-rw-r--r--apps/web/app/settings/ai/page.tsx5
-rw-r--r--apps/web/app/settings/api-keys/page.tsx9
-rw-r--r--apps/web/app/settings/import/page.tsx9
-rw-r--r--apps/web/app/settings/info/page.tsx11
-rw-r--r--apps/web/app/settings/layout.tsx34
-rw-r--r--apps/web/app/settings/page.tsx6
-rw-r--r--apps/web/components/dashboard/header/ProfileOptions.tsx2
-rw-r--r--apps/web/components/dashboard/sidebar/AllLists.tsx2
-rw-r--r--apps/web/components/dashboard/sidebar/ModileSidebar.tsx3
-rw-r--r--apps/web/components/dashboard/sidebar/Sidebar.tsx2
-rw-r--r--apps/web/components/settings/AISettings.tsx (renamed from apps/web/components/dashboard/settings/AISettings.tsx)0
-rw-r--r--apps/web/components/settings/AddApiKey.tsx (renamed from apps/web/components/dashboard/settings/AddApiKey.tsx)0
-rw-r--r--apps/web/components/settings/ApiKeySettings.tsx (renamed from apps/web/components/dashboard/settings/ApiKeySettings.tsx)0
-rw-r--r--apps/web/components/settings/ChangePassword.tsx (renamed from apps/web/components/dashboard/settings/ChangePassword.tsx)0
-rw-r--r--apps/web/components/settings/DeleteApiKey.tsx (renamed from apps/web/components/dashboard/settings/DeleteApiKey.tsx)0
-rw-r--r--apps/web/components/settings/ImportExport.tsx (renamed from apps/web/components/dashboard/settings/ImportExport.tsx)0
-rw-r--r--apps/web/components/settings/UserDetails.tsx (renamed from apps/web/components/dashboard/settings/UserDetails.tsx)0
-rw-r--r--apps/web/components/settings/sidebar/ModileSidebar.tsx19
-rw-r--r--apps/web/components/settings/sidebar/Sidebar.tsx34
-rw-r--r--apps/web/components/settings/sidebar/items.tsx34
-rw-r--r--apps/web/components/shared/sidebar/ModileSidebarItem.tsx (renamed from apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx)0
-rw-r--r--apps/web/components/shared/sidebar/SidebarItem.tsx (renamed from apps/web/components/dashboard/sidebar/SidebarItem.tsx)0
23 files changed, 165 insertions, 65 deletions
diff --git a/apps/web/app/dashboard/settings/page.tsx b/apps/web/app/dashboard/settings/page.tsx
deleted file mode 100644
index 11883d55..00000000
--- a/apps/web/app/dashboard/settings/page.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import AISettings from "@/components/dashboard/settings/AISettings";
-import ApiKeySettings from "@/components/dashboard/settings/ApiKeySettings";
-import { ChangePassword } from "@/components/dashboard/settings/ChangePassword";
-import ImportExport from "@/components/dashboard/settings/ImportExport";
-import UserDetails from "@/components/dashboard/settings/UserDetails";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
-import { Download, KeyRound, Sparkle, User } from "lucide-react";
-
-export default async function Settings() {
- return (
- <Tabs
- defaultValue="info"
- orientation="horizontal"
- className="flex flex-col gap-1"
- >
- <TabsList className="flex justify-start overflow-x-auto overflow-y-hidden">
- <TabsTrigger className="flex items-center gap-2 p-3" value="info">
- <User className="size-4" />
- User Info
- </TabsTrigger>
- <TabsTrigger className="flex items-center gap-2 p-3" value="ai">
- <Sparkle className="size-4" />
- AI Settings
- </TabsTrigger>
- <TabsTrigger
- className="flex items-center gap-2 p-3"
- value="importexport"
- >
- <Download className="size-4" />
- Import / Export
- </TabsTrigger>
- <TabsTrigger className="flex items-center gap-2 p-3" value="apikeys">
- <KeyRound className="size-4" />
- API Keys
- </TabsTrigger>
- </TabsList>
- <div className="w-full">
- <TabsContent value="info">
- <div className="rounded-md border bg-background p-4">
- <UserDetails />
- <ChangePassword />
- </div>
- </TabsContent>
- <TabsContent value="ai">
- <AISettings />
- </TabsContent>
- <TabsContent value="importexport">
- <div className="rounded-md border bg-background p-4">
- <ImportExport />
- </div>
- </TabsContent>
- <TabsContent value="apikeys">
- <div className="rounded-md border bg-background p-4">
- <ApiKeySettings />
- </div>
- </TabsContent>
- </div>
- </Tabs>
- );
-}
diff --git a/apps/web/app/settings/ai/page.tsx b/apps/web/app/settings/ai/page.tsx
new file mode 100644
index 00000000..2b3d7a8d
--- /dev/null
+++ b/apps/web/app/settings/ai/page.tsx
@@ -0,0 +1,5 @@
+import AISettings from "@/components/settings/AISettings";
+
+export default function AISettingsPage() {
+ return <AISettings />;
+}
diff --git a/apps/web/app/settings/api-keys/page.tsx b/apps/web/app/settings/api-keys/page.tsx
new file mode 100644
index 00000000..1c3718d6
--- /dev/null
+++ b/apps/web/app/settings/api-keys/page.tsx
@@ -0,0 +1,9 @@
+import ApiKeySettings from "@/components/settings/ApiKeySettings";
+
+export default async function ApiKeysPage() {
+ return (
+ <div className="rounded-md border bg-background p-4">
+ <ApiKeySettings />
+ </div>
+ );
+}
diff --git a/apps/web/app/settings/import/page.tsx b/apps/web/app/settings/import/page.tsx
new file mode 100644
index 00000000..e27aa9a8
--- /dev/null
+++ b/apps/web/app/settings/import/page.tsx
@@ -0,0 +1,9 @@
+import ImportExport from "@/components/settings/ImportExport";
+
+export default function ImportSettingsPage() {
+ return (
+ <div className="rounded-md border bg-background p-4">
+ <ImportExport />
+ </div>
+ );
+}
diff --git a/apps/web/app/settings/info/page.tsx b/apps/web/app/settings/info/page.tsx
new file mode 100644
index 00000000..8027b09f
--- /dev/null
+++ b/apps/web/app/settings/info/page.tsx
@@ -0,0 +1,11 @@
+import { ChangePassword } from "@/components/settings/ChangePassword";
+import UserDetails from "@/components/settings/UserDetails";
+
+export default async function InfoPage() {
+ return (
+ <div className="rounded-md border bg-background p-4">
+ <UserDetails />
+ <ChangePassword />
+ </div>
+ );
+}
diff --git a/apps/web/app/settings/layout.tsx b/apps/web/app/settings/layout.tsx
new file mode 100644
index 00000000..0ab6c624
--- /dev/null
+++ b/apps/web/app/settings/layout.tsx
@@ -0,0 +1,34 @@
+import Header from "@/components/dashboard/header/Header";
+import DemoModeBanner from "@/components/DemoModeBanner";
+import MobileSidebar from "@/components/settings/sidebar/ModileSidebar";
+import Sidebar from "@/components/settings/sidebar/Sidebar";
+import { Separator } from "@/components/ui/separator";
+import ValidAccountCheck from "@/components/utils/ValidAccountCheck";
+
+import serverConfig from "@hoarder/shared/config";
+
+export default async function SettingsLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+ <div>
+ <Header />
+ <div className="flex min-h-[calc(100vh-64px)] w-screen flex-col sm:h-[calc(100vh-64px)] sm:flex-row">
+ <ValidAccountCheck />
+ <div className="hidden flex-none sm:flex">
+ <Sidebar />
+ </div>
+ <main className="flex-1 bg-muted sm:overflow-y-auto">
+ {serverConfig.demoMode && <DemoModeBanner />}
+ <div className="block w-full sm:hidden">
+ <MobileSidebar />
+ <Separator />
+ </div>
+ <div className="min-h-30 container p-4">{children}</div>
+ </main>
+ </div>
+ </div>
+ );
+}
diff --git a/apps/web/app/settings/page.tsx b/apps/web/app/settings/page.tsx
new file mode 100644
index 00000000..de935c84
--- /dev/null
+++ b/apps/web/app/settings/page.tsx
@@ -0,0 +1,6 @@
+import { redirect } from "next/navigation";
+
+export default function SettingsHomepage() {
+ redirect("/settings/info");
+ return null;
+}
diff --git a/apps/web/components/dashboard/header/ProfileOptions.tsx b/apps/web/components/dashboard/header/ProfileOptions.tsx
index ea8c7d12..ee6cac01 100644
--- a/apps/web/components/dashboard/header/ProfileOptions.tsx
+++ b/apps/web/components/dashboard/header/ProfileOptions.tsx
@@ -62,7 +62,7 @@ export default function SidebarProfileOptions() {
</div>
<Separator className="my-2" />
<DropdownMenuItem asChild>
- <Link href="/dashboard/settings">
+ <Link href="/settings">
<Settings className="mr-2 size-4" />
User Settings
</Link>
diff --git a/apps/web/components/dashboard/sidebar/AllLists.tsx b/apps/web/components/dashboard/sidebar/AllLists.tsx
index b6cadea9..c48ddb0f 100644
--- a/apps/web/components/dashboard/sidebar/AllLists.tsx
+++ b/apps/web/components/dashboard/sidebar/AllLists.tsx
@@ -3,6 +3,7 @@
import { useCallback } from "react";
import Link from "next/link";
import { usePathname } from "next/navigation";
+import SidebarItem from "@/components/shared/sidebar/SidebarItem";
import { Button } from "@/components/ui/button";
import { CollapsibleTriggerTriangle } from "@/components/ui/collapsible";
import { MoreHorizontal, Plus } from "lucide-react";
@@ -13,7 +14,6 @@ import { ZBookmarkListTreeNode } from "@hoarder/shared/utils/listUtils";
import { CollapsibleBookmarkLists } from "../lists/CollapsibleBookmarkLists";
import { EditListModal } from "../lists/EditListModal";
import { ListOptions } from "../lists/ListOptions";
-import SidebarItem from "./SidebarItem";
export default function AllLists({
initialData,
diff --git a/apps/web/components/dashboard/sidebar/ModileSidebar.tsx b/apps/web/components/dashboard/sidebar/ModileSidebar.tsx
index 7ccf6b8d..bfa91afa 100644
--- a/apps/web/components/dashboard/sidebar/ModileSidebar.tsx
+++ b/apps/web/components/dashboard/sidebar/ModileSidebar.tsx
@@ -1,8 +1,7 @@
+import MobileSidebarItem from "@/components/shared/sidebar/ModileSidebarItem";
import HoarderLogoIcon from "@/public/icons/logo-icon.svg";
import { ClipboardList, Search, Tag } from "lucide-react";
-import MobileSidebarItem from "./ModileSidebarItem";
-
export default async function MobileSidebar() {
return (
<aside className="w-full">
diff --git a/apps/web/components/dashboard/sidebar/Sidebar.tsx b/apps/web/components/dashboard/sidebar/Sidebar.tsx
index 14d019ff..8021ad36 100644
--- a/apps/web/components/dashboard/sidebar/Sidebar.tsx
+++ b/apps/web/components/dashboard/sidebar/Sidebar.tsx
@@ -1,4 +1,5 @@
import { redirect } from "next/navigation";
+import SidebarItem from "@/components/shared/sidebar/SidebarItem";
import { Separator } from "@/components/ui/separator";
import { api } from "@/server/api/client";
import { getServerAuthSession } from "@/server/auth";
@@ -7,7 +8,6 @@ import { Archive, Home, Search, Tag } from "lucide-react";
import serverConfig from "@hoarder/shared/config";
import AllLists from "./AllLists";
-import SidebarItem from "./SidebarItem";
export default async function Sidebar() {
const session = await getServerAuthSession();
diff --git a/apps/web/components/dashboard/settings/AISettings.tsx b/apps/web/components/settings/AISettings.tsx
index 0a8db147..0a8db147 100644
--- a/apps/web/components/dashboard/settings/AISettings.tsx
+++ b/apps/web/components/settings/AISettings.tsx
diff --git a/apps/web/components/dashboard/settings/AddApiKey.tsx b/apps/web/components/settings/AddApiKey.tsx
index 34fd2df7..34fd2df7 100644
--- a/apps/web/components/dashboard/settings/AddApiKey.tsx
+++ b/apps/web/components/settings/AddApiKey.tsx
diff --git a/apps/web/components/dashboard/settings/ApiKeySettings.tsx b/apps/web/components/settings/ApiKeySettings.tsx
index 4d43be7a..4d43be7a 100644
--- a/apps/web/components/dashboard/settings/ApiKeySettings.tsx
+++ b/apps/web/components/settings/ApiKeySettings.tsx
diff --git a/apps/web/components/dashboard/settings/ChangePassword.tsx b/apps/web/components/settings/ChangePassword.tsx
index aa27f223..aa27f223 100644
--- a/apps/web/components/dashboard/settings/ChangePassword.tsx
+++ b/apps/web/components/settings/ChangePassword.tsx
diff --git a/apps/web/components/dashboard/settings/DeleteApiKey.tsx b/apps/web/components/settings/DeleteApiKey.tsx
index e2334c44..e2334c44 100644
--- a/apps/web/components/dashboard/settings/DeleteApiKey.tsx
+++ b/apps/web/components/settings/DeleteApiKey.tsx
diff --git a/apps/web/components/dashboard/settings/ImportExport.tsx b/apps/web/components/settings/ImportExport.tsx
index 1145a42d..1145a42d 100644
--- a/apps/web/components/dashboard/settings/ImportExport.tsx
+++ b/apps/web/components/settings/ImportExport.tsx
diff --git a/apps/web/components/dashboard/settings/UserDetails.tsx b/apps/web/components/settings/UserDetails.tsx
index 471a6e09..471a6e09 100644
--- a/apps/web/components/dashboard/settings/UserDetails.tsx
+++ b/apps/web/components/settings/UserDetails.tsx
diff --git a/apps/web/components/settings/sidebar/ModileSidebar.tsx b/apps/web/components/settings/sidebar/ModileSidebar.tsx
new file mode 100644
index 00000000..2016c931
--- /dev/null
+++ b/apps/web/components/settings/sidebar/ModileSidebar.tsx
@@ -0,0 +1,19 @@
+import MobileSidebarItem from "@/components/shared/sidebar/ModileSidebarItem";
+
+import { settingsSidebarItems } from "./items";
+
+export default async function MobileSidebar() {
+ return (
+ <aside className="w-full">
+ <ul className="flex justify-between space-x-2 border-b-black px-5 py-2 pt-5">
+ {settingsSidebarItems.map((item) => (
+ <MobileSidebarItem
+ key={item.name}
+ logo={item.icon}
+ path={item.path}
+ />
+ ))}
+ </ul>
+ </aside>
+ );
+}
diff --git a/apps/web/components/settings/sidebar/Sidebar.tsx b/apps/web/components/settings/sidebar/Sidebar.tsx
new file mode 100644
index 00000000..247e0916
--- /dev/null
+++ b/apps/web/components/settings/sidebar/Sidebar.tsx
@@ -0,0 +1,34 @@
+import { redirect } from "next/navigation";
+import SidebarItem from "@/components/shared/sidebar/SidebarItem";
+import { getServerAuthSession } from "@/server/auth";
+
+import serverConfig from "@hoarder/shared/config";
+
+import { settingsSidebarItems } from "./items";
+
+export default async function Sidebar() {
+ const session = await getServerAuthSession();
+ if (!session) {
+ redirect("/");
+ }
+
+ return (
+ <aside className="flex h-[calc(100vh-64px)] w-60 flex-col gap-5 border-r p-4 ">
+ <div>
+ <ul className="space-y-2 text-sm font-medium">
+ {settingsSidebarItems.map((item) => (
+ <SidebarItem
+ key={item.name}
+ logo={item.icon}
+ name={item.name}
+ path={item.path}
+ />
+ ))}
+ </ul>
+ </div>
+ <div className="mt-auto flex items-center border-t pt-2 text-sm text-gray-400">
+ Hoarder v{serverConfig.serverVersion}
+ </div>
+ </aside>
+ );
+}
diff --git a/apps/web/components/settings/sidebar/items.tsx b/apps/web/components/settings/sidebar/items.tsx
new file mode 100644
index 00000000..999825db
--- /dev/null
+++ b/apps/web/components/settings/sidebar/items.tsx
@@ -0,0 +1,34 @@
+import React from "react";
+import { ArrowLeft, Download, KeyRound, Sparkles, User } from "lucide-react";
+
+export const settingsSidebarItems: {
+ name: string;
+ icon: JSX.Element;
+ path: string;
+}[] = [
+ {
+ name: "Back To App",
+ icon: <ArrowLeft size={18} />,
+ path: "/dashboard/bookmarks",
+ },
+ {
+ name: "User Info",
+ icon: <User size={18} />,
+ path: "/settings/info",
+ },
+ {
+ name: "AI Settings",
+ icon: <Sparkles size={18} />,
+ path: "/settings/ai",
+ },
+ {
+ name: "Import / Export",
+ icon: <Download size={18} />,
+ path: "/settings/import",
+ },
+ {
+ name: "API Keys",
+ icon: <KeyRound size={18} />,
+ path: "/settings/api-keys",
+ },
+];
diff --git a/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx b/apps/web/components/shared/sidebar/ModileSidebarItem.tsx
index 4d3436ea..4d3436ea 100644
--- a/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx
+++ b/apps/web/components/shared/sidebar/ModileSidebarItem.tsx
diff --git a/apps/web/components/dashboard/sidebar/SidebarItem.tsx b/apps/web/components/shared/sidebar/SidebarItem.tsx
index 83ce776e..83ce776e 100644
--- a/apps/web/components/dashboard/sidebar/SidebarItem.tsx
+++ b/apps/web/components/shared/sidebar/SidebarItem.tsx