mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-26 12:25:20 +01:00
[PM-5384] Add Countdown Timer to Duo Redirect (#7694)
* add countdown timer if a number is provided in duoHandOffMessage * add documentation * refactor to use object for handOffMessage
This commit is contained in:
parent
b5f6508c0e
commit
2511ae959a
@ -12,7 +12,12 @@
|
|||||||
<body class="layout_frontend">
|
<body class="layout_frontend">
|
||||||
<div class="mt-5 d-flex justify-content-center">
|
<div class="mt-5 d-flex justify-content-center">
|
||||||
<div>
|
<div>
|
||||||
<img src="../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden" />
|
<img
|
||||||
|
src="../images/logo-primary@2x.png"
|
||||||
|
class="mb-4"
|
||||||
|
style="display: block; max-width: 290px; margin: 0 auto"
|
||||||
|
alt="Bitwarden"
|
||||||
|
/>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<p class="text-center">
|
<p class="text-center">
|
||||||
<i
|
<i
|
||||||
|
@ -23,21 +23,80 @@ window.addEventListener("load", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `duoHandOffMessage` is set in the client via a cookie. This allows us to
|
||||||
|
* make use of i18n translations.
|
||||||
|
*
|
||||||
|
* Format the message as an object and set is as a cookie. The following gives an
|
||||||
|
* example (be sure to replace strings with i18n translated text):
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* const duoHandOffMessage = {
|
||||||
|
* title: "You successfully logged in",
|
||||||
|
* message: "This window will automatically close in 5 seconds",
|
||||||
|
* buttonText: "Close",
|
||||||
|
* countdown: 5
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* document.cookie = `duoHandOffMessage=${encodeURIComponent(JSON.stringify(duoHandOffMessage))};SameSite=strict`;
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* The `title`, `message`, and `buttonText` properties will be used to create the relevant
|
||||||
|
* DOM elements. The `countdown` property will be used for the starting value of the countdown.
|
||||||
|
* Make sure the `countdown` number matches the number set in the `message` property.
|
||||||
|
*
|
||||||
|
* If no `countdown` property is given, there will be no countdown timer and the user will simply
|
||||||
|
* have to close the tab manually.
|
||||||
|
*/
|
||||||
function processAndDisplayHandoffMessage() {
|
function processAndDisplayHandoffMessage() {
|
||||||
const handOffMessage = ("; " + document.cookie)
|
const handOffMessageCookie = ("; " + document.cookie)
|
||||||
|
|
||||||
.split("; duoHandOffMessage=")
|
.split("; duoHandOffMessage=")
|
||||||
.pop()
|
.pop()
|
||||||
.split(";")
|
.split(";")
|
||||||
.shift();
|
.shift();
|
||||||
|
const handOffMessage = JSON.parse(decodeURIComponent(handOffMessageCookie));
|
||||||
|
|
||||||
|
// Clear the cookie
|
||||||
document.cookie = "duoHandOffMessage=;SameSite=strict;max-age=0";
|
document.cookie = "duoHandOffMessage=;SameSite=strict;max-age=0";
|
||||||
|
|
||||||
const content = document.getElementById("content");
|
const content = document.getElementById("content");
|
||||||
|
content.className = "text-center";
|
||||||
content.innerHTML = "";
|
content.innerHTML = "";
|
||||||
|
|
||||||
|
const h1 = document.createElement("h1");
|
||||||
const p = document.createElement("p");
|
const p = document.createElement("p");
|
||||||
p.className = "text-center";
|
const button = document.createElement("button");
|
||||||
p.innerText = handOffMessage;
|
|
||||||
|
|
||||||
|
h1.textContent = handOffMessage.title;
|
||||||
|
p.textContent = handOffMessage.message;
|
||||||
|
button.textContent = handOffMessage.buttonText;
|
||||||
|
|
||||||
|
h1.className = "font-weight-semibold";
|
||||||
|
p.className = "mb-4";
|
||||||
|
button.className = "bg-primary text-white border-0 rounded py-2 px-3";
|
||||||
|
|
||||||
|
button.addEventListener("click", () => {
|
||||||
|
window.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
content.appendChild(h1);
|
||||||
content.appendChild(p);
|
content.appendChild(p);
|
||||||
|
content.appendChild(button);
|
||||||
|
|
||||||
|
// Countdown timer (closes tab upon completion)
|
||||||
|
if (handOffMessage.countdown && Number.isInteger(handOffMessage.countdown)) {
|
||||||
|
let num = handOffMessage.countdown;
|
||||||
|
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
if (num > 1) {
|
||||||
|
p.textContent = `This window will automatically close in ${num - 1} seconds`;
|
||||||
|
num--;
|
||||||
|
} else {
|
||||||
|
clearInterval(interval);
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
apps/web/src/images/logo-primary@2x.png
Normal file
BIN
apps/web/src/images/logo-primary@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.7 KiB |
Loading…
Reference in New Issue
Block a user