Merge pull request #365 from documenso/feat/avatar-fallback

feat: add avatar email fallback
This commit is contained in:
Lucas Smith
2023-09-13 21:51:42 +10:00
committed by GitHub
6 changed files with 26 additions and 22 deletions

View File

@ -15,7 +15,7 @@ export type StackAvatarProps = {
type: 'unsigned' | 'waiting' | 'opened' | 'completed'; type: 'unsigned' | 'waiting' | 'opened' | 'completed';
}; };
export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { export const StackAvatar = ({ first, zIndex, fallbackText = '', type }: StackAvatarProps) => {
let classes = ''; let classes = '';
let zIndexClass = ''; let zIndexClass = '';
const firstClass = first ? '' : '-ml-3'; const firstClass = first ? '' : '-ml-3';
@ -48,7 +48,7 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr
${firstClass} ${firstClass}
dark:border-border h-10 w-10 border-2 border-solid border-white`} dark:border-border h-10 w-10 border-2 border-solid border-white`}
> >
<AvatarFallback className={classes}>{fallbackText ?? 'UK'}</AvatarFallback> <AvatarFallback className={classes}>{fallbackText}</AvatarFallback>
</Avatar> </Avatar>
); );
}; };

View File

@ -1,5 +1,5 @@
import { initials } from '@documenso/lib/client-only/recipient-initials';
import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type';
import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter';
import { Recipient } from '@documenso/prisma/client'; import { Recipient } from '@documenso/prisma/client';
import { import {
Tooltip, Tooltip,
@ -56,7 +56,7 @@ export const StackAvatarsWithTooltip = ({
first={true} first={true}
key={recipient.id} key={recipient.id}
type={getRecipientType(recipient)} type={getRecipientType(recipient)}
fallbackText={initials(recipient.name)} fallbackText={recipientAbbreviation(recipient)}
/> />
<span className="text-sm text-gray-500">{recipient.email}</span> <span className="text-sm text-gray-500">{recipient.email}</span>
</div> </div>
@ -73,7 +73,7 @@ export const StackAvatarsWithTooltip = ({
first={true} first={true}
key={recipient.id} key={recipient.id}
type={getRecipientType(recipient)} type={getRecipientType(recipient)}
fallbackText={initials(recipient.name)} fallbackText={recipientAbbreviation(recipient)}
/> />
<span className="text-sm text-gray-500">{recipient.email}</span> <span className="text-sm text-gray-500">{recipient.email}</span>
</div> </div>
@ -90,7 +90,7 @@ export const StackAvatarsWithTooltip = ({
first={true} first={true}
key={recipient.id} key={recipient.id}
type={getRecipientType(recipient)} type={getRecipientType(recipient)}
fallbackText={initials(recipient.name)} fallbackText={recipientAbbreviation(recipient)}
/> />
<span className="text-sm text-gray-500">{recipient.email}</span> <span className="text-sm text-gray-500">{recipient.email}</span>
</div> </div>
@ -107,7 +107,7 @@ export const StackAvatarsWithTooltip = ({
first={true} first={true}
key={recipient.id} key={recipient.id}
type={getRecipientType(recipient)} type={getRecipientType(recipient)}
fallbackText={initials(recipient.name)} fallbackText={recipientAbbreviation(recipient)}
/> />
<span className="text-sm text-gray-500">{recipient.email}</span> <span className="text-sm text-gray-500">{recipient.email}</span>
</div> </div>

View File

@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { initials } from '@documenso/lib/client-only/recipient-initials';
import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type';
import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter';
import { Recipient } from '@documenso/prisma/client'; import { Recipient } from '@documenso/prisma/client';
import { StackAvatar } from './stack-avatar'; import { StackAvatar } from './stack-avatar';
@ -26,7 +26,7 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) {
first={first} first={first}
zIndex={String(zIndex - index * 10)} zIndex={String(zIndex - index * 10)}
type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)} type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)}
fallbackText={lastItemText ? lastItemText : initials(recipient.name)} fallbackText={lastItemText ? lastItemText : recipientAbbreviation(recipient)}
/> />
); );
}); });

View File

@ -15,6 +15,7 @@ import {
import { signOut } from 'next-auth/react'; import { signOut } from 'next-auth/react';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import { recipientInitials } from '@documenso/lib/utils/recipient-formatter';
import { User } from '@documenso/prisma/client'; import { User } from '@documenso/prisma/client';
import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar';
import { Button } from '@documenso/ui/primitives/button'; import { Button } from '@documenso/ui/primitives/button';
@ -40,19 +41,16 @@ export const ProfileDropdown = ({ user }: ProfileDropdownProps) => {
const isBillingEnabled = getFlag('app_billing'); const isBillingEnabled = getFlag('app_billing');
const initials = const avatarFallback = user.name
user.name ? recipientInitials(user.name)
?.split(' ') : user.email.slice(0, 1).toUpperCase();
.map((name: string) => name.slice(0, 1).toUpperCase())
.slice(0, 2)
.join('') ?? 'UK';
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<Button variant="ghost" className="relative h-10 w-10 rounded-full"> <Button variant="ghost" className="relative h-10 w-10 rounded-full">
<Avatar className="h-10 w-10"> <Avatar className="h-10 w-10">
<AvatarFallback>{initials}</AvatarFallback> <AvatarFallback>{avatarFallback}</AvatarFallback>
</Avatar> </Avatar>
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>

View File

@ -1,6 +0,0 @@
export const initials = (text: string) =>
text
?.split(' ')
.map((name: string) => name.slice(0, 1).toUpperCase())
.slice(0, 2)
.join('') ?? 'UK';

View File

@ -0,0 +1,12 @@
import { Recipient } from '@documenso/prisma/client';
export const recipientInitials = (text: string) =>
text
.split(' ')
.map((name: string) => name.slice(0, 1).toUpperCase())
.slice(0, 2)
.join('');
export const recipientAbbreviation = (recipient: Recipient) => {
return recipientInitials(recipient.name) || recipient.email.slice(0, 1).toUpperCase();
};