< Summary

Class:EventsSubSectionComponentController
Assembly:ExploreV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExploreV2/Scripts/Sections/PlacesAndEventsSection/SubSections/EventsSubSection/EventsSubSectionMenu/EventsSubSectionComponentController.cs
Covered lines:15
Uncovered lines:144
Coverable lines:159
Total lines:350
Line coverage:9.4% (15 of 159)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EventsSubSectionComponentController(...)0%110100%
FirstLoading()0%2100%
OnExploreV2Open(...)0%6200%
RequestAllEvents()0%6200%
RequestAllEventsFromAPI()0%6200%
OnRequestedEventsUpdated()0%2100%
LoadFeaturedEvents()0%12300%
LoadTrendingEvents()0%12300%
LoadUpcomingEvents()0%6200%
ShowMoreUpcomingEvents()0%2100%
LoadGoingEvents()0%12300%
Dispose()0%110100%
CreateEventCardModelFromAPIEvent(...)0%2100%
FormatEventDate(...)0%2100%
FormatEventStartDate(...)0%20400%
FormatEventStartDateFromTo(...)0%2100%
FormatEventOrganized(...)0%2100%
FormatEventPlace(...)0%6200%
GetJumpInConfigFromAPIEvent(...)0%6200%
ConfigureOnJumpInActions(...)0%2100%
ConfigureOnInfoActions(...)0%2100%
ConfigureOnSubscribeActions(...)0%2100%
ConfigureOnUnsubscribeActions(...)0%2100%
RequestExploreV2Closing()0%6200%

File(s)

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

