js/views/register.js — stiprumas ir async
Kodo stulpelyje — js/views/register.js, sudėtingiausia forma kurse. Trys nauji dalykai.
1. Slaptažodžio stiprumas. checkPassword (iš validation.js) grąžina balą 0–4 ir trūkumus:
export function checkPassword(password) {
let score = 0; const errors = [];
if (password.length >= 8) score++; else errors.push('At least 8 characters.');
if (/[a-z]/.test(password) && /[A-Z]/.test(password)) score++; else errors.push('Mix of case.');
if (/\d/.test(password)) score++; else errors.push('A number.');
if (/[^A-Za-z0-9]/.test(password)) score++; else errors.push('A symbol.');
return { score, label: ['Very weak','Weak','Fair','Good','Strong'][score], errors };
}
Per input matuoklio juosta ir sąrašas atsinaujina gyvai — vartotojas mato, kaip stiprumas auga.
2. Patvirtinimo sutapimas — kryžminis, tikrinamas gyvai. matches(values.password, ...) yra taisyklė. Bet yra subtilumas: jei jau įvedei patvirtinimą, o paskui keiti pirmą slaptažodį, patvirtinimas turi persivertinti iškart:
passwordInput.addEventListener('input', () => {
const confirm = form.querySelector('[name="confirmPassword"]');
if (confirm.value) {
setFieldError(form, 'confirmPassword',
confirm.value === passwordInput.value ? '' : 'Passwords do not match.');
}
});
3. Asinchroninis patikrinimas. „Ar vardas užimtas?" per blur:
usernameInput.addEventListener('blur', async () => {
usernameInput.classList.add('checking'); // suktukas
const taken = await isUsernameTaken(value); // imituota serverio užklausa
usernameInput.classList.remove('checking');
if (taken) setFieldError(form, 'username', `"${value}" is already taken.`);
});
Patikrink. Registracijos formoje:
1. Rašai slaptažodį → matuoklis auga, reikalavimai žymimi ✓.
2. Patvirtinimas nesutampa → klaida; ištaisai pirmą slaptažodį → klaida dingsta gyvai.
3. Įvedi „admin" ir išeini iš lauko → po ~pusės sekundės: „already taken".
Spąstai (async lenktynės). Asinchroninės patikros gali lenktyniauti: įvedi „admin" (lėta patikra pakeliui), tada „adm002" (greita patikra grįžta pirma). Jei nesaugosies, senesnis atsakymas gali perrašyti naujesnį ir parodyti klaidą ne tam vardui. Tikri sprendimai: debounce + „laimi paskutinis" (pagal užklausos eilės numerį). 17 pamokoje pamatysim, kaip tipai padeda modeliuoti tokią „laukiama / gauta / klaida" būseną saugiai.