media class on page change
Build and Push Image / build-and-push (push) Successful in 4m45s

This commit is contained in:
2026-03-30 14:19:29 -04:00
parent 5caa08e145
commit 44425723c6
2 changed files with 33 additions and 25 deletions
+31 -23
View File
@@ -21,7 +21,12 @@ pub struct MediaGridProps
#[component] #[component]
pub fn MediaGrid(mut props: MediaGridProps) -> Element pub fn MediaGrid(mut props: MediaGridProps) -> Element
{ {
let mut error_display = use_signal(|| {
rsx! {}
});
let mut items = use_signal::<Option<Vec<MediaModel>>>(|| None);
let media_result = use_resource(use_reactive!(|(props)| async move { let media_result = use_resource(use_reactive!(|(props)| async move {
items.set(None);
let mut client = get_rpc_client(); let mut client = get_rpc_client();
let request = PageFilter { let request = PageFilter {
page_size: Some(props.page_size.cloned()), page_size: Some(props.page_size.cloned()),
@@ -43,19 +48,7 @@ pub fn MediaGrid(mut props: MediaGridProps) -> Element
} }
})); }));
let mut media_grid_display = use_signal(|| { use_effect(move || match media_result()
rsx! {
div{
class: "mediaGrid",
{(0..50).map(|_| rsx!{
MediaItemPlaceHolder { }
})}
}
}
});
let mut items = use_signal::<Vec<MediaModel>>(|| Vec::new());
use_memo(move || match media_result()
{ {
Some(value) => match value Some(value) => match value
{ {
@@ -68,34 +61,49 @@ pub fn MediaGrid(mut props: MediaGridProps) -> Element
props.max_page.set(total_pages.max(1)); props.max_page.set(total_pages.max(1));
props.total_items.set(total_items.max(1)); props.total_items.set(total_items.max(1));
} }
items.set(result.items); items.set(Some(result.items));
media_grid_display.set(rsx! { error_display.set(rsx! {});
MediaList { items }
});
} }
Err(msg) => media_grid_display.set(rsx! { Err(msg) => error_display.set(rsx! {
div{ div{
"Failed to load results: {msg}" "Failed to load results: {msg}"
} }
}), }),
}, },
_ => (), _ =>
{}
}); });
rsx! { rsx! {
div { div {
class: "mediaGrid", class: "mediaGrid",
{media_grid_display} {error_display}
{match items(){
Some(itms) => rsx!{MediaList { items: itms }},
None => rsx!{PlaceholderGrid { count: props.page_size.cloned() as usize }}
}}
} }
} }
} }
#[component] #[component]
fn MediaList(items: Signal<Vec<MediaModel>>) -> Element fn PlaceholderGrid(count: usize) -> Element
{ {
let vec = items.cloned();
rsx! { rsx! {
{vec.iter().map(|itm| rsx!{ div{
class: "mediaGrid",
{(0..count).map(|_| rsx!{
MediaItemPlaceHolder { }
})}
}
}
}
#[component]
fn MediaList(items: Vec<MediaModel>) -> Element
{
rsx! {
{items.iter().map(|itm| rsx!{
MediaItem { MediaItem {
item: itm.clone() item: itm.clone()
} }
+2 -2
View File
@@ -73,7 +73,7 @@ pub fn MediaItem(props: MediaItemProps) -> Element
class: "contextItem", class: "contextItem",
div{ div{
class: "label", class: "label",
"Details {class_signal()}" "Details"
} }
} }
}, },
@@ -129,7 +129,7 @@ pub fn MediaItem(props: MediaItemProps) -> Element
class: "contextItem", class: "contextItem",
div{ div{
class: "label", class: "label",
"Mark blur" "Mark NSFW"
} }
} }
}} }}