/* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { PureComponent, RefCallback, RefObject } from "react"; import Field, { IInputProps } from "../elements/Field"; import { _t, _td, TranslationKey } from "../../../languageHandler"; import withValidation, { IFieldState, IValidationResult } from "../elements/Validation"; import * as Email from "../../../email"; import { Alignment } from "../elements/Tooltip"; interface IProps extends Omit { id?: string; fieldRef?: RefCallback | RefObject; value: string; autoFocus?: boolean; label: TranslationKey; labelRequired: TranslationKey; labelInvalid: TranslationKey; tooltipAlignment?: Alignment; // When present, completely overrides the default validation rules. validationRules?: (fieldState: IFieldState) => Promise; onChange(ev: React.FormEvent): void; onValidate?(result: IValidationResult): void; } class EmailField extends PureComponent { public static defaultProps = { label: _td("auth|email_field_label"), labelRequired: _td("auth|email_field_label_required"), labelInvalid: _td("auth|email_field_label_invalid"), }; public readonly validate = withValidation({ rules: [ { key: "required", test: ({ value, allowEmpty }) => allowEmpty || !!value, invalid: () => _t(this.props.labelRequired), }, { key: "email", test: ({ value }) => !value || Email.looksValid(value), invalid: () => _t(this.props.labelInvalid), }, ], }); public onValidate = async (fieldState: IFieldState): Promise => { let validate = this.validate; if (this.props.validationRules) { validate = this.props.validationRules; } const result = await validate(fieldState); if (this.props.onValidate) { this.props.onValidate(result); } return result; }; public render(): React.ReactNode { return ( ); } } export default EmailField;