From 980dfe97630e71669a5721a574d6d01fab2aaeb5 Mon Sep 17 00:00:00 2001 From: Yongtae Park <samuel.park@megazone.com> Date: Mon, 20 Jan 2025 16:51:01 +0900 Subject: [PATCH 1/2] fix(user-account-page): apply changed planning (password-check, set mfa) Signed-off-by: samuel.park <samuel.park@megazone.com> --- .../UserAccountMultiFactorAuthFormModal.vue | 16 ++-------- .../my-page/pages/UserAccountPage.vue | 29 +++++++------------ 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/apps/web/src/services/my-page/components/UserAccountMultiFactorAuthFormModal.vue b/apps/web/src/services/my-page/components/UserAccountMultiFactorAuthFormModal.vue index 37fb98a766..e056297d73 100644 --- a/apps/web/src/services/my-page/components/UserAccountMultiFactorAuthFormModal.vue +++ b/apps/web/src/services/my-page/components/UserAccountMultiFactorAuthFormModal.vue @@ -18,8 +18,6 @@ import { useUserStore } from '@/store/user/user-store'; import { postValidationMfaCode } from '@/lib/helper/multi-factor-auth-helper'; -import ErrorHandler from '@/common/composables/error/errorHandler'; - import UserAccountMultiFactorAuthModalEmailInfo from '@/services/my-page/components/UserAccountMultiFactorAuthModalEmailInfo.vue'; import UserAccountMultiFactorAuthModalFolding from '@/services/my-page/components/UserAccountMultiFactorAuthModalFolding.vue'; import UserAccountMultiFactorAuthModalMSInfo @@ -90,13 +88,6 @@ const handleChangeInput = (value: string) => { }; const handleClickCancel = async () => { resetFormData(); - if (storeState.userId === state.userInfo.user_id) { - try { - await userStore.updateUser(state.userInfo); - } catch (e: any) { - ErrorHandler.handleError(e); - } - } if (storeState.isSwitchModal && state.otherType) { multiFactorAuthStore.setEnableMfaMap({ [storeState.selectedType]: true, @@ -112,11 +103,8 @@ const handleClickVerifyButton = async () => { state.userInfo = await postValidationMfaCode({ verify_code: validationState.verificationCode, }) as UserInfoType; - if (storeState.userId === state.userInfo.user_id) { - await userStore.updateUser(state.userInfo); - if (state.userInfo.mfa) { - userStore.setMfa(state.userInfo.mfa); - } + if (storeState.userId === state.userInfo.user_id && state.userInfo.mfa) { + userStore.setMfa(state.userInfo.mfa); } resetFormData(); if (storeState.isReSyncModal || storeState.isSwitchModal) { diff --git a/apps/web/src/services/my-page/pages/UserAccountPage.vue b/apps/web/src/services/my-page/pages/UserAccountPage.vue index 471d4c1390..1400d3197e 100644 --- a/apps/web/src/services/my-page/pages/UserAccountPage.vue +++ b/apps/web/src/services/my-page/pages/UserAccountPage.vue @@ -1,8 +1,6 @@ <script setup lang="ts"> import { computed, reactive } from 'vue'; -import { debounce } from 'lodash'; - import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; import { getCancellableFetcher } from '@cloudforet/core-lib/space-connector/cancellable-fetcher'; import { @@ -25,6 +23,7 @@ import { useDomainStore } from '@/store/domain/domain-store'; import { useUserStore } from '@/store/user/user-store'; import config from '@/lib/config'; +import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; import UserAccountBaseInformation from '@/services/my-page/components/UserAccountBaseInformation.vue'; import UserAccountChangePassword from '@/services/my-page/components/UserAccountChangePassword.vue'; @@ -60,12 +59,11 @@ const state = reactive({ }), readonlyMode: computed(() => { const isLocalUser = storeState.authType === 'LOCAL'; - return isLocalUser ? !passwordFormState.isPasswordChecked : false; + return isLocalUser ? !passwordFormState.isTokenChecked : false; }), }); const passwordFormState = reactive({ - isPasswordChecked: false, passwordCheckModalVisible: false, password: '', certifiedPassword: '', @@ -76,12 +74,8 @@ const passwordFormState = reactive({ }); const passwordCheckFecher = getCancellableFetcher(SpaceConnector.clientV2.identity.token.issue); -const handleChangePassword = debounce(async () => { - if (!passwordFormState.password) { - passwordFormState.isTokenChecked = undefined; - passwordFormState.invalidText = ''; - return; - } + +const handleConfirmPasswordCheckModal = async () => { passwordFormState.loading = true; try { const result = await passwordCheckFecher<TokenIssueParameters, TokenIssueModel>({ @@ -97,6 +91,8 @@ const handleChangePassword = debounce(async () => { passwordFormState.certifiedPassword = passwordFormState.password; passwordFormState.isTokenChecked = true; passwordFormState.invalidText = ''; + passwordFormState.passwordCheckModalVisible = false; + showSuccessMessage(i18n.t('COMMON.PROFILE.SUCCESS_PASSWORD_CHECK')); } else { passwordFormState.isTokenChecked = false; passwordFormState.invalidText = i18n.t('COMMON.PROFILE.CURRENT_PASSWORD_INVALID'); @@ -107,6 +103,8 @@ const handleChangePassword = debounce(async () => { passwordFormState.certifiedPassword = passwordFormState.password; passwordFormState.isTokenChecked = true; passwordFormState.invalidText = ''; + passwordFormState.passwordCheckModalVisible = false; + showSuccessMessage(i18n.t('COMMON.PROFILE.SUCCESS_PASSWORD_CHECK')); } else { passwordFormState.isTokenChecked = false; passwordFormState.invalidText = i18n.t('COMMON.PROFILE.CURRENT_PASSWORD_INVALID'); @@ -114,11 +112,6 @@ const handleChangePassword = debounce(async () => { } finally { passwordFormState.loading = false; } -}, 800); - -const handleConfirmPasswordCheckModal = () => { - passwordFormState.isPasswordChecked = true; - passwordFormState.passwordCheckModalVisible = false; }; const handleOpenPasswordCheckModal = () => { passwordFormState.passwordCheckModalVisible = true; @@ -140,7 +133,7 @@ const handleClickCancel = () => { <p-heading :title="$t('MY_PAGE.ACCOUNT.ACCOUNT_N_PROFILE')" /> </template> <template #extra> - <p-button v-if="!passwordFormState.isPasswordChecked && storeState.authType === 'LOCAL'" + <p-button v-if="!passwordFormState.isTokenChecked && storeState.authType === 'LOCAL'" @click="handleOpenPasswordCheckModal" > {{ $t('COMMON.PROFILE.EDIT_ACCOUNT_INFO') }} @@ -180,7 +173,7 @@ const handleClickCancel = () => { <p-button-modal :header-title="$t('COMMON.PROFILE.PASSWORD_CHECK_TITLE')" :visible.sync="passwordFormState.passwordCheckModalVisible" :loading="passwordFormState.loading" - :disabled="!passwordFormState.isTokenChecked" + :disabled="passwordFormState.password.length < 8" size="sm" @confirm="handleConfirmPasswordCheckModal" @cancel="handleClickCancel" @@ -198,10 +191,8 @@ const handleClickCancel = () => { type="password" placeholder="Password" appearance-type="masking" - :readonly="passwordFormState.loading" :invalid="invalid" block - @update:value="handleChangePassword" /> </template> </p-field-group> From 440333ec4c5e2bde4001122459bfdbbaa1d2acf7 Mon Sep 17 00:00:00 2001 From: Yongtae Park <samuel.park@megazone.com> Date: Mon, 20 Jan 2025 16:55:17 +0900 Subject: [PATCH 2/2] chore: translation Signed-off-by: samuel.park <samuel.park@megazone.com> --- .../console-translation-2.8.babel | 21 +++++++++++++++++++ packages/language-pack/en.json | 1 + packages/language-pack/ja.json | 1 + packages/language-pack/ko.json | 1 + 4 files changed, 24 insertions(+) diff --git a/packages/language-pack/console-translation-2.8.babel b/packages/language-pack/console-translation-2.8.babel index 6839c7489f..f19c8ba5d3 100644 --- a/packages/language-pack/console-translation-2.8.babel +++ b/packages/language-pack/console-translation-2.8.babel @@ -25937,6 +25937,27 @@ </translation> </translations> </concept_node> + <concept_node> + <name>SUCCESS_PASSWORD_CHECK</name> + <definition_loaded>false</definition_loaded> + <description/> + <comment/> + <default_text/> + <translations> + <translation> + <language>en-US</language> + <approved>false</approved> + </translation> + <translation> + <language>ja-JP</language> + <approved>false</approved> + </translation> + <translation> + <language>ko-KR</language> + <approved>false</approved> + </translation> + </translations> + </concept_node> <concept_node> <name>TIMEZONE</name> <definition_loaded>false</definition_loaded> diff --git a/packages/language-pack/en.json b/packages/language-pack/en.json index cfcb7fd131..b37e65bc21 100644 --- a/packages/language-pack/en.json +++ b/packages/language-pack/en.json @@ -1413,6 +1413,7 @@ "ROLE": "Role", "SEND_LINK": "Send user a password reset link", "SET_MANUALLY": "Set password manually", + "SUCCESS_PASSWORD_CHECK": "Password successfully verified", "TIMEZONE": "Time Zone", "TITLE": "Profile" }, diff --git a/packages/language-pack/ja.json b/packages/language-pack/ja.json index e44837b7ce..2bfc2f89fe 100644 --- a/packages/language-pack/ja.json +++ b/packages/language-pack/ja.json @@ -1413,6 +1413,7 @@ "ROLE": "権限", "SEND_LINK": "パスワードリセットメール送信", "SET_MANUALLY": "管理者がパスワードを設定する", + "SUCCESS_PASSWORD_CHECK": "パスワードが正常に確認されました。", "TIMEZONE": "タイムゾーン", "TITLE": "個人情報" }, diff --git a/packages/language-pack/ko.json b/packages/language-pack/ko.json index 96c81d54e3..e397b00730 100644 --- a/packages/language-pack/ko.json +++ b/packages/language-pack/ko.json @@ -1413,6 +1413,7 @@ "ROLE": "권한", "SEND_LINK": "사용자에게 비밀번호 재설정 이메일 발송", "SET_MANUALLY": "관리자가 대신 비밀번호 설정", + "SUCCESS_PASSWORD_CHECK": "비밀번호가 성공적으로 인증되었습니다.", "TIMEZONE": "타임존", "TITLE": "개인 정보" },