Skip to content

Commit 786398a

Browse files
committed
feat: Add immediate like button feedback with optimistic UI update
- Extract current like count from likeSpan text content - Increment likes count immediately when user clicks Like button - Update UI before server response for instant feedback - Maintain consistency with backend data on next poll - Improve user experience with responsive interface
1 parent e8655db commit 786398a

1 file changed

Lines changed: 44 additions & 6 deletions

File tree

chat-app/frontend/script.js

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,53 @@ async function getAllMessages() {
1111
const messageContainer = document.getElementById("all-messages");
1212

1313
data.forEach((message) => {
14-
const newElement = document.createElement("div");
14+
const elementId = "msg-" + message.id;
1515

16-
newElement.textContent = message.sender + ": " + message.text;
17-
lastIdSeen = message.id;
18-
messageContainer.appendChild(newElement);
16+
const existingElement = document.getElementById(elementId);
17+
18+
if (existingElement) {
19+
// find the specific span that hold the likes
20+
const likeSpan = document.getElementById("likes-count-" + message.id);
21+
22+
// update only that span
23+
if (likeSpan) {
24+
likeSpan.textContent = `(${message.likes} Likes) `;
25+
}
26+
} else {
27+
const newElement = document.createElement("div");
28+
newElement.id = "msg-" + message.id;
29+
30+
// layer 1: the text
31+
const textSpan = document.createElement("span");
32+
textSpan.textContent = `${message.sender}: ${message.text} `;
33+
34+
//Layer 2: the counter (this is the one we will update later)
35+
const likeSpan = document.createElement("span");
36+
likeSpan.id = "likes-count-" + message.id;
37+
likeSpan.textContent = `(${message.likes} Likes) `;
38+
39+
// Layer 3: the button
40+
const likeButton = document.createElement("button");
41+
likeButton.textContent = "Like";
42+
43+
likeButton.addEventListener("click", async () => {
44+
await fetch(`http://localhost:3000/messages/${message.id}/like`, {
45+
method: "POST",
46+
});
47+
});
48+
49+
// put it all together
50+
newElement.appendChild(textSpan);
51+
newElement.appendChild(likeSpan);
52+
newElement.appendChild(likeButton);
53+
messageContainer.appendChild(newElement);
54+
55+
lastIdSeen = message.id;
56+
}
1957
});
20-
setTimeout(getAllMessages, 5000);
58+
setTimeout(getAllMessages, 0);
2159
} catch (error) {
22-
setTimeout(getAllMessages, 5000);
60+
setTimeout(getAllMessages, 0);
2361
console.error("Error fetching messages:", error);
2462
}
2563
}

0 commit comments

Comments
 (0)