Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refact(confirmation-codes)!: change constraints and add column for action #243

Merged
merged 2 commits into from
Feb 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ server_fn = "0.7.7"
tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] }
uuid = { version = "1.13.1", features = ["serde", "v4"] }
wasm-bindgen = "0.2.100"
web-sys = "0.3.77"
mango3-core = { path = "mango3-core" }
mango3-leptos-utils = { path = "mango3-leptos-utils" }

Expand Down
1 change: 0 additions & 1 deletion locales/leptos/en/accounts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ failed_to_send_password_reset_code: Failed to send password reset code
i_dont_have_an_account: I don't have an account
i_forgot_my_password: I forgot my password
invitation_code: Invitation code
password_reset_code_sent_successfully: Password reset code send successfully
reset_password: Reset password
user_authenticated_successfully: User authenticated successfully
user_created_successfully: User created successfully
Expand Down
1 change: 0 additions & 1 deletion locales/leptos/es/accounts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ failed_to_get_invitation: Error al obtener invitación
i_dont_have_an_account: No tengo una cuenta
i_forgot_my_password: Olvidé mi contraseña
invitation_code: Código de invitación
password_reset_code_sent_successfully: Código de reinicio de contraseña enviado exitosamente
reset_password: Reiniciar contraseña
user_authenticated_successfully: Usuario autenticado exitosamente
user_created_successfully: Usuario creado exitosamente
Expand Down
1 change: 0 additions & 1 deletion locales/leptos/pt/accounts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ failed_to_send_password_reset_code: Falha ao enviar código de redefinição de
i_dont_have_an_account: Não tenho uma conta
i_forgot_my_password: Esqueci minha senha
invitation_code: Código de convite
password_reset_code_sent_successfully: Código de redefinição de senha enviado com sucesso
reset_password: Redefinir senha
user_authenticated_successfully: Usuário autenticado com sucesso
user_created_successfully: Usuário criado com sucesso
Expand Down
42 changes: 20 additions & 22 deletions mango3-accounts/src/components/reset_password_modal.rs
Original file line number Diff line number Diff line change
@@ -1,52 +1,50 @@
use leptos::prelude::*;

use mango3_leptos_utils::components::{
ActionFormAlert, ActionFormError, Modal, PasswordField, SubmitButton, TextField,
};
use mango3_leptos_utils::enums::ActionFormStatus;
use mango3_leptos_utils::components::forms::ActionFormErrorAlert;
use mango3_leptos_utils::components::{Modal, PasswordField, SubmitButton, TextField};
use mango3_leptos_utils::i18n::{t, use_i18n};
use mango3_leptos_utils::icons::InformationCircleOutlined;
use mango3_leptos_utils::models::ActionFormResp;

use crate::server_functions::AttemptToUpdatePasswordWithCode;
use crate::server_functions::AttemptToResetPassword;

