diff options
author | tdro <tdro@noreply.example.com> | 2024-01-13 20:33:21 -0500 |
---|---|---|
committer | tdro <tdro@noreply.example.com> | 2024-01-13 20:33:21 -0500 |
commit | 8b53662def693a97ee5e0b5697841cf7859b6704 (patch) | |
tree | 91404ed8b418b5fd7eaf72eebc1e89549faaef9c | |
parent | 30d33a9eedca8ae4b2e6082b915579c309f8b52c (diff) | |
download | canory-8b53662def693a97ee5e0b5697841cf7859b6704.tar.gz canory-8b53662def693a97ee5e0b5697841cf7859b6704.tar.bz2 canory-8b53662def693a97ee5e0b5697841cf7859b6704.zip |
static/js/update: Handle no drift
Some browsers can't read headers. Prepare _self
and add reset state
-rw-r--r-- | assets/js/index.js | 10 | ||||
-rw-r--r-- | static/js/update.ts | 17 | ||||
-rw-r--r-- | themes/default/layouts/partials/navigator-middle.html | 1 |
3 files changed, 20 insertions, 8 deletions
diff --git a/assets/js/index.js b/assets/js/index.js index 83d3943..ef35f63 100644 --- a/assets/js/index.js +++ b/assets/js/index.js @@ -93,7 +93,7 @@ }); })(); (function() { - function check(url, method, callback) { + function fetch(url, method, callback) { const http = new XMLHttpRequest(); http.onreadystatechange = function() { if (http.readyState === 4 && http.status === 200) { @@ -108,14 +108,16 @@ } function update() { const url = self.location.href.split("#")[0].split("?")[0]; - check(url, "HEAD", function(request) { + fetch(url, "HEAD", function(request) { const local = document.querySelector('meta[name="last-modified"]').content; const remote = request.getResponseHeader("last-modified") || ''; const modified = Date.parse(document.lastModified) !== Date.parse(remote); const drift = Date.parse(remote || local) - Date.parse(local); + let indicator = document.querySelector("a[data-update]"); + indicator.cloneNode(); + if (drift === 0) return; if (remote && modified) { - const indicator = document.querySelector("a[data-update]"); - check(url, "GET"); + fetch(url, "GET"); indicator.href = url; indicator.removeAttribute("id"); indicator.dataset.update = "refresh"; diff --git a/static/js/update.ts b/static/js/update.ts index cee1c92..94a509a 100644 --- a/static/js/update.ts +++ b/static/js/update.ts @@ -1,5 +1,5 @@ (function () { - function check(url, method, callback) { + function fetch(url, method, callback) { const http = new XMLHttpRequest(); http.onreadystatechange = function () { if (http.readyState === 4 && http.status === 200) { @@ -15,15 +15,24 @@ function update() { const url = self.location.href.split("#")[0].split("?")[0]; - check(url, "HEAD", function (request) { + fetch(url, "HEAD", function (request) { const local = document.querySelector('meta[name="last-modified"]').content; const remote = request.getResponseHeader("last-modified") || ''; const modified = Date.parse(document.lastModified) !== Date.parse(remote); const drift = Date.parse(remote || local) - Date.parse(local); + let indicator = document.querySelector("a[data-update]"); + const anchor = indicator.cloneNode(); + + function reset() { + indicator.href = anchor.href; + indicator.setAttribute("id", anchor.id); + indicator.dataset.update = anchor.dataset.update; + } + + if (drift === 0) return; if (remote && modified) { - const indicator = document.querySelector("a[data-update]"); - check(url, "GET"); + fetch(url, "GET"); indicator.href = url; indicator.removeAttribute("id"); indicator.dataset.update = "refresh"; diff --git a/themes/default/layouts/partials/navigator-middle.html b/themes/default/layouts/partials/navigator-middle.html index f616a2b..efe5153 100644 --- a/themes/default/layouts/partials/navigator-middle.html +++ b/themes/default/layouts/partials/navigator-middle.html @@ -18,6 +18,7 @@ data-update="" id="{{ $id }}" href="{{ $href }}" + target="_self" > {{ safeHTML $icon }} {{ safeHTML $refresh }} |