You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use client'
  2. import { useRouter, useSearchParams } from 'next/navigation'
  3. import type { FC } from 'react'
  4. import React, { useCallback } from 'react'
  5. import { useTranslation } from 'react-i18next'
  6. import { removeAccessToken } from '@/app/components/share/utils'
  7. import { useGlobalPublicStore } from '@/context/global-public-context'
  8. import AppUnavailable from '@/app/components/base/app-unavailable'
  9. import NormalForm from './normalForm'
  10. import { AccessMode } from '@/models/access-control'
  11. import ExternalMemberSsoAuth from './components/external-member-sso-auth'
  12. import { useWebAppStore } from '@/context/web-app-context'
  13. const WebSSOForm: FC = () => {
  14. const { t } = useTranslation()
  15. const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
  16. const webAppAccessMode = useWebAppStore(s => s.webAppAccessMode)
  17. const searchParams = useSearchParams()
  18. const router = useRouter()
  19. const redirectUrl = searchParams.get('redirect_url')
  20. const getSigninUrl = useCallback(() => {
  21. const params = new URLSearchParams()
  22. params.append('redirect_url', redirectUrl || '')
  23. return `/webapp-signin?${params.toString()}`
  24. }, [redirectUrl])
  25. const backToHome = useCallback(() => {
  26. removeAccessToken()
  27. const url = getSigninUrl()
  28. router.replace(url)
  29. }, [getSigninUrl, router])
  30. if (!redirectUrl) {
  31. return <div className='flex h-full items-center justify-center'>
  32. <AppUnavailable code={t('share.common.appUnavailable')} unknownReason='redirect url is invalid.' />
  33. </div>
  34. }
  35. if (!systemFeatures.webapp_auth.enabled) {
  36. return <div className="flex h-full items-center justify-center">
  37. <p className='system-xs-regular text-text-tertiary'>{t('login.webapp.disabled')}</p>
  38. </div>
  39. }
  40. if (webAppAccessMode && (webAppAccessMode === AccessMode.ORGANIZATION || webAppAccessMode === AccessMode.SPECIFIC_GROUPS_MEMBERS)) {
  41. return <div className='w-full max-w-[400px]'>
  42. <NormalForm />
  43. </div>
  44. }
  45. if (webAppAccessMode && webAppAccessMode === AccessMode.EXTERNAL_MEMBERS)
  46. return <ExternalMemberSsoAuth />
  47. return <div className='flex h-full flex-col items-center justify-center gap-y-4'>
  48. <AppUnavailable className='h-auto w-auto' isUnknownReason={true} />
  49. <span className='system-sm-regular cursor-pointer text-text-tertiary' onClick={backToHome}>{t('share.login.backToHome')}</span>
  50. </div>
  51. }
  52. export default React.memo(WebSSOForm)