Files
FastGPT/packages/web/components/common/Input/NumberInput/index.tsx
T
Archer 3f4400a500 V4.14.10 dev (#6674)
* feat: model config with brand-new price calculate machanism (#6616)

* fix: image read and json error (Agent) (#6502)

* fix:
1.image read
2.JSON parsing error

* dataset cite and pause

* perf: plancall second parse

* add test

---------

Co-authored-by: archer <545436317@qq.com>

* master message

* remove invalid code

* wip: model config

* feat: model config with brand-new price calculate machanism

* merge main branch

* ajust calculate way

* ajust priceTiers resolve procession

* perf: price config code

* fix: default price

* fix: test

* fix: comment

* fix test

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: archer <545436317@qq.com>

* wip: fix modal UI (#6634)

* wip: fix modal UI

* fix: maxInputToken set

* chore: add price unit for non llm models

* chore: replace question mark icon with beta tag (#6672)

* feat:rerank too long; fix:rerank ui(agent),embedding returns 0 (#6663)

* feat:rerank too long; fix:rerank ui(agent),embedding returns 0

* rerank

* fix:rerank function

* perf: rerank code

* fix rerank

* perf: model price ui

---------

Co-authored-by: archer <545436317@qq.com>

* remove llmtype field

* revert model init

* fix: filed

* fix: model select filter

* perf: multiple selector render

* remove invalid checker

* remove invalid i18n

* perf: model selector tip

* perf: model selector tip

* fix cr

* limit pnpm version

* fix: i18n

* fix action

* set default mintoken

* update i18n

* perf: usage push

* fix:rerank model ui (#6677)

* fix: tier match error

* fix: testr

---------

Co-authored-by: Ryo <whoeverimf5@gmail.com>
Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
2026-03-30 10:05:42 +08:00

136 lines
3.3 KiB
TypeScript

import {
NumberInput,
NumberIncrementStepper,
NumberInputField,
NumberInputStepper,
NumberDecrementStepper,
type NumberInputProps,
type NumberInputFieldProps
} from '@chakra-ui/react';
import React from 'react';
import MyIcon from '../../Icon';
import { type UseFormRegister } from 'react-hook-form';
type Props = Omit<NumberInputProps, 'onChange' | 'onBlur'> & {
onChange?: (e?: number) => any;
onBlur?: (e?: number) => any;
placeholder?: string;
register?: UseFormRegister<any>;
name?: string;
inputFieldProps?: NumberInputFieldProps;
hideStepper?: boolean;
};
const getSafeNumberValue = (value: unknown) => {
if (value === '' || value === null || value === undefined) {
return undefined;
}
if (typeof value === 'number') {
return Number.isFinite(value) ? value : undefined;
}
if (typeof value === 'string') {
const trimmedValue = value.trim();
if (!trimmedValue) {
return undefined;
}
const parsedValue = Number(trimmedValue);
return Number.isFinite(parsedValue) ? parsedValue : undefined;
}
return undefined;
};
const MyNumberInput = (props: Props) => {
const {
register,
name,
onChange,
onBlur,
placeholder,
inputFieldProps,
hideStepper = false,
value,
...restProps
} = props;
const registeredField =
register && name
? register(name, {
required: props.isRequired,
min: props.min,
max: props.max,
setValueAs: (value) => getSafeNumberValue(value)
})
: undefined;
const inputFieldRegisterProps = registeredField
? {
name: registeredField.name,
ref: registeredField.ref
}
: undefined;
const safeControlledValue =
value === '' ? '' : typeof value === 'undefined' ? undefined : getSafeNumberValue(value) ?? '';
const getRegisteredValue = (value: unknown) => {
const safeValue = getSafeNumberValue(value);
if (typeof safeValue === 'number') {
return safeValue;
}
return '';
};
return (
<NumberInput
{...restProps}
{...(typeof value !== 'undefined' ? { value: safeControlledValue } : {})}
onBlur={(e) => {
const numE = getSafeNumberValue(e.target.value);
onBlur?.(numE);
onChange?.(numE);
if (registeredField && name) {
const registeredValue = getRegisteredValue(e.target.value);
const target = {
name,
value: registeredValue
};
registeredField.onChange({
target,
type: 'change'
});
registeredField.onBlur({
target,
type: 'blur'
});
}
}}
>
<NumberInputField
placeholder={placeholder}
h={restProps.h}
defaultValue={restProps.defaultValue}
{...(inputFieldRegisterProps || {})}
{...inputFieldProps}
/>
{!hideStepper && (
<NumberInputStepper>
<NumberIncrementStepper>
<MyIcon name={'core/chat/chevronUp'} width={'12px'} />
</NumberIncrementStepper>
<NumberDecrementStepper>
<MyIcon name={'core/chat/chevronDown'} width={'12px'} />
</NumberDecrementStepper>
</NumberInputStepper>
)}
</NumberInput>
);
};
export default React.memo(MyNumberInput);