diff options
| author | Mohamed Bassem <me@mbassem.com> | 2024-12-30 11:27:32 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-12-30 11:31:35 +0000 |
| commit | 179f00b15525b024b6823088ef8fb94b7106b4f0 (patch) | |
| tree | d64257778930965ed076ff9a081411470343fb3c /apps/web/components/admin/sidebar | |
| parent | aff4e60952321d06dc4cf517ff3b15206aaaebba (diff) | |
| download | karakeep-179f00b15525b024b6823088ef8fb94b7106b4f0.tar.zst | |
feat: Change the admin page to be tabbed similar to that of the settings page
Diffstat (limited to 'apps/web/components/admin/sidebar')
| -rw-r--r-- | apps/web/components/admin/sidebar/MobileSidebar.tsx | 21 | ||||
| -rw-r--r-- | apps/web/components/admin/sidebar/Sidebar.tsx | 36 | ||||
| -rw-r--r-- | apps/web/components/admin/sidebar/items.tsx | 31 |
3 files changed, 88 insertions, 0 deletions
diff --git a/apps/web/components/admin/sidebar/MobileSidebar.tsx b/apps/web/components/admin/sidebar/MobileSidebar.tsx new file mode 100644 index 00000000..416b944c --- /dev/null +++ b/apps/web/components/admin/sidebar/MobileSidebar.tsx @@ -0,0 +1,21 @@ +import MobileSidebarItem from "@/components/shared/sidebar/ModileSidebarItem"; +import { useTranslation } from "@/lib/i18n/server"; + +import { adminSidebarItems } from "./items"; + +export default async function MobileSidebar() { + const { t } = await useTranslation(); + return ( + <aside className="w-full"> + <ul className="flex justify-between space-x-2 border-b-black px-5 py-2 pt-5"> + {adminSidebarItems(t).map((item) => ( + <MobileSidebarItem + key={item.name} + logo={item.icon} + path={item.path} + /> + ))} + </ul> + </aside> + ); +} diff --git a/apps/web/components/admin/sidebar/Sidebar.tsx b/apps/web/components/admin/sidebar/Sidebar.tsx new file mode 100644 index 00000000..8a5d615a --- /dev/null +++ b/apps/web/components/admin/sidebar/Sidebar.tsx @@ -0,0 +1,36 @@ +import { redirect } from "next/navigation"; +import SidebarItem from "@/components/shared/sidebar/SidebarItem"; +import { useTranslation } from "@/lib/i18n/server"; +import { getServerAuthSession } from "@/server/auth"; + +import serverConfig from "@hoarder/shared/config"; + +import { adminSidebarItems } from "./items"; + +export default async function Sidebar() { + const { t } = await useTranslation(); + 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"> + {adminSidebarItems(t).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/admin/sidebar/items.tsx b/apps/web/components/admin/sidebar/items.tsx new file mode 100644 index 00000000..78dfee34 --- /dev/null +++ b/apps/web/components/admin/sidebar/items.tsx @@ -0,0 +1,31 @@ +import { TFunction } from "i18next"; +import { Activity, ArrowLeft, Settings, Users } from "lucide-react"; + +export const adminSidebarItems = ( + t: TFunction, +): { + name: string; + icon: JSX.Element; + path: string; +}[] => [ + { + name: t("settings.back_to_app"), + icon: <ArrowLeft size={18} />, + path: "/dashboard/bookmarks", + }, + { + name: t("admin.server_stats.server_stats"), + icon: <Activity size={18} />, + path: "/admin/overview", + }, + { + name: t("admin.users_list.users_list"), + icon: <Users size={18} />, + path: "/admin/users", + }, + { + name: t("common.actions"), + icon: <Settings size={18} />, + path: "/admin/actions", + }, +]; |
