2019-09-02 14:24:02 +01:00
|
|
|
(function(global) {
|
2016-03-02 17:36:20 +00:00
|
|
|
"use strict";
|
|
|
|
|
|
2016-06-11 12:02:47 +01:00
|
|
|
var queues = {};
|
2019-09-02 14:24:02 +01:00
|
|
|
var dd = new global.diffDOM();
|
2020-04-16 13:21:24 +01:00
|
|
|
var defaultInterval = 2000;
|
2020-04-08 17:55:53 +01:00
|
|
|
var interval = 0;
|
|
|
|
|
|
|
|
|
|
var calculateBackoff = responseTime => parseInt(Math.max(
|
|
|
|
|
(250 * Math.sqrt(responseTime)) - 1000,
|
|
|
|
|
1000
|
|
|
|
|
));
|
2016-04-27 09:28:42 +01:00
|
|
|
|
2016-08-04 12:06:04 +01:00
|
|
|
var getRenderer = $component => response => dd.apply(
|
|
|
|
|
$component.get(0),
|
|
|
|
|
dd.diff($component.get(0), $(response[$component.data('key')]).get(0))
|
|
|
|
|
);
|
2016-03-02 17:36:20 +00:00
|
|
|
|
2016-06-11 12:02:47 +01:00
|
|
|
var getQueue = resource => (
|
|
|
|
|
queues[resource] = queues[resource] || []
|
|
|
|
|
);
|
2016-03-02 17:36:20 +00:00
|
|
|
|
2016-06-11 12:02:47 +01:00
|
|
|
var flushQueue = function(queue, response) {
|
|
|
|
|
while(queue.length) queue.shift()(response);
|
2016-03-02 17:36:20 +00:00
|
|
|
};
|
|
|
|
|
|
2016-06-12 08:40:56 +01:00
|
|
|
var clearQueue = queue => (queue.length = 0);
|
|
|
|
|
|
2020-04-08 17:55:53 +01:00
|
|
|
var poll = function(renderer, resource, queue, form) {
|
|
|
|
|
|
|
|
|
|
let startTime = Date.now();
|
2016-06-11 12:02:47 +01:00
|
|
|
|
2018-12-11 17:28:02 +00:00
|
|
|
if (document.visibilityState !== "hidden" && queue.push(renderer) === 1) $.ajax(
|
2017-06-13 11:20:41 +01:00
|
|
|
resource,
|
|
|
|
|
{
|
|
|
|
|
'method': form ? 'post' : 'get',
|
|
|
|
|
'data': form ? $('#' + form).serialize() : {}
|
|
|
|
|
}
|
2016-06-12 08:40:56 +01:00
|
|
|
).done(
|
2019-05-20 17:32:40 +01:00
|
|
|
response => {
|
|
|
|
|
flushQueue(queue, response);
|
|
|
|
|
if (response.stop === 1) {
|
|
|
|
|
poll = function(){};
|
|
|
|
|
}
|
2020-04-08 17:55:53 +01:00
|
|
|
interval = calculateBackoff(Date.now() - startTime);
|
2019-05-20 17:32:40 +01:00
|
|
|
}
|
2016-06-12 08:40:56 +01:00
|
|
|
).fail(
|
2016-10-21 14:24:21 +01:00
|
|
|
() => poll = function(){}
|
2016-06-11 12:02:47 +01:00
|
|
|
);
|
|
|
|
|
|
2016-08-04 12:06:04 +01:00
|
|
|
setTimeout(
|
2019-04-17 12:40:49 +01:00
|
|
|
() => poll.apply(window, arguments), interval
|
2016-06-11 12:02:47 +01:00
|
|
|
);
|
|
|
|
|
};
|
2016-03-02 17:36:20 +00:00
|
|
|
|
2019-09-02 14:24:02 +01:00
|
|
|
global.GOVUK.Modules.UpdateContent = function() {
|
2016-03-02 17:36:20 +00:00
|
|
|
|
2020-04-16 13:21:24 +01:00
|
|
|
this.start = component => setTimeout(
|
|
|
|
|
() => poll(
|
|
|
|
|
getRenderer($(component)),
|
|
|
|
|
$(component).data('resource'),
|
|
|
|
|
getQueue($(component).data('resource')),
|
|
|
|
|
$(component).data('form')
|
|
|
|
|
),
|
|
|
|
|
defaultInterval
|
2016-06-11 12:02:47 +01:00
|
|
|
);
|
2016-03-02 17:36:20 +00:00
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
2020-04-08 17:55:53 +01:00
|
|
|
global.GOVUK.Modules.UpdateContent.calculateBackoff = calculateBackoff;
|
|
|
|
|
|
2019-09-02 14:24:02 +01:00
|
|
|
})(window);
|