From 9cc62ac311a56c28ff0e2e6ad170fc86f6e81e2c Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 27 Feb 2024 09:50:20 +0100 Subject: [PATCH] refactor!: implement LoadNextPage for LibraryWithFilters --- src/deep_links/mod.rs | 34 ++++---- src/models/library_with_filters.rs | 83 ++++++++++--------- src/runtime/msg/action.rs | 7 ++ .../deep_links/library_deep_links.rs | 4 +- 4 files changed, 69 insertions(+), 59 deletions(-) diff --git a/src/deep_links/mod.rs b/src/deep_links/mod.rs index 573ec3ef3..96a74b910 100644 --- a/src/deep_links/mod.rs +++ b/src/deep_links/mod.rs @@ -519,30 +519,24 @@ impl From<(&String, &LibraryRequest)> for LibraryDeepLinks { "stremio:///{}/{}?{}", root, utf8_percent_encode(r#type, URI_COMPONENT_ENCODE_SET), - query_params_encode(&[ - ( - "sort", - serde_json::to_value(&request.sort) - .unwrap() - .as_str() - .unwrap() - ), - ("page", &request.page.to_string()) - ]), + query_params_encode(&[( + "sort", + serde_json::to_value(&request.sort) + .unwrap() + .as_str() + .unwrap() + )]), ), _ => format!( "stremio:///{}?{}", root, - query_params_encode(&[ - ( - "sort", - serde_json::to_value(&request.sort) - .unwrap() - .as_str() - .unwrap() - ), - ("page", &request.page.to_string()) - ]), + query_params_encode(&[( + "sort", + serde_json::to_value(&request.sort) + .unwrap() + .as_str() + .unwrap() + )]), ), }, } diff --git a/src/models/library_with_filters.rs b/src/models/library_with_filters.rs index 4a51a5c0c..ca2899e53 100644 --- a/src/models/library_with_filters.rs +++ b/src/models/library_with_filters.rs @@ -1,6 +1,5 @@ use std::{iter, marker::PhantomData, num::NonZeroUsize}; -use boolinator::Boolinator; use derivative::Derivative; use derive_more::Deref; use itertools::Itertools; @@ -14,7 +13,7 @@ use crate::{ ctx::Ctx, }, runtime::{ - msg::{Action, ActionLoad, Internal, Msg}, + msg::{Action, ActionLibraryWithFilters, ActionLoad, Internal, Msg}, Effects, Env, UpdateWithCtx, }, types::{ @@ -106,7 +105,6 @@ pub struct SelectablePage { pub struct Selectable { pub types: Vec, pub sorts: Vec, - pub prev_page: Option, pub next_page: Option, } @@ -175,6 +173,32 @@ impl UpdateWithCtx for LibraryWithFilters .join(selectable_effects) .join(catalog_effects) } + Msg::Action(Action::LibraryWithFilters(ActionLibraryWithFilters::LoadNextPage)) => { + match self.selectable.next_page.as_ref() { + Some(next_page) => { + let next_selected = Some(Selected { + request: next_page.request.to_owned(), + }); + let selected_effects = eq_update(&mut self.selected, next_selected); + let selectable_effects = selectable_update::( + &mut self.selectable, + &self.selected, + &ctx.library, + &ctx.notifications, + ); + let catalog_effects = catalog_update::( + &mut self.catalog, + &self.selected, + &ctx.library, + &ctx.notifications, + ); + selected_effects + .join(selectable_effects) + .join(catalog_effects) + } + _ => Effects::none().unchanged(), + } + } Msg::Internal(Internal::LibraryChanged(_)) => { let selectable_effects = selectable_update::( &mut self.selectable, @@ -259,43 +283,29 @@ fn selectable_update( .unwrap_or_default(), }) .collect(); - let (prev_page, next_page) = match selected { - Some(selected) => { - let prev_page = (selected.request.page.get() > 1) - .as_option() - .map(|_| SelectablePage { - request: LibraryRequest { - page: LibraryRequestPage( - NonZeroUsize::new(selected.request.page.get() - 1).unwrap(), - ), - ..selected.request.to_owned() - }, - }); - let next_page = library - .items - .values() - .filter(|library_item| F::predicate(library_item, notifications)) - .filter(|library_item| match &selected.request.r#type { - Some(r#type) => library_item.r#type == *r#type, - None => true, - }) - .nth(selected.request.page.get() * CATALOG_PAGE_SIZE) - .map(|_| SelectablePage { - request: LibraryRequest { - page: LibraryRequestPage( - NonZeroUsize::new(selected.request.page.get() + 1).unwrap(), - ), - ..selected.request.to_owned() - }, - }); - (prev_page, next_page) - } + let next_page = match selected { + Some(selected) => library + .items + .values() + .filter(|library_item| F::predicate(library_item, notifications)) + .filter(|library_item| match &selected.request.r#type { + Some(r#type) => library_item.r#type == *r#type, + None => true, + }) + .nth(selected.request.page.get() * CATALOG_PAGE_SIZE) + .map(|_| SelectablePage { + request: LibraryRequest { + page: LibraryRequestPage( + NonZeroUsize::new(selected.request.page.get() + 1).unwrap(), + ), + ..selected.request.to_owned() + }, + }), _ => Default::default(), }; let next_selectable = Selectable { types: selectable_types, sorts: selectable_sorts, - prev_page, next_page, }; eq_update(selectable, next_selectable) @@ -321,8 +331,7 @@ fn catalog_update( Sort::TimesWatched => b.state.times_watched.cmp(&a.state.times_watched), Sort::Name => a.name.to_lowercase().cmp(&b.name.to_lowercase()), }) - .skip((selected.request.page.get() - 1) * CATALOG_PAGE_SIZE) - .take(CATALOG_PAGE_SIZE) + .take(selected.request.page.get() * CATALOG_PAGE_SIZE) .cloned() .collect(), _ => vec![], diff --git a/src/runtime/msg/action.rs b/src/runtime/msg/action.rs index 96cd6d569..77ace2e13 100644 --- a/src/runtime/msg/action.rs +++ b/src/runtime/msg/action.rs @@ -83,6 +83,12 @@ pub enum ActionLibraryByType { LoadNextPage(usize), } +#[derive(Clone, Deserialize, Debug)] +#[serde(tag = "action", content = "args")] +pub enum ActionLibraryWithFilters { + LoadNextPage, +} + #[derive(Clone, Deserialize, Debug)] #[serde(tag = "action", content = "args")] pub enum ActionMetaDetails { @@ -199,6 +205,7 @@ pub enum Action { CatalogWithFilters(ActionCatalogWithFilters), CatalogsWithExtra(ActionCatalogsWithExtra), LibraryByType(ActionLibraryByType), + LibraryWithFilters(ActionLibraryWithFilters), MetaDetails(ActionMetaDetails), StreamingServer(ActionStreamingServer), Player(ActionPlayer), diff --git a/src/unit_tests/deep_links/library_deep_links.rs b/src/unit_tests/deep_links/library_deep_links.rs index 7d607c4aa..62a7a78e0 100644 --- a/src/unit_tests/deep_links/library_deep_links.rs +++ b/src/unit_tests/deep_links/library_deep_links.rs @@ -20,7 +20,7 @@ fn library_deep_links_request_type() { let ldl = LibraryDeepLinks::try_from((&root, &request)).unwrap(); assert_eq!( ldl.library, - "stremio:///library/movie?sort=lastwatched&page=1".to_string() + "stremio:///library/movie?sort=lastwatched".to_string() ); } @@ -35,6 +35,6 @@ fn library_deep_links_request_no_type() { let ldl = LibraryDeepLinks::try_from((&root, &request)).unwrap(); assert_eq!( ldl.library, - "stremio:///library?sort=lastwatched&page=1".to_string() + "stremio:///library?sort=lastwatched".to_string() ); }