< Summary

Class:PlacesSubSectionComponentController
Assembly:ExploreV2
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExploreV2/Scripts/Sections/PlacesAndEventsSection/SubSections/PlacesSubSection/PlacesSubSectionMenu/PlacesSubSectionComponentController.cs
Covered lines:87
Uncovered lines:18
Coverable lines:105
Total lines:227
Line coverage:82.8% (87 of 105)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PlacesSubSectionComponentController(...)0%110100%
FirstLoading()0%110100%
OnExploreV2Open(...)0%6200%
RequestAllPlaces()0%2.012088.89%
RequestAllPlacesFromAPI()0%110100%
OnRequestedPlacesUpdated()0%110100%
LoadPlaces()0%2.062075%
ShowMorePlaces()0%5.795068.42%
Dispose()0%110100%
CreatePlaceCardModelFromAPIPlace(...)0%110100%
FormatDescription(...)0%220100%
FormatAuthorName(...)0%110100%
ShowPlaceDetailedInfo(...)0%2.062075%
JumpInToPlace(...)0%8.18088.24%
View_OnFriendHandlerAdded(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/ExploreV2/Scripts/Sections/PlacesAndEventsSection/SubSections/PlacesSubSection/PlacesSubSectionMenu/PlacesSubSectionComponentController.cs

#LineLine coverage
 1using DCL;
 2using DCL.Interface;
 3using ExploreV2Analytics;
 4using System;
 5using System.Collections.Generic;
 6using System.Linq;
 7using UnityEngine;
 8using static HotScenesController;
 9
 10public interface IPlacesSubSectionComponentController : IDisposable
 11{
 12    /// <summary>
 13    /// It will be triggered when the sub-section want to request to close the ExploreV2 main menu.
 14    /// </summary>
 15    event Action OnCloseExploreV2;
 16
 17    /// <summary>
 18    /// It will be triggered when any action is executed inside the places sub-section.
 19    /// </summary>
 20    event Action OnAnyActionExecuted;
 21
 22    /// <summary>
 23    /// Request all places from the API.
 24    /// </summary>
 25    void RequestAllPlaces();
 26
 27    /// <summary>
 28    /// Load the places with the last requested ones.
 29    /// </summary>
 30    void LoadPlaces();
 31
 32    /// <summary>
 33    /// Increment the number of places loaded.
 34    /// </summary>
 35    void ShowMorePlaces();
 36}
 37
 38public class PlacesSubSectionComponentController : IPlacesSubSectionComponentController
 39{
 40    public event Action OnCloseExploreV2;
 41    public event Action OnAnyActionExecuted;
 42    internal event Action OnPlacesFromAPIUpdated;
 43
 44    internal const int INITIAL_NUMBER_OF_ROWS = 4;
 45    internal const int SHOW_MORE_ROWS_INCREMENT = 1;
 46    internal const string NO_PLACE_DESCRIPTION_WRITTEN = "The author hasn't written a description yet.";
 47    internal IPlacesSubSectionComponentView view;
 48    internal IPlacesAPIController placesAPIApiController;
 49    internal FriendTrackerController friendsTrackerController;
 1750    internal List<HotSceneInfo> placesFromAPI = new List<HotSceneInfo>();
 51    internal int currentPlacesShowed = 0;
 52    internal bool reloadPlaces = false;
 53    internal IExploreV2Analytics exploreV2Analytics;
 54
 1755    public PlacesSubSectionComponentController(IPlacesSubSectionComponentView view, IPlacesAPIController placesAPI, IFri
 56    {
 1757        this.view = view;
 1758        this.view.OnReady += FirstLoading;
 1759        this.view.OnInfoClicked += ShowPlaceDetailedInfo;
 1760        this.view.OnJumpInClicked += JumpInToPlace;
 1761        this.view.OnFriendHandlerAdded += View_OnFriendHandlerAdded;
 1762        this.view.OnShowMorePlacesClicked += ShowMorePlaces;
 63
 1764        placesAPIApiController = placesAPI;
 1765        OnPlacesFromAPIUpdated += OnRequestedPlacesUpdated;
 66
 1767        friendsTrackerController = new FriendTrackerController(friendsController, view.currentFriendColors);
 68
 1769        this.exploreV2Analytics = exploreV2Analytics;
 1770    }
 71
 72    internal void FirstLoading()
 73    {
 174        reloadPlaces = true;
 175        RequestAllPlaces();
 76
 177        view.OnPlacesSubSectionEnable += RequestAllPlaces;
 178        DataStore.i.exploreV2.isOpen.OnChange += OnExploreV2Open;
 179    }
 80
 81    internal void OnExploreV2Open(bool current, bool previous)
 82    {
 083        if (current)
 084            return;
 85
 086        reloadPlaces = true;
 087    }
 88
 89    public void RequestAllPlaces()
 90    {
 291        if (!reloadPlaces)
 092            return;
 93
 294        currentPlacesShowed = view.currentPlacesPerRow * INITIAL_NUMBER_OF_ROWS;
 295        view.RestartScrollViewPosition();
 296        view.SetPlacesAsLoading(true);
 297        view.SetShowMorePlacesButtonActive(false);
 298        RequestAllPlacesFromAPI();
 299        reloadPlaces = false;
 2100    }
 101
 102    internal void RequestAllPlacesFromAPI()
 103    {
 3104        placesAPIApiController.GetAllPlaces(
 105            (placeList) =>
 106            {
 0107                placesFromAPI = placeList;
 0108                OnPlacesFromAPIUpdated?.Invoke();
 0109            });
 3110    }
 111
 2112    internal void OnRequestedPlacesUpdated() { LoadPlaces(); }
 113
 114    public void LoadPlaces()
 115    {
 2116        friendsTrackerController.RemoveAllHandlers();
 117
 2118        List<PlaceCardComponentModel> places = new List<PlaceCardComponentModel>();
 2119        List<HotSceneInfo> placesFiltered = placesFromAPI.Take(currentPlacesShowed).ToList();
 4120        foreach (HotSceneInfo receivedPlace in placesFiltered)
 121        {
 0122            PlaceCardComponentModel placeCardModel = CreatePlaceCardModelFromAPIPlace(receivedPlace);
 0123            places.Add(placeCardModel);
 124        }
 125
 2126        view.SetPlaces(places);
 2127        view.SetShowMorePlacesButtonActive(currentPlacesShowed < placesFromAPI.Count);
 2128        view.SetPlacesAsLoading(false);
 2129    }
 130
 131    public void ShowMorePlaces()
 132    {
 2133        List<PlaceCardComponentModel> places = new List<PlaceCardComponentModel>();
 2134        List<HotSceneInfo> placesFiltered = new List<HotSceneInfo>();
 2135        int numberOfExtraItemsToAdd = ((int)Mathf.Ceil((float)currentPlacesShowed / view.currentPlacesPerRow) * view.cur
 2136        int numberOfItemsToAdd = view.currentPlacesPerRow * SHOW_MORE_ROWS_INCREMENT + numberOfExtraItemsToAdd;
 137
 2138        if (currentPlacesShowed + numberOfItemsToAdd <= placesFromAPI.Count)
 2139            placesFiltered = placesFromAPI.GetRange(currentPlacesShowed, numberOfItemsToAdd);
 140        else
 0141            placesFiltered = placesFromAPI.GetRange(currentPlacesShowed, placesFromAPI.Count - currentPlacesShowed);
 142
 4143        foreach (HotSceneInfo receivedPlace in placesFiltered)
 144        {
 0145            PlaceCardComponentModel placeCardModel = CreatePlaceCardModelFromAPIPlace(receivedPlace);
 0146            places.Add(placeCardModel);
 147        }
 148
 2149        view.AddPlaces(places);
 150
 2151        currentPlacesShowed += numberOfItemsToAdd;
 2152        if (currentPlacesShowed > placesFromAPI.Count)
 0153            currentPlacesShowed = placesFromAPI.Count;
 154
 2155        view.SetShowMorePlacesButtonActive(currentPlacesShowed < placesFromAPI.Count);
 156
 2157        OnAnyActionExecuted?.Invoke();
 0158    }
 159
 160    public void Dispose()
 161    {
 17162        view.OnReady -= FirstLoading;
 17163        view.OnInfoClicked -= ShowPlaceDetailedInfo;
 17164        view.OnJumpInClicked -= JumpInToPlace;
 17165        view.OnPlacesSubSectionEnable -= RequestAllPlaces;
 17166        view.OnFriendHandlerAdded -= View_OnFriendHandlerAdded;
 17167        view.OnShowMorePlacesClicked -= ShowMorePlaces;
 17168        OnPlacesFromAPIUpdated -= OnRequestedPlacesUpdated;
 17169        DataStore.i.exploreV2.isOpen.OnChange -= OnExploreV2Open;
 17170    }
 171
 172    internal PlaceCardComponentModel CreatePlaceCardModelFromAPIPlace(HotSceneInfo placeFromAPI)
 173    {
 1174        PlaceCardComponentModel placeCardModel = new PlaceCardComponentModel();
 1175        placeCardModel.placePictureUri = placeFromAPI.thumbnail;
 1176        placeCardModel.placeName = placeFromAPI.name;
 1177        placeCardModel.placeDescription = FormatDescription(placeFromAPI);
 1178        placeCardModel.placeAuthor = FormatAuthorName(placeFromAPI);
 1179        placeCardModel.numberOfUsers = placeFromAPI.usersTotalCount;
 1180        placeCardModel.parcels = placeFromAPI.parcels;
 1181        placeCardModel.coords = placeFromAPI.baseCoords;
 1182        placeCardModel.hotSceneInfo = placeFromAPI;
 183
 1184        return placeCardModel;
 185    }
 186
 2187    internal string FormatDescription(HotSceneInfo placeFromAPI) { return string.IsNullOrEmpty(placeFromAPI.description)
 188
 2189    internal string FormatAuthorName(HotSceneInfo placeFromAPI) { return $"Author <b>{placeFromAPI.creator}</b>"; }
 190
 191    internal void ShowPlaceDetailedInfo(PlaceCardComponentModel placeModel)
 192    {
 1193        view.ShowPlaceModal(placeModel);
 1194        exploreV2Analytics.SendClickOnPlaceInfo(placeModel.hotSceneInfo.id, placeModel.placeName);
 1195        OnAnyActionExecuted?.Invoke();
 0196    }
 197
 198    internal void JumpInToPlace(HotSceneInfo placeFromAPI)
 199    {
 1200        HotScenesController.HotSceneInfo.Realm realm = new HotScenesController.HotSceneInfo.Realm() { layer = null, serv
 2201        placeFromAPI.realms = placeFromAPI.realms.OrderByDescending(x => x.usersCount).ToArray();
 202
 2203        for (int i = 0; i < placeFromAPI.realms.Length; i++)
 204        {
 1205            bool isArchipelagoRealm = string.IsNullOrEmpty(placeFromAPI.realms[i].layer);
 206
 1207            if (isArchipelagoRealm || placeFromAPI.realms[i].usersCount < placeFromAPI.realms[i].maxUsers)
 208            {
 1209                realm = placeFromAPI.realms[i];
 1210                break;
 211            }
 212        }
 213
 1214        if (string.IsNullOrEmpty(realm.serverName))
 0215            WebInterface.GoTo(placeFromAPI.baseCoords.x, placeFromAPI.baseCoords.y);
 216        else
 1217            WebInterface.JumpIn(placeFromAPI.baseCoords.x, placeFromAPI.baseCoords.y, realm.serverName, realm.layer);
 218
 1219        view.HidePlaceModal();
 1220        OnCloseExploreV2?.Invoke();
 1221        OnAnyActionExecuted?.Invoke();
 222
 1223        exploreV2Analytics.SendPlaceTeleport(placeFromAPI.id, placeFromAPI.name, placeFromAPI.baseCoords);
 1224    }
 225
 0226    internal void View_OnFriendHandlerAdded(FriendsHandler friendsHandler) { friendsTrackerController.AddHandler(friends
 227}