-
Notifications
You must be signed in to change notification settings - Fork 19
/
create-clone-environment-modal-feature.tsx
112 lines (98 loc) · 3.62 KB
/
create-clone-environment-modal-feature.tsx
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
import {
CloneRequest,
CreateEnvironmentModeEnum,
CreateEnvironmentRequest,
EnvironmentModeEnum,
} from 'qovery-typescript-axios'
import { useState } from 'react'
import { FormProvider, useForm } from 'react-hook-form'
import { useDispatch, useSelector } from 'react-redux'
import { useNavigate } from 'react-router-dom'
import { cloneEnvironment, createEnvironment } from '@qovery/domains/environment'
import { selectClustersEntitiesByOrganizationId } from '@qovery/domains/organization'
import { ClusterEntity, EnvironmentEntity } from '@qovery/shared/interfaces'
import { SERVICES_GENERAL_URL, SERVICES_URL } from '@qovery/shared/router'
import { useModal } from '@qovery/shared/ui'
import { AppDispatch, RootState } from '@qovery/store'
import CreateCloneEnvironmentModal from '../ui/create-clone-environment-modal'
export interface CreateCloneEnvironmentModalFeatureProps {
environmentToClone?: EnvironmentEntity
onClose: () => void
projectId: string
organizationId: string
}
export function CreateCloneEnvironmentModalFeature(props: CreateCloneEnvironmentModalFeatureProps) {
const [loading, setLoading] = useState(false)
const { enableAlertClickOutside } = useModal()
const clusters = useSelector<RootState, ClusterEntity[]>((state) =>
selectClustersEntitiesByOrganizationId(state, props.organizationId)
)
const methods = useForm({
mode: 'onChange',
defaultValues: {
name: props.environmentToClone?.name ? props.environmentToClone?.name + '-clone' : '',
cluster: 'automatic',
mode: 'automatic',
},
})
methods.watch(() => enableAlertClickOutside(methods.formState.isDirty))
const dispatch = useDispatch<AppDispatch>()
const navigate = useNavigate()
const onSubmit = methods.handleSubmit(async (data) => {
const dataFormatted: { name: string; cluster?: string; mode?: string } = {
name: data.name,
cluster: data.cluster,
mode: data.mode,
}
if (dataFormatted.cluster === 'automatic') delete dataFormatted.cluster
if (dataFormatted.mode === 'automatic') delete dataFormatted.mode
setLoading(true)
if (props.environmentToClone) {
const cloneRequest: CloneRequest = {
name: dataFormatted.name,
mode: dataFormatted.mode as EnvironmentModeEnum,
cluster_id: dataFormatted.cluster,
}
dispatch(cloneEnvironment({ environmentId: props.environmentToClone.id, cloneRequest }))
.unwrap()
.then((result) => {
navigate(SERVICES_URL(props.organizationId, props.projectId, result.id) + SERVICES_GENERAL_URL)
setLoading(false)
props.onClose()
})
.catch((e) => {
setLoading(false)
console.error(e)
})
} else {
const environmentRequest: CreateEnvironmentRequest = {
name: dataFormatted.name,
mode: dataFormatted.mode as CreateEnvironmentModeEnum,
cluster: dataFormatted.cluster,
}
dispatch(createEnvironment({ projectId: props.projectId, environmentRequest }))
.unwrap()
.then((result) => {
navigate(SERVICES_URL(props.organizationId, props.projectId, result.id) + SERVICES_GENERAL_URL)
setLoading(false)
props.onClose()
})
.catch((e) => {
setLoading(false)
console.error(e)
})
}
})
return (
<FormProvider {...methods}>
<CreateCloneEnvironmentModal
environmentToClone={props.environmentToClone}
loading={loading}
closeModal={props.onClose}
onSubmit={onSubmit}
clusters={clusters}
/>
</FormProvider>
)
}
export default CreateCloneEnvironmentModalFeature