Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use client'
  2. import { useRouter, useSearchParams } from 'next/navigation'
  3. import type { FC } from 'react'
  4. import { useCallback } from 'react'
  5. import { useState } from 'react'
  6. import { useTranslation } from 'react-i18next'
  7. import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
  8. import Toast from '@/app/components/base/toast'
  9. import Button from '@/app/components/base/button'
  10. import { SSOProtocol } from '@/types/feature'
  11. import { fetchMembersOAuth2SSOUrl, fetchMembersOIDCSSOUrl, fetchMembersSAMLSSOUrl } from '@/service/share'
  12. type SSOAuthProps = {
  13. protocol: SSOProtocol | ''
  14. }
  15. const SSOAuth: FC<SSOAuthProps> = ({
  16. protocol,
  17. }) => {
  18. const router = useRouter()
  19. const { t } = useTranslation()
  20. const searchParams = useSearchParams()
  21. const redirectUrl = searchParams.get('redirect_url')
  22. const getAppCodeFromRedirectUrl = useCallback(() => {
  23. const appCode = redirectUrl?.split('/').pop()
  24. if (!appCode)
  25. return null
  26. return appCode
  27. }, [redirectUrl])
  28. const [isLoading, setIsLoading] = useState(false)
  29. const handleSSOLogin = () => {
  30. const appCode = getAppCodeFromRedirectUrl()
  31. if (!redirectUrl || !appCode) {
  32. Toast.notify({
  33. type: 'error',
  34. message: 'invalid redirect URL or app code',
  35. })
  36. return
  37. }
  38. setIsLoading(true)
  39. if (protocol === SSOProtocol.SAML) {
  40. fetchMembersSAMLSSOUrl(appCode, redirectUrl).then((res) => {
  41. router.push(res.url)
  42. }).finally(() => {
  43. setIsLoading(false)
  44. })
  45. }
  46. else if (protocol === SSOProtocol.OIDC) {
  47. fetchMembersOIDCSSOUrl(appCode, redirectUrl).then((res) => {
  48. router.push(res.url)
  49. }).finally(() => {
  50. setIsLoading(false)
  51. })
  52. }
  53. else if (protocol === SSOProtocol.OAuth2) {
  54. fetchMembersOAuth2SSOUrl(appCode, redirectUrl).then((res) => {
  55. router.push(res.url)
  56. }).finally(() => {
  57. setIsLoading(false)
  58. })
  59. }
  60. else {
  61. Toast.notify({
  62. type: 'error',
  63. message: 'invalid SSO protocol',
  64. })
  65. setIsLoading(false)
  66. }
  67. }
  68. return (
  69. <Button
  70. tabIndex={0}
  71. onClick={() => { handleSSOLogin() }}
  72. disabled={isLoading}
  73. className="w-full"
  74. >
  75. <Lock01 className='mr-2 h-5 w-5 text-text-accent-light-mode-only' />
  76. <span className="truncate">{t('login.withSSO')}</span>
  77. </Button>
  78. )
  79. }
  80. export default SSOAuth