aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard/header
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--apps/web/components/dashboard/header/ProfileOptions.tsx56
1 files changed, 51 insertions, 5 deletions
diff --git a/apps/web/components/dashboard/header/ProfileOptions.tsx b/apps/web/components/dashboard/header/ProfileOptions.tsx
index 7ccc0078..8a2b0165 100644
--- a/apps/web/components/dashboard/header/ProfileOptions.tsx
+++ b/apps/web/components/dashboard/header/ProfileOptions.tsx
@@ -1,5 +1,6 @@
"use client";
+import { useMemo } from "react";
import Link from "next/link";
import { redirect, useRouter } from "next/navigation";
import { useToggleTheme } from "@/components/theme-provider";
@@ -11,11 +12,24 @@ import {
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { Separator } from "@/components/ui/separator";
+import { UserAvatar } from "@/components/ui/user-avatar";
+import { useSession } from "@/lib/auth/client";
import { useTranslation } from "@/lib/i18n/client";
-import { LogOut, Moon, Paintbrush, Settings, Shield, Sun } from "lucide-react";
-import { useSession } from "next-auth/react";
+import {
+ BookOpen,
+ LogOut,
+ Moon,
+ Paintbrush,
+ Puzzle,
+ Settings,
+ Shield,
+ Sun,
+ Twitter,
+} from "lucide-react";
import { useTheme } from "next-themes";
+import { useWhoAmI } from "@karakeep/shared-react/hooks/users";
+
import { AdminNoticeBadge } from "../../admin/AdminNotices";
function DarkModeToggle() {
@@ -43,7 +57,12 @@ export default function SidebarProfileOptions() {
const { t } = useTranslation();
const toggleTheme = useToggleTheme();
const { data: session } = useSession();
+ const { data: whoami } = useWhoAmI();
const router = useRouter();
+
+ const avatarImage = whoami?.image ?? null;
+ const avatarUrl = useMemo(() => avatarImage ?? null, [avatarImage]);
+
if (!session) return redirect("/");
return (
@@ -53,13 +72,21 @@ export default function SidebarProfileOptions() {
className="border-new-gray-200 aspect-square rounded-full border-4 bg-black p-0 text-white"
variant="ghost"
>
- {session.user.name?.charAt(0) ?? "U"}
+ <UserAvatar
+ image={avatarUrl}
+ name={session.user.name}
+ className="h-full w-full rounded-full"
+ />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="mr-2 min-w-64 p-2">
<div className="flex gap-2">
- <div className="border-new-gray-200 flex aspect-square size-11 items-center justify-center rounded-full border-4 bg-black p-0 text-white">
- {session.user.name?.charAt(0) ?? "U"}
+ <div className="border-new-gray-200 flex aspect-square size-11 items-center justify-center overflow-hidden rounded-full border-4 bg-black p-0 text-white">
+ <UserAvatar
+ image={avatarUrl}
+ name={session.user.name}
+ className="h-full w-full"
+ />
</div>
<div className="flex flex-col">
<p>{session.user.name}</p>
@@ -95,6 +122,25 @@ export default function SidebarProfileOptions() {
<DarkModeToggle />
</DropdownMenuItem>
<Separator className="my-2" />
+ <DropdownMenuItem asChild>
+ <a href="https://karakeep.app/apps" target="_blank" rel="noreferrer">
+ <Puzzle className="mr-2 size-4" />
+ {t("options.apps_extensions")}
+ </a>
+ </DropdownMenuItem>
+ <DropdownMenuItem asChild>
+ <a href="https://docs.karakeep.app" target="_blank" rel="noreferrer">
+ <BookOpen className="mr-2 size-4" />
+ {t("options.documentation")}
+ </a>
+ </DropdownMenuItem>
+ <DropdownMenuItem asChild>
+ <a href="https://x.com/karakeep_app" target="_blank" rel="noreferrer">
+ <Twitter className="mr-2 size-4" />
+ {t("options.follow_us_on_x")}
+ </a>
+ </DropdownMenuItem>
+ <Separator className="my-2" />
<DropdownMenuItem onClick={() => router.push("/logout")}>
<LogOut className="mr-2 size-4" />
<span>{t("actions.sign_out")}</span>