mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-14 14:13:43 +01:00
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:
committed by
Copybot
parent
c6b576b25a
commit
913caca379
@@ -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
-1
@@ -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">
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user