8484 < script >
8585
8686 const roomId = '{{chatgroup.id}}'
87+ var tempDaysWeekdays = [ ] ;
8788
8889 const chatSocket = new WebSocket (
8990 `ws://${ window . location . host } /ws/chat/${ roomId } /`
116117
117118 document . querySelector ( '#chat-message-input' ) . onpaste = function ( e ) {
118119 let item = e . clipboardData . items [ 0 ] ;
119- console . log ( item ) ;
120120 if ( item . type . includes ( 'image' ) ) {
121121 let blob = item . getAsFile ( ) ;
122122
139139 msgbox . scrollTop = msgbox . scrollHeight
140140 }
141141
142- function getTime ( ) {
143- let today = new Date ( ) ;
142+ function getTime ( msg_time ) {
143+ if ( msg_time ) {
144+ // define as Date so we can convert to acceptable date time format (with out letter T, ex. 2020-10-10T06:50:14.751 )
145+ temp = new Date ( msg_time ) ;
146+
147+ // suffix UTC so it will render as local time when it use toLocalString
148+ var today = new Date ( `${ temp . toLocaleString ( ) } UTC` ) ;
149+ } else {
150+ var today = new Date ( ) ;
151+ }
152+
153+ // format & render to local time
144154 let time = today . toLocaleString ( [ ] , { hour : '2-digit' , minute : '2-digit' } ) ;
145155 return time
146156
147157 }
148158
149- function broadcastMessage ( msg , user , msg_type , img_caption ) {
159+ function broadcastMessage ( msg , user , msg_type , img_caption , msg_time ) {
150160 // create a new div element
151161 let newDiv = document . createElement ( "div" ) ;
152162 // and give it some content
153- console . log ( msg_type , 'broadcastMessage' )
154163 if ( msg_type == 'image' ) {
155164 msg = `<img src="${ msg } "> <br/> ${ img_caption } ` ;
156165 }
159168 var msg1 = `<div class="right-msg-container">
160169 <div class="s-message">
161170 <div class="s-msg">${ msg } </div>
162- <div class="s-time">${ getTime ( ) } </div>
171+ <div class="s-time">${ getTime ( msg_time ) } </div>
163172 </div>
164173 <div class="s-tail"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 13" preserveAspectRatio="none" width="8" height="13"><path opacity=".5" d="M5.188 1H0v11.193l6.467-8.625C7.526 2.156 6.958 1 5.188 1z"></path><path fill="#dcf8c6ff" d="M5.188 0H0v11.193l6.467-8.625C7.526 1.156 6.958 0 5.188 0z"></path></svg></div>
165174 </div>`
169178 <div class="r-message" >
170179 <div class="r-user"><a href="#">${ user } </a></div>
171180 <div class="r-msg">${ msg } </div>
172- <div class="r-time">${ getTime ( ) } </div>
181+ <div class="r-time">${ getTime ( msg_time ) } </div>
173182 </div>
174183 </div>`
175184 }
185+
186+ if ( msg_time ) {
187+ showDatesWeekDays ( msg_time )
188+ } else {
189+ showDatesWeekDays ( new Date ( ) )
190+ }
176191
177192 newDiv . innerHTML = msg1 ;
178193
232247 } ) ) ;
233248 }
234249
250+
251+ function showDatesWeekDays ( date_created ) {
252+ // add the newly created element and its content into the DOM
253+
254+ dt = new Date ( date_created )
255+
256+ if ( ! tempDaysWeekdays . includes ( dt . toLocaleDateString ( ) ) ) {
257+ let newDiv = document . createElement ( "div" ) ;
258+ let currentDiv = document . getElementById ( "new-message-chat" ) ;
259+ let parentDiv = currentDiv . parentNode ;
260+ let days = [ 'Sunday' , 'Monday' , 'Tuesday' , 'Wednesday' , 'Thursday' , 'Friday' , 'Saturday' ] ;
261+
262+ if ( dt . toDateString ( ) == new Date ( ) . toDateString ( ) ) {
263+ // display TODAY in message
264+ date_weekday = 'TODAY' ;
265+ } else if ( dt > getDateBefore ( ) ) {
266+ // display week day in message
267+ date_weekday = days [ dt . getDay ( ) ] . toUpperCase ( )
268+ } else {
269+ // display date in message
270+ date_weekday = dt . toLocaleDateString ( ) ;
271+ }
272+
273+ newDiv . style . display = "grid" ;
274+ newDiv . innerHTML = `<div class="date_weekday">${ date_weekday } </div>`
275+ parentDiv . insertBefore ( newDiv , currentDiv ) ;
276+
277+ tempDaysWeekdays . push ( dt . toLocaleDateString ( ) )
278+ }
279+
280+ }
281+
282+ function getDateBefore ( days = 7 ) {
283+ // calculate the last 7 days date
284+ // 7 (days) * 24 (hours) * 60 (minutes) * 60 (seconds) * 1000 (milliseconds ) = 604800000 or 7 days in milliseconds.
285+ daysInMs = days * 24 * 60 * 60 * 1000
286+ return new Date ( Date . now ( ) - daysInMs )
287+ }
288+
289+ function loadMessage ( ) {
290+ fetch ( "{% url 'chat:history' chatgroup.id %}" )
291+ . then ( response => response . json ( ) )
292+ . then ( data => {
293+ for ( let msg of data ) {
294+ broadcastMessage ( msg . message , msg . username , msg . message_type , msg . image_caption , msg . date_created )
295+ }
296+ scrollBottom ( )
297+ } )
298+ }
299+ loadMessage ( )
300+
235301 </ script >
236302{% endblock content %}
0 commit comments