Tema
/
Interneto svetainių kliento dalies kūrimas JS

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.