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": "개인 정보"
 		},