When marking notifications read the results may be returned out of order or be delayed. This PR sends a sequence number to gitea so that the browser can ensure that only the results of the latest notification change are shown. Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									0f11c5f592
								
							
						
					
					
						commit
						7f6019e492
					
				
					 3 changed files with 15 additions and 5 deletions
				
			
		|  | @ -50,6 +50,7 @@ func Notifications(c *context.Context) { | |||
| 		return | ||||
| 	} | ||||
| 	if c.QueryBool("div-only") { | ||||
| 		c.Data["SequenceNumber"] = c.Query("sequence-number") | ||||
| 		c.HTML(http.StatusOK, tplNotificationDiv) | ||||
| 		return | ||||
| 	} | ||||
|  | @ -175,6 +176,7 @@ func NotificationStatusPost(c *context.Context) { | |||
| 		return | ||||
| 	} | ||||
| 	c.Data["Link"] = setting.AppURL + "notifications" | ||||
| 	c.Data["SequenceNumber"] = c.Req.PostFormValue("sequence-number") | ||||
| 
 | ||||
| 	c.HTML(http.StatusOK, tplNotificationDiv) | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <div class="page-content user notification" id="notification_div" data-params="{{.Page.GetParams}}"> | ||||
| <div class="page-content user notification" id="notification_div" data-params="{{.Page.GetParams}}" data-sequence-number="{{.SequenceNumber}}"> | ||||
| 	<div class="ui container"> | ||||
| 		<h1 class="ui dividing header">{{.i18n.Tr "notification.notifications"}}</h1> | ||||
| 		<div class="ui top attached tabular menu"> | ||||
|  |  | |||
|  | @ -1,5 +1,7 @@ | |||
| const {AppSubUrl, csrf, NotificationSettings} = window.config; | ||||
| 
 | ||||
| let notificationSequenceNumber = 0; | ||||
| 
 | ||||
| export function initNotificationsTable() { | ||||
|   $('#notification_table .button').on('click', async function () { | ||||
|     const data = await updateNotification( | ||||
|  | @ -10,8 +12,10 @@ export function initNotificationsTable() { | |||
|       $(this).data('notification-id'), | ||||
|     ); | ||||
| 
 | ||||
|     if ($(data).data('sequence-number') === notificationSequenceNumber) { | ||||
|       $('#notification_div').replaceWith(data); | ||||
|       initNotificationsTable(); | ||||
|     } | ||||
|     await updateNotificationCount(); | ||||
| 
 | ||||
|     return false; | ||||
|  | @ -139,12 +143,15 @@ async function updateNotificationTable() { | |||
|       url: `${AppSubUrl}/notifications?${notificationDiv.data('params')}`, | ||||
|       data: { | ||||
|         'div-only': true, | ||||
|         'sequence-number': ++notificationSequenceNumber, | ||||
|       } | ||||
|     }); | ||||
|     if ($(data).data('sequence-number') === notificationSequenceNumber) { | ||||
|       notificationDiv.replaceWith(data); | ||||
|       initNotificationsTable(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| async function updateNotificationCount() { | ||||
|   const data = await $.ajax({ | ||||
|  | @ -182,6 +189,7 @@ async function updateNotification(url, status, page, q, notificationID) { | |||
|       page, | ||||
|       q, | ||||
|       noredirect: true, | ||||
|       'sequence-number': ++notificationSequenceNumber, | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue