UNPKG

ui-for-firebase-authentication

Version:

UI for Firebase Authentication (Firebase UI alternative supporting v9+)

90 lines (89 loc) 4.07 kB
//@ts-nocheck import { wrapInputElement } from "./floatingInputWrapper"; class AutoCompleteValues { } AutoCompleteValues.CURRENT_PASSWORD = "current-password"; AutoCompleteValues.NEW_PASSWORD = "new-password"; class PasswordEntryBox { constructor({ hidden, placeholder, minLength, autoComplete } = {}) { //A box for handling password entry for login, password changes, and account creation. //This box will not contain any validation whatsoever and is a building block for the forms. this.container = document.createElement("div"); this.input = document.createElement("input"); this.input.minLength = minLength; this.input.placeholder = placeholder; this.input.autocomplete = autoComplete; this.input.setAttribute("required", "required"); this.container.classList.add("passwordEntryContainer"); //Checkbox to hide / show the password. let randomId = "passwordVisibilityToggle" + Math.random().toString(36).substring(2); this._hideShowButton = document.createElement("input"); this._hideShowButton.type = "checkbox"; this._hideShowButton.id = randomId; this._hideShowButton.style.verticalAlign = "middle"; this._hideShowButton.addEventListener("input", (function () { this.setHidden(!this._hideShowButton.checked); }).bind(this)); this._hideShowLabel = document.createElement("label"); this._hideShowLabel.htmlFor = randomId; this._hideShowLabel.innerText = "Show"; this._hideShowLabel.style.verticalAlign = "middle"; this.container.appendChild(wrapInputElement(this.input)); this.container.appendChild(this._hideShowButton); this.container.appendChild(this._hideShowLabel); this.setHidden(hidden); this._hideShowButton.checked = !hidden; } setHidden(newHidden) { this.input.type = newHidden ? "password" : "text"; } reset() { this.setValue(""); } setValue(val) { this.input.value = val; } getValue() { return this.input.value; } } class PasswordConfirmingUnit { //Manages both a password entry and a password confirmation entry. //If the two do not match, a validity error will be raised on the form automatically. //getValue will return the value contained in both password entries, or null if the passwords do not match. constructor({ hidden = true, minLength = 6, autoComplete = AutoCompleteValues.CURRENT_PASSWORD } = {}) { this.container = document.createElement("div"); let isNewPassword = autoComplete === AutoCompleteValues.NEW_PASSWORD; this._passwordEntry = new PasswordEntryBox({ hidden, minLength, placeholder: `Enter ${isNewPassword ? "New " : ""}Password`, autoComplete }); this.container.appendChild(this._passwordEntry.container); this._passwordConfirm = new PasswordEntryBox({ hidden, minLength, placeholder: `Confirm ${isNewPassword ? "New " : ""}Password`, autoComplete }); this.container.appendChild(this._passwordConfirm.container); this._passwordEntry.input.addEventListener("keyup", this._validate.bind(this)); this._passwordConfirm.input.addEventListener("keyup", this._validate.bind(this)); } passwordsMatch() { return this._passwordEntry.getValue() === this._passwordConfirm.getValue(); } _validate() { if (!this.passwordsMatch()) { this._passwordConfirm.input.setCustomValidity("Passwords do not match"); } else { this._passwordConfirm.input.setCustomValidity(""); } } getValue() { if (!this.passwordsMatch()) { return null; } return this._passwordEntry.getValue(); } setValue(val) { this._passwordEntry.setValue(val); this._passwordConfirm.setValue(val); } } //Login: One field, no confirm, reset option //Create: Two fields, confirm //Change: Two fields, confirm export { PasswordEntryBox, PasswordConfirmingUnit };