All files / modules/70-pipeline/components/PipelineStudio/SaveTemplateButton useSaveAsTemplate.tsx

100% Statements 34/34
80% Branches 4/5
100% Functions 4/4
100% Lines 34/34

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              30x 30x 30x 30x 30x 30x 30x   30x   30x 30x   30x   30x 30x               30x 61x 61x 61x 61x 61x 61x 61x   1x                       61x           61x 1x 1x 1x   1x 1x 1x 1x                     1x         1x           61x    
/*
 * Copyright 2022 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 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/06/PolyForm-Shield-1.0.0.txt.
 */
 
import React from 'react'
import { useModalHook } from '@harness/use-modal'
import produce from 'immer'
import { defaultTo, merge, omit } from 'lodash-es'
import { Dialog } from '@blueprintjs/core'
import { useParams } from 'react-router-dom'
import { DefaultTemplate } from 'framework/Templates/templates'
import type { NGTemplateInfoConfig } from 'services/template-ng'
import { ModalProps, TemplateConfigModal } from 'framework/Templates/TemplateConfigModal/TemplateConfigModal'
import type { ProjectPathProps, GitQueryParams } from '@common/interfaces/RouteInterfaces'
import { useQueryParams } from '@common/hooks'
import { useSaveTemplate } from '@pipeline/utils/useSaveTemplate'
import type { JsonNode } from 'services/cd-ng'
import { AppStoreContext } from 'framework/AppStore/AppStoreContext'
import type { SaveTemplateButtonProps } from '@pipeline/components/PipelineStudio/SaveTemplateButton/SaveTemplateButton'
import { useStrings } from 'framework/strings'
import css from './SaveAsTemplate.module.scss'
 
interface TemplateActionsReturnType {
  save: () => void
}
 
type SaveAsTemplateProps = Omit<SaveTemplateButtonProps, 'buttonProps'>
 
export function useSaveAsTemplate({ data, type }: SaveAsTemplateProps): TemplateActionsReturnType {
  const { orgIdentifier, projectIdentifier } = useParams<ProjectPathProps>()
  const { repoIdentifier, branch } = useQueryParams<GitQueryParams>()
  const [template, setTemplate] = React.useState<NGTemplateInfoConfig>()
  const [modalProps, setModalProps] = React.useState<ModalProps>()
  const { isGitSyncEnabled } = React.useContext(AppStoreContext)
  const { getString } = useStrings()
  const [showConfigModal, hideConfigModal] = useModalHook(
    () => (
      <Dialog enforceFocus={false} isOpen={true} className={css.configDialog}>
        {modalProps && template && (
          <TemplateConfigModal
            initialValues={merge(template, { repo: defaultTo(repoIdentifier, ''), branch: defaultTo(branch, '') })}
            onClose={hideConfigModal}
            modalProps={modalProps}
          />
        )}
      </Dialog>
    ),
    [template, modalProps, repoIdentifier, branch]
  )
  const { saveAndPublish } = useSaveTemplate({
    template: template as NGTemplateInfoConfig,
    gitDetails: { repoIdentifier, branch },
    isPipelineStudio: true
  })
 
  const onSaveAsTemplate = async () => {
    try {
      const finalData = typeof data === 'function' ? await data() : data
      setTemplate(
        produce(DefaultTemplate, draft => {
          draft.projectIdentifier = projectIdentifier
          draft.orgIdentifier = orgIdentifier
          draft.type = type
          draft.spec = omit(
            finalData,
            'name',
            'identifier',
            'description',
            'tags',
            'orgIdentifier',
            'projectIdentifier'
          ) as JsonNode
        })
      )
      setModalProps({
        title: getString('common.template.saveAsNewTemplateHeading'),
        promise: saveAndPublish,
        shouldGetComment: !isGitSyncEnabled
      })
      showConfigModal()
    } catch (_error) {
      //Do not do anything as there are error in the form
    }
  }
 
  return { save: onSaveAsTemplate }
}