< 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:59
Uncovered lines:3
Coverable lines:62
Total lines:158
Line coverage:95.1% (59 of 62)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Awake()0%110100%
InitNameAndEmailScreen()0%110100%
InitTermsOfServicesScreen()0%110100%
OnFaceSnapshotReady(...)0%110100%
CreateView()0%110100%
SetVisibility(...)0%110100%
ShowNameScreen()0%110100%
ShowTermsOfServiceScreen()0%110100%
Dispose()0%220100%
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 TMPro;
 5using UnityEngine;
 6using UnityEngine.UI;
 7
 8namespace SignupHUD
 9{
 10    public interface ISignupHUDView : IDisposable
 11    {
 12        delegate void NameScreenDone(string newName, string newEmail);
 13        event NameScreenDone OnNameScreenNext;
 14        event Action OnEditAvatar;
 15        event Action OnTermsOfServiceAgreed;
 16        event Action OnTermsOfServiceBack;
 17
 18        void SetVisibility(bool visible);
 19        void ShowNameScreen();
 20        void ShowTermsOfServiceScreen();
 21    }
 22
 23    public class SignupHUDView : MonoBehaviour, ISignupHUDView
 24    {
 25        private const int MIN_NAME_LENGTH = 1;
 26        private const int MAX_NAME_LENGTH = 15;
 27
 28        public event ISignupHUDView.NameScreenDone OnNameScreenNext;
 29        public event Action OnEditAvatar;
 30        public event Action OnTermsOfServiceAgreed;
 31        public event Action OnTermsOfServiceBack;
 32
 33        [Header("Name and Email Screen")]
 34        [SerializeField] internal RectTransform nameAndEmailPanel;
 35        [SerializeField] internal Button nameAndEmailNextButton;
 36        [SerializeField] internal TMP_InputField nameInputField;
 37        [SerializeField] internal GameObject nameInputFieldFullOrInvalid;
 38        [SerializeField] internal GameObject nameInputInvalidLabel;
 39        [SerializeField] internal TextMeshProUGUI nameCurrentCharacters;
 40        [SerializeField] internal GameObject emailInputFieldInvalid;
 41        [SerializeField] internal TMP_InputField emailInputField;
 42        [SerializeField] internal GameObject emailInputInvalidLabel;
 43        [SerializeField] internal Color colorForCharLimit;
 44
 45        [Header("Terms of Service Screen")]
 46        [SerializeField] internal RectTransform termsOfServicePanel;
 47        [SerializeField] internal Button editAvatarButton;
 48        [SerializeField] internal ScrollRect termsOfServiceScrollView;
 49        [SerializeField] internal Button termsOfServiceBackButton;
 50        [SerializeField] internal Button termsOfServiceAgreeButton;
 51        [SerializeField] internal RawImage avatarPic;
 52
 53        private void Awake()
 54        {
 955            InitNameAndEmailScreen();
 956            InitTermsOfServicesScreen();
 957        }
 58
 59        private void InitNameAndEmailScreen()
 60        {
 961            UserProfile userProfile = UserProfile.GetOwnUserProfile();
 962            OnFaceSnapshotReady(userProfile.faceSnapshot);
 963            userProfile.OnFaceSnapshotReadyEvent += OnFaceSnapshotReady;
 64
 965            nameAndEmailNextButton.interactable = false;
 966            nameCurrentCharacters.text = $"{0}/{MAX_NAME_LENGTH}";
 967            nameInputField.characterLimit = MAX_NAME_LENGTH;
 968            nameInputInvalidLabel.SetActive(false);
 969            nameInputFieldFullOrInvalid.SetActive(false);
 970            emailInputFieldInvalid.SetActive(false);
 971            emailInputInvalidLabel.SetActive(false);
 72
 973            nameInputField.onValueChanged.AddListener((text) =>
 74            {
 375                UpdateNameAndEmailNextButton();
 376                nameCurrentCharacters.text = $"{text.Length} / {MAX_NAME_LENGTH}";
 377                nameCurrentCharacters.color = text.Length < MAX_NAME_LENGTH ? Color.black : colorForCharLimit;
 378                nameInputInvalidLabel.SetActive(!IsValidName(text));
 379                nameInputFieldFullOrInvalid.SetActive(text.Length >= MAX_NAME_LENGTH || !IsValidName(text));
 380            });
 981            emailInputField.onValueChanged.AddListener((text) =>
 82            {
 283                emailInputFieldInvalid.SetActive(!IsValidEmail(text));
 284                emailInputInvalidLabel.SetActive(!IsValidEmail(text));
 285                UpdateNameAndEmailNextButton();
 286            });
 987            nameAndEmailNextButton.onClick.AddListener(() => OnNameScreenNext?.Invoke(nameInputField.text, emailInputFie
 988            editAvatarButton.onClick.AddListener(() => OnEditAvatar?.Invoke());
 989        }
 90
 91        private void InitTermsOfServicesScreen()
 92        {
 993            termsOfServiceScrollView.onValueChanged.AddListener(pos =>
 94            {
 095                if (pos.y <= 0.1f)
 096                    termsOfServiceAgreeButton.interactable = true;
 097            });
 998            termsOfServiceAgreeButton.interactable = false;
 999            termsOfServiceBackButton.onClick.AddListener(() => OnTermsOfServiceBack?.Invoke());
 9100            termsOfServiceAgreeButton.onClick.AddListener(() => OnTermsOfServiceAgreed?.Invoke());
 9101        }
 102
 18103        private void OnFaceSnapshotReady(Texture2D texture) { avatarPic.texture = texture; }
 104
 105        public static SignupHUDView CreateView()
 106        {
 1107            SignupHUDView view = Instantiate(Resources.Load<GameObject>("SignupHUD")).GetComponent<SignupHUDView>();
 1108            view.gameObject.name = "_SignupHUD";
 1109            return view;
 110        }
 111
 6112        public void SetVisibility(bool visible) { gameObject.SetActive(visible); }
 113
 114        public void ShowNameScreen()
 115        {
 2116            nameAndEmailPanel.gameObject.SetActive(true);
 2117            termsOfServicePanel.gameObject.SetActive(false);
 2118        }
 119
 120        public void ShowTermsOfServiceScreen()
 121        {
 1122            nameAndEmailPanel.gameObject.SetActive(false);
 1123            termsOfServicePanel.gameObject.SetActive(true);
 1124        }
 125
 126        public void Dispose()
 127        {
 1128            if (this != null)
 1129                Destroy(gameObject);
 1130        }
 131
 132        internal void UpdateNameAndEmailNextButton()
 133        {
 9134            string name = nameInputField.text;
 9135            string email = emailInputField.text;
 136
 9137            nameAndEmailNextButton.interactable = name.Length >= MIN_NAME_LENGTH && IsValidName(name) && IsValidEmail(em
 9138        }
 139
 140        private bool IsValidEmail(string email)
 141        {
 12142            if (email.Length == 0)
 4143                return true;
 144
 145            try
 146            {
 8147                MailAddress mailAddress = new MailAddress(email);
 4148                return mailAddress.Address == email;
 149            }
 4150            catch
 151            {
 4152                return false;
 153            }
 8154        }
 155
 14156        private bool IsValidName(string name) { return Regex.IsMatch(name, "^[a-zA-Z0-9]*$"); }
 157    }
 158}