< 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:96
Uncovered lines:29
Coverable lines:125
Total lines:303
Line coverage:76.8% (96 of 125)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EventsSubSectionComponentController(...)0%110100%
FirstLoading()0%110100%
OnExploreV2Open(...)0%6200%
RequestAllEvents()0%3.093078.57%
IsInShowAnimationTransitonChanged(...)0%2100%
RequestAllEventsFromAPI()0%220100%
OnRequestedEventsUpdated()0%110100%
LoadFeaturedEvents()0%440100%
LoadTrendingEvents()0%3.243070%
LoadUpcomingEvents()0%2.082072.73%
ShowMoreUpcomingEvents()0%4.344072.22%
LoadGoingEvents()0%3.243070%
Dispose()0%110100%
ShowEventDetailedInfo(...)0%110100%
JumpInToEvent(...)0%220100%
SubscribeToEvent(...)0%2100%
UnsubscribeToEvent(...)0%2100%

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 DCL.Interface;
 3using ExploreV2Analytics;
 4using System;
 5using System.Collections.Generic;
 6using System.Linq;
 7using UnityEngine;
 8
 9public interface IEventsSubSectionComponentController : IDisposable
 10{
 11    /// <summary>
 12    /// It will be triggered when the sub-section want to request to close the ExploreV2 main menu.
 13    /// </summary>
 14    event Action OnCloseExploreV2;
 15
 16    /// <summary>
 17    /// Request all events from the API.
 18    /// </summary>
 19    void RequestAllEvents();
 20
 21    /// <summary>
 22    /// Load the featured events with the last requested ones.
 23    /// </summary>
 24    void LoadFeaturedEvents();
 25
 26    /// <summary>
 27    /// Load the trending events with the last requested ones.
 28    /// </summary>
 29    void LoadTrendingEvents();
 30
 31    /// <summary>
 32    /// Load the upcoming events with the last requested ones.
 33    /// </summary>
 34    void LoadUpcomingEvents();
 35
 36    /// <summary>
 37    /// Increment the number of upcoming events loaded.
 38    /// </summary>
 39    void ShowMoreUpcomingEvents();
 40
 41    /// <summary>
 42    /// Load the going events with the last requested ones.
 43    /// </summary>
 44    void LoadGoingEvents();
 45}
 46
 47public class EventsSubSectionComponentController : IEventsSubSectionComponentController
 48{
 49    public event Action OnCloseExploreV2;
 50    internal event Action OnEventsFromAPIUpdated;
 51
 52    internal const int DEFAULT_NUMBER_OF_FEATURED_EVENTS = 3;
 53    internal const int INITIAL_NUMBER_OF_UPCOMING_ROWS = 1;
 54    internal const int SHOW_MORE_UPCOMING_ROWS_INCREMENT = 2;
 55    internal const string EVENT_DETAIL_URL = "https://events.decentraland.org/event/?id={0}";
 56    internal IEventsSubSectionComponentView view;
 57    internal IEventsAPIController eventsAPIApiController;
 2158    internal List<EventFromAPIModel> eventsFromAPI = new List<EventFromAPIModel>();
 59    internal int currentUpcomingEventsShowed = 0;
 60    internal bool reloadEvents = false;
 61    internal IExploreV2Analytics exploreV2Analytics;
 62
 2163    public EventsSubSectionComponentController(
 64        IEventsSubSectionComponentView view,
 65        IEventsAPIController eventsAPI,
 66        IExploreV2Analytics exploreV2Analytics)
 67    {
 2168        this.view = view;
 2169        this.view.OnReady += FirstLoading;
 2170        this.view.OnInfoClicked += ShowEventDetailedInfo;
 2171        this.view.OnJumpInClicked += JumpInToEvent;
 2172        this.view.OnSubscribeEventClicked += SubscribeToEvent;
 2173        this.view.OnUnsubscribeEventClicked += UnsubscribeToEvent;
 2174        this.view.OnShowMoreUpcomingEventsClicked += ShowMoreUpcomingEvents;
 75
 2176        eventsAPIApiController = eventsAPI;
 2177        OnEventsFromAPIUpdated += OnRequestedEventsUpdated;
 78
 2179        this.exploreV2Analytics = exploreV2Analytics;
 2180    }
 81
 82    internal void FirstLoading()
 83    {
 184        reloadEvents = true;
 185        RequestAllEvents();
 86
 187        view.OnEventsSubSectionEnable += RequestAllEvents;
 188        DataStore.i.exploreV2.isOpen.OnChange += OnExploreV2Open;
 189    }
 90
 91    internal void OnExploreV2Open(bool current, bool previous)
 92    {
 093        if (current)
 094            return;
 95
 096        reloadEvents = true;
 097    }
 98
 99    public void RequestAllEvents()
 100    {
 2101        if (!reloadEvents)
 0102            return;
 103
 2104        currentUpcomingEventsShowed = view.currentUpcomingEventsPerRow * INITIAL_NUMBER_OF_UPCOMING_ROWS;
 2105        view.RestartScrollViewPosition();
 2106        view.SetFeaturedEventsAsLoading(true);
 2107        view.SetTrendingEventsAsLoading(true);
 2108        view.SetUpcomingEventsAsLoading(true);
 2109        view.SetShowMoreUpcomingEventsButtonActive(false);
 2110        view.SetGoingEventsAsLoading(true);
 2111        reloadEvents = false;
 112
 2113        if (!DataStore.i.exploreV2.isInShowAnimationTransiton.Get())
 2114            RequestAllEventsFromAPI();
 115        else
 0116            DataStore.i.exploreV2.isInShowAnimationTransiton.OnChange += IsInShowAnimationTransitonChanged;
 0117    }
 118
 119    internal void IsInShowAnimationTransitonChanged(bool current, bool previous)
 120    {
 0121        DataStore.i.exploreV2.isInShowAnimationTransiton.OnChange -= IsInShowAnimationTransitonChanged;
 0122        RequestAllEventsFromAPI();
 0123    }
 124
 125    internal void RequestAllEventsFromAPI()
 126    {
 3127        eventsAPIApiController.GetAllEvents(
 128            (eventList) =>
 129            {
 0130                eventsFromAPI = eventList;
 0131                OnEventsFromAPIUpdated?.Invoke();
 0132            },
 133            (error) =>
 134            {
 0135                Debug.LogError($"Error receiving events from the API: {error}");
 0136            });
 3137    }
 138
 139    internal void OnRequestedEventsUpdated()
 140    {
 1141        LoadFeaturedEvents();
 1142        LoadTrendingEvents();
 1143        LoadUpcomingEvents();
 1144        LoadGoingEvents();
 1145    }
 146
 147    public void LoadFeaturedEvents()
 148    {
 2149        List<EventCardComponentModel> featuredEvents = new List<EventCardComponentModel>();
 6150        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.highlighted).ToList();
 151
 2152        if (eventsFiltered.Count == 0)
 2153            eventsFiltered = eventsFromAPI.Take(DEFAULT_NUMBER_OF_FEATURED_EVENTS).ToList();
 154
 12155        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 156        {
 4157            EventCardComponentModel eventCardModel = ExploreEventsHelpers.CreateEventCardModelFromAPIEvent(receivedEvent
 4158            featuredEvents.Add(eventCardModel);
 159        }
 160
 2161        view.SetFeaturedEvents(featuredEvents);
 2162        view.SetFeaturedEventsAsLoading(false);
 2163        view.SetFeaturedEventsActive(featuredEvents.Count > 0);
 2164    }
 165
 166    public void LoadTrendingEvents()
 167    {
 2168        List<EventCardComponentModel> trendingEvents = new List<EventCardComponentModel>();
 6169        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.trending).ToList();
 170
 4171        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 172        {
 0173            EventCardComponentModel eventCardModel = ExploreEventsHelpers.CreateEventCardModelFromAPIEvent(receivedEvent
 0174            trendingEvents.Add(eventCardModel);
 175        }
 176
 2177        view.SetTrendingEvents(trendingEvents);
 2178        view.SetTrendingEventsAsLoading(false);
 2179    }
 180
 181    public void LoadUpcomingEvents()
 182    {
 2183        List<EventCardComponentModel> upcomingEvents = new List<EventCardComponentModel>();
 2184        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Take(currentUpcomingEventsShowed).ToList();
 185
 4186        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 187        {
 0188            EventCardComponentModel eventCardModel = ExploreEventsHelpers.CreateEventCardModelFromAPIEvent(receivedEvent
 0189            upcomingEvents.Add(eventCardModel);
 190        }
 191
 2192        view.SetUpcomingEvents(upcomingEvents);
 2193        view.SetShowMoreUpcomingEventsButtonActive(currentUpcomingEventsShowed < eventsFromAPI.Count);
 2194        view.SetUpcomingEventsAsLoading(false);
 2195    }
 196
 197    public void ShowMoreUpcomingEvents()
 198    {
 2199        List<EventCardComponentModel> upcomingEvents = new List<EventCardComponentModel>();
 2200        List<EventFromAPIModel> eventsFiltered = new List<EventFromAPIModel>();
 2201        int numberOfExtraItemsToAdd = ((int)Mathf.Ceil((float)currentUpcomingEventsShowed / view.currentUpcomingEventsPe
 2202        int numberOfItemsToAdd = view.currentUpcomingEventsPerRow * SHOW_MORE_UPCOMING_ROWS_INCREMENT + numberOfExtraIte
 203
 2204        if (currentUpcomingEventsShowed + numberOfItemsToAdd <= eventsFromAPI.Count)
 2205            eventsFiltered = eventsFromAPI.GetRange(currentUpcomingEventsShowed, numberOfItemsToAdd);
 206        else
 0207            eventsFiltered = eventsFromAPI.GetRange(currentUpcomingEventsShowed, eventsFromAPI.Count - currentUpcomingEv
 208
 4209        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 210        {
 0211            EventCardComponentModel placeCardModel = ExploreEventsHelpers.CreateEventCardModelFromAPIEvent(receivedEvent
 0212            upcomingEvents.Add(placeCardModel);
 213        }
 214
 2215        view.AddUpcomingEvents(upcomingEvents);
 216
 2217        currentUpcomingEventsShowed += numberOfItemsToAdd;
 2218        if (currentUpcomingEventsShowed > eventsFromAPI.Count)
 0219            currentUpcomingEventsShowed = eventsFromAPI.Count;
 220
 2221        view.SetShowMoreUpcomingEventsButtonActive(currentUpcomingEventsShowed < eventsFromAPI.Count);
 2222    }
 223
 224    public void LoadGoingEvents()
 225    {
 2226        List<EventCardComponentModel> goingEvents = new List<EventCardComponentModel>();
 6227        List<EventFromAPIModel> eventsFiltered = eventsFromAPI.Where(e => e.attending).ToList();
 228
 4229        foreach (EventFromAPIModel receivedEvent in eventsFiltered)
 230        {
 0231            EventCardComponentModel eventCardModel = ExploreEventsHelpers.CreateEventCardModelFromAPIEvent(receivedEvent
 0232            goingEvents.Add(eventCardModel);
 233        }
 234
 2235        view.SetGoingEvents(goingEvents);
 2236        view.SetGoingEventsAsLoading(false);
 2237    }
 238
 239    public void Dispose()
 240    {
 21241        view.OnReady -= FirstLoading;
 21242        view.OnInfoClicked -= ShowEventDetailedInfo;
 21243        view.OnJumpInClicked -= JumpInToEvent;
 21244        view.OnSubscribeEventClicked -= SubscribeToEvent;
 21245        view.OnUnsubscribeEventClicked -= UnsubscribeToEvent;
 21246        view.OnShowMoreUpcomingEventsClicked -= ShowMoreUpcomingEvents;
 21247        view.OnEventsSubSectionEnable -= RequestAllEvents;
 21248        OnEventsFromAPIUpdated -= OnRequestedEventsUpdated;
 21249        DataStore.i.exploreV2.isOpen.OnChange -= OnExploreV2Open;
 21250    }
 251
 252    internal void ShowEventDetailedInfo(EventCardComponentModel eventModel)
 253    {
 1254        view.ShowEventModal(eventModel);
 1255        exploreV2Analytics.SendClickOnEventInfo(eventModel.eventId, eventModel.eventName);
 1256    }
 257
 258    internal void JumpInToEvent(EventFromAPIModel eventFromAPI)
 259    {
 1260        ExploreEventsHelpers.JumpInToEvent(eventFromAPI);
 1261        view.HideEventModal();
 1262        OnCloseExploreV2?.Invoke();
 1263        exploreV2Analytics.SendEventTeleport(eventFromAPI.id, eventFromAPI.name, new Vector2Int(eventFromAPI.coordinates
 1264    }
 265
 266    internal void SubscribeToEvent(string eventId)
 267    {
 268        // TODO (Santi): Remove when the RegisterAttendEvent POST is available.
 0269        WebInterface.OpenURL(string.Format(EVENT_DETAIL_URL, eventId));
 270
 271        // TODO (Santi): Waiting for the new version of the Events API where we will be able to send a signed POST to re
 272        //eventsAPIApiController.RegisterAttendEvent(
 273        //    eventId,
 274        //    true,
 275        //    () =>
 276        //    {
 277        //        // ...
 278        //    },
 279        //    (error) =>
 280        //    {
 281        //        Debug.LogError($"Error posting 'attend' message to the API: {error}");
 282        //    });
 0283    }
 284
 285    internal void UnsubscribeToEvent(string eventId)
 286    {
 287        // TODO (Santi): Remove when the RegisterAttendEvent POST is available.
 0288        WebInterface.OpenURL(string.Format(EVENT_DETAIL_URL, eventId));
 289
 290        // TODO (Santi): Waiting for the new version of the Events API where we will be able to send a signed POST to un
 291        //eventsAPIApiController.RegisterAttendEvent(
 292        //    eventId,
 293        //    false,
 294        //    () =>
 295        //    {
 296        //        // ...
 297        //    },
 298        //    (error) =>
 299        //    {
 300        //        Debug.LogError($"Error posting 'attend' message to the API: {error}");
 301        //    });
 0302    }
 303}