using ModVersionChecker.managers.interfaces; using ModVersionChecker.service.interfaces; namespace ModVersionChecker.ui.forms { public class AppDetailsForm : Form { private TextBox _searchBox; private ListBox _resultsList; private Button _addButton; private readonly IApiService _apiService; private readonly IAppService _appService; public App? SelectedApp { get; private set; } public event EventHandler OnAppAdded; public AppDetailsForm( IApiService apiService, IAppService appService ) { _apiService = apiService ?? throw new ArgumentNullException(nameof(apiService)); _appService = appService ?? throw new ArgumentNullException(nameof(appService)); InitializeComponent(); } private void InitializeComponent() { Text = "Search and Add App"; Width = 400; Height = 500; Padding = new Padding(20); StartPosition = FormStartPosition.CenterParent; _searchBox = new TextBox { Dock = DockStyle.Top, PlaceholderText = "Search..." }; _resultsList = new ListBox { Dock = DockStyle.Fill }; _addButton = new Button { Text = "Add Selected", Dock = DockStyle.Bottom, Enabled = false }; _searchBox.TextChanged += async (s, e) => await UpdateResultsAync(); _resultsList.SelectedIndexChanged += (s, e) => _addButton.Enabled = _resultsList.SelectedItem != null; _resultsList.DoubleClick += (s, e) => AddSelected(); _addButton.Click += (s, e) => AddSelected(); Controls.Add(_resultsList); Controls.Add(_addButton); Controls.Add(_searchBox); } private async Task UpdateResultsAync() { var query = _searchBox.Text.Trim().ToLower(); if (query.Length < 3) { return; } if (string.IsNullOrEmpty(query)) { _resultsList.DataSource = null; return; } var apiResults = await _apiService.SearchApps(query); _resultsList.DataSource = _appService.PurgeExisitingApps(apiResults); _resultsList.DisplayMember = "Name"; } private void AddSelected() { if (_resultsList.SelectedItem is App app) { SelectedApp = app; _appService.CreateApp(app); DialogResult = DialogResult.OK; OnAppAdded?.Invoke(this, "App saved"); Close(); } } } }