/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ use super::format_form_error; use crate::{ helper::{language::AcceptLanguage, A}, ui::error::MyResult, }; use jellycommon::user::{PlayerKind, Theme}; use jellyimport::is_importing; use jellylogic::{ account::{ update_user_display_name, update_user_native_secret, update_user_password, update_user_player_preference, update_user_theme, }, session::Session, }; use jellyui::{ account::settings::SettingsPage, locale::{tr, Language}, render_page, scaffold::{RenderInfo, SessionInfo}, }; use rocket::{ form::{self, validate::len, Contextual, Form}, get, post, response::content::RawHtml, FromForm, }; use std::ops::Range; #[derive(FromForm)] pub struct SettingsForm { #[field(validate = option_len(4..64))] password: Option, #[field(validate = option_len(4..32))] display_name: Option, theme: Option>, player_preference: Option>, native_secret: Option, } fn option_len<'v>(value: &Option, range: Range) -> form::Result<'v, ()> { value.as_ref().map(|v| len(v, range)).unwrap_or(Ok(())) } fn settings_page( session: Session, flash: Option>, lang: Language, ) -> RawHtml { RawHtml(render_page( &SettingsPage { flash, session: &SessionInfo { user: session.user.clone(), }, lang: &lang, }, RenderInfo { importing: is_importing(), session: Some(SessionInfo { user: session.user }), }, lang, )) } #[get("/account/settings")] pub fn r_account_settings(session: A, lang: AcceptLanguage) -> RawHtml { let AcceptLanguage(lang) = lang; settings_page(session.0, None, lang) } #[post("/account/settings", data = "
")] pub fn r_account_settings_post( session: A, form: Form>, lang: AcceptLanguage, ) -> MyResult> { let AcceptLanguage(lang) = lang; let A(session) = session; let form = match &form.value { Some(v) => v, None => { return Ok(settings_page( session, Some(Err(format_form_error(form).to_string())), lang, )) } }; let mut out = String::new(); if let Some(password) = &form.password { update_user_password(&session, password)?; out += &*tr(lang, "settings.account.password.changed"); out += "\n"; } if let Some(display_name) = &form.display_name { update_user_display_name(&session, display_name)?; out += &*tr(lang, "settings.account.display_name.changed"); out += "\n"; } if let Some(theme) = form.theme { update_user_theme(&session, theme.0)?; out += &*tr(lang, "settings.account.theme.changed"); out += "\n"; } if let Some(player_preference) = form.player_preference { update_user_player_preference(&session, player_preference.0)?; out += &*tr(lang, "settings.player_preference.changed"); out += "\n"; } if let Some(native_secret) = &form.native_secret { update_user_native_secret(&session, native_secret)?; out += "Native secret updated.\n"; } Ok(settings_page( session, // using the old session here, results in outdated theme being displayed Some(Ok(if out.is_empty() { tr(lang, "settings.no_change").to_string() } else { out })), lang, )) }