using System; using Core.TaskSystem; using Michsky.UI.Reach; using UnityEngine; using UnityEngine.Events; namespace UI.Tasks { public class TaskListItemView : MonoBehaviour { [SerializeField] private ButtonManager button; [Header("Status Presentation")] [SerializeField] private Sprite todoIcon; [SerializeField] private Sprite completedIcon; [SerializeField] private Sprite expiredIcon; [SerializeField] private string todoPrefix = ""; [SerializeField] private string completedPrefix = ""; [SerializeField] private string expiredPrefix = ""; TaskEntry task; Action onClicked; UnityAction clickAction; void Awake() { if (button == null) { button = GetComponent(); } } public void Bind(TaskEntry task, Action onClicked) { this.task = task; this.onClicked = onClicked; if (button == null) { Debug.LogError($"{nameof(TaskListItemView)} on '{name}' is missing ButtonManager reference."); return; } if (clickAction != null) { button.onClick.RemoveListener(clickAction); } clickAction = HandleClick; button.onClick.AddListener(clickAction); ApplyPresentation(task); } void OnDestroy() { if (button != null && clickAction != null) { button.onClick.RemoveListener(clickAction); } } void HandleClick() { onClicked?.Invoke(task); } void ApplyPresentation(TaskEntry task) { if (task == null) { if (button != null) { button.SetText(string.Empty); } return; } (Sprite icon, string prefix) = task.status switch { TaskStatus.Completed => (completedIcon, completedPrefix), TaskStatus.Expired => (expiredIcon, expiredPrefix), _ => (todoIcon, todoPrefix) }; button.enableIcon = icon != null; button.buttonIcon = icon; string label = string.IsNullOrEmpty(prefix) ? task.ShortName : $"{prefix}{task.ShortName}"; button.SetText(label); } } }