import React, { useState } from 'react'; import { Box, Button, ModalHeader, ModalFooter, ModalBody, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper, Flex, Switch, Input, Grid, FormControl, useTheme } from '@chakra-ui/react'; import { SmallAddIcon } from '@chakra-ui/icons'; import { VariableInputEnum } from '@/constants/app'; import type { VariableItemType } from '@/types/app'; import MyIcon from '@/components/Icon'; import { useForm } from 'react-hook-form'; import { useFieldArray } from 'react-hook-form'; import { customAlphabet } from 'nanoid'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6); import MyModal from '@/components/MyModal'; const VariableTypeList = [ { label: '文本', icon: 'settingLight', key: VariableInputEnum.input }, { label: '下拉单选', icon: 'settingLight', key: VariableInputEnum.select } ]; export type VariableFormType = { variable: VariableItemType; }; const VariableEditModal = ({ defaultVariable, onClose, onSubmit }: { defaultVariable: VariableItemType; onClose: () => void; onSubmit: (data: VariableFormType) => void; }) => { const theme = useTheme(); const [refresh, setRefresh] = useState(false); const { reset, getValues, setValue, register, control, handleSubmit } = useForm( { defaultValues: { variable: defaultVariable } } ); const { fields: selectEnums, append: appendEnums, remove: removeEnums } = useFieldArray({ control, name: 'variable.enums' }); return ( 变量设置 必填 变量名 变量 key 字段类型 {VariableTypeList.map((item) => ( { setValue('variable.type', item.key); setRefresh(!refresh); } })} > {item.label} ))} {getValues('variable.type') === VariableInputEnum.input && ( <> 最大长度 )} {getValues('variable.type') === VariableInputEnum.select && ( <> 选项 {selectEnums.map((item, i) => ( removeEnums(i)} /> ))} )} ); }; export default React.memo(VariableEditModal); export const defaultVariable: VariableItemType = { id: nanoid(), key: 'key', label: 'label', type: VariableInputEnum.input, required: true, maxLen: 50, enums: [{ value: '' }] }; export const addVariable = () => { const newVariable = { ...defaultVariable, id: nanoid() }; return newVariable; };