|
42 | 42 | isOwn: false, |
43 | 43 | userImgSrc: 'https://i.pravatar.cc/150?img=2', |
44 | 44 | time: '2 minutes ago', |
45 | | - message: 'Hey everyone, can we finalize the color palette today?' |
| 45 | + message: 'Hey everyone, can we finalize the color palette today?', |
| 46 | + senderId: 'user-2', |
| 47 | + senderName: 'Bob', |
| 48 | + senderHandle: '@bob' |
46 | 49 | }, |
47 | 50 | { |
48 | 51 | id: 'msg-2', |
49 | 52 | isOwn: true, |
50 | 53 | userImgSrc: 'https://i.pravatar.cc/150?img=1', |
51 | 54 | time: '1 minute ago', |
52 | | - message: 'Yes, I just pushed a new draft to Figma.' |
| 55 | + message: 'Yes, I just pushed a new draft to Figma.', |
| 56 | + senderId: 'user-1', |
| 57 | + senderName: 'Alice', |
| 58 | + senderHandle: '@alice' |
53 | 59 | } |
54 | 60 | ]); |
55 | 61 |
|
|
65 | 71 |
|
66 | 72 | async function handleSend() { |
67 | 73 | if (!messageValue.trim()) return Promise.resolve(); |
| 74 | + const currentMember = group.members.find((m) => m.id === userId); |
68 | 75 | messages = [ |
69 | 76 | ...messages, |
70 | 77 | { |
71 | 78 | id: `msg-${Date.now()}`, |
72 | 79 | isOwn: true, |
73 | | - userImgSrc: group.members.find((m) => m.id === userId)?.avatar || '', |
| 80 | + userImgSrc: currentMember?.avatar || '', |
74 | 81 | time: 'just now', |
75 | | - message: messageValue |
| 82 | + message: messageValue, |
| 83 | + senderId: userId, |
| 84 | + senderName: currentMember?.name || '', |
| 85 | + senderHandle: `@${currentMember?.name.toLowerCase() || ''}` |
76 | 86 | } |
77 | 87 | ]; |
78 | 88 | messageValue = ''; |
|
141 | 151 |
|
142 | 152 | <section class="chat relative px-0"> |
143 | 153 | <div class="mt-4 h-[calc(100vh-300px)] overflow-auto" bind:this={messagesContainer}> |
144 | | - {#each messages as msg (msg.id)} |
| 154 | + {#each messages as msg, index (msg.id)} |
| 155 | + {@const prevMessage = index > 0 ? messages[index - 1] : null} |
| 156 | + {@const nextMessage = index < messages.length - 1 ? messages[index + 1] : null} |
| 157 | + {@const isHeadNeeded = Boolean( |
| 158 | + !prevMessage || |
| 159 | + prevMessage.isOwn !== msg.isOwn || |
| 160 | + (prevMessage.senderId && msg.senderId && prevMessage.senderId !== msg.senderId) |
| 161 | + )} |
| 162 | + {@const isTimestampNeeded = Boolean( |
| 163 | + !nextMessage || |
| 164 | + nextMessage.isOwn !== msg.isOwn || |
| 165 | + (nextMessage.senderId && msg.senderId && nextMessage.senderId !== msg.senderId) |
| 166 | + )} |
145 | 167 | <ChatMessage |
146 | 168 | isOwn={msg.isOwn} |
147 | 169 | userImgSrc={msg.userImgSrc} |
148 | 170 | time={msg.time} |
149 | 171 | message={msg.message} |
| 172 | + {isHeadNeeded} |
| 173 | + {isTimestampNeeded} |
| 174 | + sender={{ |
| 175 | + id: msg.senderId, |
| 176 | + name: msg.senderName, |
| 177 | + handle: msg.senderHandle, |
| 178 | + avatarUrl: msg.userImgSrc |
| 179 | + }} |
150 | 180 | /> |
151 | 181 | {/each} |
152 | 182 | </div> |
|
0 commit comments