@@ -36,15 +36,23 @@ function MessageItem({
36
36
isOwnMessage ? 'justify-end' : 'justify-start'
37
37
} `}
38
38
>
39
- < div className = { `flex max-w-[70%] ${ isOwnMessage ? 'flex-col items-end' : 'flex-col items-start' } gap-1` } >
39
+ < div
40
+ className = { `flex max-w-[70%] ${
41
+ isOwnMessage ? 'flex-col items-end' : 'flex-col items-start'
42
+ } gap-1`}
43
+ >
40
44
{ /* User Avatar and Name - Above the message */ }
41
45
{ ! isOwnMessage && showUserInfo && (
42
46
< div className = 'flex items-center gap-2 mb-1' >
43
47
< div className = 'relative flex h-6 w-6 items-center justify-center overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700' >
44
48
{ userData ?. photoURL ? (
45
49
< Image
46
50
src = { userData . photoURL }
47
- alt = { userData . name || userData . username || 'User' }
51
+ alt = {
52
+ userData . name ||
53
+ userData . username ||
54
+ 'User'
55
+ }
48
56
width = { 24 }
49
57
height = { 24 }
50
58
className = 'object-cover'
@@ -58,7 +66,7 @@ function MessageItem({
58
66
</ span >
59
67
</ div >
60
68
) }
61
-
69
+
62
70
{ /* Message Bubble */ }
63
71
< div
64
72
className = { `rounded-2xl px-4 py-2 ${
@@ -92,7 +100,9 @@ export function ChatWindow(): JSX.Element {
92
100
const [ messageText , setMessageText ] = useState ( '' ) ;
93
101
const messagesEndRef = useRef < HTMLDivElement > ( null ) ;
94
102
const [ otherUser , setOtherUser ] = useState < User | null > ( null ) ;
95
- const [ participantsData , setParticipantsData ] = useState < Record < string , User > > ( { } ) ;
103
+ const [ participantsData , setParticipantsData ] = useState <
104
+ Record < string , User >
105
+ > ( { } ) ;
96
106
const [ isLoading , setIsLoading ] = useState ( false ) ;
97
107
const [ openMemberList , setOpenMemberList ] = useState ( false ) ;
98
108
const [ openEditMenu , setOpenEditMenu ] = useState < boolean > ( false ) ;
@@ -108,7 +118,7 @@ export function ChatWindow(): JSX.Element {
108
118
const fetchParticipantsData = async ( ) : Promise < void > => {
109
119
try {
110
120
const newParticipantsData : Record < string , User > = { } ;
111
-
121
+
112
122
// Fetch data for all participants
113
123
for ( const participantId of currentChat . participants ) {
114
124
if ( participantId === user ?. id ) {
@@ -118,19 +128,27 @@ export function ChatWindow(): JSX.Element {
118
128
}
119
129
} else {
120
130
// Fetch other participants' data
121
- const userDoc = await getDoc ( doc ( db , 'users' , participantId ) ) ;
131
+ const userDoc = await getDoc (
132
+ doc ( db , 'users' , participantId )
133
+ ) ;
122
134
if ( userDoc . exists ( ) ) {
123
- newParticipantsData [ participantId ] = userDoc . data ( ) as User ;
135
+ newParticipantsData [ participantId ] =
136
+ userDoc . data ( ) as User ;
124
137
}
125
138
}
126
139
}
127
-
140
+
128
141
setParticipantsData ( newParticipantsData ) ;
129
-
142
+
130
143
// Set otherUser for direct chats
131
144
if ( currentChat . type === 'direct' ) {
132
- const otherParticipant = currentChat . participants . find ( p => p !== user ?. id ) ;
133
- if ( otherParticipant && newParticipantsData [ otherParticipant ] ) {
145
+ const otherParticipant = currentChat . participants . find (
146
+ ( p ) => p !== user ?. id
147
+ ) ;
148
+ if (
149
+ otherParticipant &&
150
+ newParticipantsData [ otherParticipant ]
151
+ ) {
134
152
setOtherUser ( newParticipantsData [ otherParticipant ] ) ;
135
153
}
136
154
}
@@ -255,25 +273,44 @@ export function ChatWindow(): JSX.Element {
255
273
{ [ ...messages ]
256
274
. reverse ( )
257
275
. map ( ( message , index , reversedMessages ) => {
258
- const isOwnMessage = message . senderId === user ?. id ;
259
- const nextMessage = reversedMessages [ index + 1 ] ;
260
- const prevMessage = reversedMessages [ index - 1 ] ;
261
-
276
+ const isOwnMessage =
277
+ message . senderId === user ?. id ;
278
+ const nextMessage =
279
+ reversedMessages [ index + 1 ] ;
280
+ const prevMessage =
281
+ reversedMessages [ index - 1 ] ;
282
+
262
283
// Show time if next message is from different sender or doesn't exist
263
- const showTime = ! nextMessage || nextMessage . senderId !== message . senderId ;
264
-
284
+ const showTime =
285
+ ! nextMessage ||
286
+ nextMessage . senderId !==
287
+ message . senderId ;
288
+
265
289
// Show user info if:
266
290
// 1. It's a group chat AND
267
291
// 2. Previous message is from different sender OR doesn't exist OR
268
292
// 3. Previous message is from same sender but more than 5 minutes ago
269
- const showUserInfo = currentChat ?. type === 'group' && ! isOwnMessage && (
270
- ! prevMessage ||
271
- prevMessage . senderId !== message . senderId ||
272
- ( prevMessage . createdAt ?. toDate && message . createdAt ?. toDate &&
273
- Math . abs ( prevMessage . createdAt . toDate ( ) . getTime ( ) - message . createdAt . toDate ( ) . getTime ( ) ) > 5 * 60 * 1000 )
274
- ) ;
275
-
276
- const userData = participantsData [ message . senderId ] ;
293
+ const showUserInfo =
294
+ currentChat ?. type === 'group' &&
295
+ ! isOwnMessage &&
296
+ ( ! prevMessage ||
297
+ prevMessage . senderId !==
298
+ message . senderId ||
299
+ ( prevMessage . createdAt
300
+ ?. toDate &&
301
+ message . createdAt ?. toDate &&
302
+ Math . abs (
303
+ prevMessage . createdAt
304
+ . toDate ( )
305
+ . getTime ( ) -
306
+ message . createdAt
307
+ . toDate ( )
308
+ . getTime ( )
309
+ ) >
310
+ 5 * 60 * 1000 ) ) ;
311
+
312
+ const userData =
313
+ participantsData [ message . senderId ] ;
277
314
278
315
return (
279
316
< MessageItem
0 commit comments