< Summary

Class:EventCardComponentView
Assembly:ExploreV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExploreV2/Scripts/Sections/PlacesAndEventsSection/SubSections/EventsSubSection/EventCard/EventCardComponentView.cs
Covered lines:203
Uncovered lines:29
Coverable lines:232
Total lines:594
Line coverage:87.5% (203 of 232)
Covered branches:0
Total branches:0
Covered methods:35
Total methods:37
Method coverage:94.5% (35 of 37)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Start()0%660100%
PressedSubscribe()0%6200%
PressedUnsubscribe()0%6200%
Configure(...)0%110100%
RefreshControl()0%5.055087.5%
OnFocus()0%330100%
OnLoseFocus()0%330100%
Show(...)0%110100%
Hide(...)0%110100%
Dispose()0%660100%
SetEventPicture(...)0%4.054085.71%
SetEventPicture(...)0%6.65060%
SetEventPicture(...)0%6.65060%
SetEventAsLive(...)0%18.0118096.43%
SetNumberOfUsers(...)0%330100%
SetLiveTagText(...)0%220100%
SetEventDate(...)0%330100%
SetEventName(...)0%330100%
SetEventDescription(...)0%440100%
SetEventStartedIn(...)0%220100%
SetEventStartsInFromTo(...)0%220100%
SetEventOrganizer(...)0%220100%
SetEventPlace(...)0%440100%
SetSubscribersUsers(...)0%5.055087.5%
SetCoords(...)0%550100%
SetLoadingIndicatorVisible(...)0%110100%
RebuildCardLayouts()0%550100%
CloseModal()0%110100%
OnCloseActionTriggered(...)0%110100%
FormatNumber(...)0%2.862040%
ResetScrollPosition()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExploreV2/Scripts/Sections/PlacesAndEventsSection/SubSections/EventsSubSection/EventCard/EventCardComponentView.cs

