Skip to content
Snippets Groups Projects
FormOAuth.tsx 2.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { useCallback, useState } from 'react'
    
    import { useI18n } from 'cozy-ui/transpiled/react/I18n'
    
    import { useClient } from 'cozy-client'
    
    import './auth.scss'
    
    Yoan VALLET's avatar
    Yoan VALLET committed
    import { Konnector } from 'models'
    
    import { OAuthWindow } from 'cozy-harvest-lib/dist/components/OAuthWindow'
    
    import Button from '@material-ui/core/Button'
    
    import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
    
    Yoan VALLET's avatar
    Yoan VALLET committed
    import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
    
    import { getPartnerPicto } from 'utils/picto'
    
    interface FormOAuthProps {
    
      konnector: Konnector | null
    
      onSuccess: Function
    
      highlightedStyle?: boolean
    
    const FormOAuth: React.FC<FormOAuthProps> = ({
    
      konnector,
      onSuccess,
    
      highlightedStyle = true,
    }: FormOAuthProps) => {
    
      const IDLE = 'idle'
      const WAITING = 'waiting'
    
    
      const { t } = useI18n()
      const client = useClient()
    
      const [status, setStatus] = useState<string>(IDLE)
    
    
      const endOAuth = useCallback(() => {
    
        setStatus(IDLE)
    
      }, [])
    
      const startOAuth = useCallback(() => {
    
        setStatus(WAITING)
    
      const handleAccountId = useCallback(
        (accountId: string) => {
          endOAuth()
          onSuccess(accountId)
        },
    
        [endOAuth, onSuccess]
    
      const handleOAuthCancel = useCallback(() => {
    
        endOAuth()
    
      }, [endOAuth])
    
      const icon = getPartnerPicto(
        konnector ? konnector.slug : '',
        highlightedStyle
      )
    
      const isWaiting = status === WAITING
    
    
      if (!konnector) {
        return null
      }
      return (
    
          <Button
    
            aria-label={t('auth.accessibility.button_connect')}
    
            onClick={startOAuth}
    
            disabled={isWaiting}
    
              root: `${
                highlightedStyle ? 'btn-highlight' : 'btn-secondary-negative'
              }`,
    
              label: 'text-18-bold',
    
            <div className="authform-button-content">
              <div className="authform-button-content-icon">
    
    Yoan VALLET's avatar
    Yoan VALLET committed
                {isWaiting ? (
                  <StyledBlackSpinner size={48} />
                ) : (
    
                  <StyledIcon icon={icon} size={80} />
    
    Yoan VALLET's avatar
    Yoan VALLET committed
                )}
    
              </div>
    
              <div className="authform-button-text text-18-bold">
    
    Yoan VALLET's avatar
    Yoan VALLET committed
                <div>{t('auth.' + konnector.slug + '.connect.label1')}</div>
                <div>{t('auth.' + konnector.slug + '.connect.label2')}</div>
    
              </div>
            </div>
    
          </Button>
    
          {isWaiting && (
            <OAuthWindow
              client={client}
              konnector={konnector}
    
              redirectSlug={client.appMetadata.slug}
    
              onSuccess={handleAccountId}
              onCancel={handleOAuthCancel}
              t={t}
            />
          )}
        </>
      )
    }
    
    
    export default FormOAuth