diff --git a/apps/storefront/src/pages/AccountSetting/config.ts b/apps/storefront/src/pages/AccountSetting/config.ts index a9dc47e7..c39f705d 100644 --- a/apps/storefront/src/pages/AccountSetting/config.ts +++ b/apps/storefront/src/pages/AccountSetting/config.ts @@ -18,47 +18,15 @@ export interface GetFilterMoreListProps { size: string; } -interface GetAccountSettingFilesReturnProps { - accountB2BFormFields: GetFilterMoreListProps[]; - passwordModified: GetFilterMoreListProps[]; -} - -interface PasswordKeysProps { - name: string; - label: string; - idLang: string; -} - -export const getPasswordKeys = (): PasswordKeysProps[] => [ - { - name: 'currentPassword', - label: 'Current Password', - idLang: 'accountSettings.form.currentPassword', - }, - { - name: 'password', - label: 'Password', - idLang: 'accountSettings.form.password', - }, - { - name: 'confirmPassword', - label: 'Confirm Password', - idLang: 'accountSettings.form.confirmPassword', - }, -]; - -export const getAccountSettingFiles = ( - xs: number, - b3Lang: LangFormatFunction, -): GetAccountSettingFilesReturnProps => { - const accountB2BFormFields = [ +export const getAccountSettingsFields = (b3Lang: LangFormatFunction): GetFilterMoreListProps[] => { + return [ { name: 'company', label: b3Lang('accountSettings.form.company'), required: false, default: '', fieldType: 'text', - xs, + xs: 12, variant: 'filled', size: 'small', }, @@ -86,26 +54,44 @@ export const getAccountSettingFiles = ( value: 3, }, ], - xs, + xs: 12, variant: 'filled', size: 'small', }, ]; +}; - const passwordModified = getPasswordKeys().map((item: PasswordKeysProps) => ({ - name: item.name, - label: item.label, - required: false, - default: '', - fieldType: 'password', - xs, - variant: 'filled', - size: 'small', - idLang: item.idLang, - })); - - return { - accountB2BFormFields, - passwordModified, - }; +export const getPasswordModifiedFields = (b3Lang: LangFormatFunction): GetFilterMoreListProps[] => { + return [ + { + name: 'currentPassword', + label: b3Lang('accountSettings.form.currentPassword'), + required: false, + default: '', + fieldType: 'password', + xs: 12, + variant: 'filled', + size: 'small', + }, + { + name: 'password', + label: b3Lang('accountSettings.form.password'), + required: false, + default: '', + fieldType: 'password', + xs: 12, + variant: 'filled', + size: 'small', + }, + { + name: 'confirmPassword', + label: b3Lang('accountSettings.form.confirmPassword'), + required: false, + default: '', + fieldType: 'password', + xs: 12, + variant: 'filled', + size: 'small', + }, + ]; }; diff --git a/apps/storefront/src/pages/AccountSetting/index.tsx b/apps/storefront/src/pages/AccountSetting/index.tsx index 3f6515c6..80b40109 100644 --- a/apps/storefront/src/pages/AccountSetting/index.tsx +++ b/apps/storefront/src/pages/AccountSetting/index.tsx @@ -27,7 +27,7 @@ import { B3SStorage, channelId, snackbar } from '@/utils'; import { deCodeField, getAccountFormFields } from '../Registered/config'; -import { getAccountSettingFiles } from './config'; +import { getAccountSettingsFields, getPasswordModifiedFields } from './config'; import { b2bSubmitDataProcessing, bcSubmitDataProcessing, initB2BInfo, initBcInfo } from './utils'; function useData() { @@ -40,11 +40,42 @@ function useData() { const companyId = role === 3 && isAgenting ? Number(salesRepCompanyId) : Number(companyInfoId); const isBCUser = !isB2BUser || (role === 3 && !isAgenting); - return { isBCUser, companyId, customer }; + const validateEmailValue = async (emailValue: string) => { + if (customer.emailAddress === trim(emailValue)) return true; + const payload = { + email: emailValue, + channelId, + }; + + const { isValid }: { isValid: boolean } = isBCUser + ? await checkUserBCEmail(payload) + : await checkUserEmail(payload); + + return isValid; + }; + + const emailValidation = (data: Partial) => { + if (data.email !== customer.emailAddress && !data.currentPassword) { + return false; + } + + return true; + }; + + const passwordValidation = (data: Partial) => { + if (data.password !== data.confirmPassword) { + return false; + } + + return true; + }; + + return { isBCUser, companyId, customer, validateEmailValue, emailValidation, passwordValidation }; } function AccountSetting() { - const { isBCUser, companyId, customer } = useData(); + const { isBCUser, companyId, customer, validateEmailValue, emailValidation, passwordValidation } = + useData(); const { control, @@ -87,24 +118,22 @@ function AccountSetting() { try { setLoading(true); - const accountFormAllFields = await getB2BAccountFormFields(isBCUser ? 1 : 2); - - const fn = !isBCUser ? getB2BAccountSettings : getBCAccountSettings; + const fn = isBCUser ? getBCAccountSettings : getB2BAccountSettings; - const params = !isBCUser - ? { + const params = isBCUser + ? {} + : { companyId, - } - : {}; + }; - const key = !isBCUser ? 'accountSettings' : 'customerAccountSettings'; + const key = isBCUser ? 'customerAccountSettings' : 'accountSettings'; const { [key]: accountSettings } = await fn(params); + const accountFormAllFields = await getB2BAccountFormFields(isBCUser ? 1 : 2); const accountFormFields = getAccountFormFields( accountFormAllFields.accountFormFields || [], ); - const { accountB2BFormFields, passwordModified } = getAccountSettingFiles(12, b3Lang); const contactInformation = (accountFormFields?.contactInformation || []).filter( (item: Partial) => item.fieldId !== 'field_email_marketing_newsletter', @@ -132,25 +161,18 @@ function AccountSetting() { const { additionalInformation = [] } = accountFormFields; - const fields = !isBCUser - ? initB2BInfo( + const fields = isBCUser + ? initBcInfo(accountSettings, contactInformationTranslatedLabels, additionalInformation) + : initB2BInfo( accountSettings, contactInformationTranslatedLabels, - accountB2BFormFields, + getAccountSettingsFields(b3Lang), additionalInformation, - ) - : initBcInfo(accountSettings, contactInformationTranslatedLabels, additionalInformation); + ); - const passwordModifiedTranslatedFields = JSON.parse(JSON.stringify(passwordModified)).map( - (element: { label: string; idLang: string }) => { - const passwordField = element; - passwordField.label = b3Lang(element.idLang); - - return element; - }, - ); + const passwordModifiedFields = getPasswordModifiedFields(b3Lang); - const all = [...fields, ...passwordModifiedTranslatedFields]; + const all = [...fields, ...passwordModifiedFields]; const roleItem = all.find((item) => item.name === 'role'); @@ -178,64 +200,17 @@ function AccountSetting() { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const validateEmailValue = async (emailValue: string) => { - if (customer.emailAddress === trim(emailValue)) return true; - const payload = { - email: emailValue, - channelId, - }; - - const { isValid }: CustomFieldItems = isBCUser - ? await checkUserBCEmail(payload) - : await checkUserEmail(payload); - - if (!isValid) { - setError('email', { - type: 'custom', - message: b3Lang('accountSettings.notification.emailExists'), - }); - } - - return isValid; - }; - - const passwordValidation = (data: Partial) => { - if (data.password !== data.confirmPassword) { - setError('confirmPassword', { - type: 'manual', - message: b3Lang('global.registerComplete.passwordMatchPrompt'), - }); - setError('password', { - type: 'manual', - message: b3Lang('global.registerComplete.passwordMatchPrompt'), - }); - return false; - } - - return true; - }; - - const emailValidation = (data: Partial) => { - if (data.email !== customer.emailAddress && !data.currentPassword) { - snackbar.error(b3Lang('accountSettings.notification.updateEmailPassword')); - return false; - } - return true; - }; - - const handleGetUserExtraFields = (data: CustomFieldItems) => { - let userExtraFieldsInfo: CustomFieldItems[] = []; + const handleGetUserExtraFields = ( + data: CustomFieldItems, + accountInfoFormFields: Partial[], + ) => { const userExtraFields = accountInfoFormFields.filter( (item: CustomFieldItems) => item.custom && item.groupId === 1, ); - if (userExtraFields.length > 0) { - userExtraFieldsInfo = userExtraFields.map((item: CustomFieldItems) => ({ - fieldName: deCodeField(item?.name || ''), - fieldValue: data[item.name], - })); - } - - return userExtraFieldsInfo; + return userExtraFields.map((item: CustomFieldItems) => ({ + fieldName: deCodeField(item?.name || ''), + fieldValue: data[item.name], + })); }; const handleAddUserClick = () => { @@ -245,48 +220,56 @@ function AccountSetting() { try { const isValid = await validateEmailValue(data.email); + if (!isValid) { + setError('email', { + type: 'custom', + message: b3Lang('accountSettings.notification.emailExists'), + }); + } + const emailFlag = emailValidation(data); + if (!emailFlag) { + snackbar.error(b3Lang('accountSettings.notification.updateEmailPassword')); + } + const passwordFlag = passwordValidation(data); - let userExtraFields: CustomFieldItems[] = []; - if (!isBCUser) { - userExtraFields = handleGetUserExtraFields(data); + if (!passwordFlag) { + setError('confirmPassword', { + type: 'manual', + message: b3Lang('global.registerComplete.passwordMatchPrompt'), + }); + setError('password', { + type: 'manual', + message: b3Lang('global.registerComplete.passwordMatchPrompt'), + }); } - const dataProcessingFn = !isBCUser ? b2bSubmitDataProcessing : bcSubmitDataProcessing; - if (isValid && emailFlag && passwordFlag) { - const { isEdit, param } = dataProcessingFn( - data, - accountSettings, - decryptionFields, - extraFields, - ); - - if (isEdit) { + const dataProcessingFn = isBCUser ? bcSubmitDataProcessing : b2bSubmitDataProcessing; + const payload = dataProcessingFn(data, accountSettings, decryptionFields, extraFields); + + if (payload) { if (!isBCUser) { - param.companyId = companyId; - param.extraFields = userExtraFields; + payload.companyId = companyId; + payload.extraFields = handleGetUserExtraFields(data, accountInfoFormFields); } - const requestFn = !isBCUser ? updateB2BAccountSettings : updateBCAccountSettings; - - const newParams: CustomFieldItems = { - ...param, - currentPassword: param.currentPassword, - }; - - if (param.newPassword === '' && param.confirmPassword === '') { - delete newParams.newPassword; - delete newParams.confirmPassword; + if (payload.newPassword === '' && payload.confirmPassword === '') { + delete payload.newPassword; + delete payload.confirmPassword; } - await requestFn(newParams); - } else { + } + + if (!payload) { snackbar.success(b3Lang('accountSettings.notification.noEdits')); return; } + const requestFn = isBCUser ? updateBCAccountSettings : updateB2BAccountSettings; + await requestFn(payload); + if ( (data.password && data.currentPassword) || customer.emailAddress !== trim(data.email) diff --git a/apps/storefront/src/pages/AccountSetting/utils.ts b/apps/storefront/src/pages/AccountSetting/utils.ts index 6db33cff..f3ee1f39 100644 --- a/apps/storefront/src/pages/AccountSetting/utils.ts +++ b/apps/storefront/src/pages/AccountSetting/utils.ts @@ -201,7 +201,7 @@ export const b2bSubmitDataProcessing = ( const param: Partial = {}; param.formFields = []; - let isEdit = true; + let pristine = true; let flag = true; let useExtraFieldsFlag = false; @@ -210,19 +210,19 @@ export const b2bSubmitDataProcessing = ( if (key === item.name) { flag = false; if (deCodeField(item.name) === 'first_name') { - if (accountSettings.firstName !== data[item.name]) isEdit = false; + if (accountSettings.firstName !== data[item.name]) pristine = false; param.firstName = data[item.name]; } if (deCodeField(item.name) === 'last_name') { - if (accountSettings.lastName !== data[item.name]) isEdit = false; + if (accountSettings.lastName !== data[item.name]) pristine = false; param.lastName = data[item.name]; } if (deCodeField(item.name) === 'phone') { - if (accountSettings.phoneNumber !== data[item.name]) isEdit = false; + if (accountSettings.phoneNumber !== data[item.name]) pristine = false; param.phoneNumber = data[item.name]; } if (deCodeField(item.name) === 'email') { - if (accountSettings.email !== data[item.name]) isEdit = false; + if (accountSettings.email !== data[item.name]) pristine = false; param.email = data[item.name]; } if (item.custom) { @@ -234,7 +234,7 @@ export const b2bSubmitDataProcessing = ( } }); if (useExtraFieldsFlag) { - isEdit = false; + pristine = false; } if (flag) { @@ -250,11 +250,11 @@ export const b2bSubmitDataProcessing = ( (formField: Partial) => formField.name === field.bcLabel, ); if (account && JSON.stringify(account.value) !== JSON.stringify(data[key])) { - isEdit = false; + pristine = false; } if (!accountSettings?.formFields?.length && name && !!data[name]) { - isEdit = false; + pristine = false; } } }); @@ -262,7 +262,7 @@ export const b2bSubmitDataProcessing = ( if (flag) { if (key === 'password') { param.newPassword = data[key]; - if (data[key]) isEdit = false; + if (data[key]) pristine = false; } else { param[key] = data[key]; } @@ -274,10 +274,11 @@ export const b2bSubmitDataProcessing = ( delete param.role; - return { - isEdit: !isEdit, - param, - }; + if (pristine) { + return undefined; + } + + return param; }; export const bcSubmitDataProcessing = ( @@ -288,30 +289,30 @@ export const bcSubmitDataProcessing = ( ) => { const param: Partial = {}; param.formFields = []; - let isEdit = true; + let pristine = true; let flag = true; Object.keys(data).forEach((key: string) => { decryptionFields.forEach((item: Partial) => { if (key === item.name) { flag = false; if (deCodeField(item.name) === 'first_name') { - if (accountSettings.firstName !== data[item.name]) isEdit = false; + if (accountSettings.firstName !== data[item.name]) pristine = false; param.firstName = data[item.name]; } if (deCodeField(item.name) === 'last_name') { - if (accountSettings.lastName !== data[item.name]) isEdit = false; + if (accountSettings.lastName !== data[item.name]) pristine = false; param.lastName = data[item.name]; } if (deCodeField(item.name) === 'phone') { - if (accountSettings.phoneNumber !== data[item.name]) isEdit = false; + if (accountSettings.phoneNumber !== data[item.name]) pristine = false; param.phoneNumber = data[item.name]; } if (deCodeField(item.name) === 'email') { - if (accountSettings.email !== data[item.name]) isEdit = false; + if (accountSettings.email !== data[item.name]) pristine = false; param.email = data[item.name]; } if (deCodeField(item.name) === 'company') { - if (accountSettings.company !== data[item.name]) isEdit = false; + if (accountSettings.company !== data[item.name]) pristine = false; param.company = data[item.name]; } } @@ -329,7 +330,7 @@ export const bcSubmitDataProcessing = ( (formField: Partial) => formField.name === field.bcLabel, ); if (account && JSON.stringify(account.value) !== JSON.stringify(data[key])) - isEdit = false; + pristine = false; } }); } @@ -337,7 +338,7 @@ export const bcSubmitDataProcessing = ( if (flag) { if (key === 'password') { param.newPassword = data[key]; - if (data[key]) isEdit = false; + if (data[key]) pristine = false; } else { param[key] = data[key]; } @@ -345,10 +346,11 @@ export const bcSubmitDataProcessing = ( flag = true; }); - return { - isEdit: !isEdit, - param, - }; + if (pristine) { + return undefined; + } + + return param; }; export default sendEmail;