| | 1 | | using Cysharp.Threading.Tasks; |
| | 2 | | using DCL; |
| | 3 | | using DCL.Helpers; |
| | 4 | | using DCLServices.PlacesAPIService; |
| | 5 | | using MainScripts.DCL.Controllers.HotScenes; |
| | 6 | | using System; |
| | 7 | | using System.Collections.Generic; |
| | 8 | | using System.Linq; |
| | 9 | | using System.Threading; |
| | 10 | | using DCL.Tasks; |
| | 11 | | using DCLServices.MapRendererV2.ConsumerUtils; |
| | 12 | | using DCLServices.MapRendererV2.MapCameraController; |
| | 13 | | using ExploreV2Analytics; |
| | 14 | | using UnityEngine; |
| | 15 | |
|
| | 16 | | public class NavmapSearchController : IDisposable |
| | 17 | | { |
| | 18 | | private const string PREVIOUS_SEARCHES_KEY = "previous_searches"; |
| | 19 | |
|
| | 20 | | private const float TRANSLATION_DURATION = 1; |
| | 21 | |
|
| | 22 | | private readonly IPlacesAPIService placesAPIService; |
| | 23 | | private readonly INavmapSearchComponentView view; |
| | 24 | | private readonly IPlayerPrefs playerPrefs; |
| | 25 | | private readonly NavmapZoomViewController navmapZoomViewController; |
| | 26 | | private readonly INavmapToastViewController toastViewController; |
| | 27 | | private readonly IExploreV2Analytics exploreV2Analytics; |
| | 28 | |
|
| | 29 | | private CancellationTokenSource searchCts; |
| | 30 | | private bool isAlreadySelected = false; |
| | 31 | | private IMapCameraController mapCamera; |
| | 32 | | private bool active; |
| | 33 | |
|
| 1 | 34 | | public NavmapSearchController( |
| | 35 | | INavmapSearchComponentView view, |
| | 36 | | IPlacesAPIService placesAPIService, |
| | 37 | | IPlayerPrefs playerPrefs, |
| | 38 | | NavmapZoomViewController navmapZoomViewController, |
| | 39 | | INavmapToastViewController toastViewController, |
| | 40 | | IExploreV2Analytics exploreV2Analytics) |
| | 41 | | { |
| 1 | 42 | | this.view = view; |
| 1 | 43 | | this.placesAPIService = placesAPIService; |
| 1 | 44 | | this.playerPrefs = playerPrefs; |
| 1 | 45 | | this.navmapZoomViewController = navmapZoomViewController; |
| 1 | 46 | | this.toastViewController = toastViewController; |
| 1 | 47 | | this.exploreV2Analytics = exploreV2Analytics; |
| | 48 | |
|
| 1 | 49 | | searchCts = new CancellationTokenSource(); |
| 1 | 50 | | view.OnSelectedSearchBar += OnSelectedSearchbarChange; |
| 1 | 51 | | view.OnSearchedText += OnSearchedText; |
| 1 | 52 | | view.OnSelectedSearchRecord += OnSelectedSearchRecord; |
| 1 | 53 | | } |
| | 54 | |
|
| | 55 | | private void OnSelectedSearchRecord(Vector2Int coordinates) |
| | 56 | | { |
| 0 | 57 | | mapCamera.TranslateTo( |
| | 58 | | coordinates: coordinates, |
| | 59 | | duration: TRANSLATION_DURATION, |
| 0 | 60 | | onComplete: () => toastViewController.ShowPlaceToast(new MapRenderImage.ParcelClickData(){Parcel = coordinat |
| | 61 | |
|
| 0 | 62 | | OnSelectedSearchbarChange(false); |
| 0 | 63 | | exploreV2Analytics.SendClickedNavmapSearchResult(coordinates); |
| 0 | 64 | | } |
| | 65 | |
|
| | 66 | | public void Activate(IMapCameraController mapCameraController) |
| | 67 | | { |
| 0 | 68 | | if (active && mapCamera == mapCameraController) |
| 0 | 69 | | return; |
| | 70 | |
|
| 0 | 71 | | mapCamera = mapCameraController; |
| 0 | 72 | | active = true; |
| 0 | 73 | | } |
| | 74 | |
|
| | 75 | | public void Deactivate() |
| | 76 | | { |
| 0 | 77 | | if (!active) return; |
| 0 | 78 | | active = false; |
| 0 | 79 | | } |
| | 80 | |
|
| | 81 | | private void OnSearchedText(string searchText) |
| | 82 | | { |
| 0 | 83 | | if (string.IsNullOrEmpty(searchText)) |
| | 84 | | { |
| 0 | 85 | | GetAndShowPreviousSearches(); |
| 0 | 86 | | return; |
| | 87 | | } |
| | 88 | |
|
| 0 | 89 | | AddToPreviousSearch(searchText); |
| 0 | 90 | | searchCts = searchCts.SafeRestart(); |
| 0 | 91 | | SearchAndDisplay(searchText, searchCts).Forget(); |
| 0 | 92 | | } |
| | 93 | |
|
| | 94 | | private async UniTaskVoid SearchAndDisplay(string searchText, CancellationTokenSource cts) |
| | 95 | | { |
| 0 | 96 | | (IReadOnlyList<IHotScenesController.PlaceInfo> places, int total) searchPlaces = await placesAPIService.SearchPl |
| 0 | 97 | | List<Vector2Int> resultsCoordinates = new List<Vector2Int>(); |
| 0 | 98 | | List<string> resultsIds = new List<string>(); |
| 0 | 99 | | foreach (var place in searchPlaces.places) |
| | 100 | | { |
| 0 | 101 | | resultsCoordinates.Add(Utils.ConvertStringToVector(place.base_position)); |
| 0 | 102 | | resultsIds.Add(place.id); |
| | 103 | | } |
| 0 | 104 | | view.SetSearchResultRecords(searchPlaces.places); |
| 0 | 105 | | exploreV2Analytics.SendSearchPlaces(searchText, resultsCoordinates.ToArray(), resultsIds.ToArray(), ActionSource |
| 0 | 106 | | } |
| | 107 | |
|
| | 108 | | private void OnSelectedSearchbarChange(bool isSelected) |
| | 109 | | { |
| 0 | 110 | | if (isSelected == isAlreadySelected) |
| 0 | 111 | | return; |
| | 112 | |
|
| 0 | 113 | | isAlreadySelected = isSelected; |
| 0 | 114 | | if (isSelected) |
| 0 | 115 | | GetAndShowPreviousSearches(); |
| | 116 | | else |
| 0 | 117 | | view.ClearResults(); |
| 0 | 118 | | } |
| | 119 | |
|
| | 120 | | private void GetAndShowPreviousSearches() |
| | 121 | | { |
| 0 | 122 | | searchCts = searchCts.SafeRestart(); |
| 0 | 123 | | string[] previousSearches = GetPreviousSearches(); |
| | 124 | |
|
| 0 | 125 | | if (previousSearches.Length > 0) |
| 0 | 126 | | view.SetHistoryRecords(previousSearches); |
| 0 | 127 | | } |
| | 128 | |
|
| | 129 | | public void Dispose() |
| | 130 | | { |
| 0 | 131 | | view.OnSelectedSearchBar -= OnSelectedSearchbarChange; |
| 0 | 132 | | view.OnSearchedText -= OnSearchedText; |
| 0 | 133 | | view.OnSelectedSearchRecord -= OnSelectedSearchRecord; |
| 0 | 134 | | } |
| | 135 | |
|
| | 136 | | private void AddToPreviousSearch(string searchToAdd) |
| | 137 | | { |
| 0 | 138 | | string playerPrefsPreviousSearches = playerPrefs.GetString(PREVIOUS_SEARCHES_KEY); |
| 0 | 139 | | string[] previousSearches = string.IsNullOrEmpty(playerPrefsPreviousSearches) ? Array.Empty<string>() : playerPr |
| 0 | 140 | | switch (previousSearches.Length) |
| | 141 | | { |
| 0 | 142 | | case > 0 when previousSearches[0] == searchToAdd: |
| 0 | 143 | | return; |
| | 144 | | case < 5: |
| 0 | 145 | | playerPrefs.Set(PREVIOUS_SEARCHES_KEY, previousSearches.Length > 0 ? searchToAdd + "|" + string.Join("|" |
| 0 | 146 | | break; |
| | 147 | | default: |
| 0 | 148 | | playerPrefs.Set(PREVIOUS_SEARCHES_KEY, searchToAdd + "|" + string.Join("|", previousSearches.Take(4))); |
| | 149 | | break; |
| | 150 | | } |
| 0 | 151 | | } |
| | 152 | |
|
| | 153 | | private string[] GetPreviousSearches() |
| | 154 | | { |
| 0 | 155 | | string previousSearches = playerPrefs.GetString(PREVIOUS_SEARCHES_KEY, ""); |
| 0 | 156 | | return string.IsNullOrEmpty(previousSearches) ? Array.Empty<string>() : previousSearches.Split('|'); |
| | 157 | | } |
| | 158 | | } |