Cleaned up active radarr block delegation to not have giant match arms and instead just check an array, and fixed a UI bug that shows an error message if a movie is already in a user's library.

This commit is contained in:
2023-08-08 10:50:05 -06:00
parent fa381cea01
commit dcc251ae01
9 changed files with 186 additions and 85 deletions
@@ -184,36 +184,58 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
.items
.is_empty() =>
{
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
self
let tmdb_id = self
.app
.data
.radarr_data
.add_movie_monitor_list
.set_items(Vec::from_iter(Monitor::iter()));
self
.add_searched_movies
.current_selection()
.tmdb_id
.clone();
if self
.app
.data
.radarr_data
.add_movie_minimum_availability_list
.set_items(Vec::from_iter(MinimumAvailability::iter()));
let mut quality_profile_names: Vec<String> = self
.app
.data
.radarr_data
.quality_profile_map
.values()
.cloned()
.collect();
quality_profile_names.sort();
self
.app
.data
.radarr_data
.add_movie_quality_profile_list
.set_items(quality_profile_names);
.movies
.items
.iter()
.any(|movie| movie.tmdb_id == tmdb_id)
{
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddMovieAlreadyInLibrary.into());
} else {
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
self
.app
.data
.radarr_data
.add_movie_monitor_list
.set_items(Vec::from_iter(Monitor::iter()));
self
.app
.data
.radarr_data
.add_movie_minimum_availability_list
.set_items(Vec::from_iter(MinimumAvailability::iter()));
let mut quality_profile_names: Vec<String> = self
.app
.data
.radarr_data
.quality_profile_map
.values()
.cloned()
.collect();
quality_profile_names.sort();
self
.app
.data
.radarr_data
.add_movie_quality_profile_list
.set_items(quality_profile_names);
}
}
ActiveRadarrBlock::AddMoviePrompt => match self.app.data.radarr_data.selected_block {
ActiveRadarrBlock::AddMovieConfirmPrompt => {
@@ -261,7 +283,8 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for AddMovieHandler<'a> {
}
ActiveRadarrBlock::AddMovieSelectMonitor
| ActiveRadarrBlock::AddMovieSelectMinimumAvailability
| ActiveRadarrBlock::AddMovieSelectQualityProfile => self.app.pop_navigation_stack(),
| ActiveRadarrBlock::AddMovieSelectQualityProfile
| ActiveRadarrBlock::AddMovieAlreadyInLibrary => self.app.pop_navigation_stack(),
_ => (),
}
}
@@ -419,6 +442,7 @@ mod tests {
use rstest::rstest;
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::models::radarr_models::Movie;
use crate::network::radarr_network::RadarrEvent;
use super::*;
@@ -506,6 +530,33 @@ mod tests {
);
}
#[test]
fn test_add_movie_search_results_submit_movie_already_in_library() {
let mut app = App::default();
app
.data
.radarr_data
.add_searched_movies
.set_items(vec![AddMovieSearchResult::default()]);
app
.data
.radarr_data
.movies
.set_items(vec![Movie::default()]);
AddMovieHandler::with(
&SUBMIT_KEY,
&mut app,
&ActiveRadarrBlock::AddMovieSearchResults,
)
.handle();
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::AddMovieAlreadyInLibrary.into()
);
}
#[test]
fn test_add_movie_prompt_prompt_decline() {
let mut app = App::default();
@@ -633,6 +684,26 @@ mod tests {
assert!(app.should_ignore_quit_key);
}
#[test]
fn test_add_movie_already_in_library_esc() {
let mut app = App::default();
app.data.radarr_data = create_test_radarr_data();
app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchResults.into());
app.push_navigation_stack(ActiveRadarrBlock::AddMovieAlreadyInLibrary.into());
AddMovieHandler::with(
&ESC_KEY,
&mut app,
&ActiveRadarrBlock::AddMovieAlreadyInLibrary,
)
.handle();
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::AddMovieSearchResults.into()
);
}
#[test]
fn test_add_movie_prompt_esc() {
let mut app = App::default();
+8 -18
View File
@@ -1,5 +1,7 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::radarr::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, COLLECTION_DETAILS_BLOCKS, MOVIE_DETAILS_BLOCKS,
};
use crate::handlers::radarr_handlers::add_movie_handler::AddMovieHandler;
use crate::handlers::radarr_handlers::collection_details_handler::CollectionDetailsHandler;
use crate::handlers::radarr_handlers::movie_details_handler::MovieDetailsHandler;
@@ -22,26 +24,13 @@ pub(super) struct RadarrHandler<'a> {
impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for RadarrHandler<'a> {
fn handle(&mut self) {
match self.active_radarr_block {
ActiveRadarrBlock::MovieDetails
| ActiveRadarrBlock::MovieHistory
| ActiveRadarrBlock::FileInfo
| ActiveRadarrBlock::Cast
| ActiveRadarrBlock::Crew
| ActiveRadarrBlock::AutomaticallySearchMoviePrompt
| ActiveRadarrBlock::RefreshAndScanPrompt
| ActiveRadarrBlock::ManualSearch
| ActiveRadarrBlock::ManualSearchConfirmPrompt => {
_ if MOVIE_DETAILS_BLOCKS.contains(self.active_radarr_block) => {
MovieDetailsHandler::with(self.key, self.app, self.active_radarr_block).handle()
}
ActiveRadarrBlock::CollectionDetails | ActiveRadarrBlock::ViewMovieOverview => {
_ if COLLECTION_DETAILS_BLOCKS.contains(self.active_radarr_block) => {
CollectionDetailsHandler::with(self.key, self.app, self.active_radarr_block).handle()
}
ActiveRadarrBlock::AddMovieSearchInput
| ActiveRadarrBlock::AddMovieSearchResults
| ActiveRadarrBlock::AddMoviePrompt
| ActiveRadarrBlock::AddMovieSelectMinimumAvailability
| ActiveRadarrBlock::AddMovieSelectMonitor
| ActiveRadarrBlock::AddMovieSelectQualityProfile => {
_ if ADD_MOVIE_BLOCKS.contains(self.active_radarr_block) => {
AddMovieHandler::with(self.key, self.app, self.active_radarr_block).handle()
}
_ => self.handle_key_event(),
@@ -1263,7 +1252,8 @@ mod tests {
ActiveRadarrBlock::AddMoviePrompt,
ActiveRadarrBlock::AddMovieSelectMonitor,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
ActiveRadarrBlock::AddMovieSelectQualityProfile
ActiveRadarrBlock::AddMovieSelectQualityProfile,
ActiveRadarrBlock::AddMovieAlreadyInLibrary
)]
active_radarr_block: ActiveRadarrBlock,
) {