Files
SpotiParty/SpotiParty.Web/Components/Pages/EnqueuePage.razor.cs

103 lines
2.9 KiB
C#

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) : 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<FullTrack> _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(e => e.Host)
.FirstOrDefaultAsync(e => e.Id == guid);
if (_event is null) {
navigator.NavigateTo("/", forceLoad: true);
return;
}
StateHasChanged();
var now = DateTime.Now;
if (_event.Start > now || _event.End < now) {
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;
}
}