< Summary

Class:SignupHUD.SignupHUDView
Assembly:SignupHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/SignupHUD/SignupHUDView.cs
Covered lines:52
Uncovered lines:8
Coverable lines:60
Total lines:164
Line coverage:86.6% (52 of 60)
Covered branches:0
Total branches:0
Covered methods:9
Total methods:11
Method coverage:81.8% (9 of 11)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Awake()0%110100%
InitNameAndEmailScreen()0%110100%
InitTermsOfServicesScreen()0%110100%
OnFaceSnapshotReady(...)0%2100%
SetVisibility(...)0%110100%
ShowNameScreen()0%110100%
ShowTermsOfServiceScreen()0%110100%
Dispose()0%6200%
UpdateNameAndEmailNextButton()0%330100%
IsValidEmail(...)0%220100%
IsValidName(...)0%110100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Net.Mail;
 3using System.Text.RegularExpressions;
 4using DCL.Helpers;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.UI;
 8
 9namespace SignupHUD
 10{
 11    public interface ISignupHUDView : IDisposable
 12    {
 13        delegate void NameScreenDone(string newName, string newEmail);
 14
 15        event NameScreenDone OnNameScreenNext;
 16        event Action OnEditAvatar;
 17        event Action OnTermsOfServiceAgreed;
 18        event Action OnTermsOfServiceBack;
 19        event Action<string> OnLinkClicked;
 20
 21        void SetVisibility(bool visible);
 22        void ShowNameScreen();
 23        void ShowTermsOfServiceScreen();
 24    }
 25
 26    public class SignupHUDView : MonoBehaviour, ISignupHUDView
 27    {
 28        private const int MIN_NAME_LENGTH = 1;
 29        private const int MAX_NAME_LENGTH = 15;
 30
 31        public event ISignupHUDView.NameScreenDone OnNameScreenNext;
 32        public event Action OnEditAvatar;
 33        public event Action OnTermsOfServiceAgreed;
 34        public event Action OnTermsOfServiceBack;
 35        public event Action<string> OnLinkClicked;
 36
 37        [Header("Name and Email Screen")]
 38        [SerializeField] internal RectTransform nameAndEmailPanel;
 39
 40        [SerializeField] internal Button nameAndEmailNextButton;
 41        [SerializeField] internal TMP_InputField nameInputField;
 42        [SerializeField] internal GameObject nameInputFieldFullOrInvalid;
 43        [SerializeField] internal GameObject nameInputInvalidLabel;
 44        [SerializeField] internal TextMeshProUGUI nameCurrentCharacters;
 45        [SerializeField] internal GameObject emailInputFieldInvalid;
 46        [SerializeField] internal TMP_InputField emailInputField;
 47        [SerializeField] internal GameObject emailInputInvalidLabel;
 48        [SerializeField] internal Color colorForCharLimit;
 49
 50        [Header("Terms of Service Screen")]
 51        [SerializeField] internal RectTransform termsOfServicePanel;
 52
 53        [SerializeField] internal Button editAvatarButton;
 54        [SerializeField] internal ScrollRect termsOfServiceScrollView;
 55        [SerializeField] internal Button termsOfServiceBackButton;
 56        [SerializeField] internal Button termsOfServiceAgreeButton;
 57        [SerializeField] internal RawImage avatarPic;
 58
 59        private ILazyTextureObserver snapshotTextureObserver;
 60
 61        private void Awake()
 62        {
 963            InitNameAndEmailScreen();
 964            InitTermsOfServicesScreen();
 965        }
 66
 67        private void InitNameAndEmailScreen()
 68        {
 969            UserProfile userProfile = UserProfile.GetOwnUserProfile();
 970            snapshotTextureObserver = userProfile.snapshotObserver;
 971            snapshotTextureObserver.AddListener(OnFaceSnapshotReady);
 72
 973            nameAndEmailNextButton.interactable = false;
 974            nameCurrentCharacters.text = $"{0}/{MAX_NAME_LENGTH}";
 975            nameInputField.characterLimit = MAX_NAME_LENGTH;
 976            nameInputInvalidLabel.SetActive(false);
 977            nameInputFieldFullOrInvalid.SetActive(false);
 978            emailInputFieldInvalid.SetActive(false);
 979            emailInputInvalidLabel.SetActive(false);
 80
 981            nameInputField.onValueChanged.AddListener((text) =>
 82            {
 383                UpdateNameAndEmailNextButton();
 384                nameCurrentCharacters.text = $"{text.Length} / {MAX_NAME_LENGTH}";
 385                nameCurrentCharacters.color = text.Length < MAX_NAME_LENGTH ? Color.black : colorForCharLimit;
 386                nameInputInvalidLabel.SetActive(!IsValidName(text));
 387                nameInputFieldFullOrInvalid.SetActive(text.Length >= MAX_NAME_LENGTH || !IsValidName(text));
 388            });
 89
 990            emailInputField.onValueChanged.AddListener((text) =>
 91            {
 292                emailInputFieldInvalid.SetActive(!IsValidEmail(text));
 293                emailInputInvalidLabel.SetActive(!IsValidEmail(text));
 294                UpdateNameAndEmailNextButton();
 295            });
 96
 997            nameAndEmailNextButton.onClick.AddListener(() => OnNameScreenNext?.Invoke(nameInputField.text, emailInputFie
 998            editAvatarButton.onClick.AddListener(() => OnEditAvatar?.Invoke());
 999        }
 100
 101        private void InitTermsOfServicesScreen()
 102        {
 9103            termsOfServiceScrollView.onValueChanged.AddListener(pos =>
 104            {
 0105                if (pos.y <= 0.1f)
 0106                    termsOfServiceAgreeButton.interactable = true;
 0107            });
 108
 9109            termsOfServiceAgreeButton.interactable = false;
 9110            termsOfServiceBackButton.onClick.AddListener(() => OnTermsOfServiceBack?.Invoke());
 9111            termsOfServiceAgreeButton.onClick.AddListener(() => OnTermsOfServiceAgreed?.Invoke());
 9112        }
 113
 0114        private void OnFaceSnapshotReady(Texture2D texture) { avatarPic.texture = texture; }
 115
 4116        public void SetVisibility(bool visible) { gameObject.SetActive(visible); }
 117
 118        public void ShowNameScreen()
 119        {
 1120            nameAndEmailPanel.gameObject.SetActive(true);
 1121            termsOfServicePanel.gameObject.SetActive(false);
 1122        }
 123
 124        public void ShowTermsOfServiceScreen()
 125        {
 1126            nameAndEmailPanel.gameObject.SetActive(false);
 1127            termsOfServicePanel.gameObject.SetActive(true);
 1128        }
 129
 130        public void Dispose()
 131        {
 0132            snapshotTextureObserver.RemoveListener(OnFaceSnapshotReady);
 133
 0134            if (this != null)
 0135                Destroy(gameObject);
 0136        }
 137
 138        internal void UpdateNameAndEmailNextButton()
 139        {
 9140            string name = nameInputField.text;
 9141            string email = emailInputField.text;
 142
 9143            nameAndEmailNextButton.interactable = name.Length >= MIN_NAME_LENGTH && IsValidName(name) && IsValidEmail(em
 9144        }
 145
 146        private bool IsValidEmail(string email)
 147        {
 12148            if (email.Length == 0)
 4149                return true;
 150
 151            try
 152            {
 8153                MailAddress mailAddress = new MailAddress(email);
 4154                return mailAddress.Address == email;
 155            }
 4156            catch
 157            {
 4158                return false;
 159            }
 8160        }
 161
 14162        private bool IsValidName(string name) { return Regex.IsMatch(name, "^[a-zA-Z0-9]*$"); }
 163    }
 164}