From f19c1a7216b5f7609ac4e01de128b9c36adf1e8a Mon Sep 17 00:00:00 2001 From: Berack96 Date: Tue, 20 Jan 2026 15:12:37 +0100 Subject: [PATCH] refactor table for reuse --- Components/Layout/MovieTable.razor | 35 ++++++++++++++++++++++++++++++ Components/Pages/Favorites.razor | 20 ++++++++++------- Components/Pages/Home.razor | 30 +------------------------ Components/Pages/MovieDetail.razor | 2 +- Models/Movie.cs | 5 +---- Models/MovieSearch.cs | 5 +---- Services/ManageFavorite.cs | 28 ++++++++++++------------ 7 files changed, 65 insertions(+), 60 deletions(-) create mode 100644 Components/Layout/MovieTable.razor diff --git a/Components/Layout/MovieTable.razor b/Components/Layout/MovieTable.razor new file mode 100644 index 0000000..eb94a65 --- /dev/null +++ b/Components/Layout/MovieTable.razor @@ -0,0 +1,35 @@ + + + + + + + + + + @if (Movies?.Search != null) + { + @foreach (var movie in Movies.Search) + { + + + + + + } + } + +
TitleYear
@movie.Title@movie.Year
+ +@inject NavigationManager NavigationManager + +@code { + + [Parameter] + public MovieSearch? Movies { get; set; } + + private async Task OnMovieSelected(string imdbID) + { + NavigationManager.NavigateTo($"/movie/{imdbID}"); + } +} \ No newline at end of file diff --git a/Components/Pages/Favorites.razor b/Components/Pages/Favorites.razor index 2662792..6b2a1f2 100644 --- a/Components/Pages/Favorites.razor +++ b/Components/Pages/Favorites.razor @@ -2,17 +2,21 @@ Favorites -

TODO

+ - - -@inject OmdbService OmdbService -@inject IJSRuntime JSRuntime +@inject ManageFavorite ManageFavorite @code { - private async Task FaiCose() + public MovieSearch? movies = null; + + protected override async Task OnInitializedAsync() { - var movies = await OmdbService.FetchMovies("Matrix"); - var movieDetail = await OmdbService.FetchMovieDetail("tt11749868"); + await ManageFavorite.LoadFavorites(); + var favoriteMovies = ManageFavorite.GetFavoriteMovies(); + movies = new MovieSearch + { + Search = favoriteMovies.ToArray(), + TotalResults = favoriteMovies.Count.ToString() + }; } } diff --git a/Components/Pages/Home.razor b/Components/Pages/Home.razor index 7d5fc28..1d1ea44 100644 --- a/Components/Pages/Home.razor +++ b/Components/Pages/Home.razor @@ -12,42 +12,14 @@ - - - - - - - - - - @if (movies?.Search != null) - { - @foreach (var movie in movies.Search) - { - - - - - - } - } - -
TitleYear
@movie.Title@movie.Year
- + @inject OmdbService OmdbService -@inject NavigationManager NavigationManager @code { private string searchTitle = ""; private MovieSearch? movies = null; - private async Task OnMovieSelected(string imdbID) - { - NavigationManager.NavigateTo($"/movie/{imdbID}"); - } - private async Task OnSearch() { movies = await OmdbService.FetchMovies(searchTitle); diff --git a/Components/Pages/MovieDetail.razor b/Components/Pages/MovieDetail.razor index 86afece..b81b1bc 100644 --- a/Components/Pages/MovieDetail.razor +++ b/Components/Pages/MovieDetail.razor @@ -71,6 +71,6 @@ private async Task ToggleFavoriteMovie() { - await ManageFavorite.ToggleFavoriteMovie(id); + await ManageFavorite.ToggleFavoriteMovie(movie!); } } diff --git a/Models/Movie.cs b/Models/Movie.cs index e59d11b..6eb8346 100644 --- a/Models/Movie.cs +++ b/Models/Movie.cs @@ -1,13 +1,10 @@ - - using System.Text.Json.Serialization; - /// /// Rappresenta un film con le sue proprietà principali. /// Non ho preso tutte le proprietà disponibili dall'API OMDB, solo quelle richieste. /// -class Movie +public class Movie { public required string Title { get; set; } public required string Year { get; set; } diff --git a/Models/MovieSearch.cs b/Models/MovieSearch.cs index d1a7f83..cbfe5c8 100644 --- a/Models/MovieSearch.cs +++ b/Models/MovieSearch.cs @@ -1,13 +1,10 @@ - - using System.Text.Json.Serialization; - /// /// Modello per rappresentare i risultati di una ricerca di film. /// Ha solo scopo di deserializzazione della risposta JSON dell'API OMDB. /// -class MovieSearch +public class MovieSearch { public required Movie[] Search { get; set; } [JsonPropertyName("totalResults")] diff --git a/Services/ManageFavorite.cs b/Services/ManageFavorite.cs index e3a7e4a..ad48753 100644 --- a/Services/ManageFavorite.cs +++ b/Services/ManageFavorite.cs @@ -8,7 +8,7 @@ class ManageFavorite(Blazored.LocalStorage.ILocalStorageService localStorage) { // Inject the local storage service private readonly Blazored.LocalStorage.ILocalStorageService LocalStorage = localStorage; - private readonly List MoviesIDs = []; + private readonly List Movies = []; /// /// Load favorite movies from local storage @@ -17,9 +17,9 @@ class ManageFavorite(Blazored.LocalStorage.ILocalStorageService localStorage) /// public async Task LoadFavorites() { - var favorites = await LocalStorage.GetItemAsync>("favorite") ?? []; - MoviesIDs.Clear(); - MoviesIDs.AddRange(favorites); + var favorites = await LocalStorage.GetItemAsync>("favorite") ?? []; + Movies.Clear(); + Movies.AddRange(favorites); } /// @@ -29,35 +29,35 @@ class ManageFavorite(Blazored.LocalStorage.ILocalStorageService localStorage) /// True if the movie is favorite, otherwise false public bool IsFavorite(string movieID) { - return MoviesIDs.Contains(movieID); + return Movies.Any(m => m.IdIMDB == movieID); } /// /// Toggle favorite status of a movie (by ID) /// - /// The movie ID to toggle + /// The movie ID to toggle /// The new favorite status - public async Task ToggleFavoriteMovie(string movieID) + public async Task ToggleFavoriteMovie(Movie movie) { - if (!IsFavorite(movieID)) + if (!IsFavorite(movie.IdIMDB)) { - MoviesIDs.Add(movieID); + Movies.Add(movie); } else { - MoviesIDs.RemoveAll(id => id == movieID); + Movies.RemoveAll(m => m.IdIMDB == movie.IdIMDB); } - await LocalStorage.SetItemAsync("favorite", MoviesIDs); - return IsFavorite(movieID); + await LocalStorage.SetItemAsync("favorite", Movies); + return IsFavorite(movie.IdIMDB); } /// /// Get the list of favorite movie IDs /// /// The list of favorite movie IDs - public List GetFavoriteMovies() + public List GetFavoriteMovies() { - return MoviesIDs; + return Movies; } } \ No newline at end of file