11import  {  Divider ,  MenuProps  }  from  'antd' ; 
22import  Dropdown ,  {  DropdownProps  }  from  'antd/es/dropdown/dropdown' ; 
3- import  React  from  'react' ; 
3+ import  React ,   { useState }  from  'react' ; 
44import  {  useTranslation  }  from  'react-i18next' ; 
5- import  {  NavLink  }  from  'react-router-dom' ; 
65
76import  {  IconButton  }  from  '@/components/icon' ; 
87import  {  useLoginStateContext  }  from  '@/pages/sys/login/providers/LoginStateProvider' ; 
98import  {  useRouter  }  from  '@/router/hooks' ; 
109import  {  useUserInfo ,  useUserActions  }  from  '@/store/userStore' ; 
1110import  {  useThemeToken  }  from  '@/theme/hooks' ; 
1211import  avatar  from  '@/assets/images/qinshihuang.jpg' ; 
12+ import  MfaBindingModal  from  "@/layouts/_common/mfa-modal.tsx" ; 
13+ import  sysService  from  "@/api/services/sysService.ts" ; 
1314
14- const  {  VITE_APP_HOMEPAGE : HOMEPAGE  }  =  import . meta. env ; 
1515
1616/** 
1717 * Account Dropdown 
@@ -24,8 +24,6 @@ export default function AccountDropdown() {
2424  const  {  t }  =  useTranslation ( ) ; 
2525  const  logout  =  ( )  =>  { 
2626    try  { 
27-       // todo const logoutMutation = useMutation(userService.logout); 
28-       // todo logoutMutation.mutateAsync(); 
2927      clearUserInfoAndToken ( ) ; 
3028      backToLogin ( ) ; 
3129    }  catch  ( error )  { 
@@ -35,6 +33,7 @@ export default function AccountDropdown() {
3533    } 
3634  } ; 
3735  const  {  colorBgElevated,  borderRadiusLG,  boxShadowSecondary }  =  useThemeToken ( ) ; 
36+   const  [ mfaModalVisible ,  setMfaModalVisible ]  =  useState ( false ) ; 
3837
3938  const  contentStyle : React . CSSProperties  =  { 
4039    backgroundColor : colorBgElevated , 
@@ -58,14 +57,10 @@ export default function AccountDropdown() {
5857  ) ; 
5958
6059  const  items : MenuProps [ 'items' ]  =  [ 
61-     {  label : < NavLink  to = { HOMEPAGE } > { t ( 'sys.menu.dashboard' ) } </ NavLink > ,  key : '0'  } , 
6260    { 
63-       label : < NavLink  to = "/management/user/profile" > { t ( 'sys.menu.user.profile' ) } </ NavLink > , 
64-       key : '1' , 
65-     } , 
66-     { 
67-       label : < NavLink  to = "/management/user/account" > { t ( 'sys.menu.user.account' ) } </ NavLink > , 
61+       label : < button > 2FA认证</ button > , 
6862      key : '2' , 
63+       onClick : ( )  =>  setMfaModalVisible ( true ) , 
6964    } , 
7065    {  type : 'divider'  } , 
7166    { 
@@ -75,11 +70,21 @@ export default function AccountDropdown() {
7570    } , 
7671  ] ; 
7772
73+   const  handleVerify  =  ( mfaCode : string ,  secret : string )  =>  { 
74+     sysService . verifyMfa ( mfaCode ,  secret ) . then ( res  =>  { 
75+       console . log ( res ) ; 
76+       setMfaModalVisible ( false ) ; 
77+     } ) ; 
78+   } 
79+ 
7880  return  ( 
79-     < Dropdown  menu = { {  items } }  trigger = { [ 'click' ] }  dropdownRender = { dropdownRender } > 
80-       < IconButton  className = "h-10 w-10 transform-none px-0 hover:scale-105" > 
81-         < img  className = "h-8 w-8 rounded-full"  src = { avatar }  alt = ""  /> 
82-       </ IconButton > 
83-     </ Dropdown > 
81+     < > 
82+       < Dropdown  menu = { {  items } }  trigger = { [ 'click' ] }  dropdownRender = { dropdownRender } > 
83+         < IconButton  className = "h-10 w-10 transform-none px-0 hover:scale-105" > 
84+           < img  className = "h-8 w-8 rounded-full"  src = { avatar }  alt = ""  /> 
85+         </ IconButton > 
86+       </ Dropdown > 
87+       < MfaBindingModal  isOpen = { mfaModalVisible }  onVerify = { handleVerify }  onClose = { ( )  =>  setMfaModalVisible ( false ) } /> 
88+     </ > 
8489  ) ; 
8590} 
0 commit comments