|
|
@@ -1,9 +1,11 @@
|
|
|
<script lang="ts" setup>
|
|
|
import { watch, ref } from 'vue'
|
|
|
+import { cloneDeep, isEqual } from 'lodash-es'
|
|
|
import { IconButton } from '@repo/ui'
|
|
|
import ErrorHandling from '@/nodes/_base/ErrorHandling.vue'
|
|
|
import RetryConfig from '@/nodes/_base/RetryConfig.vue'
|
|
|
import VarInput from '@/nodes/_base/VarInput.vue'
|
|
|
+import { useSetterModel } from '../_shared/useSetterModel'
|
|
|
|
|
|
import type { HttpRequestData } from './index'
|
|
|
|
|
|
@@ -37,64 +39,91 @@ const headers = ref<{ name: string; value: string }[]>([])
|
|
|
const params = ref<{ name: string; value: string }[]>([])
|
|
|
const body = ref<{ key: string; value: string; type: string }[]>([])
|
|
|
|
|
|
-const formData = ref<HttpRequestData>(props.data)
|
|
|
+const formData = useSetterModel<HttpRequestData>(props, emit)
|
|
|
const dialogVisible = ref(false)
|
|
|
|
|
|
-watch(
|
|
|
- () => formData.value,
|
|
|
- (val) => {
|
|
|
- if (val) {
|
|
|
- console.log('formData changed:', val)
|
|
|
- emit('update', val)
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- deep: true
|
|
|
+const createEmptyHeader = () => ({ name: '', value: '' })
|
|
|
+const createEmptyBody = () => ({ key: '', value: '', type: 'text' })
|
|
|
+
|
|
|
+const isKVBodyType = (type: string) => {
|
|
|
+ return type === 'form-data' || type === 'x-www-form-urlencoded'
|
|
|
+}
|
|
|
+
|
|
|
+const syncEditorRowsFromFormData = () => {
|
|
|
+ const nextHeaders = formData.value.heads.length
|
|
|
+ ? cloneDeep(formData.value.heads)
|
|
|
+ : [createEmptyHeader()]
|
|
|
+ if (!isEqual(nextHeaders, headers.value)) {
|
|
|
+ headers.value = nextHeaders
|
|
|
+ }
|
|
|
+
|
|
|
+ const nextParams = formData.value.params.length
|
|
|
+ ? cloneDeep(formData.value.params)
|
|
|
+ : [createEmptyHeader()]
|
|
|
+ if (!isEqual(nextParams, params.value)) {
|
|
|
+ params.value = nextParams
|
|
|
}
|
|
|
-)
|
|
|
+
|
|
|
+ const nextBody = formData.value.body.type === 'none'
|
|
|
+ ? []
|
|
|
+ : formData.value.body.data.length
|
|
|
+ ? cloneDeep(formData.value.body.data)
|
|
|
+ : [createEmptyBody()]
|
|
|
+
|
|
|
+ if (!isEqual(nextBody, body.value)) {
|
|
|
+ body.value = nextBody
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
watch(
|
|
|
- props.data,
|
|
|
- (newVal) => {
|
|
|
- if (newVal) {
|
|
|
- headers.value = newVal.heads.length ? newVal.heads : [{ name: '', value: '' }]
|
|
|
- params.value = newVal.params.length ? newVal.params : [{ name: '', value: '' }]
|
|
|
- body.value = newVal.body.data.length
|
|
|
- ? newVal.body.data
|
|
|
- : [{ key: '', value: '', type: 'text' }]
|
|
|
- }
|
|
|
+ () => [formData.value.heads, formData.value.params, formData.value.body.type, formData.value.body.data],
|
|
|
+ () => {
|
|
|
+ syncEditorRowsFromFormData()
|
|
|
},
|
|
|
{
|
|
|
- immediate: true,
|
|
|
- once: true
|
|
|
+ deep: true,
|
|
|
+ immediate: true
|
|
|
}
|
|
|
)
|
|
|
|
|
|
watch(
|
|
|
- headers.value,
|
|
|
+ headers,
|
|
|
(newVal) => {
|
|
|
- if (newVal) {
|
|
|
- formData.value.heads = newVal.filter((item) => item.name || item.value)
|
|
|
+ const normalized = newVal.filter((item) => item.name || item.value)
|
|
|
+ if (!isEqual(normalized, formData.value.heads)) {
|
|
|
+ formData.value.heads = normalized
|
|
|
}
|
|
|
},
|
|
|
{ deep: true }
|
|
|
)
|
|
|
|
|
|
watch(
|
|
|
- params.value,
|
|
|
+ params,
|
|
|
(newVal) => {
|
|
|
- if (newVal) {
|
|
|
- formData.value.params = newVal.filter((item) => item.name || item.value)
|
|
|
+ const normalized = newVal.filter((item) => item.name || item.value)
|
|
|
+ if (!isEqual(normalized, formData.value.params)) {
|
|
|
+ formData.value.params = normalized
|
|
|
}
|
|
|
},
|
|
|
{ deep: true }
|
|
|
)
|
|
|
|
|
|
watch(
|
|
|
- body.value,
|
|
|
+ body,
|
|
|
(newVal) => {
|
|
|
- if (newVal) {
|
|
|
- formData.value.body.data = newVal.filter((item) => item.key || item.value)
|
|
|
+ if (formData.value.body.type === 'none') {
|
|
|
+ if (formData.value.body.data.length) {
|
|
|
+ formData.value.body.data = []
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const normalized = isKVBodyType(formData.value.body.type)
|
|
|
+ ? newVal.filter((item) => item.key || item.value)
|
|
|
+ : [{ key: '', value: newVal[0]?.value || '', type: 'text' }]
|
|
|
+
|
|
|
+ if (!isEqual(normalized, formData.value.body.data)) {
|
|
|
+ formData.value.body.data = normalized
|
|
|
}
|
|
|
},
|
|
|
{ deep: true }
|
|
|
@@ -127,9 +156,9 @@ const handleDeleteParam = (index: number) => {
|
|
|
|
|
|
const handleChangeBodyType = (type: string) => {
|
|
|
if (type === 'none') {
|
|
|
- formData.value.body.data = []
|
|
|
+ body.value = []
|
|
|
} else {
|
|
|
- formData.value.body.data = [{ key: '', value: '', type: 'text' }]
|
|
|
+ body.value = [createEmptyBody()]
|
|
|
}
|
|
|
}
|
|
|
|