import type { FC } from 'react' import { useState } from 'react' import type { ModelParameterRule } from '../declarations' import { useLanguage } from '../hooks' import { isNullOrUndefined } from '../utils' import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general' import Switch from '@/app/components/base/switch' import Tooltip from '@/app/components/base/tooltip' import Slider from '@/app/components/base/slider' import Radio from '@/app/components/base/radio' import { SimpleSelect } from '@/app/components/base/select' import TagInput from '@/app/components/base/tag-input' export type ParameterValue = number | string | string[] | boolean | undefined type ParameterItemProps = { parameterRule: ModelParameterRule value?: ParameterValue onChange?: (value: ParameterValue) => void className?: string onSwitch?: (checked: boolean, assignValue: ParameterValue) => void } const ParameterItem: FC = ({ parameterRule, value, onChange, className, onSwitch, }) => { const language = useLanguage() const [localValue, setLocalValue] = useState(value) const mergedValue = isNullOrUndefined(value) ? localValue : value const getDefaultValue = () => { let defaultValue: ParameterValue if (parameterRule.type === 'int' || parameterRule.type === 'float') { if (isNullOrUndefined(parameterRule.default)) { if (parameterRule.min) defaultValue = parameterRule.min else defaultValue = 0 } else { defaultValue = parameterRule.default } } if (parameterRule.type === 'string' && !parameterRule.options?.length) defaultValue = parameterRule.default || '' if (parameterRule.type === 'string' && parameterRule.options?.length) defaultValue = parameterRule.default || '' if (parameterRule.type === 'boolean') defaultValue = !isNullOrUndefined(parameterRule.default) ? parameterRule.default : false if (parameterRule.type === 'tag') defaultValue = !isNullOrUndefined(parameterRule.default) ? parameterRule.default : [] return defaultValue } const renderValue = isNullOrUndefined(mergedValue) ? getDefaultValue() : mergedValue const handleChange = (v: ParameterValue) => { setLocalValue(v) if (!isNullOrUndefined(value) && onChange) onChange(v) } const handleNumberInputChange = (e: React.ChangeEvent) => { let num = +e.target.value if (!isNullOrUndefined(parameterRule.max) && num > parameterRule.max!) num = parameterRule.max as number if (!isNullOrUndefined(parameterRule.min) && num < parameterRule.min!) num = parameterRule.min as number handleChange(num) } const handleSlideChange = (num: number) => { handleChange(num) } const handleRadioChange = (v: number) => { handleChange(v === 1) } const handleStringInputChange = (e: React.ChangeEvent) => { handleChange(e.target.value) } const handleSelect = (option: { value: string | number; name: string }) => { handleChange(option.value) } const handleTagChange = (newSequences: string[]) => { handleChange(newSequences) } const handleSwitch = (checked: boolean) => { if (onSwitch) { let assignValue: ParameterValue = localValue if (isNullOrUndefined(localValue)) assignValue = getDefaultValue() onSwitch(checked, assignValue) } } const numberInputWithSlide = (parameterRule.type === 'int' || parameterRule.type === 'float') && !isNullOrUndefined(parameterRule.min) && !isNullOrUndefined(parameterRule.max) const numberInput = (parameterRule.type === 'int' || parameterRule.type === 'float') && (isNullOrUndefined(parameterRule.min) || isNullOrUndefined(parameterRule.max)) return (
{parameterRule.label[language]}
{ parameterRule.help && ( {parameterRule.help[language]}
)} > ) } { !parameterRule.required && parameterRule.name !== 'stop' && ( ) }
{ parameterRule.type === 'tag' && (
{parameterRule?.tagPlaceholder?.[language]}
) }
{ numberInputWithSlide && (
) } { parameterRule.type === 'boolean' && ( True False ) } { numberInput && ( ) } { parameterRule.type === 'string' && !parameterRule.options?.length && ( ) } { parameterRule.type === 'string' && !!parameterRule?.options?.length && ( ({ value: option, name: option }))} /> ) } { parameterRule.type === 'tag' && (
) } ) } export default ParameterItem