mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-27 16:33:49 +00:00

* feat: stop toolCall and rename some field. (#46) * perf: node delete tip;pay tip * fix: toolCall cannot save child answer * feat: stop tool * fix: team modal * fix feckbackMoal auth bug (#47) * 简单的支持提示词运行tool。优化workflow模板 (#49) * remove templates * fix: request body undefined * feat: prompt tool run * feat: workflow tamplates modal * perf: plugin start * 4.7 (#50) * fix docker-compose download url (#994) original code is a bad url with '404 NOT FOUND' return. fix docker-compose download url, add 'v' before docker-compose version * Update ai_settings.md (#1000) * Update configuration.md * Update configuration.md * Fix history in classifyQuestion and extract modules (#1012) * Fix history in classifyQuestion and extract modules * Add chatValue2RuntimePrompt import and update text formatting * flow controller to packages * fix: rerank select * modal ui * perf: modal code path * point not sufficient * feat: http url support variable * fix http key * perf: prompt * perf: ai setting modal * simple edit ui --------- Co-authored-by: entorick <entorick11@qq.com> Co-authored-by: liujianglc <liujianglc@163.com> Co-authored-by: Fengrui Liu <liufengrui.work@bytedance.com> * fix team share redirect to login (#51) * feat: support openapi import plugins (#48) * feat: support openapi import plugins * feat: import from url * fix: add body params parse * fix build * fix * fix * fix * tool box ui (#52) * fix: training queue * feat: simple edit tool select * perf: simple edit dataset prompt * fix: chatbox tool ux * feat: quote prompt module * perf: plugin tools sign * perf: model avatar * tool selector ui * feat: max histories * perf: http plugin import (#53) * perf: plugin http import * chatBox ui * perf: name * fix: Node template card (#54) * fix: ts * setting modal * package * package * feat: add plugins search (#57) * feat: add plugins search * perf: change http plugin header input * Yjl (#56) * perf: prompt tool call * perf: chat box ux * doc * doc * price tip * perf: tool selector * ui' * fix: vector queue * fix: empty tool and empty response * fix: empty msg * perf: pg index * perf: ui tip * doc * tool tip --------- Co-authored-by: yst <77910600+yu-and-liu@users.noreply.github.com> Co-authored-by: entorick <entorick11@qq.com> Co-authored-by: liujianglc <liujianglc@163.com> Co-authored-by: Fengrui Liu <liufengrui.work@bytedance.com> Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com>
130 lines
3.0 KiB
TypeScript
130 lines
3.0 KiB
TypeScript
import React, { useCallback, useRef } from 'react';
|
|
import {
|
|
ModalFooter,
|
|
ModalBody,
|
|
Input,
|
|
useDisclosure,
|
|
Button,
|
|
Box,
|
|
Textarea
|
|
} from '@chakra-ui/react';
|
|
import MyModal from '../components/common/MyModal';
|
|
import { useToast } from './useToast';
|
|
import { useTranslation } from 'next-i18next';
|
|
|
|
export const useEditTextarea = ({
|
|
title,
|
|
tip,
|
|
placeholder = '',
|
|
canEmpty = true,
|
|
valueRule
|
|
}: {
|
|
title: string;
|
|
tip?: string;
|
|
placeholder?: string;
|
|
canEmpty?: boolean;
|
|
valueRule?: (val: string) => string | void;
|
|
}) => {
|
|
const { t } = useTranslation();
|
|
const { isOpen, onOpen, onClose } = useDisclosure();
|
|
|
|
const textareaRef = useRef<HTMLTextAreaElement | null>(null);
|
|
const onSuccessCb = useRef<(content: string) => void | Promise<void>>();
|
|
const onErrorCb = useRef<(err: any) => void>();
|
|
const { toast } = useToast();
|
|
const defaultValue = useRef('');
|
|
|
|
const onOpenModal = useCallback(
|
|
({
|
|
defaultVal,
|
|
onSuccess,
|
|
onError
|
|
}: {
|
|
defaultVal: string;
|
|
onSuccess: (content: string) => any;
|
|
onError?: (err: any) => void;
|
|
}) => {
|
|
onOpen();
|
|
onSuccessCb.current = onSuccess;
|
|
onErrorCb.current = onError;
|
|
defaultValue.current = defaultVal;
|
|
},
|
|
[onOpen]
|
|
);
|
|
|
|
const onclickConfirm = useCallback(async () => {
|
|
if (!textareaRef.current || !onSuccessCb.current) return;
|
|
const val = textareaRef.current.value;
|
|
|
|
if (!canEmpty && !val) {
|
|
textareaRef.current.focus();
|
|
return;
|
|
}
|
|
|
|
if (valueRule) {
|
|
const result = valueRule(val);
|
|
if (result) {
|
|
return toast({
|
|
status: 'warning',
|
|
title: result
|
|
});
|
|
}
|
|
}
|
|
|
|
try {
|
|
await onSuccessCb.current(val);
|
|
|
|
onClose();
|
|
} catch (err) {
|
|
onErrorCb.current?.(err);
|
|
}
|
|
}, [canEmpty, onClose]);
|
|
|
|
// eslint-disable-next-line react/display-name
|
|
const EditModal = useCallback(
|
|
({
|
|
maxLength = 30,
|
|
iconSrc = 'modal/edit',
|
|
closeBtnText = t('common.Close')
|
|
}: {
|
|
maxLength?: number;
|
|
iconSrc?: string;
|
|
closeBtnText?: string;
|
|
}) => (
|
|
<MyModal isOpen={isOpen} onClose={onClose} iconSrc={iconSrc} title={title} maxW={'500px'}>
|
|
<ModalBody>
|
|
{!!tip && (
|
|
<Box mb={2} color={'myGray.500'} fontSize={'sm'}>
|
|
{tip}
|
|
</Box>
|
|
)}
|
|
|
|
<Textarea
|
|
ref={textareaRef}
|
|
defaultValue={defaultValue.current}
|
|
placeholder={placeholder}
|
|
autoFocus
|
|
maxLength={maxLength}
|
|
rows={10}
|
|
bg={'myGray.50'}
|
|
/>
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
{!!closeBtnText && (
|
|
<Button mr={3} variant={'whiteBase'} onClick={onClose}>
|
|
{closeBtnText}
|
|
</Button>
|
|
)}
|
|
<Button onClick={onclickConfirm}>{t('common.Confirm')}</Button>
|
|
</ModalFooter>
|
|
</MyModal>
|
|
),
|
|
[isOpen, onClose, onclickConfirm, placeholder, tip, title]
|
|
);
|
|
|
|
return {
|
|
onOpenModal,
|
|
EditModal
|
|
};
|
|
};
|