105 lines
3.0 KiB
C#
105 lines
3.0 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, 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<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(@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;
|
|
}
|
|
} |