betteralertjs
Version:
A library to help you create a better alert system
193 lines (171 loc) • 5.25 kB
JavaScript
document.addEventListener("DOMContentLoaded", () => {
const style = document.createElement("style");
style.textContent = `
.alert-container {
position: fixed;
top: 2vh;
left: 50%;
width: fit-content;
height: fit-content;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center !important;
align-items: center !important;
padding: 15px 20px;
border-radius: 20px;
z-index: 9999;
opacity: 0;
transform: translateX(-50%) translateY(-100%);
transition: opacity 0.5s ease, transform 1s ease;
text-align: center;
max-width: 100svw;
min-width: 300px;
}
.alert-container.open {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
.close-alert-button {
position: absolute;
top: 10px;
right: 10px;
background: none;
border: none;
color: white;
font-size: 20px;
cursor: pointer;
}
.alert-buttons {
display: flex;
width: 100%;
justify-content: center;
gap: 10px;
}
.alert-buttons button {
padding: 10px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.alert-buttons button.ok {
background-color: #00bfff;
}
.alert-buttons button.yes {
background-color: #32cd32;
}
.alert-buttons button.no {
background-color: #ff6347;
}
.alert-input {
width: 100%;
padding: 10px;
margin-top: 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
`;
document.head.appendChild(style);
const alertContainer = document.createElement("div");
alertContainer.className = "alert-container";
const alertMessageContainer = document.createElement("div");
const alertTitle = document.createElement("h1");
const alertText = document.createElement("p");
const closeAlertButton = document.createElement("button");
closeAlertButton.innerHTML = "✕";
closeAlertButton.className = "close-alert-button";
const alertButtonsContainer = document.createElement("div");
alertButtonsContainer.className = "alert-buttons";
let alertOpen = false;
const closeAlert = () => {
return new Promise((resolve) => {
alertContainer.classList.remove("open");
setTimeout(() => {
alertTitle.textContent = "";
alertText.textContent = "";
alertButtonsContainer.innerHTML = "";
alertOpen = false;
resolve();
}, 1000);
});
};
closeAlertButton.onclick = closeAlert;
alertContainer.appendChild(alertMessageContainer);
alertMessageContainer.appendChild(alertTitle);
alertMessageContainer.appendChild(alertText);
alertMessageContainer.appendChild(closeAlertButton);
alertMessageContainer.appendChild(alertButtonsContainer);
document.body.appendChild(alertContainer);
window.alertStyles = {
warning: "#FFC107",
error: "#E57373",
success: "#81C784",
info: "#64B5F6",
};
const openAlert = async (
title,
text,
type = 1,
styleType = "info",
callback = null
) => {
if (!title || !text) {
throw new Error("Title and text are required");
}
if (alertOpen) {
console.warn("Alert is already open");
return;
}
alertOpen = true;
// Set the background color based on the style type
alertContainer.style.backgroundColor =
window.alertStyles[styleType] || styleType;
alertTitle.textContent = title;
alertText.textContent = text;
alertContainer.classList.add("open");
alertButtonsContainer.innerHTML = "";
closeAlertButton.style.display = "none";
if (type === 1) {
const okButton = document.createElement("button");
okButton.textContent = "OK";
okButton.className = "ok";
okButton.onclick = async () => {
await closeAlert();
};
alertButtonsContainer.appendChild(okButton);
} else if (type === 2) {
const yesButton = document.createElement("button");
yesButton.textContent = "Yes";
yesButton.className = "yes";
yesButton.onclick = async () => {
if (callback) callback(true);
await closeAlert();
};
const noButton = document.createElement("button");
noButton.textContent = "No";
noButton.className = "no";
noButton.onclick = async () => {
if (callback) callback(false);
await closeAlert();
};
alertButtonsContainer.appendChild(yesButton);
alertButtonsContainer.appendChild(noButton);
} else if (type === 3) {
const inputField = document.createElement("input");
inputField.type = "text";
inputField.className = "alert-input";
const submitButton = document.createElement("button");
submitButton.textContent = "Submit";
submitButton.className = "ok";
submitButton.onclick = async () => {
if (callback) callback(inputField.value);
await closeAlert();
};
alertMessageContainer.appendChild(inputField);
alertButtonsContainer.appendChild(submitButton);
} else {
closeAlertButton.style.display = "block";
}
};
window.openAlert = openAlert;
window.closeAlert = closeAlert;
});