Files
WatchIt/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs

128 lines
3.9 KiB
C#

using System.Diagnostics;
using Microsoft.AspNetCore.Components;
using WatchIt.Common.Model.Genres;
using WatchIt.Common.Model.Media;
using WatchIt.Common.Model.Movies;
using WatchIt.Common.Model.Series;
using WatchIt.Website.Services.Utility.Authentication;
using WatchIt.Website.Services.WebAPI.Media;
using WatchIt.Website.Services.WebAPI.Movies;
using WatchIt.Website.Services.WebAPI.Series;
namespace WatchIt.Website.Pages;
public partial class MediaPage : ComponentBase
{
#region SERVICES
[Inject] public NavigationManager NavigationManager { get; set; } = default!;
[Inject] public IAuthenticationService AuthenticationService { get; set; } = default!;
[Inject] public IMediaWebAPIService MediaWebAPIService { get; set; } = default!;
[Inject] public IMoviesWebAPIService MoviesWebAPIService { get; set; } = default!;
[Inject] public ISeriesWebAPIService SeriesWebAPIService { get; set; } = default!;
#endregion
#region PARAMETERS
[Parameter] public long Id { get; set; }
#endregion
#region FIELDS
private bool _loaded;
private string? _error;
private MediaResponse? _media;
private User? _user;
private MediaPhotoResponse? _background;
private MediaPosterResponse? _poster;
private IEnumerable<GenreResponse> _genres;
private MediaRatingResponse _globalRating;
private MovieResponse? _movie;
private SeriesResponse? _series;
private short? _userRating;
#endregion
#region PRIVATE METHODS
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
List<Task> step1Tasks = new List<Task>();
List<Task> step2Tasks = new List<Task>();
List<Task> endTasks = new List<Task>();
// STEP 0
step1Tasks.AddRange(
[
MediaWebAPIService.GetMedia(Id, data => _media = data, () => _error = $"Media with id {Id} was not found")
]);
// STEP 1
await Task.WhenAll(step1Tasks);
if (_error is null)
{
step2Tasks.AddRange(
[
Task.Run(async () => _user = await AuthenticationService.GetUserAsync())
]);
endTasks.AddRange(
[
MediaWebAPIService.PostMediaView(Id),
MediaWebAPIService.GetPhotoMediaRandomBackground(Id, data => _background = data),
MediaWebAPIService.GetPoster(Id, data => _poster = data),
MediaWebAPIService.GetMediaGenres(Id, data => _genres = data),
MediaWebAPIService.GetMediaRating(Id, data => _globalRating = data),
_media.Type == MediaType.Movie ? MoviesWebAPIService.GetMovie(Id, data => _movie = data) : SeriesWebAPIService.GetSeries(Id, data => _series = data),
]);
}
// STEP 2
await Task.WhenAll(step2Tasks);
if (_error is null && _user is not null)
{
endTasks.AddRange(
[
MediaWebAPIService.GetMediaRatingByUser(Id, _user.Id, data => _userRating = data)
]);
}
// END
await Task.WhenAll(endTasks);
_loaded = true;
StateHasChanged();
}
}
private async Task AddRating(short rating)
{
if (_userRating == rating)
{
await MediaWebAPIService.DeleteMediaRating(Id);
_userRating = null;
}
else
{
await MediaWebAPIService.PutMediaRating(Id, new MediaRatingRequest(rating));
_userRating = rating;
}
await MediaWebAPIService.GetMediaRating(Id, data => _globalRating = data);
}
#endregion
}