| 'use client' | |
| import { useRouter, useSearchParams } from 'next/navigation' | |
| import type { FC } from 'react' | |
| import { useState } from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' | |
| import Toast from '@/app/components/base/toast' | |
| import { getUserOAuth2SSOUrl, getUserOIDCSSOUrl, getUserSAMLSSOUrl } from '@/service/sso' | |
| import Button from '@/app/components/base/button' | |
| import { SSOProtocol } from '@/types/feature' | |
| type SSOAuthProps = { | |
| protocol: SSOProtocol | '' | |
| } | |
| const SSOAuth: FC<SSOAuthProps> = ({ | |
| protocol, | |
| }) => { | |
| const router = useRouter() | |
| const { t } = useTranslation() | |
| const searchParams = useSearchParams() | |
| const invite_token = decodeURIComponent(searchParams.get('invite_token') || '') | |
| const [isLoading, setIsLoading] = useState(false) | |
| const handleSSOLogin = () => { | |
| setIsLoading(true) | |
| if (protocol === SSOProtocol.SAML) { | |
| getUserSAMLSSOUrl(invite_token).then((res) => { | |
| router.push(res.url) | |
| }).finally(() => { | |
| setIsLoading(false) | |
| }) | |
| } | |
| else if (protocol === SSOProtocol.OIDC) { | |
| getUserOIDCSSOUrl(invite_token).then((res) => { | |
| document.cookie = `user-oidc-state=${res.state}` | |
| router.push(res.url) | |
| }).finally(() => { | |
| setIsLoading(false) | |
| }) | |
| } | |
| else if (protocol === SSOProtocol.OAuth2) { | |
| getUserOAuth2SSOUrl(invite_token).then((res) => { | |
| document.cookie = `user-oauth2-state=${res.state}` | |
| router.push(res.url) | |
| }).finally(() => { | |
| setIsLoading(false) | |
| }) | |
| } | |
| else { | |
| Toast.notify({ | |
| type: 'error', | |
| message: 'invalid SSO protocol', | |
| }) | |
| setIsLoading(false) | |
| } | |
| } | |
| return ( | |
| <Button | |
| tabIndex={0} | |
| onClick={() => { handleSSOLogin() }} | |
| disabled={isLoading} | |
| className="w-full" | |
| > | |
| <Lock01 className='mr-2 w-5 h-5 text-text-accent-light-mode-only' /> | |
| <span className="truncate">{t('login.withSSO')}</span> | |
| </Button> | |
| ) | |
| } | |
| export default SSOAuth | |