JWT access token and refresh token

Access Token

The simplest method to use JWT is to read it from a cookie. Let's start with some boilerplate where we have token and some_data to be loaded from API.

    use vertigo::{dom, LazyCache, Resource, Value};

    #[derive(Clone, PartialEq)]
    struct Data;

    let token: Value<Option<String>> = Value::new(None);
    let some_data: Value<Option<LazyCache<Data>>> = Value::new(None);

    let token_span = token.render_value(|token| match token {
        Some(token) => dom! { <span>{token}</span> },
        None => dom! { <i>"None"</i> },
    });

    let data_state_str = some_data.render_value(|data| match data {
        Some(resource) => resource.to_computed().render_value(|res| match res {
            Resource::Loading => dom! { <i>"Loading"</i> },
            Resource::Ready(_) => dom! { <i>"Data loaded"</i> },
            Resource::Error(err) => dom! { <i>"Error: " {err}</i> },
        }),
        None => dom! { <i>"None"</i> },
    });

    dom! {
        <div>
            <p>
                "Current token: " {token_span}
            </p>
            <p>
                "Data state: "
                {data_state_str}
            </p>
        </div>
    }

Reading it from a cookie can be done through the Driver :

    use vertigo::{get_driver, Value};

    let cookie = get_driver().cookie_get("jwt_token");
    let token: Value<Option<String>> = Value::new((!cookie.is_empty()).then_some(cookie));

Reading the data using token:

    let load_data = bind!(token, some_data, || {
        transaction(|ctx| {
            if let Some(token) = token.get(ctx) {
                let data_resource = LazyCache::new(
                    get_driver()
                        .request_get("https://example.com/api/data")
                        .bearer_auth(token)
                        .ttl_minutes(1),
                    |status, body| {
                        if status == 200 {
                            Some(body.into::<Data>())
                        } else {
                            None
                        }
                    },
                );

                some_data.set(Some(data_resource));
            }
        })
    });

To be continued...

Refresh Token

To be continued...