All files / modules/35-user-profile/components/TwoFactorAuthentication TwoFactorAuthentication.tsx

97.14% Statements 34/35
85.71% Branches 6/7
100% Functions 5/5
97.14% Lines 34/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93              1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x           1x 20x 20x 20x 20x 20x   20x   20x           1x 1x 1x 1x 1x 1x                     20x 10x           20x                   2x 1x   1x                   1x           1x  
/*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Free Trial 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/05/PolyForm-Free-Trial-1.0.0.txt.
 */
 
import React from 'react'
import { Button, Layout, Text, shouldShowError, useConfirmationDialog } from '@wings-software/uicore'
import { Color } from '@harness/design-system'
import { useStrings } from 'framework/strings'
import { useDisableTwoFactorAuth } from 'services/cd-ng'
import { useToaster } from '@common/exports'
import { useQueryParams } from '@common/hooks'
import { useEnableTwoFactorAuthModal } from '@user-profile/modals/EnableTwoFactorAuth/useEnableTwoFactorAuthModal'
import { useAppStore } from 'framework/AppStore/AppStoreContext'
import { FeatureIdentifier } from 'framework/featureStore/FeatureIdentifier'
import FeatureSwitch from '@rbac/components/Switch/Switch'
import css from './TwoFactorAuthentication.module.scss'
 
interface Props {
  twoFactorAuthenticationDisabled: boolean
}
 
const TwoFactorAuthentication: React.FC<Props> = ({ twoFactorAuthenticationDisabled }) => {
  const { getString } = useStrings()
  const { openTwoFactorModal } = useQueryParams<{ openTwoFactorModal?: string }>()
  const { showSuccess, showError } = useToaster()
  const { currentUserInfo, updateAppStore } = useAppStore()
  const { mutate: disableTwoFactorAuth } = useDisableTwoFactorAuth({})
 
  const { openEnableTwoFactorAuthModal } = useEnableTwoFactorAuthModal()
 
  const { openDialog: disableTwoFactorAuthDialog } = useConfirmationDialog({
    titleText: getString('userProfile.twoFactor.disableTitle'),
    contentText: getString('userProfile.twoFactor.disableText'),
    confirmButtonText: getString('common.disable'),
    cancelButtonText: getString('cancel'),
    onCloseDialog: async (isConfirmed: boolean) => {
      /* istanbul ignore else */ if (isConfirmed) {
        try {
          const disabled = await disableTwoFactorAuth('' as any, { headers: { 'content-type': 'application/json' } })
          /* istanbul ignore else */ if (disabled) {
            showSuccess(getString('userProfile.twoFactor.disableSuccess'))
            updateAppStore({ currentUserInfo: disabled.data })
          }
        } catch (e) {
          /* istanbul ignore next */ if (shouldShowError(e)) {
            showError(e.data.message || e.message)
          }
        }
      }
    }
  })
 
  React.useEffect(() => {
    /* istanbul ignore else */ Iif (openTwoFactorModal === 'true') {
      openEnableTwoFactorAuthModal(false)
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [openTwoFactorModal])
 
  return (
    <>
      <Layout.Horizontal spacing="small" className={css.twoFactorAuth}>
        <FeatureSwitch
          featureProps={{ featureRequest: { featureName: FeatureIdentifier.TWO_FACTOR_AUTH_SUPPORT } }}
          className={css.switch}
          data-testid={'TwoFactorAuthSwitch'}
          checked={currentUserInfo.twoFactorAuthenticationEnabled}
          disabled={twoFactorAuthenticationDisabled}
          onChange={event => {
            if (event.currentTarget.checked) {
              openEnableTwoFactorAuthModal(false)
            } else {
              disableTwoFactorAuthDialog()
            }
          }}
        />
        <Text color={Color.BLACK} font={{ weight: 'semi-bold' }}>
          {getString('userProfile.twofactorAuth')}
        </Text>
      </Layout.Horizontal>
 
      {currentUserInfo.twoFactorAuthenticationEnabled ? (
        <Button icon="reset" minimal onClick={() => openEnableTwoFactorAuthModal(true)} />
      ) : null}
    </>
  )
}
 
export default TwoFactorAuthentication