< 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:102
Uncovered lines:81
Coverable lines:183
Total lines:454
Line coverage:55.7% (102 of 183)
Covered branches:0
Total branches:0
Covered methods:14
Total methods:30
Method coverage:46.6% (14 of 30)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EventsSubSectionComponentController(...)0%110100%
ConnectWallet()0%2100%
Dispose()0%110100%
FirstLoading()0%2100%
RequestAllEvents()0%220100%
RequestAllFromAPI()0%220100%
OnRequestedEventsUpdated(...)0%110100%
<OnRequestedEventsUpdated()0%32.3719066.67%
ApplyEventTypeFilters()0%20400%
ApplyEventFrequencyFilter()0%2100%
ApplyEventCategoryFilter()0%2100%
ApplyEventTimeFilter()0%2100%
LoadFilteredEvents()0%23.6111052.94%
FilterUpcomingEvents(...)0%330100%
FilterFeaturedEvents(...)0%220100%
FilterTrendingEvents(...)0%2100%
FilterWantToGoEvents(...)0%2100%
FrequencyFilterQuery(...)0%20400%
CategoryFilterQuery(...)0%6200%
TimeFilterQuery(...)0%2100%
ShowMoreEvents()0%3.013088.89%
ShowEventDetailedInfo(...)0%110100%
OnJumpInToEvent(...)0%220100%
SubscribeToEvent(...)0%6200%
UnsubscribeToEvent(...)0%2100%
OnChannelToJoinChanged(...)0%12300%
JumpInToEvent(...)0%2.262060%
RequestAndLoadCategories()0%220100%
IsTimeInRange(...)0%20400%
ConvertToTimeString(...)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 Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Tasks;
 4using DCLServices.PlacesAPIService;
 5using DCLServices.WorldsAPIService;
 6using ExploreV2Analytics;
 7using MainScripts.DCL.Controllers.HotScenes;
 8using System;
 9using System.Collections.Generic;
 10using System.Linq;
 11using System.Threading;
 12using UnityEngine;
 13using Environment = DCL.Environment;
 14
 15public class EventsSubSectionComponentController : IEventsSubSectionComponentController, IPlacesAndEventsAPIRequester
 16{
 17    public event Action OnCloseExploreV2;
 18
 19    private const int DEFAULT_NUMBER_OF_FEATURED_EVENTS = 3;
 20    internal const int INITIAL_NUMBER_OF_ROWS = 4;
 21    private const int SHOW_MORE_ROWS_INCREMENT = 2;
 22    private const string ALL_FILTER_ID = "all";
 23    private const string RECURRING_EVENT_FREQUENCY_FILTER_ID = "recurring_event";
 24    private const float TIME_MIN_VALUE = 0;
 25    private const float TIME_MAX_VALUE = 48;
 26
 27    internal readonly IEventsSubSectionComponentView view;
 28    internal readonly IEventsAPIController eventsAPIApiController;
 29    private readonly DataStore dataStore;
 30    private readonly IExploreV2Analytics exploreV2Analytics;
 31    private readonly IUserProfileBridge userProfileBridge;
 32    private readonly IPlacesAPIService placesAPIService;
 33    private readonly IWorldsAPIService worldsAPIService;
 34
 35    internal readonly PlaceAndEventsCardsReloader cardsReloader;
 36
 1937    internal List<EventFromAPIModel> eventsFromAPI = new ();
 38    internal int availableUISlots;
 39
 40    private CancellationTokenSource getPlacesAssociatedToEventsCts;
 41
 1942    public EventsSubSectionComponentController(
 43        IEventsSubSectionComponentView view,
 44        IEventsAPIController eventsAPI,
 45        IExploreV2Analytics exploreV2Analytics,
 46        DataStore dataStore,
 47        IUserProfileBridge userProfileBridge,
 48        IPlacesAPIService placesAPIService,
 49        IWorldsAPIService worldsAPIService)
 50    {
 1951        cardsReloader = new PlaceAndEventsCardsReloader(view, this, dataStore.exploreV2);
 52
 1953        this.view = view;
 54
 1955        this.view.OnReady += FirstLoading;
 56
 1957        this.view.OnInfoClicked += ShowEventDetailedInfo;
 1958        this.view.OnJumpInClicked += OnJumpInToEvent;
 59
 1960        this.view.OnSubscribeEventClicked += SubscribeToEvent;
 1961        this.view.OnUnsubscribeEventClicked += UnsubscribeToEvent;
 62
 1963        this.view.OnShowMoreEventsClicked += ShowMoreEvents;
 1964        this.view.OnConnectWallet += ConnectWallet;
 65
 1966        this.dataStore = dataStore;
 1967        this.dataStore.channels.currentJoinChannelModal.OnChange += OnChannelToJoinChanged;
 68
 1969        eventsAPIApiController = eventsAPI;
 70
 1971        this.exploreV2Analytics = exploreV2Analytics;
 1972        this.userProfileBridge = userProfileBridge;
 73
 1974        this.placesAPIService = placesAPIService;
 1975        this.worldsAPIService = worldsAPIService;
 76
 1977        view.ConfigurePools();
 1978    }
 79
 80    private void ConnectWallet()
 81    {
 082        dataStore.HUDs.connectWalletModalVisible.Set(true);
 083    }
 84
 85    public void Dispose()
 86    {
 1987        getPlacesAssociatedToEventsCts.SafeCancelAndDispose();
 88
 1989        view.OnReady -= FirstLoading;
 1990        view.OnInfoClicked -= ShowEventDetailedInfo;
 1991        view.OnJumpInClicked -= OnJumpInToEvent;
 1992        view.OnSubscribeEventClicked -= SubscribeToEvent;
 1993        view.OnUnsubscribeEventClicked -= UnsubscribeToEvent;
 1994        view.OnShowMoreEventsClicked -= ShowMoreEvents;
 1995        view.OnEventsSubSectionEnable -= RequestAllEvents;
 1996        view.OnEventTypeFiltersChanged -= ApplyEventTypeFilters;
 1997        view.OnEventFrequencyFilterChanged -= ApplyEventFrequencyFilter;
 1998        view.OnEventCategoryFilterChanged -= ApplyEventCategoryFilter;
 1999        view.OnEventTimeFilterChanged -= ApplyEventTimeFilter;
 19100        view.OnConnectWallet -= ConnectWallet;
 101
 19102        dataStore.channels.currentJoinChannelModal.OnChange -= OnChannelToJoinChanged;
 103
 19104        cardsReloader.Dispose();
 19105    }
 106
 107    private void FirstLoading()
 108    {
 0109        view.OnEventsSubSectionEnable += RequestAllEvents;
 0110        view.OnEventTypeFiltersChanged += ApplyEventTypeFilters;
 0111        view.OnEventFrequencyFilterChanged += ApplyEventFrequencyFilter;
 0112        view.OnEventCategoryFilterChanged += ApplyEventCategoryFilter;
 0113        view.OnEventTimeFilterChanged += ApplyEventTimeFilter;
 0114        cardsReloader.Initialize();
 0115    }
 116
 117    internal void RequestAllEvents()
 118    {
 2119        exploreV2Analytics.SendEventsTabOpen();
 120
 2121        view.SetIsGuestUser(userProfileBridge.GetOwn().isGuest);
 2122        if (cardsReloader.CanReload())
 123        {
 2124            availableUISlots = view.CurrentTilesPerRow * INITIAL_NUMBER_OF_ROWS;
 2125            view.SetShowMoreEventsButtonActive(false);
 2126            cardsReloader.RequestAll();
 127        }
 2128    }
 129
 130    public void RequestAllFromAPI()
 131    {
 3132        eventsAPIApiController.GetAllEvents(
 133            OnSuccess: OnRequestedEventsUpdated,
 0134            OnFail: error => { Debug.LogError($"Error receiving events from the API: {error}"); });
 3135    }
 136
 137    internal void OnRequestedEventsUpdated(List<EventFromAPIModel> eventList)
 138    {
 1139        eventsFromAPI = eventList;
 140
 1141        getPlacesAssociatedToEventsCts = getPlacesAssociatedToEventsCts.SafeRestart();
 1142        GetPlacesAssociatedToEventsAsync(getPlacesAssociatedToEventsCts.Token).Forget();
 143
 144        async UniTaskVoid GetPlacesAssociatedToEventsAsync(CancellationToken ct)
 145        {
 146            // Land's events
 3147            var landEventsFromAPI = eventsFromAPI.Where(e => !e.world).ToList();
 1148            var coordsList = landEventsFromAPI.Select(e => new Vector2Int(e.coordinates[0], e.coordinates[1]));
 1149            var places = await placesAPIService.GetPlacesByCoordsList(coordsList, ct);
 150
 6151            foreach (EventFromAPIModel landEventFromAPI in landEventsFromAPI)
 152            {
 2153                Vector2Int landEventCoords = new Vector2Int(landEventFromAPI.coordinates[0], landEventFromAPI.coordinate
 10154                foreach (IHotScenesController.PlaceInfo place in places)
 155                {
 4156                    if (!place.Positions.Contains(landEventCoords))
 157                        continue;
 158
 2159                    landEventFromAPI.scene_name = place.title;
 2160                    break;
 161                }
 162            }
 163
 164            // World's events
 3165            var worldEventsFromAPI = eventsFromAPI.Where(e => e.world).ToList();
 1166            var worldNamesList = worldEventsFromAPI.Select(e => e.server);
 1167            var worlds = await worldsAPIService.GetWorldsByNamesList(worldNamesList, ct);
 168
 2169            foreach (EventFromAPIModel worldEventFromAPI in worldEventsFromAPI)
 170            {
 0171                foreach (WorldsResponse.WorldInfo world in worlds)
 172                {
 0173                    if (world.world_name != worldEventFromAPI.server)
 174                        continue;
 175
 0176                    worldEventFromAPI.scene_name = world.title;
 0177                    break;
 178                }
 179            }
 180
 1181            view.SetFeaturedEvents(PlacesAndEventsCardsFactory.CreateEventsCards(FilterFeaturedEvents()));
 1182            LoadFilteredEvents();
 1183            RequestAndLoadCategories();
 1184        }
 1185    }
 186
 187    private void ApplyEventTypeFilters()
 188    {
 0189        switch (view.SelectedEventType)
 190        {
 191            case EventsType.Featured:
 0192                exploreV2Analytics.SendFilterEvents(FilterType.Featured);
 0193                break;
 194            case EventsType.Trending:
 0195                exploreV2Analytics.SendFilterEvents(FilterType.Trending);
 0196                break;
 197            case EventsType.WantToGo:
 0198                exploreV2Analytics.SendFilterEvents(FilterType.WantToGo);
 199                break;
 200        }
 201
 0202        LoadFilteredEvents();
 0203    }
 204
 205    private void ApplyEventFrequencyFilter()
 206    {
 0207        exploreV2Analytics.SendFilterEvents(FilterType.Frequency, view.SelectedFrequency);
 0208        LoadFilteredEvents();
 0209    }
 210
 211    private void ApplyEventCategoryFilter()
 212    {
 0213        exploreV2Analytics.SendFilterEvents(FilterType.Category, view.SelectedCategory);
 0214        LoadFilteredEvents();
 0215    }
 216
 217    private void ApplyEventTimeFilter()
 218    {
 0219        exploreV2Analytics.SendFilterEvents(FilterType.Time);
 0220        LoadFilteredEvents();
 0221    }
 222
 223    private void LoadFilteredEvents()
 224    {
 1225        List<EventCardComponentModel> filteredEventCards = new ();
 226
 1227        bool anyFilterApplied =
 228            view.SelectedEventType != EventsType.Upcoming ||
 229            view.SelectedFrequency != ALL_FILTER_ID ||
 230            view.SelectedCategory != ALL_FILTER_ID ||
 231            view.SelectedLowTime > TIME_MIN_VALUE ||
 232            view.SelectedHighTime < TIME_MAX_VALUE;
 233
 1234        switch (view.SelectedEventType)
 235        {
 236            case EventsType.Upcoming:
 1237                availableUISlots = view.CurrentTilesPerRow * INITIAL_NUMBER_OF_ROWS;
 1238                filteredEventCards = PlacesAndEventsCardsFactory.CreateEventsCards(
 239                    FilterUpcomingEvents(view.SelectedFrequency, view.SelectedCategory, view.SelectedLowTime, view.Selec
 1240                view.SetShowMoreEventsButtonActive(!anyFilterApplied && availableUISlots < eventsFromAPI.Count);
 1241                break;
 242            case EventsType.Featured:
 0243                filteredEventCards = PlacesAndEventsCardsFactory.CreateEventsCards(
 244                    FilterFeaturedEvents(false, view.SelectedFrequency, view.SelectedCategory, view.SelectedLowTime, vie
 0245                view.SetShowMoreEventsButtonActive(false);
 0246                break;
 247            case EventsType.Trending:
 0248                filteredEventCards = PlacesAndEventsCardsFactory.CreateEventsCards(
 249                    FilterTrendingEvents(view.SelectedFrequency, view.SelectedCategory, view.SelectedLowTime, view.Selec
 0250                view.SetShowMoreEventsButtonActive(false);
 0251                break;
 252            case EventsType.WantToGo:
 0253                filteredEventCards = PlacesAndEventsCardsFactory.CreateEventsCards(
 254                    FilterWantToGoEvents(view.SelectedFrequency, view.SelectedCategory, view.SelectedLowTime, view.Selec
 0255                view.SetShowMoreEventsButtonActive(false);
 256                break;
 257        }
 258
 1259        view.SetEvents(filteredEventCards);
 1260    }
 261
 262    internal List<EventFromAPIModel> FilterUpcomingEvents(
 263        string frequencyFilter = ALL_FILTER_ID,
 264        string categoryFilter = ALL_FILTER_ID,
 265        float lowTimeFilter = TIME_MIN_VALUE,
 266        float highTimeFilter = TIME_MAX_VALUE,
 267        bool takeAllResults = false)
 268    {
 2269        return eventsFromAPI
 270              .Where(e =>
 0271                   FrequencyFilterQuery(e, frequencyFilter) &&
 272                   CategoryFilterQuery(e, categoryFilter) &&
 273                   TimeFilterQuery(e, lowTimeFilter, highTimeFilter))
 274              .Take(takeAllResults ? eventsFromAPI.Count : availableUISlots)
 275              .ToList();
 276    }
 277
 278    internal List<EventFromAPIModel> FilterFeaturedEvents(
 279        bool showDefaultsIfNoData = true,
 280        string frequencyFilter = ALL_FILTER_ID,
 281        string categoryFilter = ALL_FILTER_ID,
 282        float lowTimeFilter = TIME_MIN_VALUE,
 283        float highTimeFilter = TIME_MAX_VALUE)
 284    {
 2285        List<EventFromAPIModel> eventsFiltered = eventsFromAPI
 286                                                .Where(e =>
 4287                                                     e.highlighted &&
 288                                                     FrequencyFilterQuery(e, frequencyFilter) &&
 289                                                     CategoryFilterQuery(e, categoryFilter) &&
 290                                                     TimeFilterQuery(e, lowTimeFilter, highTimeFilter))
 291                                                .ToList();
 292
 2293        if (eventsFiltered.Count == 0 && showDefaultsIfNoData)
 2294            eventsFiltered = eventsFromAPI.Take(DEFAULT_NUMBER_OF_FEATURED_EVENTS).ToList();
 295
 2296        return eventsFiltered;
 297    }
 298
 299    internal List<EventFromAPIModel> FilterTrendingEvents(
 300        string frequencyFilter = ALL_FILTER_ID,
 301        string categoryFilter = ALL_FILTER_ID,
 302        float lowTimeFilter = TIME_MIN_VALUE,
 303        float highTimeFilter = TIME_MAX_VALUE)
 304    {
 0305        return eventsFromAPI
 306              .Where(e =>
 0307                   e.trending &&
 308                   FrequencyFilterQuery(e, frequencyFilter) &&
 309                   CategoryFilterQuery(e, categoryFilter) &&
 310                   TimeFilterQuery(e, lowTimeFilter, highTimeFilter))
 311              .ToList();
 312    }
 313
 314    internal List<EventFromAPIModel> FilterWantToGoEvents(
 315        string frequencyFilter = ALL_FILTER_ID,
 316        string categoryFilter = ALL_FILTER_ID,
 317        float lowTimeFilter = TIME_MIN_VALUE,
 318        float highTimeFilter = TIME_MAX_VALUE)
 319    {
 0320        return eventsFromAPI
 321              .Where(e =>
 0322                   e.attending &&
 323                   FrequencyFilterQuery(e, frequencyFilter) &&
 324                   CategoryFilterQuery(e, categoryFilter) &&
 325                   TimeFilterQuery(e, lowTimeFilter, highTimeFilter))
 326              .ToList();
 327    }
 328
 329    private static bool FrequencyFilterQuery(EventFromAPIModel e, string frequencyFilter) =>
 0330        frequencyFilter == ALL_FILTER_ID ||
 331        (frequencyFilter == RECURRING_EVENT_FREQUENCY_FILTER_ID ?
 332            e.duration > TimeSpan.FromDays(1).TotalMilliseconds || e.recurrent :
 333            e.duration <= TimeSpan.FromDays(1).TotalMilliseconds);
 334
 335    private static bool CategoryFilterQuery(EventFromAPIModel e, string categoryFilter) =>
 0336        categoryFilter == ALL_FILTER_ID || e.categories.Contains(categoryFilter);
 337
 338    private static bool TimeFilterQuery(EventFromAPIModel e, float lowTimeFilter, float highTimeFilter) =>
 0339        IsTimeInRange(e.start_at, lowTimeFilter, highTimeFilter);
 340
 341    public void ShowMoreEvents()
 342    {
 2343        int numberOfExtraItemsToAdd = ((int)Mathf.Ceil((float)availableUISlots / view.currentEventsPerRow) * view.curren
 2344        int numberOfItemsToAdd = (view.currentEventsPerRow * SHOW_MORE_ROWS_INCREMENT) + numberOfExtraItemsToAdd;
 345
 2346        List<EventFromAPIModel> eventsFiltered = availableUISlots + numberOfItemsToAdd <= eventsFromAPI.Count
 347            ? eventsFromAPI.GetRange(availableUISlots, numberOfItemsToAdd)
 348            : eventsFromAPI.GetRange(availableUISlots, eventsFromAPI.Count - availableUISlots);
 349
 2350        view.AddEvents(PlacesAndEventsCardsFactory.CreateEventsCards(eventsFiltered));
 351
 2352        availableUISlots += numberOfItemsToAdd;
 2353        if (availableUISlots > eventsFromAPI.Count)
 0354            availableUISlots = eventsFromAPI.Count;
 355
 2356        view.SetShowMoreEventsButtonActive(availableUISlots < eventsFromAPI.Count);
 2357    }
 358
 359    internal void ShowEventDetailedInfo(EventCardComponentModel eventModel)
 360    {
 1361        view.ShowEventModal(eventModel);
 1362        exploreV2Analytics.SendClickOnEventInfo(eventModel.eventId, eventModel.eventName, !string.IsNullOrEmpty(eventMod
 1363    }
 364
 365    internal void OnJumpInToEvent(EventFromAPIModel eventFromAPI)
 366    {
 1367        JumpInToEvent(eventFromAPI);
 1368        view.HideEventModal();
 369
 1370        OnCloseExploreV2?.Invoke();
 1371        exploreV2Analytics.SendEventTeleport(eventFromAPI.id, eventFromAPI.name, eventFromAPI.world, new Vector2Int(even
 1372    }
 373
 374    private void SubscribeToEvent(string eventId, bool isWorld)
 375    {
 0376        if (userProfileBridge.GetOwn().isGuest)
 0377            ConnectWallet();
 378        else
 379        {
 0380            eventsAPIApiController.RegisterParticipation(eventId);
 0381            exploreV2Analytics.SendParticipateEvent(eventId, isWorld);
 382        }
 0383    }
 384
 385    private void UnsubscribeToEvent(string eventId, bool isWorld)
 386    {
 0387        eventsAPIApiController.RemoveParticipation(eventId);
 0388        exploreV2Analytics.SendRemoveParticipateEvent(eventId, isWorld);
 0389    }
 390
 391    private void OnChannelToJoinChanged(string currentChannelId, string previousChannelId)
 392    {
 0393        if (!string.IsNullOrEmpty(currentChannelId))
 0394            return;
 395
 0396        view.HideEventModal();
 0397        OnCloseExploreV2?.Invoke();
 0398    }
 399
 400    /// <summary>
 401    /// Makes a jump in to the event defined by the given place data from API.
 402    /// </summary>
 403    /// <param name="eventFromAPI">Event data from API.</param>
 404    public static void JumpInToEvent(EventFromAPIModel eventFromAPI)
 405    {
 2406        Vector2Int coords = new Vector2Int(eventFromAPI.coordinates[0], eventFromAPI.coordinates[1]);
 407
 2408        if (string.IsNullOrEmpty(eventFromAPI.server))
 2409            Environment.i.world.teleportController.Teleport(coords.x, coords.y);
 410        else
 0411            Environment.i.world.teleportController.JumpIn(coords.x, coords.y, eventFromAPI.server);
 0412    }
 413
 414    private void RequestAndLoadCategories()
 415    {
 1416        eventsAPIApiController.GetCategories(
 417            onSuccess: categoryList =>
 418            {
 0419                List<CategoryFromAPIModel> categoriesInUse = new ();
 0420                foreach (CategoryFromAPIModel category in categoryList)
 421                {
 0422                    foreach (EventFromAPIModel loadedEvent in eventsFromAPI)
 423                    {
 0424                        if (!loadedEvent.categories.Contains(category.name))
 425                            continue;
 426
 0427                        categoriesInUse.Add(category);
 0428                        break;
 429                    }
 430                }
 431
 0432                view.SetCategories(PlacesAndEventsCardsFactory.ConvertCategoriesResponseToToggleModel(categoriesInUse));
 0433            },
 0434            onFail: error => { Debug.LogError($"Error receiving categories from the API: {error}"); });
 1435    }
 436
 437    private static bool IsTimeInRange(string dateTime, float lowTimeValue, float highTimeValue)
 438    {
 0439        string startTimeString = ConvertToTimeString(lowTimeValue);
 0440        string endTimeString = ConvertToTimeString(highTimeValue);
 441
 0442        TimeSpan startTime = lowTimeValue < TIME_MAX_VALUE ? TimeSpan.Parse(startTimeString) : TimeSpan.FromDays(1);
 0443        TimeSpan endTime = highTimeValue < TIME_MAX_VALUE ? TimeSpan.Parse(endTimeString) : TimeSpan.FromDays(1);
 0444        TimeSpan currentTime = Convert.ToDateTime(dateTime).ToUniversalTime().TimeOfDay;
 0445        return currentTime >= startTime && currentTime <= endTime;
 446    }
 447
 448    private static string ConvertToTimeString(float hours)
 449    {
 0450        var wholeHours = (int)(hours / 2);
 0451        int minutes = (int)(hours % 2) * 30;
 0452        return $"{wholeHours:D2}:{minutes:D2}";
 453    }
 454}

Methods/Properties

EventsSubSectionComponentController(IEventsSubSectionComponentView, IEventsAPIController, ExploreV2Analytics.IExploreV2Analytics, DCL.DataStore, IUserProfileBridge, DCLServices.PlacesAPIService.IPlacesAPIService, DCLServices.WorldsAPIService.IWorldsAPIService)
ConnectWallet()
Dispose()
FirstLoading()
RequestAllEvents()
RequestAllFromAPI()
OnRequestedEventsUpdated(System.Collections.Generic.List[EventFromAPIModel])
<OnRequestedEventsUpdated()
ApplyEventTypeFilters()
ApplyEventFrequencyFilter()
ApplyEventCategoryFilter()
ApplyEventTimeFilter()
LoadFilteredEvents()
FilterUpcomingEvents(System.String, System.String, System.Single, System.Single, System.Boolean)
FilterFeaturedEvents(System.Boolean, System.String, System.String, System.Single, System.Single)
FilterTrendingEvents(System.String, System.String, System.Single, System.Single)
FilterWantToGoEvents(System.String, System.String, System.Single, System.Single)
FrequencyFilterQuery(EventFromAPIModel, System.String)
CategoryFilterQuery(EventFromAPIModel, System.String)
TimeFilterQuery(EventFromAPIModel, System.Single, System.Single)
ShowMoreEvents()
ShowEventDetailedInfo(EventCardComponentModel)
OnJumpInToEvent(EventFromAPIModel)
SubscribeToEvent(System.String, System.Boolean)
UnsubscribeToEvent(System.String, System.Boolean)
OnChannelToJoinChanged(System.String, System.String)
JumpInToEvent(EventFromAPIModel)
RequestAndLoadCategories()
IsTimeInRange(System.String, System.Single, System.Single)
ConvertToTimeString(System.Single)