Make session control fully ajax

This commit is contained in:
2025-06-27 00:28:38 +03:00
parent 3da7f369a5
commit bdbf33098f
4 changed files with 75 additions and 19 deletions

View File

@@ -28,15 +28,12 @@
/>
</a>
<div class="header-right">
<div class="signed_in">
<button class="account-button" id="logout-button">LOGOUT</button>
</div>
<div class="not_signed_i">
<button class="account-button" id="login-button">LOGIN</button>
<button class="account-button" id="signup-button">SIGN UP</button>
</div>
<button class="account-button" id="logout-button">LOGOUT</button>
<button class="account-button" id="login-button">LOGIN</button>
<button class="account-button" id="signup-button">SIGN UP</button>
</div>
</div>
<span id="message"><%= @message %></span>
<canvas id="main-canvas"></canvas>
<div class="popup" id="popup">
<span class="close" id="close">&times;</span>
@@ -69,6 +66,9 @@
<span class="info" id="signup-info"></span>
</form>
</div>
<div class="popup-tab" id="settings">
<!-- TODO: settings -->
</div>
<div class="popup-tab" id="forgot-pass">
<form id="forgot-form" class="form">
<input

10
main.rb
View File

@@ -37,7 +37,8 @@ set :public_folder, "public"
get "/" do
session = Sessions.new request, response
Logman.log session.message if session.message != ""
@message = session.message || ""
session.message = ""
@signed_in = session.signed_in?.nil? ? false : true
ERB.new(File.read("index.erb")).result(binding)
end
@@ -104,20 +105,21 @@ post "/logout" do
uid = session["user"]
if $active_users[uid].nil?
status 400
return { "message" => "Not signed in!" }.to_json
return { "message" => "Not logged in!" }.to_json
end
unless session.logout
status 500
return { "message" => "Internal server error when signing you out!" }.to_json
return { "message" => "Internal server error when logging you out!" }.to_json
end
status 200
return { "message" => "Signed out successfully!" }.to_json
return { "message" => "Logged out successfully!", "success" => "true" }.to_json
end
get "/logout" do
session = Sessions.new request, response
uid = session["user"]
session.logout unless $active_users[uid].nil?
session.message = "Logged out successfully!"
redirect "/"
end

View File

@@ -16,6 +16,44 @@ body {
font-family: "WDXL Lubrifont JP N", sans-serif;
}
#message {
color: white;
position: absolute;
background-color: #1b262c;
width: calc(100vw - 10px);
padding: 5px;
display: block;
text-align: center;
font-size: 21px;
font-family: "WDXL Lubrifont JP N", sans-serif;
opacity: 1;
transition: opacity 0.5s ease-in-out;
}
#message.hide {
opacity: 0;
}
#message::after {
content: "X";
color: white;
position: absolute;
right: 10px;
cursor: pointer;
}
#message:hover::after {
color: #90bdd9;
}
#message:empty {
display: none;
}
#message:empty:after {
display: none;
}
button {
font-family: "WDXL Lubrifont JP N", sans-serif;
font-size: 18px;
@@ -132,7 +170,7 @@ input {
}
.form button {
margin-top: 20px;
margin-top: 10px;
padding: 10px;
background-color: #3498db;
color: white;
@@ -152,6 +190,9 @@ input {
.header-right {
margin-right: 20px;
display: flex;
white-space: nowrap;
gap: 10px;
}
.account-button {
@@ -160,7 +201,6 @@ input {
cursor: pointer;
color: #90bdd9;
font-size: 23px;
margin-right: 10px;
font-family: "WDXL Lubrifont JP N", sans-serif;
}

View File

@@ -21,6 +21,9 @@ window.onload = async () => {
const forgotButton = document.getElementById("forgot-link");
const closeButton = document.getElementById("close");
const message = document.getElementById("message");
message.onclick = () => message.classList.add("hide");
const signedInMeta = document.querySelector('meta[name="signed_in"]');
const isSignedIn = signedInMeta?.content === "true";
if (isSignedIn) {
@@ -49,14 +52,20 @@ window.onload = async () => {
loginButton?.addEventListener("click", () => showPopup(loginSection));
signupButton?.addEventListener("click", () => showPopup(signupSection));
logoutButton?.addEventListener(
"click",
() => (window.location.href = "/logout"),
);
logoutButton?.addEventListener("click", async () => {
const res = await fetch("/logout", { method: "POST" });
const data = await res.json();
message.innerText = data.message;
message.classList.remove("hide");
if (data.success == "true") {
loginButton.style.display = "block";
signupButton.style.display = "block";
logoutButton.style.display = "none";
}
});
forgotButton?.addEventListener("click", () => showPopup(forgotPassSection));
closeButton?.addEventListener("click", hidePopup);
// TODO: if succesful hide form and popup success message
loginForm?.addEventListener("submit", async (e) => {
e.preventDefault();
const { username, pass } = loginForm;
@@ -71,10 +80,12 @@ window.onload = async () => {
loginButton.style.display = "none";
signupButton.style.display = "none";
logoutButton.style.display = "block";
message.innerText = data.message;
message.classList.remove("hide");
hidePopup();
}
});
// TODO: if succesful hide form and popup success message
signupForm?.addEventListener("submit", async (e) => {
e.preventDefault();
const { username, email, pass } = signupForm;
@@ -93,6 +104,9 @@ window.onload = async () => {
loginButton.style.display = "none";
signupButton.style.display = "none";
logoutButton.style.display = "block";
message.innerText = data.message;
message.classList.remove("hide");
hidePopup();
}
});