using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public sealed class ShopView : MonoBehaviour { [SerializeField] private Transform itemContainer; [SerializeField] private ShopItemView itemPrefab; [SerializeField] private TMP_Text currencyText; [SerializeField] private Button closeButton; private readonly List spawnedItems = new(); public event Action OnBuyClicked; private void Awake() { if (closeButton != null) closeButton.onClick.AddListener(Hide); } private void OnDestroy() { if (closeButton != null) closeButton.onClick.RemoveListener(Hide); } public void Show() => gameObject.SetActive(true); public void Hide() => gameObject.SetActive(false); public bool IsVisible => gameObject.activeSelf; public void Populate(IReadOnlyList catalog, ShopModel model) { ClearItems(); for (int i = 0; i < catalog.Count; i++) { var data = catalog[i]; if (data == null) continue; var item = Instantiate(itemPrefab, itemContainer); var state = model.GetItemState(data); item.Setup(data, state); item.OnBuyClicked += HandleBuy; spawnedItems.Add(item); } } public void RefreshStates(IReadOnlyList catalog, ShopModel model) { for (int i = 0; i < spawnedItems.Count && i < catalog.Count; i++) { var state = model.GetItemState(catalog[i]); spawnedItems[i].SetState(state); } } public void UpdateCurrencyDisplay(int currency) { if (currencyText != null) currencyText.text = currency.ToString(); } private void ClearItems() { for (int i = 0; i < spawnedItems.Count; i++) { spawnedItems[i].OnBuyClicked -= HandleBuy; Destroy(spawnedItems[i].gameObject); } spawnedItems.Clear(); } private void HandleBuy(ModifierData data) => OnBuyClicked?.Invoke(data); }