use actix_web::Result as AwResult;
use actix_web::{HttpRequest, get, web};
use super::render_layout;
use super::session_auth::get_username_from_request;
use crate::auth::HodisContext;
fn wrap_auth_content(content: &maud::Markup) -> maud::Markup {
maud::html! {
div id="auth-content" class="flex flex-column items-center justify-center" style="min-height: calc(100vh - 8rem); padding: 2rem 1rem;" {
div class="w-100 mw6" {
(content)
}
}
}
}
#[get("/auth/signup")]
pub async fn signup_page(
req: HttpRequest,
auth_state: web::Data<HodisContext>,
) -> AwResult<maud::Markup> {
let username = get_username_from_request(&req, &auth_state).await;
let invite_code = req.query_string();
let invite_param = if invite_code.starts_with("code=") {
invite_code.strip_prefix("code=").unwrap_or("").to_string()
} else {
String::new()
};
let content = maud::html! {
h1 class="f3 fw6 mb4 tc" style="color: #e3001a;" { "Konto erstellen" }
@if invite_param.is_empty() {
div class="ba br2 pa4 mb4" style="background-color: #fef7f7; border-color: #e3001a;" {
p class="f6 black-70 mb2" {
"Du benötigst einen Einladungslink, um ein Konto zu erstellen. Bitte jemanden mit einem Konto, einen mit dir zu teilen."
}
}
} @else {
div class="ba br2 pa4 mb4" style="background-color: #f0f8f0; border-color: #4caf50;" {
p class="f6 black-70 mb2" {
"Erstelle dein Konto, um an der Challenge teilzunehmen."
}
}
form
hx-post="/auth/signup"
hx-target="#signup-result"
hx-target-error="#signup-result"
hx-swap="innerHTML"
class="ba b--black-20 br2 pa4 bg-white"
{
input type="hidden" name="invite_code" id="invite_code" value=(invite_param);
div class="mb3" {
label class="db f6 black-70 mb2" for="username" { "Benutzername" }
input
type="text"
name="username"
id="username"
required
minlength="3"
class="db w-100 pa2 ba b--black-30 br1"
placeholder="Wähle einen Benutzernamen (mind. 3 Zeichen)";
}
div class="mb3" {
label class="db f6 black-70 mb2" for="email" { "E-Mail" }
input
type="email"
name="email"
id="email"
required
class="db w-100 pa2 ba b--black-30 br1"
placeholder="Gib deine E-Mail-Adresse ein";
}
div class="mb4" {
label class="db f6 black-70 mb2" for="password" { "Passwort" }
input
type="password"
name="password"
id="password"
required
minlength="8"
class="db w-100 pa2 ba b--black-30 br1"
placeholder="Wähle ein Passwort (mind. 8 Zeichen)";
}
button
type="submit"
class="w-100 pa2 btn-brand br1 f5 fw6"
{
"Konto erstellen"
}
}
div id="signup-result" class="mt3" {}
div class="mt3 tc" {
span class="black-60 f6" { "Bereits ein Konto? " }
a href="/auth/login" class="brand no-underline f6 underline" {
"Anmelden"
}
}
}
};
if req.headers().get("HX-Request").is_some() {
Ok(content)
} else {
Ok(render_layout(
&wrap_auth_content(&content),
username.as_deref(),
false,
))
}
}
#[get("/auth/login")]
pub async fn login_page(
req: HttpRequest,
auth_state: web::Data<HodisContext>,
) -> AwResult<maud::Markup> {
let username = get_username_from_request(&req, &auth_state).await;
let content = maud::html! {
h1 class="f3 fw6 mb4 tc" style="color: #e3001a;" { "Anmelden" }
form
hx-post="/auth/login"
hx-target="#login-result"
hx-target-error="#login-result"
hx-swap="innerHTML"
class="ba b--black-20 br2 pa4 bg-white"
{
div class="mb3" {
label class="db f6 black-70 mb2" for="username" { "Benutzername" }
input
type="text"
name="username"
id="username"
required
class="db w-100 pa2 ba b--black-30 br1"
placeholder="Gib deinen Benutzernamen ein";
}
div class="mb4" {
label class="db f6 black-70 mb2" for="password" { "Passwort" }
input
type="password"
name="password"
id="password"
required
class="db w-100 pa2 ba b--black-30 br1"
placeholder="Gib dein Passwort ein";
}
button
type="submit"
class="w-100 pa2 btn-brand br1 f5 fw6"
{
"Anmelden"
}
}
div id="login-result" class="mt3" {}
div class="mt3 tc" {
span class="black-60 f6" { "Noch kein Konto? " }
a href="/auth/signup" class="brand no-underline f6 underline" {
"Registrieren"
}
}
};
if req.headers().get("HX-Request").is_some() {
Ok(content)
} else {
Ok(render_layout(
&wrap_auth_content(&content),
username.as_deref(),
false,
))
}
}
pub fn render_signup_success(username: &str) -> maud::Markup {
maud::html! {
div class="ba b--green br2 pa3 bg-washed-green" {
h2 class="f4 fw6 mb3 dark-green" { "Konto erstellt!" }
p class="f6 dark-green mb2" {
"Willkommen, " (username) "! Dein Konto wurde erfolgreich erstellt."
}
div class="flex flex-column" {
a
href="/auth/login"
class="db tc pa2 btn-brand br1 no-underline mb2"
{
"Anmelden"
}
}
}
}
}
pub fn render_login_success(username: &str) -> maud::Markup {
maud::html! {
div class="ba b--green br2 pa3 bg-washed-green" {
h2 class="f4 fw6 mb3 dark-green" { "Anmeldung erfolgreich!" }
p class="f6 dark-green mb2" {
"Willkommen zurück, " (username) "!"
}
p class="f6 dark-green mb3" {
"Weiterleitung zum Dashboard..."
}
}
}
}