fix(web): model options update
This commit is contained in:
@@ -2,9 +2,9 @@
|
|||||||
* @Author: ZhaoYing
|
* @Author: ZhaoYing
|
||||||
* @Date: 2026-03-07 16:49:59
|
* @Date: 2026-03-07 16:49:59
|
||||||
* @Last Modified by: ZhaoYing
|
* @Last Modified by: ZhaoYing
|
||||||
* @Last Modified time: 2026-04-16 17:46:02
|
* @Last Modified time: 2026-04-17 10:05:23
|
||||||
*/
|
*/
|
||||||
import { useEffect, useState, forwardRef, useImperativeHandle } from 'react';
|
import { type FC, useEffect, useState } from 'react';
|
||||||
import { Select, Flex, Space } from 'antd';
|
import { Select, Flex, Space } from 'antd';
|
||||||
import type { SelectProps } from 'antd/es/select';
|
import type { SelectProps } from 'antd/es/select';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
@@ -26,17 +26,13 @@ interface ModelSelectProps extends SelectProps {
|
|||||||
fontClassName?: string;
|
fontClassName?: string;
|
||||||
isAutoFetch?: boolean;
|
isAutoFetch?: boolean;
|
||||||
initialData?: Model[];
|
initialData?: Model[];
|
||||||
|
updateOptions?: (options: Model[]) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ModelSelect = forwardRef<ModelSelectRef, ModelSelectProps>((
|
const ModelSelect: FC<ModelSelectProps> = ({ params, placeholder, fontClassName, isAutoFetch = true, initialData = [], updateOptions, ...props }) => {
|
||||||
{ params, placeholder, fontClassName, isAutoFetch = true, initialData = [], ...props },
|
|
||||||
ref
|
|
||||||
) => {
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [options, setOptions] = useState<Model[]>([]);
|
const [options, setOptions] = useState<Model[]>([]);
|
||||||
|
|
||||||
useImperativeHandle(ref, () => ({ options }), [options]);
|
|
||||||
|
|
||||||
// Fetch active models whenever params change; stringify for stable deep comparison
|
// Fetch active models whenever params change; stringify for stable deep comparison
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isAutoFetch) return
|
if (!isAutoFetch) return
|
||||||
@@ -62,6 +58,10 @@ const ModelSelect = forwardRef<ModelSelectRef, ModelSelectProps>((
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (updateOptions) updateOptions([...options, ...initialData]);
|
||||||
|
}, [options, initialData])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Select
|
<Select
|
||||||
placeholder={placeholder ?? t('common.pleaseSelect')}
|
placeholder={placeholder ?? t('common.pleaseSelect')}
|
||||||
@@ -91,6 +91,6 @@ const ModelSelect = forwardRef<ModelSelectRef, ModelSelectProps>((
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
export default ModelSelect;
|
export default ModelSelect;
|
||||||
|
|||||||
@@ -1,29 +1,38 @@
|
|||||||
import { type FC, useEffect, useRef, useState } from "react";
|
/*
|
||||||
|
* @Author: ZhaoYing
|
||||||
|
* @Date: 2026-03-07 14:55:04
|
||||||
|
* @Last Modified by: ZhaoYing
|
||||||
|
* @Last Modified time: 2026-04-17 10:05:32
|
||||||
|
*/
|
||||||
|
import { type FC, useEffect, useState } from "react";
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Form, Switch } from 'antd'
|
import { Form, Switch } from 'antd'
|
||||||
|
|
||||||
import RbSlider from '@/components/RbSlider'
|
import RbSlider from '@/components/RbSlider'
|
||||||
import RbCard from '@/components/RbCard/Card'
|
import RbCard from '@/components/RbCard/Card'
|
||||||
import ModelSelect, { type ModelSelectRef } from '@/components/ModelSelect'
|
import ModelSelect from '@/components/ModelSelect'
|
||||||
import type { Model } from '@/views/ModelManagement/types';
|
import type { Model } from '@/views/ModelManagement/types';
|
||||||
|
|
||||||
const ModelConfig: FC = () => {
|
const ModelConfig: FC = () => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const form = Form.useFormInstance()
|
const form = Form.useFormInstance()
|
||||||
const model_id = Form.useWatch(['model_id'], form)
|
const model_id = Form.useWatch(['model_id'], form)
|
||||||
const modelSelectRef = useRef<ModelSelectRef>(null)
|
|
||||||
const [selectedModel, setSelectedModel] = useState<Model | null>(null)
|
const [selectedModel, setSelectedModel] = useState<Model | null>(null)
|
||||||
|
const [options, setOptions] = useState<Model[]>([])
|
||||||
|
|
||||||
|
const updateOptions = (options: Model[]) => {
|
||||||
|
setOptions(options)
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (model_id && modelSelectRef.current?.options) {
|
if (model_id && options) {
|
||||||
const model = modelSelectRef.current?.options.find(item => item.id === model_id)
|
const model = options.find(item => item.id === model_id)
|
||||||
setSelectedModel(model || null)
|
setSelectedModel(model || null)
|
||||||
form.setFieldValue('json_output', false)
|
form.setFieldValue('json_output', false)
|
||||||
} else {
|
} else {
|
||||||
setSelectedModel(null)
|
setSelectedModel(null)
|
||||||
}
|
}
|
||||||
}, [model_id, modelSelectRef.current?.options])
|
}, [model_id, options])
|
||||||
console.log('ModelConfig', model_id)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -34,11 +43,11 @@ const ModelConfig: FC = () => {
|
|||||||
required
|
required
|
||||||
>
|
>
|
||||||
<ModelSelect
|
<ModelSelect
|
||||||
ref={modelSelectRef}
|
|
||||||
placeholder={t('common.pleaseSelect')}
|
placeholder={t('common.pleaseSelect')}
|
||||||
params={{ type: 'llm,chat' }}
|
params={{ type: 'llm,chat' }}
|
||||||
className="rb:w-full!"
|
className="rb:w-full!"
|
||||||
size="small"
|
size="small"
|
||||||
|
updateOptions={updateOptions}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
{model_id && (
|
{model_id && (
|
||||||
|
|||||||
Reference in New Issue
Block a user