using Microsoft.AspNetCore.Components; using Microsoft.EntityFrameworkCore; using SpotifyAPI.Web; using SpotiParty.Web.Models; using SpotiParty.Web.Services; namespace SpotiParty.Web.Components.Pages; public partial class EnqueuePage(AuthorizationHandler authHandler, NavigationManager navigator, DatabaseContext context, DashboardAuthHandler authContext) : ComponentBase { [Parameter] public string EventId { get; set; } = string.Empty; private Event? _event; private readonly int _currentYear = DateTime.Now.Year; private SpotifyClient _client = null!; private string _searchText = string.Empty; private List _tracks = new(); private bool _isLoading; private FullTrack? _selectedTrack; private bool _isAdding; private bool _success; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); if (!Guid.TryParse(EventId, out var guid)) { navigator.NavigateTo("/", forceLoad: true); return; } _event = await context.Events .Include(@event => @event.Host) .FirstOrDefaultAsync(e => e.Id == guid); if (_event is null) { navigator.NavigateTo("/", forceLoad: true); return; } StateHasChanged(); var currentUser = await authContext.GetCurrentUser(); var now = DateTime.Now; if ((_event.Start > now || _event.End < now) && currentUser?.UserId != _event.Host.UserId) { navigator.NavigateTo("/", forceLoad: true); return; } var client = await authHandler.ConfigureClient(_event.Host.UserId); if (client is null) { navigator.NavigateTo("/", forceLoad: true); return; } _client = client; } private async Task ExecuteSearch() { if (_isLoading) return; if (string.IsNullOrWhiteSpace(_searchText)) return; _isLoading = true; _tracks.Clear(); StateHasChanged(); var request = new SearchRequest(SearchRequest.Types.Track, _searchText); var response = await _client.Search.Item(request); var responseTracks = response.Tracks.Items ?? []; foreach (var track in responseTracks) { _tracks.Add(track); } _isLoading = false; } private void OnTrackClick(FullTrack track) { if (_selectedTrack is not null) return; _selectedTrack = track; } private void DialogDismiss() { if (_isAdding) return; _selectedTrack = null; } private async Task DialogAccept() { if (_selectedTrack is null || _isAdding) return; _isAdding = true; var request = new PlayerAddToQueueRequest(_selectedTrack.Uri); await _client.Player.AddToQueue(request); _isAdding = false; _success = true; StateHasChanged(); await Task.Delay(2000); _success = false; _selectedTrack = null; } }