use graphql_client::{GraphQLQuery, Response}; use leptos::*; use crate::features::navbar_projects::gen::queries::get_projects_list_view::{ ResponseData, Variables, }; use crate::features::navbar_projects::gen::queries::GetProjectsListView; use super::gen::queries::get_projects_list_view::GetProjectsListViewGetProjects; pub async fn get_projects_list() -> anyhow::Result<Vec<GetProjectsListViewGetProjects>> { let request_body = GetProjectsListView::build_query(Variables {}); let payload = serde_json::to_string(&request_body)?; let res = reqwasm::http::Request::post("http://localhost:3001/graphql") .credentials(reqwasm::http::RequestCredentials::Include) .body(payload) .send() .await?; let response_body: Response<ResponseData> = res.json().await?; Ok(response_body .data .ok_or(anyhow::anyhow!("failed to get projects list"))? .get_projects) } #[component] pub fn NavbarProjectsView( projects: Resource<(), Vec<GetProjectsListViewGetProjects>>, ) -> impl IntoView { let projects_view = move || { projects.with(|projects| { if projects.is_none() { return Vec::new() } let projects = projects.as_ref().unwrap(); if projects.is_empty() { return vec![view! { <div class="project-item">"No projects"</div> }.into_any()]; } projects .into_iter() .map(|project| { view! { <a href=format!("/dash/project/{}", & project.id) class="project-item"> <div class="project-item-name hover:dark:bg-blue-700 rounded-md p-0.5 px-2"> {&project.name} </div> </a> }.into_any() }) .collect::<Vec<_>>() }) }; view! { <div class="project-items space-y-1">{projects_view}</div> } } #[component] pub fn NavbarProjects() -> impl IntoView { let projects = create_local_resource(|| (), |_| async { get_projects_list().await.unwrap() }); view! { <NavbarProjectsView projects=projects/> } }