Merge pull request #26850 from overleaf/mj-chat-deleted-user

[web] Handle deleted users in chat threads

GitOrigin-RevId: 6593bf37e4f2339b40069b7cf4198166660852fb
This commit is contained in:
Mathias Jakobsen
2025-07-08 08:06:17 +00:00
committed by Copybot
parent c6b576b25a
commit 913caca379
8 changed files with 22 additions and 12 deletions
@@ -2,6 +2,7 @@ import { getHueForUserId } from '@/shared/utils/colors'
import MessageContent from './message-content'
import type { Message as MessageType } from '@/features/chat/context/chat-context'
import { User } from '../../../../../types/user'
import { useTranslation } from 'react-i18next'
export interface MessageProps {
message: MessageType
@@ -26,11 +27,16 @@ function getArrowStyle(user?: User) {
}
function Message({ message, fromSelf }: MessageProps) {
const { t } = useTranslation()
return (
<div className="message-wrapper">
{!fromSelf && (
<div className="name" translate="no">
<span>{message.user.first_name || message.user.email}</span>
<span>
{message.user
? message.user.first_name || message.user.email
: t('deleted_user')}
</span>
</div>
)}
<div className="message" style={getMessageStyle(message.user)}>
@@ -29,7 +29,7 @@ export type Message = {
id: string
timestamp: number
contents: string[]
user: User
user?: User
}
type State = {
@@ -15,6 +15,7 @@ export function appendMessage(messageList, message, uniqueMessageIds) {
lastMessage &&
message &&
message.user &&
lastMessage.user &&
message.user.id &&
message.user.id === lastMessage.user.id &&
message.timestamp - lastMessage.timestamp < TIMESTAMP_GROUP_SIZE
@@ -57,6 +58,7 @@ export function prependMessages(messageList, messages, uniqueMessageIds) {
const shouldGroup =
firstMessage &&
message &&
firstMessage.user &&
message.user &&
message.user.id === firstMessage.user.id &&
firstMessage.timestamp - message.timestamp < TIMESTAMP_GROUP_SIZE
@@ -27,8 +27,6 @@ function getAvatarStyle(user?: User) {
}
function Message({ message, fromSelf }: MessageProps) {
const userAvailable = message.user?.id && message.user.email
return (
<div className="chat-message-redesign">
<div className="message-row">
@@ -36,7 +34,7 @@ function Message({ message, fromSelf }: MessageProps) {
{!fromSelf && (
<div className="message-author">
<span>
{userAvailable
{message.user?.id && message.user.email
? message.user.first_name || message.user.email
: t('deleted_user')}
</span>
@@ -49,7 +47,7 @@ function Message({ message, fromSelf }: MessageProps) {
{!fromSelf && index === message.contents.length - 1 ? (
<div className="message-avatar">
<div className="avatar" style={getAvatarStyle(message.user)}>
{userAvailable ? (
{message.user?.id && message.user.email ? (
message.user.first_name?.charAt(0) ||
message.user.email.charAt(0)
) : (
@@ -3,13 +3,15 @@ import { buildName } from '../utils/build-name'
import { ReviewPanelUser } from '../../../../../types/review-panel/review-panel'
import { ChangesUser } from '../context/changes-users-context'
import { getBackgroundColorForUserId } from '@/shared/utils/colors'
import { useTranslation } from 'react-i18next'
const ReviewPanelEntryUser = ({
user,
}: {
user?: ReviewPanelUser | ChangesUser
}) => {
const userName = buildName(user)
const { t } = useTranslation()
const userName = user ? buildName(user) : t('deleted_user')
return (
<div className="review-panel-entry-user" translate="no">
@@ -40,7 +40,7 @@ export const ReviewPanelMessage: FC<{
const user = useUserContext()
const permissions = usePermissionsContext()
const isCommentAuthor = user.id === message.user.id
const isCommentAuthor = Boolean(message.user && user.id === message.user.id)
const canEdit = isCommentAuthor && permissions.comment
const canResolve =
permissions.resolveAllComments ||
@@ -1,15 +1,17 @@
export const buildName = (user?: {
export const buildName = (user: {
first_name?: string
last_name?: string
email?: string
}) => {
const name = [user?.first_name, user?.last_name].filter(Boolean).join(' ')
const name = [user.first_name, user.last_name].filter(Boolean).join(' ')
if (name) {
return name
}
if (user?.email) {
if (user.email) {
return user.email.split('@')[0]
}
return 'Unknown'
}
@@ -20,6 +20,6 @@ export interface ReviewPanelCommentThreadMessage {
content: string
id: CommentId
timestamp: Date
user: ReviewPanelUser
user?: ReviewPanelUser
user_id: UserId
}