100 lines
3.3 KiB
JavaScript
100 lines
3.3 KiB
JavaScript
/*
|
|
* Copyright (C) 2011 - present Instructure, Inc.
|
|
*
|
|
* This file is part of Canvas.
|
|
*
|
|
* Canvas is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License as published by the Free
|
|
* Software Foundation, version 3 of the License.
|
|
*
|
|
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import INST from './INST'
|
|
import $ from 'jquery'
|
|
import authenticity_token from 'compiled/behaviors/authenticity_token'
|
|
import './jquery.ajaxJSON'
|
|
|
|
let update_url = window.ENV.page_view_update_url
|
|
if (update_url) {
|
|
$(() => {
|
|
let interactionSeconds = 0
|
|
|
|
INST.interaction_contexts = {}
|
|
|
|
if (update_url) {
|
|
let secondsSinceLastEvent = 0
|
|
const intervalInSeconds = 60 * 5
|
|
|
|
$(document).bind('page_view_update_url_received', function(event, new_update_url) {
|
|
update_url = new_update_url
|
|
})
|
|
|
|
let updateTrigger
|
|
$(document).bind('page_view_update', function(event, force) {
|
|
const data = {}
|
|
|
|
if (force || (interactionSeconds > 10 && secondsSinceLastEvent < intervalInSeconds)) {
|
|
data.interaction_seconds = interactionSeconds
|
|
$.ajaxJSON(update_url, 'PUT', data, null, function(result, xhr) {
|
|
if (xhr.status === 422) {
|
|
clearInterval(updateTrigger)
|
|
}
|
|
})
|
|
interactionSeconds = 0
|
|
}
|
|
})
|
|
|
|
updateTrigger = setInterval(function() {
|
|
$(document).triggerHandler('page_view_update')
|
|
}, 1000 * intervalInSeconds)
|
|
|
|
window.addEventListener(
|
|
'unload',
|
|
() => {
|
|
if (interactionSeconds > 30) {
|
|
// Use sendBeacon so the request doesn't get cancelled as we navigate away like a normal XHR would,
|
|
// but because sendBeacon only sends POST requests, we have to use FormData to fake the "_method" to PUT
|
|
// like Rail's `form_for` does
|
|
const formData = new FormData()
|
|
formData.append('interaction_seconds', interactionSeconds)
|
|
formData.append('_method', 'put')
|
|
formData.append('authenticity_token', authenticity_token())
|
|
formData.append('utf8', '✓')
|
|
navigator.sendBeacon(update_url, formData)
|
|
}
|
|
},
|
|
false
|
|
)
|
|
|
|
let eventInTime = false
|
|
$(document).bind('mousemove keypress mousedown focus', function() {
|
|
eventInTime = true
|
|
})
|
|
setInterval(function() {
|
|
if (eventInTime) {
|
|
interactionSeconds++
|
|
if (INST && INST.interaction_context && INST.interaction_contexts) {
|
|
INST.interaction_contexts[INST.interaction_context] =
|
|
(INST.interaction_contexts[INST.interaction_context] || 0) + 1
|
|
}
|
|
eventInTime = false
|
|
if (secondsSinceLastEvent >= intervalInSeconds) {
|
|
secondsSinceLastEvent = 0
|
|
$(document).triggerHandler('page_view_update')
|
|
}
|
|
secondsSinceLastEvent = 0
|
|
} else {
|
|
secondsSinceLastEvent++
|
|
}
|
|
}, 1000)
|
|
}
|
|
})
|
|
}
|