#[component]
pub fn ResetPasswordModal(
#[prop(into)] username_or_email: Signal<String>,
#[prop(into)] is_open: RwSignal<bool>,
) -> impl IntoView {
pub fn ResetPasswordModal(is_open: RwSignal<bool>, #[prop(into)] on_success: Callback<()>) -> impl IntoView {
let i18n = use_i18n();
let server_action = ServerAction::<AttemptToUpdatePasswordWithCode>::new();
let server_action = ServerAction::<AttemptToResetPassword>::new();
let action_value = server_action.value();
let status = RwSignal::new(ActionFormStatus::Pending);
let error_alert_is_active = RwSignal::new(false);
let error_code = RwSignal::new(None);
let error_new_password = RwSignal::new(None);

Effect::new(move || {
let response = ActionFormResp::from(action_value);

if let Some(true) = response.success {
if response.is_success() {
is_open.set(false);
on_success.run(());
}

error_alert_is_active.set(response.is_invalid());
error_code.set(response.error("code"));
error_new_password.set(response.error("new-password"));
});

view! {
<ActionFormAlert
action_value=action_value
redirect_to="/login"
status=status
success_message=move || t!(i18n, shared.password_updated_successfully)
/>

<Modal is_open=is_open>
<h4 class="text-lg font-bold">{t!(i18n, shared.change_password)}</h4>

<ActionForm action=server_action attr:autocomplete="off" attr:novalidate="true" attr:class="form">
<ActionFormError message=move || t!(i18n, shared.failed_to_update_password) status=status />
<div role="alert" class="alert mt-4">
<InformationCircleOutlined class="self-start my-2" />

<div>{t!(i18n, accounts.a_confirmation_code_has_been_sent_to_your_email_address)}"."</div>
</div>

<input type="hidden" name="username_or_email" value=username_or_email />
<ActionForm action=server_action attr:autocomplete="off" attr:novalidate="true" attr:class="form">
<ActionFormErrorAlert
is_active=error_alert_is_active
message=move || t!(i18n, shared.failed_to_update_password)
/>

<TextField label=move || t!(i18n, shared.code) name="code" error=error_code />

Expand Down
1 change: 0 additions & 1 deletion mango3-accounts/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
pub mod app;
pub mod components;
pub mod models;
pub mod pages;
pub mod server_functions;

Expand Down
18 changes: 0 additions & 18 deletions mango3-accounts/src/models.rs

This file was deleted.

2 changes: 1 addition & 1 deletion mango3-accounts/src/pages/login_page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub fn LoginPage() -> impl IntoView {
let response = ActionFormResp::from(action_value);

if response.is_success() {
if response.data.as_ref().map(|user_session| user_session.is_confirmed) == Some(true) {
if response.data == Some(true) {
success_modal_is_open.set(true);
} else {
login_confirmation_modal_is_open.set(true);
Expand Down
42 changes: 27 additions & 15 deletions mango3-accounts/src/pages/reset_password_page.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use leptos::ev::Event;
use leptos::prelude::*;

use leptos_router::hooks::use_navigate;
use mango3_leptos_utils::async_t_string;
use mango3_leptos_utils::components::{ActionFormAlert, SubmitButton, TextField};
use mango3_leptos_utils::components::forms::{ActionFormErrorAlert, ActionFormSuccessModal};
use mango3_leptos_utils::components::{SubmitButton, TextField};
use mango3_leptos_utils::i18n::{t, use_i18n};
use mango3_leptos_utils::models::ActionFormResp;
use mango3_leptos_utils::pages::GuestPage;
Expand All @@ -14,47 +15,58 @@ use crate::server_functions::AttemptToSendPasswordResetCode;
#[component]
pub fn ResetPasswordPage() -> impl IntoView {
let i18n = use_i18n();
let navigate = use_navigate();
let server_action = ServerAction::<AttemptToSendPasswordResetCode>::new();
let action_value = server_action.value();
let value_username_or_email = RwSignal::new(String::new());
let error_alert_is_active = RwSignal::new(false);
let error_username_or_email = RwSignal::new(None);
let reset_password_modal_is_open = RwSignal::new(false);
let success_modal_is_open = RwSignal::new(false);
let text_title = async_t_string!(i18n, accounts.reset_password).to_signal();

Effect::new(move || {
let response = ActionFormResp::from(action_value);

if response.is_success() {
reset_password_modal_is_open.set(true);
}

error_alert_is_active.set(response.is_invalid());
error_username_or_email.set(response.error("username-or-email"));
});

let on_input = move |event: Event| {
value_username_or_email.set(event_target_value(&event));
};

view! {
<GuestPage title=text_title>
<h2 class="h2">{move || text_title.get()}</h2>

<ResetPasswordModal username_or_email=value_username_or_email is_open=reset_password_modal_is_open />

<ActionForm action=server_action attr:autocomplete="off" attr:novalidate="true" attr:class="form">
<ActionFormAlert
action_value=action_value
error_message=move || t!(i18n, accounts.failed_to_send_password_reset_code)
on_success=move || reset_password_modal_is_open.set(true)
success_message=move || t!(i18n, accounts.password_reset_code_sent_successfully)
<ActionFormErrorAlert
is_active=error_alert_is_active
message=move || t!(i18n, accounts.failed_to_send_password_reset_code)
/>

<TextField
label=move || t!(i18n, accounts.username_or_email)
name="username_or_email"
error=error_username_or_email
on_input=on_input
/>

<SubmitButton is_loading=server_action.pending() />
</ActionForm>

<ResetPasswordModal
is_open=reset_password_modal_is_open
on_success=move || success_modal_is_open.set(true)
/>

<ActionFormSuccessModal
is_open=success_modal_is_open
message=move || t!(i18n, shared.password_updated_successfully)
on_close=move || {
navigate("/login", Default::default());
}
/>

<div class="max-w-[640px] ml-auto mr-auto mt-4">
<a class="btn btn-block btn-outline" href="/login">
{t!(i18n, accounts.back_to_login)}
Expand Down
Loading
Loading