@@ -12,17 +12,20 @@ import {
1212 Grid2 as Grid ,
1313 InputAdornment ,
1414 IconButton ,
15+ Divider ,
16+ Stack ,
1517} from '@mui/material' ;
16- import { Icon } from '@c-x/ui' ;
18+ import { Icon , message } from '@c-x/ui' ;
1719
1820// @ts -ignore
1921import { AestheticFluidBg } from '@/assets/jsm/AestheticFluidBg.module.js' ;
2022
2123import { useSearchParams } from 'react-router-dom' ;
22- import { postLogin } from '@/api/User' ;
24+ import { postLogin , getUserOauthSignupOrIn , getGetSetting } from '@/api/User' ;
2325
2426import { useForm , Controller } from 'react-hook-form' ;
2527import { styled } from '@mui/material/styles' ;
28+ import { useRequest } from 'ahooks' ;
2629
2730// 样式化组件
2831const StyledContainer = styled ( Container ) ( ( { theme } ) => ( {
@@ -111,6 +114,7 @@ const AuthPage = () => {
111114 const [ showPassword , setShowPassword ] = useState ( false ) ;
112115
113116 const [ searchParams ] = useSearchParams ( ) ;
117+ const { data : loginSetting = { } } = useRequest ( getGetSetting ) ;
114118
115119 const {
116120 control,
@@ -132,7 +136,8 @@ const AuthPage = () => {
132136 try {
133137 const sessionId = searchParams . get ( 'session_id' ) ;
134138 if ( ! sessionId ) {
135- throw new Error ( '缺少会话ID参数' ) ;
139+ message . error ( '缺少会话ID参数' ) ;
140+ return ;
136141 }
137142
138143 // 用户登录
@@ -245,17 +250,6 @@ const AuthPage = () => {
245250 />
246251 ) ;
247252
248- // 渲染错误提示
249- const renderErrorAlert = ( ) => {
250- if ( ! error ) return null ;
251-
252- return (
253- < Grid size = { 12 } >
254- < Alert severity = 'error' > { error } </ Alert >
255- </ Grid >
256- ) ;
257- } ;
258-
259253 // 渲染登录按钮
260254 const renderLoginButton = ( ) => (
261255 < Grid size = { 12 } >
@@ -271,6 +265,32 @@ const AuthPage = () => {
271265 </ Grid >
272266 ) ;
273267
268+ const onDingdingLogin = ( ) => {
269+ getUserOauthSignupOrIn ( {
270+ platform : 'dingtalk' ,
271+ redirect_url : window . location . origin + window . location . pathname ,
272+ // @ts -ignore
273+ session_id : searchParams . get ( 'session_id' ) || null ,
274+ } ) . then ( ( res ) => {
275+ if ( res . url ) {
276+ window . location . href = res . url ;
277+ }
278+ } ) ;
279+ } ;
280+
281+ const dingdingLogin = ( ) => {
282+ return (
283+ < Stack justifyContent = 'center' >
284+ < Divider sx = { { my : 3 , fontSize : 12 , borderColor : 'divider' } } >
285+ 使用其他方式登录
286+ </ Divider >
287+ < IconButton sx = { { alignSelf : 'center' } } onClick = { onDingdingLogin } >
288+ < Icon type = 'icon-dingding' sx = { { fontSize : 30 } } />
289+ </ IconButton >
290+ </ Stack >
291+ ) ;
292+ } ;
293+
274294 // 渲染登录表单
275295 const renderLoginForm = ( ) => (
276296 < >
@@ -284,19 +304,27 @@ const AuthPage = () => {
284304 < Box component = 'form' onSubmit = { handleSubmit ( onSubmit ) } >
285305 < Grid container spacing = { 4 } >
286306 < Grid size = { 12 } > { renderUsernameField ( ) } </ Grid >
287-
288307 < Grid size = { 12 } > { renderPasswordField ( ) } </ Grid >
289308
290- { renderErrorAlert ( ) }
291309 { renderLoginButton ( ) }
292310 </ Grid >
293311 </ Box >
294312 </ >
295313 ) ;
296314
315+ useEffect ( ( ) => {
316+ const redirect_url = searchParams . get ( 'redirect_url' ) ;
317+ if ( redirect_url ) {
318+ window . location . href = redirect_url ;
319+ }
320+ } , [ ] ) ;
321+
297322 return (
298323 < StyledContainer id = 'box' >
299- < StyledPaper elevation = { 3 } > { renderLoginForm ( ) } </ StyledPaper >
324+ < StyledPaper elevation = { 3 } >
325+ { ! loginSetting . disable_password_login && renderLoginForm ( ) }
326+ { loginSetting . enable_dingtalk_oauth && dingdingLogin ( ) }
327+ </ StyledPaper >
300328 </ StyledContainer >
301329 ) ;
302330} ;
0 commit comments