diff --git a/client/src/register-form.js b/client/src/register-form.js index ee40c40..460ff21 100644 --- a/client/src/register-form.js +++ b/client/src/register-form.js @@ -93,10 +93,6 @@ customElements.define('register-form', class extends Component { this.step = 0; } - attributeChangedCallback(name, oldV, newV) { - super.attributeChangedCallback(name, oldV, newV); - } - get step() { const step = parseInt(this.getAttribute('step')); return isNaN(step) ? 1 : step; diff --git a/server/assets/templates/account.html b/server/assets/templates/account.html index 7221e3c..8d05450 100644 --- a/server/assets/templates/account.html +++ b/server/assets/templates/account.html @@ -17,6 +17,9 @@ {% when None %} + page="{{register_page.as_str()}}" +> + + {% endmatch %} {% endblock %} diff --git a/server/src/routes/unrestricted/account.rs b/server/src/routes/unrestricted/account.rs index 5a5522f..cfcd5d3 100644 --- a/server/src/routes/unrestricted/account.rs +++ b/server/src/routes/unrestricted/account.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use actix_web::web::{Data, ServiceConfig}; +use actix_web::web::{Data, Path, ServiceConfig}; use actix_web::{get, post, web, HttpResponse}; use askama::*; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use sqlx::PgPool; use tracing::error; @@ -21,6 +21,7 @@ struct AccountTemplate { error: Option, page: Page, h: Helper, + register_page: RegisterPage, } impl AccountTemplate { @@ -331,6 +332,60 @@ async fn account_page(id: Identity, db: Data) -> Result { )) } +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +enum RegisterPage { + #[default] + UserType = 0, + Basic = 1, + Business = 2, + Items = 3, + Submit = 4, + User = 40, +} +impl RegisterPage { + pub fn as_str(&self) -> &str { + match self { + RegisterPage::UserType => "user-type", + RegisterPage::Basic => "basic", + RegisterPage::Business => "business", + RegisterPage::Items => "items", + RegisterPage::Submit => "submit", + RegisterPage::User => "user", + } + } +} + +#[get("/register/{step}")] +#[tracing::instrument] +async fn register_page( + id: Identity, + db: Data, + path: Path<(RegisterPage,)>, +) -> Result { + let pool = db.into_inner(); + let mut t = crate::ok_or_internal!(pool.begin().await); + let account = match id.identity() { + Some(id) => queries::account_by_id(&mut t, id).await, + _ => { + id.forget(); + None + } + }; + let page = path.into_inner().0; + t.commit().await.ok(); + Ok(HttpResponse::Ok().content_type("text/html").body( + AccountTemplate { + account, + page: Page::Account, + register_page: page, + ..Default::default() + } + .render() + .unwrap(), + )) +} + #[derive(Debug, Deserialize)] #[serde(rename_all = "snake_case")] struct RegisterForm { @@ -398,7 +453,8 @@ pub fn configure(config: &mut ServiceConfig) { .service(logout) .service(login) .service(upload) - .service(account_page); + .service(account_page) + .service(register_page); } #[cfg(test)]