< Summary

Class:SignupHUD.SignupHUDV2View
Assembly:SignupHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/SignupHUD/SignupHUDV2View.cs
Covered lines:0
Uncovered lines:73
Coverable lines:73
Total lines:168
Line coverage:0% (0 of 73)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:14
Method coverage:0% (0 of 14)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SignupHUDV2View()0%2100%
Awake()0%2100%
RefreshControl()0%2100%
SetVisibility(...)0%6200%
ShowNameScreen()0%2100%
ShowTermsOfServiceScreen()0%2100%
InitNameAndEmailScreen()0%2100%
InitTermsOfServicesScreen()0%2100%
UpdateNameAndEmailNextButton()0%20400%
IsValidEmail(...)0%6200%
IsValidName(...)0%2100%
OnPointerClick(...)0%12300%
SetTermsOfServiceAgreeButtonInteractable(...)0%12300%
PlayTransitionAnimation(...)0%20400%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/SignupHUD/SignupHUDV2View.cs

#LineLine coverage
 1using DG.Tweening;
 2using System;
 3using System.Net.Mail;
 4using System.Text.RegularExpressions;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.EventSystems;
 8using UnityEngine.UI;
 9
 10namespace SignupHUD
 11{
 12    public class SignupHUDV2View : BaseComponentView, ISignupHUDView, IPointerClickHandler
 13    {
 14        private const int MIN_NAME_LENGTH = 1;
 15        private const int MAX_NAME_LENGTH = 15;
 16
 17        public event ISignupHUDView.NameScreenDone OnNameScreenNext;
 18        public event Action OnEditAvatar;
 19        public event Action OnTermsOfServiceAgreed;
 20        public event Action OnTermsOfServiceBack;
 21        public event Action<string> OnLinkClicked;
 22
 23        [SerializeField] internal TMP_InputField nameInputField;
 24        [SerializeField] internal GameObject nameInputFieldFullOrInvalid;
 25        [SerializeField] internal GameObject nameInputInvalidLabel;
 26        [SerializeField] internal TextMeshProUGUI nameCurrentCharacters;
 27        [SerializeField] internal GameObject nameCurrentCharactersReachedLimit;
 28        [SerializeField] internal GameObject emailInputFieldInvalid;
 29        [SerializeField] internal TMP_InputField emailInputField;
 30        [SerializeField] internal GameObject emailInputInvalidLabel;
 31        [SerializeField] internal Color colorForCharLimit;
 32        [SerializeField] internal ToggleComponentView agreeTosAndPrivacyPolicyToggle;
 33        [SerializeField] internal TMP_Text tosAndPrivacyPolicyText;
 34        [SerializeField] internal Button termsOfServiceAgreeButton;
 35        [SerializeField] internal Image termsOfServiceAgreeButtonIcon;
 36
 37        [Header("SignUp Mode Transitions")]
 38        [SerializeField] internal RectTransform signUpRectTransform;
 39        [SerializeField] internal CanvasGroup signUpCanvasGroup;
 040        [SerializeField] internal Ease transitionEase = Ease.InOutExpo;
 041        [SerializeField] internal float transitionDuration = 0.5f;
 042        [SerializeField] internal float transitionDistance = 200f;
 43
 44        private Vector2 originalAnchorPositionOfSignUp;
 45
 46        public override void Awake()
 47        {
 048            originalAnchorPositionOfSignUp = signUpRectTransform.anchoredPosition;
 49
 050            InitNameAndEmailScreen();
 051            InitTermsOfServicesScreen();
 052        }
 53
 054        public override void RefreshControl() { }
 55
 56        public void SetVisibility(bool visible)
 57        {
 058            PlayTransitionAnimation(visible);
 59
 060            if (!visible)
 061                return;
 62
 063            nameInputField.Select();
 064        }
 65
 066        public void ShowNameScreen() { }
 67
 068        public void ShowTermsOfServiceScreen() { }
 69
 70        private void InitNameAndEmailScreen()
 71        {
 072            SetTermsOfServiceAgreeButtonInteractable(false);
 073            nameCurrentCharacters.text = $"{0}/{MAX_NAME_LENGTH}";
 074            nameInputField.characterLimit = MAX_NAME_LENGTH;
 075            nameInputInvalidLabel.SetActive(false);
 076            nameInputFieldFullOrInvalid.SetActive(false);
 077            emailInputFieldInvalid.SetActive(false);
 078            emailInputInvalidLabel.SetActive(false);
 079            nameCurrentCharactersReachedLimit.SetActive(false);
 80
 081            nameInputField.onValueChanged.AddListener((text) =>
 82            {
 083                UpdateNameAndEmailNextButton();
 084                nameCurrentCharacters.text = $"{text.Length} / {MAX_NAME_LENGTH}";
 085                nameCurrentCharacters.color = text.Length < MAX_NAME_LENGTH ? Color.black : colorForCharLimit;
 086                nameCurrentCharactersReachedLimit.SetActive(text.Length >= MAX_NAME_LENGTH);
 087                nameInputInvalidLabel.SetActive(!IsValidName(text));
 088                nameInputFieldFullOrInvalid.SetActive(text.Length >= MAX_NAME_LENGTH || !IsValidName(text));
 089            });
 90
 091            emailInputField.onValueChanged.AddListener((text) =>
 92            {
 093                emailInputFieldInvalid.SetActive(!IsValidEmail(text));
 094                emailInputInvalidLabel.SetActive(!IsValidEmail(text));
 095                UpdateNameAndEmailNextButton();
 096            });
 97
 098            agreeTosAndPrivacyPolicyToggle.OnSelectedChanged += (_, _, _) =>
 099                UpdateNameAndEmailNextButton();
 0100        }
 101
 102        private void InitTermsOfServicesScreen()
 103        {
 0104            SetTermsOfServiceAgreeButtonInteractable(false);
 0105            termsOfServiceAgreeButton.onClick.AddListener(() =>
 106            {
 0107                OnNameScreenNext?.Invoke(nameInputField.text, emailInputField.text);
 0108                OnTermsOfServiceAgreed?.Invoke();
 0109            });
 0110        }
 111
 112        private void UpdateNameAndEmailNextButton()
 113        {
 0114            string nameText = nameInputField.text;
 0115            string emailText = emailInputField.text;
 116
 0117            SetTermsOfServiceAgreeButtonInteractable(
 118                nameText.Length >= MIN_NAME_LENGTH &&
 119                IsValidName(nameText) && IsValidEmail(emailText) &&
 120                agreeTosAndPrivacyPolicyToggle.isOn);
 0121        }
 122
 123        private bool IsValidEmail(string email)
 124        {
 0125            if (email.Length == 0)
 0126                return true;
 127
 128            try
 129            {
 0130                MailAddress mailAddress = new MailAddress(email);
 0131                return mailAddress.Address == email;
 132            }
 0133            catch
 134            {
 0135                return false;
 136            }
 0137        }
 138
 139        private static bool IsValidName(string nameText) =>
 0140            Regex.IsMatch(nameText, "^[a-zA-Z0-9]*$");
 141
 142        public void OnPointerClick(PointerEventData eventData)
 143        {
 0144            int linkIndex = TMP_TextUtilities.FindIntersectingLink(tosAndPrivacyPolicyText, Input.mousePosition, null);
 0145            if (linkIndex == -1)
 0146                return;
 147
 0148            TMP_LinkInfo linkInfo = tosAndPrivacyPolicyText.textInfo.linkInfo[linkIndex];
 0149            OnLinkClicked?.Invoke(linkInfo.GetLinkID());
 0150        }
 151
 152        private void SetTermsOfServiceAgreeButtonInteractable(bool isInteractable)
 153        {
 0154            termsOfServiceAgreeButton.interactable = isInteractable;
 0155            termsOfServiceAgreeButtonIcon.color = new Color(termsOfServiceAgreeButtonIcon.color.r, termsOfServiceAgreeBu
 0156        }
 157
 158        private void PlayTransitionAnimation(bool visible)
 159        {
 0160            Vector2 signUpEndPosition = originalAnchorPositionOfSignUp;
 0161            if (!visible)
 0162                signUpEndPosition.x -= transitionDistance;
 0163            signUpRectTransform.DOAnchorPos(signUpEndPosition, transitionDuration).SetEase(transitionEase);
 0164            signUpCanvasGroup.DOFade(visible ? 1f : 0f, transitionDuration).SetEase(transitionEase);
 0165            signUpCanvasGroup.blocksRaycasts = visible;
 0166        }
 167    }
 168}