#LineLine coverage
 1using DCL;
 2using System;
 3using System.Collections.Generic;
 4using System.Globalization;
 5using System.Linq;
 6using UnityEngine;
 7
 8public interface IEventsSubSectionComponentController : IDisposable
 9{
 10    /// <summary>
 11    /// It will be triggered when the sub-section want to request to close the ExploreV2 main menu.
 12    /// </summary>
 13    event Action OnCloseExploreV2;
 14
 15    /// <summary>
 16    /// Request all events from the API.
 17    /// </summary>
 18    void RequestAllEvents();
 19
 20    /// <summary>
 21    /// Load the featured events with the last requested ones.
 22    /// </summary>
 23    void LoadFeaturedEvents();
 24
 25    /// <summary>
 26    /// Load the trending events with the last requested ones.
 27    /// </summary>
 28    void LoadTrendingEvents();
 29
 30    /// <summary>
 31    /// Load the upcoming events with the last requested ones.
 32    /// </summary>
 33    void LoadUpcomingEvents();
 34
 35    /// <summary>
 36    /// Increment the number of upcoming events loaded.
 37    /// </summary>
 38    void ShowMoreUpcomingEvents();
 39
 40    /// <summary>
 41    /// Load the going events with the last requested ones.
 42    /// </summary>
 43    void LoadGoingEvents();
 44}
 45
 46public class EventsSubSectionComponentController : IEventsSubSectionComponentController
 47{
 48    public event Action OnCloseExploreV2;
 49    internal event Action OnEventsFromAPIUpdated;
 50
 51    internal const int INITIAL_NUMBER_OF_UPCOMING_EVENTS = 6;
 52    internal const int SHOW_MORE_UPCOMING_EVENTS_INCREMENT = 6;
 53
 54    internal IEventsSubSectionComponentView view;
 55    internal IEventsAPIController eventsAPIApiController;
 156    internal List<EventFromAPIModel> eventsFromAPI = new List<EventFromAPIModel>();
 157    internal int currentUpcomingEventsShowed = INITIAL_NUMBER_OF_UPCOMING_EVENTS;
 58    internal bool reloadEvents = false;
 59
 160    public EventsSubSectionComponentController(IEventsSubSectionComponentView view, IEventsAPIController eventsAPI)
 61    {
 162        this.view = view;
 163        this.view.OnReady += FirstLoading;
 164        this.view.OnShowMoreUpcomingEventsClicked += ShowMoreUpcomingEvents;
 65
 166        eventsAPIApiController = eventsAPI;
 167        OnEventsFromAPIUpdated += OnRequestedEventsUpdated;
 168    }
 69
 70    internal void FirstLoading()
 71    {
 072        reloadEvents = true;
 073        RequestAllEvents();
 74
 075        view.OnEventsSubSectionEnable += RequestAllEvents;
 076        DataStore.i.exploreV2.isOpen.OnChange += OnExploreV2Open;
 077    }
 78
 79    private void OnExploreV2Open(bool current, bool previous)
 80    {
 081        if (current)
 082            return;
 83
 084        reloadEvents = true;
 085    }
 86
 87    public void RequestAllEvents()
 88    {
 089        if (!reloadEvents)
 090            return;
 91
 092        view.SetFeaturedEventsAsLoading(true);
 093        view.SetTrendingEventsAsLoading(true);
 094        view.SetUpcomingEventsAsLoading(true);
 095        view.SetGoingEventsAsLoading(true);
 96
 097        RequestAllEventsFromAPI();
 98
 099        reloadEvents = false;
 0100    }
 101
 102    internal void RequestAllEventsFromAPI()
 103    {
 0104        eventsAPIApiController.GetAllEvents(
 105            (eventList) =>
 106            {
 0107                eventsFromAPI = eventList;
 0108                OnEventsFromAPIUpdated?.Invoke();
 0109            },
 110            (error) =>
 111            {
 0112                Debug.LogError($"Error receiving events from the API: {error}");
 0113            });
 0114    }
 115
 116    internal void OnRequestedEventsUpdated()
 117    {
 0118        LoadFeaturedEvents();
 0119        LoadTrendingEvents();
 0120        LoadUpcomingEvents();
 0121        LoadGoingEvents();
 0122    }
 123
 124    public void LoadFeaturedEvents()
 125    {
 0126        view.SetFeaturedEvents(new List<EventCardComponentModel>());
 127
 0128        List<EventCardComponentModel> featuredEvents = new List<EventCardComponentModel>();
 0129        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.highlighted).ToList();
 0130        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 131        {
 0132            EventCardComponentModel eventCardModel = CreateEventCardModelFromAPIEvent(receivedEvent);
 0133            featuredEvents.Add(eventCardModel);
 134        }
 135
 0136        view.SetFeaturedEventsAsLoading(false);
 0137        view.SetFeaturedEvents(featuredEvents);
 0138    }
 139
 140    public void LoadTrendingEvents()
 141    {
 0142        view.SetTrendingEvents(new List<EventCardComponentModel>());
 143
 0144        List<EventCardComponentModel> trendingEvents = new List<EventCardComponentModel>();
 0145        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.trending).ToList();
 0146        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 147        {
 0148            EventCardComponentModel eventCardModel = CreateEventCardModelFromAPIEvent(receivedEvent);
 0149            trendingEvents.Add(eventCardModel);
 150        }
 151
 0152        view.SetTrendingEventsAsLoading(false);
 0153        view.SetTrendingEvents(trendingEvents);
 0154    }
 155
 156    public void LoadUpcomingEvents()
 157    {
 0158        view.SetUpcomingEvents(new List<EventCardComponentModel>());
 159
 0160        List<EventCardComponentModel> upcomingEvents = new List<EventCardComponentModel>();
 0161        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Take(currentUpcomingEventsShowed).ToList();
 0162        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 163        {
 0164            EventCardComponentModel eventCardModel = CreateEventCardModelFromAPIEvent(receivedEvent);
 0165            upcomingEvents.Add(eventCardModel);
 166        }
 167
 0168        view.SetUpcomingEventsAsLoading(false);
 0169        view.SetUpcomingEvents(upcomingEvents);
 0170        view.SetShowMoreUpcomingEventsButtonActive(eventsFromAPI.Count > currentUpcomingEventsShowed);
 0171    }
 172
 173    public void ShowMoreUpcomingEvents()
 174    {
 0175        currentUpcomingEventsShowed += SHOW_MORE_UPCOMING_EVENTS_INCREMENT;
 0176        LoadUpcomingEvents();
 0177    }
 178
 179    public void LoadGoingEvents()
 180    {
 0181        view.SetGoingEvents(new List<EventCardComponentModel>());
 182
 0183        List<EventCardComponentModel> goingEvents = new List<EventCardComponentModel>();
 0184        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.attending).ToList();
 0185        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 186        {
 0187            EventCardComponentModel eventCardModel = CreateEventCardModelFromAPIEvent(receivedEvent);
 0188            goingEvents.Add(eventCardModel);
 189        }
 190
 0191        view.SetGoingEventsAsLoading(false);
 0192        view.SetGoingEvents(goingEvents);
 0193    }
 194
 195    public void Dispose()
 196    {
 1197        view.OnReady -= FirstLoading;
 1198        view.OnShowMoreUpcomingEventsClicked -= ShowMoreUpcomingEvents;
 1199        view.OnEventsSubSectionEnable -= RequestAllEvents;
 1200        OnEventsFromAPIUpdated -= OnRequestedEventsUpdated;
 1201        DataStore.i.exploreV2.isOpen.OnChange -= OnExploreV2Open;
 1202    }
 203
 204    internal EventCardComponentModel CreateEventCardModelFromAPIEvent(EventFromAPIModel eventFromAPI)
 205    {
 0206        EventCardComponentModel eventCardModel = new EventCardComponentModel();
 207
 208        // Card data
 0209        eventCardModel.eventId = eventFromAPI.id;
 0210        eventCardModel.eventPictureUri = eventFromAPI.image;
 0211        eventCardModel.isLive = eventFromAPI.live;
 0212        eventCardModel.liveTagText = "LIVE";
 0213        eventCardModel.eventDateText = FormatEventDate(eventFromAPI);
 0214        eventCardModel.eventName = eventFromAPI.name;
 0215        eventCardModel.eventDescription = eventFromAPI.description;
 0216        eventCardModel.eventStartedIn = FormatEventStartDate(eventFromAPI);
 0217        eventCardModel.eventStartsInFromTo = FormatEventStartDateFromTo(eventFromAPI);
 0218        eventCardModel.eventOrganizer = FormatEventOrganized(eventFromAPI);
 0219        eventCardModel.eventPlace = FormatEventPlace(eventFromAPI);
 0220        eventCardModel.subscribedUsers = eventFromAPI.total_attendees;
 0221        eventCardModel.isSubscribed = false;
 0222        eventCardModel.jumpInConfiguration = GetJumpInConfigFromAPIEvent(eventFromAPI);
 223
 224        // Card events
 0225        ConfigureOnJumpInActions(eventCardModel);
 0226        ConfigureOnInfoActions(eventCardModel);
 0227        ConfigureOnSubscribeActions(eventCardModel);
 0228        ConfigureOnUnsubscribeActions(eventCardModel);
 229
 0230        return eventCardModel;
 231    }
 232
 233    internal string FormatEventDate(EventFromAPIModel eventFromAPI)
 234    {
 0235        DateTime eventDateTime = Convert.ToDateTime(eventFromAPI.next_start_at).ToUniversalTime();
 0236        return eventDateTime.ToString("MMMM d", new CultureInfo("en-US"));
 237    }
 238
 239    internal string FormatEventStartDate(EventFromAPIModel eventFromAPI)
 240    {
 0241        DateTime eventDateTime = Convert.ToDateTime(eventFromAPI.next_start_at).ToUniversalTime();
 242        string formattedDate;
 0243        if (eventFromAPI.live)
 244        {
 0245            int daysAgo = (int)Math.Ceiling((DateTime.Now - eventDateTime).TotalDays);
 0246            int hoursAgo = (int)Math.Ceiling((DateTime.Now - eventDateTime).TotalHours);
 247
 0248            if (daysAgo > 0)
 0249                formattedDate = $"{daysAgo} days ago";
 250            else
 0251                formattedDate = $"{hoursAgo} hr ago";
 0252        }
 253        else
 254        {
 0255            int daysToStart = (int)Math.Ceiling((eventDateTime - DateTime.Now).TotalDays);
 0256            int hoursToStart = (int)Math.Ceiling((eventDateTime - DateTime.Now).TotalHours);
 257
 0258            if (daysToStart > 0)
 0259                formattedDate = $"in {daysToStart} days";
 260            else
 0261                formattedDate = $"in {hoursToStart} hours";
 262        }
 263
 0264        return formattedDate;
 265    }
 266
 267    internal string FormatEventStartDateFromTo(EventFromAPIModel eventFromAPI)
 268    {
 0269        CultureInfo cultureInfo = new CultureInfo("en-US");
 0270        DateTime eventStartDateTime = Convert.ToDateTime(eventFromAPI.next_start_at).ToUniversalTime();
 0271        DateTime eventEndDateTime = Convert.ToDateTime(eventFromAPI.finish_at).ToUniversalTime();
 0272        string formattedDate = $"From {eventStartDateTime.ToString("dddd", cultureInfo)}, {eventStartDateTime.Day} {even
 273                               $" to {eventEndDateTime.ToString("dddd", cultureInfo)}, {eventEndDateTime.Day} {eventEndD
 274
 0275        return formattedDate;
 276    }
 277
 0278    internal string FormatEventOrganized(EventFromAPIModel eventFromAPI) { return $"Public, Organized by {eventFromAPI.u
 279
 0280    internal string FormatEventPlace(EventFromAPIModel eventFromAPI) { return string.IsNullOrEmpty(eventFromAPI.scene_na
 281
 282    internal JumpInConfig GetJumpInConfigFromAPIEvent(EventFromAPIModel eventFromAPI)
 283    {
 0284        JumpInConfig result = new JumpInConfig();
 285
 0286        result.coords = new Vector2Int(eventFromAPI.coordinates[0], eventFromAPI.coordinates[1]);
 287
 0288        string[] realmFromAPI = string.IsNullOrEmpty(eventFromAPI.realm) ? new string[] { "", "" } : eventFromAPI.realm.
 0289        result.serverName = realmFromAPI[0];
 0290        result.layerName = realmFromAPI[1];
 291
 0292        return result;
 293    }
 294
 295    internal void ConfigureOnJumpInActions(EventCardComponentModel eventModel)
 296    {
 0297        eventModel.onJumpInClick = new UnityEngine.UI.Button.ButtonClickedEvent();
 0298        eventModel.onJumpInClick.AddListener(RequestExploreV2Closing);
 0299    }
 300
 301    internal void ConfigureOnInfoActions(EventCardComponentModel eventModel)
 302    {
 0303        eventModel.onInfoClick = new UnityEngine.UI.Button.ButtonClickedEvent();
 0304        eventModel.onInfoClick.AddListener(() => view.ShowEventModal(eventModel));
 0305    }
 306
 307    internal void ConfigureOnSubscribeActions(EventCardComponentModel eventModel)
 308    {
 0309        eventModel.onSubscribeClick = new UnityEngine.UI.Button.ButtonClickedEvent();
 0310        eventModel.onSubscribeClick.AddListener(() =>
 311        {
 0312            eventsAPIApiController.RegisterAttendEvent(
 313                eventModel.eventId,
 314                true,
 315                () =>
 316                {
 317                    // Waiting for the new version of the Events API where we will be able to send a signed POST to regi
 0318                },
 319                (error) =>
 320                {
 0321                    Debug.LogError($"Error posting 'attend' message to the API: {error}");
 0322                });
 0323        });
 0324    }
 325
 326    internal void ConfigureOnUnsubscribeActions(EventCardComponentModel eventModel)
 327    {
 0328        eventModel.onUnsubscribeClick = new UnityEngine.UI.Button.ButtonClickedEvent();
 0329        eventModel.onUnsubscribeClick.AddListener(() =>
 330        {
 0331            eventsAPIApiController.RegisterAttendEvent(
 332                eventModel.eventId,
 333                false,
 334                () =>
 335                {
 336                    // Waiting for the new version of the Events API where we will be able to send a signed POST to unre
 0337                },
 338                (error) =>
 339                {
 0340                    Debug.LogError($"Error posting 'attend' message to the API: {error}");
 0341                });
 0342        });
 0343    }
 344
 345    internal void RequestExploreV2Closing()
 346    {
 0347        view.HideEventModal();
 0348        OnCloseExploreV2?.Invoke();
 0349    }
 350}