@@ -5,31 +5,45 @@ const appServerURL = "http://localhost:3000/";
55const currentUser = prompt ( "Enter your name:" ) || "Unknown" ;
66let lastTimestamp = 0 ;
77let displayedMessages = [ ] ;
8+ let replyToMessage = null ;
89
910async function setup ( ) {
1011 await renderMessages ( ) ;
1112
1213 const messageText = document . getElementById ( "messageText" ) ;
1314 const submitMessage = document . getElementById ( "submitMessage" ) ;
1415 const messagesContainer = document . querySelector ( ".chat-messages" ) ;
16+ const cancelReplyButton = document . getElementById ( "cancelReplyButton" ) ;
1517
1618 submitMessage . addEventListener ( "click" , async ( e ) => {
1719 e . preventDefault ( ) ;
1820 const message = messageText . value . trim ( ) ;
1921 if ( message ) {
20- const success = await sendMessage ( message ) ;
22+ const success = await sendMessage ( message , replyToMessage ?. id ) ;
2123 if ( success ) {
2224 messageText . value = "" ;
25+ clearReplyPreview ( ) ;
2326 await renderMessages ( ) ;
2427 } else {
2528 alert ( "Failed to send message. Please try again." ) ;
2629 }
2730 }
2831 } ) ;
2932
33+ cancelReplyButton . addEventListener ( "click" , ( ) => {
34+ clearReplyPreview ( ) ;
35+ } ) ;
36+
3037 messagesContainer . addEventListener ( "click" , async ( e ) => {
3138 const likeButton = e . target . closest ( ".like-button" ) ;
3239 const dislikeButton = e . target . closest ( ".dislike-button" ) ;
40+ const replyButton = e . target . closest ( ".reply-button" ) ;
41+
42+ if ( replyButton ) {
43+ const messageId = replyButton . dataset . id ;
44+ handleReplyClick ( messageId ) ;
45+ return ;
46+ }
3347
3448 if ( likeButton || dislikeButton ) {
3549 const button = likeButton || dislikeButton ;
@@ -74,12 +88,27 @@ function appendMessages(messages) {
7488 senderName . className = "sender-name" ;
7589 senderName . textContent = message . sender ;
7690
91+ if ( message . replyTo ) {
92+ const originalMessage = displayedMessages . find ( ( m ) => String ( m . id ) === String ( message . replyTo ) ) ;
93+ const replyPreview = document . createElement ( "div" ) ;
94+ replyPreview . className = "message-reply" ;
95+ replyPreview . textContent = originalMessage
96+ ? `${ originalMessage . sender } : ${ originalMessage . message } `
97+ : "Replied to a message" ;
98+ div . append ( replyPreview ) ;
99+ }
100+
77101 const text = document . createElement ( "p" ) ;
78102 text . textContent = message . message ;
79103
80104 const reactionRow = document . createElement ( "div" ) ;
81105 reactionRow . className = "reaction-row" ;
82106
107+ const replyButton = document . createElement ( "button" ) ;
108+ replyButton . className = "reply-button" ;
109+ replyButton . dataset . id = message . id ;
110+ replyButton . textContent = "Reply" ;
111+
83112 const likeButton = document . createElement ( "button" ) ;
84113 likeButton . className = "reaction-button like-button" ;
85114 likeButton . dataset . id = message . id ;
@@ -90,7 +119,11 @@ function appendMessages(messages) {
90119 dislikeButton . dataset . id = message . id ;
91120 dislikeButton . textContent = `👎 ${ message . dislikes || 0 } ` ;
92121
122+ if ( role === "received" ) {
123+ reactionRow . append ( replyButton ) ;
124+ }
93125 reactionRow . append ( likeButton , dislikeButton ) ;
126+
94127 div . append ( senderName , text , reactionRow ) ;
95128 messagesContainer . appendChild ( div ) ;
96129 } ) ;
@@ -110,12 +143,12 @@ async function fetchMessages(lastTimestamp = 0) {
110143 }
111144}
112145
113- async function sendMessage ( message ) {
146+ async function sendMessage ( message , replyTo = null ) {
114147 try {
115148 const response = await fetch ( `${ appServerURL } sendMessage` , {
116149 method : "POST" ,
117150 headers : { "Content-Type" : "application/json" } ,
118- body : JSON . stringify ( { message, sender : currentUser } ) ,
151+ body : JSON . stringify ( { message, sender : currentUser , replyTo } ) ,
119152 } ) ;
120153 const data = await response . json ( ) ;
121154 return data . success ;
@@ -124,6 +157,35 @@ async function sendMessage(message) {
124157 }
125158}
126159
160+ function handleReplyClick ( messageId ) {
161+ const message = displayedMessages . find ( ( m ) => String ( m . id ) === String ( messageId ) ) ;
162+ if ( ! message ) {
163+ return ;
164+ }
165+
166+ replyToMessage = message ;
167+ renderReplyPreview ( ) ;
168+ }
169+
170+ function renderReplyPreview ( ) {
171+ const replyPreview = document . getElementById ( "replyPreview" ) ;
172+ const replyPreviewText = document . getElementById ( "replyPreviewText" ) ;
173+
174+ if ( ! replyToMessage ) {
175+ replyPreview . classList . add ( "hidden" ) ;
176+ replyPreviewText . textContent = "" ;
177+ return ;
178+ }
179+
180+ replyPreviewText . textContent = `${ replyToMessage . sender } : ${ replyToMessage . message } ` ;
181+ replyPreview . classList . remove ( "hidden" ) ;
182+ }
183+
184+ function clearReplyPreview ( ) {
185+ replyToMessage = null ;
186+ renderReplyPreview ( ) ;
187+ }
188+
127189async function reactToMessage ( id , reaction ) {
128190 try {
129191 const response = await fetch ( `${ appServerURL } reactMessage` , {
0 commit comments