mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 16:23:06 +10:00
## Description This pull request solves the problem where the avatar component within the document list has the same z-index value as the header component, causing the avatar to be above the header. When two elements have the same z-index value, the last one takes priority! ## Related Issue Fixes #870 ## Changes Made 1. Increases the value of the header's `z-index` by `10` (the current value is `50`
170 lines
4.9 KiB
TypeScript
170 lines
4.9 KiB
TypeScript
'use client';
|
|
|
|
import Link from 'next/link';
|
|
|
|
import {
|
|
CreditCard,
|
|
FileSpreadsheet,
|
|
Lock,
|
|
LogOut,
|
|
User as LucideUser,
|
|
Monitor,
|
|
Moon,
|
|
Palette,
|
|
Sun,
|
|
UserCog,
|
|
} from 'lucide-react';
|
|
import { signOut } from 'next-auth/react';
|
|
import { useTheme } from 'next-themes';
|
|
import { LuGithub } from 'react-icons/lu';
|
|
|
|
import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag';
|
|
import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin';
|
|
import { recipientInitials } from '@documenso/lib/utils/recipient-formatter';
|
|
import type { User } from '@documenso/prisma/client';
|
|
import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar';
|
|
import { Button } from '@documenso/ui/primitives/button';
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuLabel,
|
|
DropdownMenuPortal,
|
|
DropdownMenuRadioGroup,
|
|
DropdownMenuRadioItem,
|
|
DropdownMenuSeparator,
|
|
DropdownMenuSub,
|
|
DropdownMenuSubContent,
|
|
DropdownMenuSubTrigger,
|
|
DropdownMenuTrigger,
|
|
} from '@documenso/ui/primitives/dropdown-menu';
|
|
|
|
export type ProfileDropdownProps = {
|
|
user: User;
|
|
};
|
|
|
|
export const ProfileDropdown = ({ user }: ProfileDropdownProps) => {
|
|
const { getFlag } = useFeatureFlags();
|
|
const { theme, setTheme } = useTheme();
|
|
const isUserAdmin = isAdmin(user);
|
|
|
|
const isBillingEnabled = getFlag('app_billing');
|
|
|
|
const avatarFallback = user.name
|
|
? recipientInitials(user.name)
|
|
: user.email.slice(0, 1).toUpperCase();
|
|
|
|
return (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger asChild>
|
|
<Button
|
|
variant="ghost"
|
|
title="Profile Dropdown"
|
|
className="relative h-10 w-10 rounded-full"
|
|
>
|
|
<Avatar className="h-10 w-10">
|
|
<AvatarFallback>{avatarFallback}</AvatarFallback>
|
|
</Avatar>
|
|
</Button>
|
|
</DropdownMenuTrigger>
|
|
|
|
<DropdownMenuContent className="z-[60] w-56" align="end" forceMount>
|
|
<DropdownMenuLabel>Account</DropdownMenuLabel>
|
|
|
|
{isUserAdmin && (
|
|
<>
|
|
<DropdownMenuItem asChild>
|
|
<Link href="/admin" className="cursor-pointer">
|
|
<UserCog className="mr-2 h-4 w-4" />
|
|
Admin
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuSeparator />
|
|
</>
|
|
)}
|
|
|
|
<DropdownMenuItem asChild>
|
|
<Link href="/settings/profile" className="cursor-pointer">
|
|
<LucideUser className="mr-2 h-4 w-4" />
|
|
Profile
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem asChild>
|
|
<Link href="/settings/security" className="cursor-pointer">
|
|
<Lock className="mr-2 h-4 w-4" />
|
|
Security
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
|
|
{isBillingEnabled && (
|
|
<DropdownMenuItem asChild>
|
|
<Link href="/settings/billing" className="cursor-pointer">
|
|
<CreditCard className="mr-2 h-4 w-4" />
|
|
Billing
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
)}
|
|
|
|
<DropdownMenuSeparator />
|
|
<DropdownMenuItem asChild>
|
|
<Link href="/templates" className="cursor-pointer">
|
|
<FileSpreadsheet className="mr-2 h-4 w-4" />
|
|
Templates
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
<DropdownMenuSeparator />
|
|
|
|
<DropdownMenuSub>
|
|
<DropdownMenuSubTrigger>
|
|
<Palette className="mr-2 h-4 w-4" />
|
|
Themes
|
|
</DropdownMenuSubTrigger>
|
|
<DropdownMenuPortal>
|
|
<DropdownMenuSubContent className="z-[60]">
|
|
<DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>
|
|
<DropdownMenuRadioItem value="light">
|
|
<Sun className="mr-2 h-4 w-4" /> Light
|
|
</DropdownMenuRadioItem>
|
|
<DropdownMenuRadioItem value="dark">
|
|
<Moon className="mr-2 h-4 w-4" />
|
|
Dark
|
|
</DropdownMenuRadioItem>
|
|
<DropdownMenuRadioItem value="system">
|
|
<Monitor className="mr-2 h-4 w-4" />
|
|
System
|
|
</DropdownMenuRadioItem>
|
|
</DropdownMenuRadioGroup>
|
|
</DropdownMenuSubContent>
|
|
</DropdownMenuPortal>
|
|
</DropdownMenuSub>
|
|
<DropdownMenuSeparator />
|
|
<DropdownMenuItem asChild>
|
|
<Link
|
|
href="https://github.com/documenso/documenso"
|
|
className="cursor-pointer"
|
|
target="_blank"
|
|
>
|
|
<LuGithub className="mr-2 h-4 w-4" />
|
|
Star on Github
|
|
</Link>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
<DropdownMenuItem
|
|
onSelect={() =>
|
|
void signOut({
|
|
callbackUrl: '/',
|
|
})
|
|
}
|
|
>
|
|
<LogOut className="mr-2 h-4 w-4" />
|
|
Sign Out
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
);
|
|
};
|