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 106 107 108 109 110 111 112 113 | 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 7x 7x 7x 7x | /*
* Copyright 2021 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, { useState } from 'react'
import { get } from 'lodash-es'
import { useToaster } from '@common/exports'
import useActiveEnvironment from '@cf/hooks/useActiveEnvironment'
import { CreateTargetQueryParams, useCreateTarget } from 'services/cf'
import CreateTargetModal, { TargetData } from './CreateTargetModal'
export interface NewTargetsProps {
accountIdentifier: string
orgIdentifier: string
projectIdentifier: string
onCreated: () => void
}
type SettledTarget = {
status: 'fulfilled' | 'rejected'
data: TargetData
}
export const NewTargets: React.FC<NewTargetsProps> = ({
accountIdentifier,
orgIdentifier,
projectIdentifier,
onCreated
}) => {
const { showError, clear } = useToaster()
const [loadingBulk, setLoadingBulk] = useState<boolean>(false)
const { mutate: createTarget, loading: loadingCreateTarget } = useCreateTarget({
queryParams: { accountIdentifier, orgIdentifier } as CreateTargetQueryParams
})
const { activeEnvironment: environmentIdentifier } = useActiveEnvironment()
const bulkTargetCreation = (ts: TargetData[]): Promise<SettledTarget[]> => {
return Promise.all(
ts.map((t: TargetData) => {
return createTarget({
identifier: t.identifier,
name: t.name,
anonymous: false,
attributes: {},
environment: environmentIdentifier,
project: projectIdentifier,
account: accountIdentifier,
org: orgIdentifier
})
.then(() => ({
status: 'fulfilled',
data: t
}))
.catch(error => ({
status: 'rejected',
data: t,
error
})) as Promise<SettledTarget>
})
)
}
const handleTargetCreation = (ts: TargetData[], hideModal: () => void): void => {
setLoadingBulk(true)
bulkTargetCreation(ts)
.then(results => {
if (results.every(res => res.status === 'rejected')) {
return Promise.reject(results)
}
results
.filter(res => res.status === 'rejected')
.forEach((res: SettledTarget) => {
clear()
showError(get(res, 'error.data.message', get(res, 'error.message')), 0, 'cf.create.bulk.target..error')
})
})
.then(() => {
hideModal()
onCreated()
})
.catch(results => {
results.forEach((res: SettledTarget) => {
clear()
showError(get(res, 'error.data.message', get(res, 'error.message')), 0, 'cf.create.bulk.target.error')
})
})
.finally(() => setLoadingBulk(false))
}
const handleTargetUpload = (file: File, hideModal: () => void): void => {
file
.text()
.then((str: string) => {
return str
.split(/\r?\n/)
.map(row => row.split(',').map(x => x.trim()))
.map(([name, identifier]) => ({ name, identifier } as TargetData))
})
.then((ts: TargetData[]) => handleTargetCreation(ts, hideModal))
}
return (
<CreateTargetModal
loading={loadingCreateTarget || loadingBulk}
onSubmitTargets={handleTargetCreation}
onSubmitUpload={handleTargetUpload}
/>
)
}
|