use quokka::{
handler::html::TemplateDataLoader,
state::{FromState, ProvideState},
};
use crate::{data::AdminDashboardWidget, state::AdminState};
use super::{AdminPageData, AdminPageLoader};
#[derive(Clone, FromState)]
pub struct AdminDashboardPageLoader {
admin_page_loader: AdminPageLoader,
#[from_state(
bounds = "State: ProvideState<AdminState<State>> + 'static",
builder = ProvideState::<AdminState<_>>::provide(state).dashboard_widgets,
)]
dashboard_widgets: Vec<AdminDashboardWidget>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct AdminDashboardPageData {
dashboard_widgets: Vec<AdminDashboardWidget>,
}
impl<S> TemplateDataLoader<S> for AdminDashboardPageLoader
where
S: ProvideState<AdminPageLoader>,
S: Send + Sync + Clone + 'static,
{
type Args = <AdminPageLoader as TemplateDataLoader<S>>::Args;
type Data = AdminPageData<AdminDashboardPageData>;
#[tracing::instrument(
skip_all,
target = "quokka_admin::service::page_loader::admin_dashboard_page_loader::AdminDashboardPageLoader"
)]
async fn load_data(&self, base_params: Self::Args) -> quokka::Result<Self::Data> {
let base = <AdminPageLoader as TemplateDataLoader<S>>::load_data(
&self.admin_page_loader,
base_params,
)
.await?;
Ok(base.page(AdminDashboardPageData {
dashboard_widgets: self.dashboard_widgets.clone(),
}))
}
#[tracing::instrument(
skip_all,
target = "quokka_admin::service::page_loader::admin_dashboard_page_loader::AdminDashboardPageLoader"
)]
async fn render_error(&self, error: quokka::Error) -> impl axum::response::IntoResponse {
<AdminPageLoader as TemplateDataLoader<S>>::render_error(&self.admin_page_loader, error)
.await
}
}