Repository navigation
Expand file tree
/
Copy pathapp.js
More file actions
105 lines (92 loc) · 3.86 KB
/
Copy pathapp.js
File metadata and controls
105 lines (92 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
'use strict';
const SESSION_TTL = 8 * 60 * 60 * 1000;
const REMEMBERED_SESSION_TTL = 30 * 24 * 60 * 60 * 1000;
const SESSION_KEY = 'nexo-session';
const DEFAULT_RETURN_TARGET = '/upgrader-calculator/';
const loading = document.querySelector('#loading');
const loginView = document.querySelector('#login-view');
const dashboardView = document.querySelector('#dashboard-view');
const loginForm = document.querySelector('#login-form');
const formError = document.querySelector('#form-error');
const submitButton = document.querySelector('#submit-button');
const usernameInput = document.querySelector('#username');
const passwordInput = document.querySelector('#password');
const togglePassword = document.querySelector('#toggle-password');
const rememberSession = document.querySelector('#remember-session');
const logoutButton = document.querySelector('#logout-button');
const displayName = document.querySelector('#display-name');
const avatar = document.querySelector('.avatar');
const dashboardMessage = document.querySelector('#dashboard-message');
const sessionExpiry = document.querySelector('#session-expiry');
function getReturnTarget() {
const target = new URLSearchParams(location.search).get('return');
return target?.startsWith('/') && !target.startsWith('//') ? target : DEFAULT_RETURN_TARGET;
}
function continueAfterLogin(username, expiresAt) {
const target = getReturnTarget();
location.replace(target);
}
function showLogin() {
loading.classList.add('hidden');
dashboardView.classList.add('hidden');
loginView.classList.remove('hidden');
usernameInput.focus();
}
function showDashboard(username, expiresAt) {
loading.classList.add('hidden');
loginView.classList.add('hidden');
dashboardView.classList.remove('hidden');
displayName.textContent = username;
avatar.textContent = username.charAt(0).toUpperCase();
dashboardMessage.textContent = 'Entraste com sucesso. Esta sessão existe apenas neste navegador.';
sessionExpiry.textContent = `Sessão válida até às ${new Date(expiresAt).toLocaleTimeString('pt-PT', { hour: '2-digit', minute: '2-digit' })}.`;
dashboardView.focus();
}
function restoreSession() {
try {
const rawSession = localStorage.getItem(SESSION_KEY) || sessionStorage.getItem(SESSION_KEY);
const session = JSON.parse(rawSession);
if (session?.expiresAt > Date.now()) {
continueAfterLogin(session.username, session.expiresAt);
return;
}
} catch {
// A sessão inválida é eliminada abaixo.
}
localStorage.removeItem(SESSION_KEY);
sessionStorage.removeItem(SESSION_KEY);
showLogin();
}
togglePassword.addEventListener('click', () => {
const revealing = passwordInput.type === 'password';
passwordInput.type = revealing ? 'text' : 'password';
togglePassword.setAttribute('aria-label', revealing ? 'Ocultar palavra-passe' : 'Mostrar palavra-passe');
passwordInput.focus();
});
loginForm.addEventListener('submit', async (event) => {
event.preventDefault();
formError.textContent = '';
if (!loginForm.reportValidity()) return;
submitButton.disabled = true;
submitButton.querySelector('span').textContent = 'A entrar…';
try {
const username = usernameInput.value.trim();
const expiresAt = Date.now() + (rememberSession.checked ? REMEMBERED_SESSION_TTL : SESSION_TTL);
const session = JSON.stringify({ username, expiresAt });
const storage = rememberSession.checked ? localStorage : sessionStorage;
localStorage.removeItem(SESSION_KEY);
sessionStorage.removeItem(SESSION_KEY);
storage.setItem(SESSION_KEY, session);
loginForm.reset();
continueAfterLogin(username, expiresAt);
} finally {
submitButton.disabled = false;
submitButton.querySelector('span').textContent = 'Entrar na minha conta';
}
});
logoutButton.addEventListener('click', () => {
localStorage.removeItem(SESSION_KEY);
sessionStorage.removeItem(SESSION_KEY);
showLogin();
});
restoreSession();