diff --git a/web/app/components/base/user-avatar-list/index.tsx b/web/app/components/base/user-avatar-list/index.tsx index d31a82912d..03d71c3c4d 100644 --- a/web/app/components/base/user-avatar-list/index.tsx +++ b/web/app/components/base/user-avatar-list/index.tsx @@ -1,9 +1,10 @@ import type { FC } from 'react' import type { AvatarSize } from '@/app/components/base/avatar' import { memo } from 'react' -import { Avatar } from '@/app/components/base/avatar' +import { AvatarFallback, AvatarImage, avatarPartClassNames, AvatarRoot, getAvatarSizeClassNames } from '@/app/components/base/avatar' import { getUserColor } from '@/app/components/workflow/collaboration/utils/user-color' import { useAppContext } from '@/context/app-context' +import { cn } from '@/utils/classnames' type User = { id: string @@ -60,6 +61,8 @@ export const UserAvatarList: FC = memo(({ const remainingCount = users.length - actualMaxVisible const currentUserId = userProfile?.id + const avatarSize = numericPxToAvatarSize(size) + const avatarSizeClassNames = getAvatarSizeClassNames(avatarSize) return (
@@ -72,13 +75,21 @@ export const UserAvatarList: FC = memo(({ className="relative" style={{ zIndex: visibleUsers.length - index }} > - + + {user.avatar_url && ( + + )} + + {user.name?.[0]?.toLocaleUpperCase()} + +
) }, diff --git a/web/app/components/workflow/comment/thread.tsx b/web/app/components/workflow/comment/thread.tsx index 63189f16b4..2b415dda19 100644 --- a/web/app/components/workflow/comment/thread.tsx +++ b/web/app/components/workflow/comment/thread.tsx @@ -6,7 +6,7 @@ import { RiArrowDownSLine, RiArrowUpSLine, RiCheckboxCircleFill, RiCheckboxCircl import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow, useViewport } from 'reactflow' -import { Avatar } from '@/app/components/base/avatar' +import { Avatar, AvatarFallback, AvatarImage, avatarPartClassNames, AvatarRoot, getAvatarSizeClassNames } from '@/app/components/base/avatar' import Divider from '@/app/components/base/divider' import InlineDeleteConfirm from '@/app/components/base/inline-delete-confirm' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem' @@ -19,6 +19,8 @@ import { cn } from '@/utils/classnames' import { useStore } from '../store' import { MentionInput } from './mention-input' +const threadAvatarSizeClassNames = getAvatarSizeClassNames('sm') + type CommentThreadProps = { comment: WorkflowCommentDetail loading?: boolean @@ -120,13 +122,21 @@ const ThreadMessage: FC<{ return (
- + + {avatarUrl && ( + + )} + + {authorName?.[0]?.toLocaleUpperCase()} + +
diff --git a/web/app/components/workflow/header/online-users.tsx b/web/app/components/workflow/header/online-users.tsx index 016d7bbf70..d2dcccb990 100644 --- a/web/app/components/workflow/header/online-users.tsx +++ b/web/app/components/workflow/header/online-users.tsx @@ -4,7 +4,7 @@ import { ChevronDownIcon } from '@heroicons/react/20/solid' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow } from 'reactflow' -import { Avatar } from '@/app/components/base/avatar' +import { AvatarFallback, AvatarImage, avatarPartClassNames, AvatarRoot, getAvatarSizeClassNames } from '@/app/components/base/avatar' import Divider from '@/app/components/base/divider' import { PortalToFollowElem, @@ -51,6 +51,38 @@ const useAvatarUrls = (users: OnlineUser[]) => { return avatarUrls } +const onlineUserAvatarSizeClassNames = getAvatarSizeClassNames('sm') + +type OnlineUserAvatarProps = { + name: string + avatar: string | null + className?: string + fallbackColor?: string +} + +const OnlineUserAvatar = ({ + name, + avatar, + className, + fallbackColor, +}: OnlineUserAvatarProps) => ( + + {avatar && ( + + )} + + {name?.[0]?.toLocaleUpperCase()} + + +) + const OnlineUsers = () => { const { t } = useTranslation() const appId = useStore(s => s.appId) @@ -135,12 +167,11 @@ const OnlineUsers = () => { style={{ zIndex: visibleUsers.length - index }} onClick={() => !isCurrentUser && jumpToUserCursor(user.user_id)} > - { }} >
-
{renderDisplayName(