use graphql_client::reqwest::post_graphql; use yew::prelude::*; use crate::components; use crate::graphql; pub enum Msg { DoneFetching { errors: Option>, tokens: Vec, }, Revoke(usize), RevokeDone { errors: Option>, id: usize, }, } #[derive(Properties, PartialEq, Eq)] pub struct TokensProps { pub token: String, } pub struct Tokens { fetching: bool, errors: Option>, tokens: Option>, } impl Component for Tokens { type Message = Msg; type Properties = TokensProps; fn create(ctx: &Context) -> Self { let client = graphql::client(Some(&ctx.props().token)).unwrap(); ctx.link().send_future(async move { let response = post_graphql::( &client, graphql::URL.as_str(), graphql::queries::tokens::tokens::Variables, ) .await .unwrap(); Msg::DoneFetching { errors: None, tokens: response.data.unwrap().tokens.unwrap(), } }); Self { fetching: true, errors: None, tokens: None, } } fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { match msg { Msg::DoneFetching { errors, tokens } => { self.fetching = false; self.errors = errors; self.tokens = Some(tokens); true } Msg::Revoke(id) => { let client = graphql::client(Some(&ctx.props().token)).unwrap(); let token = self.tokens.as_ref().unwrap()[id].id.to_owned(); ctx.link().send_future(async move { let response = post_graphql::( &client, graphql::URL.as_str(), graphql::mutations::revoke_token::revoke_token::Variables { token }, ) .await .unwrap(); Msg::RevokeDone { errors: components::graphql_errors::convert(response.errors), id, } }); false } Msg::RevokeDone { errors, id } => { self.errors = errors; self.tokens.as_mut().unwrap().remove(id); true } } } fn view(&self, ctx: &Context) -> Html { html! {
{ "Tokens" } if self.fetching {

{ "Fetching..." }

} else { { for self.tokens.as_ref().unwrap().iter().enumerate().map(|(i, t)| { html! { } }) }
{ "ID" } { "Issued at" } { "Expires at" } { "Revoke" }
{ &t.id } { &t.iat } { &t.exp }
}
} } }