disable 2fa

This commit is contained in:
hamid zarghami
2025-07-27 10:15:14 +03:30
parent 4fd6378ee8
commit a75682dd82
6 changed files with 125 additions and 13 deletions
+2 -2
View File
@@ -6,8 +6,8 @@ VITE_DANAK_BASE_URL ='https://api.danakcorp.com'
VITE_SOCKET_URL = 'wss://dmail-api.danakcorp.com/email'
# VITE_SOCKET_URL = 'ws://192.168.1.118:4000/email'
# VITE_BASE_URL = 'https://dmail-api.danakcorp.com'
VITE_BASE_URL = 'http://192.168.1.101:4000'
VITE_BASE_URL = 'https://dmail-api.danakcorp.com'
# VITE_BASE_URL = 'http://192.168.1.101:4000'
VITE_SERVICE_ID = 'e51afdc3-ea0b-49cf-8f49-2a6f131b024e'
+5 -1
View File
@@ -150,7 +150,11 @@
"2fa_step_2": "QR Code را اسکن کنید یا کد را به صورت دستی وارد کنید",
"2fa_step_3": "کد 6 رقمی تولید شده توسط برنامه را وارد کنید",
"note": "توجه",
"2fa_note": "کد های پشتیبان خود را در مکانی امن نگهداری کنید"
"2fa_note": "کد های پشتیبان خود را در مکانی امن نگهداری کنید",
"disable_2fa": "غیر فعال کردن دو مرحله ای",
"enter_2fa_code": "کد دو مرحله ای خود را وارد کنید",
"cancel": "انصراف",
"confirm_disable": "تایید غیر فعال سازی"
},
"success": "عملیات با موفقیت انجام شد",
"attachment_select": "اضافه کردن فایل ضمیمه",
+103
View File
@@ -0,0 +1,103 @@
import { FC, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Logout, TickCircle } from 'iconsax-react'
import Button from '@/components/Button'
import Input from '@/components/Input'
import { clx } from '@/helpers/utils'
import { toast } from '@/components/Toast'
import { ErrorType } from '@/helpers/types'
import { useDisableTwoFactor } from '../hooks/useSettingData'
const Enabled: FC = () => {
const { t } = useTranslation()
const [show, setShow] = useState(false)
const [token, setToken] = useState('')
const { mutate: disableTwoFactor } = useDisableTwoFactor()
const handleDisableTwoFactor = () => {
if (token.length !== 6) {
toast(t('setting.invalid_code_length'), 'error')
return
}
disableTwoFactor(token, {
onSuccess: () => {
setShow(false)
setToken('')
window.location.reload()
},
onError: (error: ErrorType) => {
toast(error.response?.data?.error?.message[0] || t('setting.2fa_disabled_failed'), 'error')
}
})
}
return (
<div>
<div className='mt-10 bg-white xl:p-8 p-4 rounded-3xl'>
<div className='text-center py-8'>
<div className='inline-flex items-center justify-center w-16 h-16 bg-green-100 rounded-full mb-4'>
<TickCircle size={32} color='#22c55e' />
</div>
<h2 className='text-lg font-semibold text-green-600 mb-2'>
{t('setting.2fa_enabled_successfully')}
</h2>
</div>
{
show && (
<div className='px-10 mt-10'>
<Input
label={t('setting.enter_2fa_code')}
placeholder={t('setting.enter_2fa_code')}
value={token}
onChange={(e) => setToken(e.target.value)}
maxLength={6}
/>
</div>
)
}
<div className={clx(
'flex justify-center mt-10',
!show && '-mt-5'
)}>
{!show ? (
<Button
onClick={() => setShow(true)}
className='w-fit px-6'
>
<div className='flex items-center gap-2'>
<Logout size={20} color='white' />
<span>{t('setting.disable_2fa')}</span>
</div>
</Button>
) : (
<div className='flex gap-3'>
<Button
onClick={() => {
setShow(false)
setToken('')
}}
variant='secondary'
className='w-fit px-6'
>
{t('setting.cancel')}
</Button>
<Button
onClick={handleDisableTwoFactor}
className='w-fit px-6'
disabled={token.length !== 6}
>
{t('setting.confirm_disable')}
</Button>
</div>
)}
</div>
</div>
</div>
)
}
export default Enabled
+2 -10
View File
@@ -8,6 +8,7 @@ import { ErrorType } from '../../../helpers/types'
import { TickCircle, Scan, Key } from 'iconsax-react'
import { TwoFactorSetupResponseType } from '../types/SettingTypes'
import { useGetProfile } from '@/pages/profile/hooks/useProfileData'
import Enabled from './Enabled'
const TwoFactor: FC = () => {
@@ -68,16 +69,7 @@ const TwoFactor: FC = () => {
if (isEnabled) {
return (
<div className='mt-10 bg-white xl:p-8 p-4 rounded-3xl'>
<div className='text-center py-8'>
<div className='inline-flex items-center justify-center w-16 h-16 bg-green-100 rounded-full mb-4'>
<TickCircle size={32} color='#22c55e' />
</div>
<h2 className='text-lg font-semibold text-green-600 mb-2'>
{t('setting.2fa_enabled_successfully')}
</h2>
</div>
</div>
<Enabled />
)
}
@@ -38,3 +38,9 @@ export const useEnableTwoFactor = () => {
mutationFn: (token: string) => api.enableTwoFactor(token),
});
};
export const useDisableTwoFactor = () => {
return useMutation<TwoFactorEnableResponseType, Error, string>({
mutationFn: (token: string) => api.disableTwoFactor(token),
});
};
@@ -30,3 +30,10 @@ export const enableTwoFactor = async (
const { data } = await axios.post(`/auth/2fa/enable`, { token });
return data;
};
export const disableTwoFactor = async (
token: string
): Promise<TwoFactorEnableResponseType> => {
const { data } = await axios.post(`/auth/2fa/disable `, { token });
return data;
};