#LineLine coverage
 1using DCL;
 2using DCL.Helpers;
 3using System;
 4using TMPro;
 5using UnityEngine;
 6using UnityEngine.UI;
 7
 8public interface IEventCardComponentView
 9{
 10    /// <summary>
 11    /// Event that will be triggered when the jumpIn button is clicked.
 12    /// </summary>
 13    Button.ButtonClickedEvent onJumpInClick { get; }
 14    Button.ButtonClickedEvent onSecondaryJumpInClick { get; }
 15
 16    /// <summary>
 17    /// Event that will be triggered when the info button is clicked.
 18    /// </summary>
 19    Button.ButtonClickedEvent onInfoClick { get; }
 20
 21    /// <summary>
 22    /// Event that will be triggered when the background button is clicked.
 23    /// </summary>
 24    Button.ButtonClickedEvent onBackgroundClick { get; }
 25
 26    /// <summary>
 27    /// Event that will be triggered when the subscribe event button is clicked.
 28    /// </summary>
 29    Button.ButtonClickedEvent onSubscribeClick { get; }
 30
 31    /// <summary>
 32    /// Event that will be triggered when the unsubscribe event button is clicked.
 33    /// </summary>
 34    Button.ButtonClickedEvent onUnsubscribeClick { get; }
 35
 36    /// <summary>
 37    /// Set the event picture directly from a sprite.
 38    /// </summary>
 39    /// <param name="sprite">Event picture (sprite).</param>
 40    void SetEventPicture(Sprite sprite);
 41
 42    /// <summary>
 43    /// Set the event picture from a 2D texture.
 44    /// </summary>
 45    /// <param name="texture">Event picture (url).</param>
 46    void SetEventPicture(Texture2D texture);
 47
 48    /// <summary>
 49    /// Set the event picture from an uri.
 50    /// </summary>
 51    /// <param name="uri"></param>
 52    void SetEventPicture(string uri);
 53
 54    /// <summary>
 55    /// Set the event card as live mode.
 56    /// </summary>
 57    /// <param name="isLive">True to set the event as live.</param>
 58    void SetEventAsLive(bool isLive);
 59
 60    /// <summary>
 61    /// Set the the number of users in the event.
 62    /// </summary>
 63    /// <param name="newNumberOfUsers">Number of users.</param>
 64    void SetNumberOfUsers(int newNumberOfUsers);
 65
 66    /// <summary>
 67    /// Set the live tag text.
 68    /// </summary>
 69    /// <param name="newText">New text.</param>
 70    void SetLiveTagText(string newText);
 71
 72    /// <summary>
 73    /// Set the event date.
 74    /// </summary>
 75    /// <param name="newDate">The new date showed in the event card.</param>
 76    void SetEventDate(string newDate);
 77
 78    /// <summary>
 79    /// Set the event name in the card.
 80    /// </summary>
 81    /// <param name="newText">New event name.</param>
 82    void SetEventName(string newText);
 83
 84    /// <summary>
 85    /// Set the event description in the card.
 86    /// </summary>
 87    /// <param name="newText">New event description.</param>
 88    void SetEventDescription(string newText);
 89
 90    /// <summary>
 91    /// Set the event started time in the card.
 92    /// </summary>
 93    /// <param name="newText">New event started time.</param>
 94    void SetEventStartedIn(string newText);
 95
 96    /// <summary>
 97    /// Set the event dates range in the card.
 98    /// </summary>
 99    /// <param name="newText">New event date range.</param>
 100    void SetEventStartsInFromTo(string newText);
 101
 102    /// <summary>
 103    /// Set the event organizer in the card.
 104    /// </summary>
 105    /// <param name="newText">New event organizer.</param>
 106    void SetEventOrganizer(string newText);
 107
 108    /// <summary>
 109    /// Set the event place in the card.
 110    /// </summary>
 111    /// <param name="newText">New event place.</param>
 112    /// <param name="isWorld">True for setting the place as world.</param>
 113    void SetEventPlace(string newText, bool isWorld);
 114
 115    /// <summary>
 116    /// Set the the number of users subscribed to the event.
 117    /// </summary>
 118    /// <param name="newNumberOfUsers">Number of users subscribed.</param>
 119    void SetSubscribersUsers(int newNumberOfUsers);
 120
 121    /// <summary>
 122    /// Set the event coords.
 123    /// </summary>
 124    /// <param name="newCoords">Event coords.</param>
 125    /// <param name="worldAddress">World address (for world's events)</param>
 126    void SetCoords(Vector2Int newCoords, string worldAddress);
 127
 128    /// <summary>
 129    /// Active or deactive the loading indicator.
 130    /// </summary>
 131    /// <param name="isVisible">True for showing the loading indicator and hiding the card info.</param>
 132    void SetLoadingIndicatorVisible(bool isVisible);
 133}
 134
 135public class EventCardComponentView : BaseComponentView, IEventCardComponentView, IComponentModelConfig<EventCardCompone
 136{
 137    internal const string USERS_CONFIRMED_MESSAGE = "{0} interested";
 138    internal const string NOBODY_CONFIRMED_MESSAGE = "Nobody confirmed yet";
 139    private const string NO_DESCRIPTION_TEXT = "No description.";
 140    private const int EVENT_TITLE_LENGTH_LIMIT = 65;
 141
 142    [Header("Assets References")]
 143    [SerializeField] internal UserProfile ownUserProfile;
 144
 145    [Header("Prefab References")]
 146    [SerializeField] internal ImageComponentView eventImage;
 147    [SerializeField] internal GameObject numberOfUsersContainer;
 148    [SerializeField] internal TMP_Text numberOfUsersText;
 149    [SerializeField] internal TagComponentView liveTag;
 150    [SerializeField] internal TMP_Text eventDateText;
 151    [SerializeField] internal TMP_Text eventDateTextOnFocus;
 152    [SerializeField] internal TMP_Text eventNameText;
 153    [SerializeField] internal TMP_Text eventNameTextOnFocus;
 154    [SerializeField] internal TMP_Text eventDescText;
 155    [SerializeField] internal TMP_Text eventStartedInTitleForLive;
 156    [SerializeField] internal TMP_Text eventStartedInTitleForLiveOnFocus;
 157    [SerializeField] internal TMP_Text eventStartedInTitleForNotLive;
 158    [SerializeField] internal TMP_Text eventStartedInText;
 159    [SerializeField] internal TMP_Text eventStartsInFromToText;
 160    [SerializeField] internal TMP_Text eventOrganizerText;
 161    [SerializeField] internal TMP_Text eventPlaceText;
 162    [SerializeField] internal TMP_Text subscribedUsersTitleForLive;
 163    [SerializeField] internal TMP_Text subscribedUsersTitleForNotLive;
 164    [SerializeField] internal GameObject goingUsersGameObject;
 165    [SerializeField] internal TMP_Text subscribedUsersText;
 166    [SerializeField] internal Button modalBackgroundButton;
 167    [SerializeField] internal ButtonComponentView closeCardButton;
 168    [SerializeField] internal InputAction_Trigger closeAction;
 169    [SerializeField] internal ButtonComponentView backgroundButton;
 170    [SerializeField] internal ButtonComponentView infoButton;
 171    [SerializeField] internal ButtonComponentView jumpinButton;
 172    [SerializeField] internal ButtonComponentView secondaryJumpinButton;
 173    [SerializeField] internal ButtonComponentView subscribeEventButton;
 174    [SerializeField] internal ButtonComponentView unsubscribeEventButton;
 175    [SerializeField] internal GameObject imageContainer;
 176    [SerializeField] internal GameObject eventInfoContainer;
 177    [SerializeField] internal GameObject loadingSpinner;
 178    [SerializeField] internal GameObject cardSelectionFrame;
 179    [SerializeField] internal VerticalLayoutGroup contentVerticalLayout;
 180    [SerializeField] internal VerticalLayoutGroup infoVerticalLayout;
 181    [SerializeField] internal HorizontalLayoutGroup timeAndPlayersHorizontalLayout;
 182    [SerializeField] internal EventCardAnimator cardAnimator;
 183    [SerializeField] internal ScrollRect scroll;
 184    [SerializeField] internal GameObject placeIcon;
 185    [SerializeField] internal GameObject worldIcon;
 186
 187    [Header("Configuration")]
 188    [SerializeField] internal Sprite defaultPicture;
 189    [SerializeField] internal bool isEventCardModal;
 190    [SerializeField] internal EventCardComponentModel model;
 191
 24192    public Button.ButtonClickedEvent onJumpInClick => jumpinButton?.onClick;
 24193    public Button.ButtonClickedEvent onSecondaryJumpInClick => secondaryJumpinButton?.onClick;
 24194    public Button.ButtonClickedEvent onInfoClick => infoButton?.onClick;
 24195    public Button.ButtonClickedEvent onBackgroundClick => backgroundButton?.onClick;
 697196    public Button.ButtonClickedEvent onSubscribeClick => subscribeEventButton?.onClick;
 697197    public Button.ButtonClickedEvent onUnsubscribeClick => unsubscribeEventButton?.onClick;
 198
 199    public void Start()
 200    {
 70201        if (cardSelectionFrame != null)
 31202            cardSelectionFrame.SetActive(false);
 203
 70204        if (closeCardButton != null)
 39205            closeCardButton.onClick.AddListener(CloseModal);
 206
 70207        if (closeAction != null)
 39208            closeAction.OnTriggered += OnCloseActionTriggered;
 209
 70210        if (modalBackgroundButton != null)
 39211            modalBackgroundButton.onClick.AddListener(CloseModal);
 212
 70213        if (secondaryJumpinButton != null)
 39214            secondaryJumpinButton.onClick.AddListener(CloseModal);
 215
 70216        onSubscribeClick.AddListener(PressedSubscribe);
 70217        onUnsubscribeClick.AddListener(PressedUnsubscribe);
 70218    }
 219
 220    private void PressedSubscribe()
 221    {
 0222        if (ownUserProfile.isGuest)
 0223            return;
 224
 0225        model.isSubscribed = true;
 0226        model.eventFromAPIInfo.attending = true;
 0227        RefreshControl();
 0228    }
 229
 230    private void PressedUnsubscribe()
 231    {
 0232        if (ownUserProfile.isGuest)
 0233            return;
 234
 0235        model.isSubscribed = false;
 0236        model.eventFromAPIInfo.attending = false;
 0237        RefreshControl();
 0238    }
 239
 240    public void Configure(EventCardComponentModel newModel)
 241    {
 9242        model = newModel;
 9243        RefreshControl();
 9244    }
 245
 246    public override void RefreshControl()
 247    {
 13248        if (model == null)
 0249            return;
 250
 13251        if (model.eventPictureSprite != null)
 9252            SetEventPicture(model.eventPictureSprite);
 4253        else if (model.eventPictureTexture != null)
 0254            SetEventPicture(model.eventPictureTexture);
 4255        else if (!string.IsNullOrEmpty(model.eventPictureUri))
 0256            SetEventPicture(model.eventPictureUri);
 257        else
 4258            SetEventPicture(sprite: null);
 259
 13260        SetEventAsLive(model.isLive);
 13261        SetNumberOfUsers(model.numberOfUsers);
 13262        SetLiveTagText(model.liveTagText);
 13263        SetEventDate(model.eventDateText);
 13264        SetEventName(model.eventName);
 13265        SetEventDescription(model.eventDescription);
 13266        SetEventStartedIn(model.eventStartedIn);
 13267        SetEventStartsInFromTo(model.eventStartsInFromTo);
 13268        SetEventOrganizer(model.eventOrganizer);
 13269        SetEventPlace(model.eventPlace, !string.IsNullOrEmpty(model.worldAddress));
 13270        SetSubscribersUsers(model.subscribedUsers);
 13271        SetCoords(model.coords, model.worldAddress);
 13272        ResetScrollPosition();
 13273        RebuildCardLayouts();
 13274    }
 275
 276    public override void OnFocus()
 277    {
 31278        base.OnFocus();
 279
 31280        if (cardSelectionFrame != null)
 31281            cardSelectionFrame.SetActive(true);
 282
 31283        cardAnimator?.Focus();
 31284    }
 285
 286    public override void OnLoseFocus()
 287    {
 518288        base.OnLoseFocus();
 289
 518290        if (cardSelectionFrame != null)
 408291            cardSelectionFrame.SetActive(false);
 292
 518293        cardAnimator?.Idle();
 469294    }
 295
 296    public override void Show(bool instant = false)
 297    {
 3298        base.Show(instant);
 299
 3300        DataStore.i.exploreV2.isSomeModalOpen.Set(true);
 3301    }
 302
 303    public override void Hide(bool instant = false)
 304    {
 96305        base.Hide(instant);
 306
 96307        DataStore.i.exploreV2.isSomeModalOpen.Set(false);
 96308    }
 309
 310    public override void Dispose()
 311    {
 611312        base.Dispose();
 313
 611314        if (eventImage != null)
 610315            eventImage.Dispose();
 316
 611317        if (closeCardButton != null)
 158318            closeCardButton.onClick.RemoveAllListeners();
 319
 611320        if (closeAction != null)
 159321            closeAction.OnTriggered -= OnCloseActionTriggered;
 322
 611323        if (modalBackgroundButton != null)
 158324            modalBackgroundButton.onClick.RemoveAllListeners();
 325
 611326        if (secondaryJumpinButton != null)
 158327            secondaryJumpinButton.onClick.RemoveAllListeners();
 328
 611329        onSubscribeClick.RemoveAllListeners();
 611330        onUnsubscribeClick.RemoveAllListeners();
 611331    }
 332
 333    public void SetEventPicture(Sprite sprite)
 334    {
 14335        if (sprite == null && defaultPicture != null)
 4336            sprite = defaultPicture;
 337
 14338        model.eventPictureSprite = sprite;
 339
 14340        if (eventImage == null)
 0341            return;
 342
 14343        eventImage.SetImage(sprite);
 14344    }
 345
 346    public void SetEventPicture(Texture2D texture)
 347    {
 1348        if (texture == null && defaultPicture != null)
 349        {
 0350            SetEventPicture(defaultPicture);
 0351            return;
 352        }
 353
 1354        model.eventPictureTexture = texture;
 355
 1356        if (!Application.isPlaying)
 0357            return;
 358
 1359        if (eventImage == null)
 0360            return;
 361
 1362        eventImage.SetImage(texture);
 1363    }
 364
 365    public void SetEventPicture(string uri)
 366    {
 1367        if (string.IsNullOrEmpty(uri) && defaultPicture != null)
 368        {
 0369            SetEventPicture(defaultPicture);
 0370            return;
 371        }
 372
 1373        model.eventPictureUri = uri;
 374
 1375        if (!Application.isPlaying)
 0376            return;
 377
 1378        if (eventImage == null)
 0379            return;
 380
 1381        eventImage.SetImage(uri);
 1382    }
 383
 384    public void SetEventAsLive(bool isLive)
 385    {
 21386        model.isLive = isLive;
 387
 21388        if (liveTag != null)
 19389            liveTag.gameObject.SetActive(isLive);
 390
 21391        if (eventDateText != null && !isEventCardModal)
 15392            eventDateText.gameObject.SetActive(!isLive);
 393
 21394        if (eventDateTextOnFocus != null)
 17395            eventDateTextOnFocus.gameObject.SetActive(!isLive);
 396
 21397        if (jumpinButton != null)
 21398            jumpinButton.gameObject.SetActive(isEventCardModal || isLive);
 399
 21400        if (secondaryJumpinButton != null)
 2401            secondaryJumpinButton.gameObject.SetActive(isEventCardModal || isLive);
 402
 21403        if (subscribeEventButton != null)
 21404            subscribeEventButton.gameObject.SetActive(!isLive && !model.eventFromAPIInfo.attending);
 405
 21406        if (unsubscribeEventButton != null)
 21407            unsubscribeEventButton.gameObject.SetActive(!isLive && model.eventFromAPIInfo.attending);
 408
 21409        if (eventStartedInTitleForLive)
 19410            eventStartedInTitleForLive.gameObject.SetActive(isLive);
 411
 21412        if (eventStartedInTitleForLiveOnFocus)
 17413            eventStartedInTitleForLiveOnFocus.gameObject.SetActive(isLive);
 414
 21415        if (eventStartedInTitleForNotLive)
 2416            eventStartedInTitleForNotLive.gameObject.SetActive(!isLive);
 417
 21418        if (subscribedUsersTitleForLive != null)
 2419            subscribedUsersTitleForLive.gameObject.SetActive(isLive);
 420
 21421        if (subscribedUsersTitleForNotLive != null)
 2422            subscribedUsersTitleForNotLive.gameObject.SetActive(!isLive);
 423
 21424        if(goingUsersGameObject != null)
 0425            goingUsersGameObject.SetActive(!isLive);
 21426    }
 427
 428    public void SetNumberOfUsers(int newNumberOfUsers)
 429    {
 13430        model.numberOfUsers = newNumberOfUsers;
 431
 13432        if (numberOfUsersText == null)
 2433            return;
 434
 11435        numberOfUsersText.text = FormatNumber(newNumberOfUsers);
 11436        numberOfUsersContainer.SetActive(model.isLive && newNumberOfUsers > 0);
 11437    }
 438
 439    public void SetLiveTagText(string newText)
 440    {
 14441        model.liveTagText = newText;
 442
 14443        if (liveTag != null)
 12444            liveTag.SetText(newText);
 14445    }
 446
 447    public void SetEventDate(string newDate)
 448    {
 14449        model.eventDateText = newDate;
 450
 14451        if (eventDateText != null)
 14452            eventDateText.text = newDate;
 453
 14454        if (eventDateTextOnFocus != null)
 10455            eventDateTextOnFocus.text = newDate;
 14456    }
 457
 458    public void SetEventName(string newText)
 459    {
 14460        model.eventName = newText;
 461
 14462        string wrappedText = newText.Substring(0, Math.Min(EVENT_TITLE_LENGTH_LIMIT, newText.Length));
 463
 14464        if (eventNameText != null)
 14465            eventNameText.text = wrappedText;
 466
 14467        if (eventNameTextOnFocus != null)
 10468            eventNameTextOnFocus.text = wrappedText;
 14469    }
 470
 471    public void SetEventDescription(string newText)
 472    {
 14473        model.eventDescription = newText;
 474
 14475        if (eventDescText == null)
 9476            return;
 477
 5478        eventDescText.text = string.IsNullOrEmpty(newText) ? NO_DESCRIPTION_TEXT : newText;
 5479    }
 480
 481    public void SetEventStartedIn(string newText)
 482    {
 14483        model.eventStartedIn = newText;
 484
 14485        if (eventStartedInText == null)
 2486            return;
 487
 12488        eventStartedInText.text = newText;
 12489    }
 490
 491    public void SetEventStartsInFromTo(string newText)
 492    {
 14493        model.eventStartsInFromTo = newText;
 494
 14495        if (eventStartsInFromToText == null)
 11496            return;
 497
 3498        eventStartsInFromToText.text = newText;
 3499    }
 500
 501    public void SetEventOrganizer(string newText)
 502    {
 14503        model.eventOrganizer = newText;
 504
 14505        if (eventOrganizerText == null)
 11506            return;
 507
 3508        eventOrganizerText.text = newText;
 3509    }
 510
 511    public void SetEventPlace(string newText, bool isWorld)
 512    {
 15513        model.eventPlace = newText;
 514
 15515        if (eventPlaceText != null)
 15516            eventPlaceText.text = newText;
 517
 15518        if (placeIcon != null)
 15519            placeIcon.SetActive(!isWorld);
 520
 15521        if (worldIcon != null)
 15522            worldIcon.SetActive(isWorld);
 15523    }
 524
 525    public void SetSubscribersUsers(int newNumberOfUsers)
 526    {
 17527        model.subscribedUsers = newNumberOfUsers;
 17528        if (subscribedUsersText == null)
 0529            return;
 530
 17531        if (!isEventCardModal)
 532        {
 13533            subscribedUsersText.text = $"{newNumberOfUsers.ToString()} interested";
 13534            subscribedUsersText.gameObject.SetActive(!model.isLive);
 535        }
 536        else
 4537            subscribedUsersText.text = newNumberOfUsers > 0 ? string.Format(USERS_CONFIRMED_MESSAGE, newNumberOfUsers) :
 4538    }
 539
 540    public void SetCoords(Vector2Int newCoords, string worldAddress)
 541    {
 15542        model.coords = newCoords;
 15543        model.worldAddress = worldAddress;
 544
 15545        if (secondaryJumpinButton == null || !isEventCardModal)
 11546            return;
 547
 4548        secondaryJumpinButton.SetText(string.IsNullOrEmpty(worldAddress) ? $"{newCoords.x},{newCoords.y}" : worldAddress
 4549    }
 550
 551    public void SetLoadingIndicatorVisible(bool isVisible)
 552    {
 2553        imageContainer.SetActive(!isVisible);
 2554        eventInfoContainer.SetActive(!isVisible);
 2555        loadingSpinner.SetActive(isVisible);
 2556    }
 557
 558    internal void RebuildCardLayouts()
 559    {
 13560        if (contentVerticalLayout != null)
 2561            Utils.ForceRebuildLayoutImmediate(contentVerticalLayout.transform as RectTransform);
 562
 13563        if (infoVerticalLayout != null)
 2564            Utils.ForceRebuildLayoutImmediate(infoVerticalLayout.transform as RectTransform);
 565
 13566        if (timeAndPlayersHorizontalLayout != null)
 2567            Utils.ForceRebuildLayoutImmediate(timeAndPlayersHorizontalLayout.transform as RectTransform);
 568
 13569        if (numberOfUsersContainer != null)
 11570            Utils.ForceRebuildLayoutImmediate(numberOfUsersContainer.transform as RectTransform);
 13571    }
 572
 4573    internal void CloseModal() { Hide(); }
 574
 2575    internal void OnCloseActionTriggered(DCLAction_Trigger action) { CloseModal(); }
 576
 577    private static string FormatNumber(int num)
 578    {
 11579        if (num < 1000)
 11580            return num.ToString();
 581
 0582        float divided = num / 1000.0f;
 0583        divided = (int)(divided * 100) / 100f;
 0584        return $"{divided:F2}k";
 585    }
 586
 587    private void ResetScrollPosition()
 588    {
 13589        if (scroll == null)
 11590            return;
 591
 2592        scroll.verticalNormalizedPosition = 1;
 2593    }
 594}