Skip to content

Commit 1d9766b

Browse files
committed
ui: show availability hint text only when field is focused
1 parent df392a4 commit 1d9766b

1 file changed

Lines changed: 33 additions & 10 deletions

File tree

public/js/app.js

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@ function renderRegisterPage() {
755755
}
756756

757757
const registerAvailability = { email: null, username: null };
758+
const registerFocus = { email: false, username: false };
758759
let registerAvailabilityTimer = null;
759760

760761
function setFieldStatus(field, state, message) {
@@ -771,13 +772,25 @@ function setFieldStatus(field, state, message) {
771772
} else {
772773
statusEl.innerHTML = '';
773774
}
775+
const showText = registerFocus[field] && (state === 'ok' || state === 'taken');
774776
if (hintEl) {
775-
hintEl.textContent = message || '';
776-
hintEl.className = `field-hint ${state === 'ok' || state === 'taken' ? state : ''}`;
777+
hintEl.textContent = showText ? message : '';
778+
hintEl.className = `field-hint ${showText ? state : ''}`;
777779
}
778780
if (state === 'taken' || state === 'ok') initIcons();
779781
}
780782

783+
function renderStoredStatus(field) {
784+
const availability = registerAvailability[field];
785+
if (availability === true) {
786+
setFieldStatus(field, 'ok', 'Available');
787+
} else if (availability === false) {
788+
setFieldStatus(field, 'taken', field === 'email' ? 'This email is already taken' : 'This username is already taken');
789+
} else {
790+
setFieldStatus(field, '');
791+
}
792+
}
793+
781794
function setupRegisterAvailabilityChecks() {
782795
const emailInput = $('#reg-email');
783796
const usernameInput = $('#reg-username');
@@ -813,14 +826,12 @@ function setupRegisterAvailabilityChecks() {
813826
if (username && validateRegUsername(username)) params.set('username', username);
814827
const data = await api(`/auth/check-availability?${params.toString()}`);
815828
if (email && validateRegEmail(email)) {
816-
const available = data.email?.available;
817-
registerAvailability.email = available;
818-
setFieldStatus('email', available ? 'ok' : 'taken', available ? 'Available' : 'This email is already taken');
829+
registerAvailability.email = !!data.email?.available;
830+
renderStoredStatus('email');
819831
}
820832
if (username && validateRegUsername(username)) {
821-
const available = data.username?.available;
822-
registerAvailability.username = available;
823-
setFieldStatus('username', available ? 'ok' : 'taken', available ? 'Available' : 'This username is already taken');
833+
registerAvailability.username = !!data.username?.available;
834+
renderStoredStatus('username');
824835
}
825836
} catch {
826837
setFieldStatus('email', '');
@@ -833,10 +844,22 @@ function setupRegisterAvailabilityChecks() {
833844
registerAvailabilityTimer = setTimeout(runCheck, 400);
834845
};
835846

847+
const onFocus = (field) => {
848+
registerFocus[field] = true;
849+
renderStoredStatus(field);
850+
};
851+
852+
const onBlur = (field) => {
853+
registerFocus[field] = false;
854+
renderStoredStatus(field);
855+
};
856+
836857
emailInput.addEventListener('input', onInput);
837858
usernameInput.addEventListener('input', onInput);
838-
emailInput.addEventListener('blur', runCheck);
839-
usernameInput.addEventListener('blur', runCheck);
859+
emailInput.addEventListener('focus', () => onFocus('email'));
860+
emailInput.addEventListener('blur', () => onBlur('email'));
861+
usernameInput.addEventListener('focus', () => onFocus('username'));
862+
usernameInput.addEventListener('blur', () => onBlur('username'));
840863
}
841864

842865
function validateRegEmail(email) {

0 commit comments

Comments
 (0)