All files / modules/70-pipeline/utils useTemplateSelector.ts

51.72% Statements 15/29
0% Branches 0/26
37.5% Functions 3/8
51.72% Lines 15/29

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 94 95 96 97 98 99 100 101 102 103 104 105              102x 102x 102x 102x 102x 102x                                     102x         166x 166x   166x             166x                                                       166x   1x 1x                                                 166x    
/*
 * 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 { parse } from 'yaml'
import { useParams } from 'react-router-dom'
import { isEmpty, merge, set } from 'lodash-es'
import { SelectorData, TemplateDrawerTypes } from '@pipeline/components/PipelineStudio/PipelineContext/PipelineActions'
import {
  findAllByKey,
  getTemplateTypesByRef,
  usePipelineContext
} from '@pipeline/components/PipelineStudio/PipelineContext/PipelineContext'
import type { TemplateSummaryResponse } from 'services/template-ng'
import type { ProjectPathProps } from '@common/interfaces/RouteInterfaces'
 
export interface GetTemplateResponse {
  template: TemplateSummaryResponse
  isCopied: boolean
}
 
export type GetTemplateProps = Omit<SelectorData, 'onSubmit' | 'onCancel'>
 
interface TemplateActionsReturnType {
  getTemplate: (data: GetTemplateProps) => Promise<GetTemplateResponse>
}
 
export function useTemplateSelector(): TemplateActionsReturnType {
  const {
    state: { templateTypes, gitDetails },
    updateTemplateView,
    setTemplateTypes
  } = usePipelineContext()
  const { accountId, orgIdentifier, projectIdentifier } = useParams<ProjectPathProps>()
 
  const closeTemplateSelector = React.useCallback(() => {
    updateTemplateView({
      isTemplateDrawerOpened: false,
      templateDrawerData: { type: TemplateDrawerTypes.UseTemplate }
    })
  }, [updateTemplateView])
 
  const updateTemplateTypes = React.useCallback(
    (template: TemplateSummaryResponse, isCopied: boolean) => {
      if (isCopied) {
        const templateRefs = findAllByKey('templateRef', parse(template?.yaml || '')?.template.spec)
        if (!isEmpty(templateRefs)) {
          getTemplateTypesByRef(
            {
              accountIdentifier: accountId,
              orgIdentifier: orgIdentifier,
              projectIdentifier: projectIdentifier,
              templateListType: 'Stable',
              repoIdentifier: gitDetails.repoIdentifier,
              branch: gitDetails.branch,
              getDefaultFromOtherRepo: true
            },
            templateRefs
          ).then(resp => {
            setTemplateTypes(merge(templateTypes, resp))
          })
        }
      } else if (template?.identifier && template?.childType) {
        set(templateTypes, template.identifier, template.childType)
        setTemplateTypes(templateTypes)
      }
    },
    [accountId, orgIdentifier, projectIdentifier, gitDetails, templateTypes, setTemplateTypes]
  )
 
  const getTemplate = React.useCallback(
    (selectorData: GetTemplateProps): Promise<GetTemplateResponse> => {
      return new Promise((resolve, reject) => {
        updateTemplateView({
          isTemplateDrawerOpened: true,
          templateDrawerData: {
            type: TemplateDrawerTypes.UseTemplate,
            data: {
              selectorData: {
                ...selectorData,
                onSubmit: (template: TemplateSummaryResponse, isCopied: boolean) => {
                  closeTemplateSelector()
                  updateTemplateTypes(template, isCopied)
                  resolve({ template, isCopied })
                },
                onCancel: () => {
                  closeTemplateSelector()
                  reject()
                }
              }
            }
          }
        })
      })
    },
    [updateTemplateView, closeTemplateSelector, updateTemplateTypes]
  )
 
  return { getTemplate }
}