perf: prompt textarea (#625)

This commit is contained in:
Archer
2023-12-18 21:41:17 +08:00
committed by GitHub
parent b14a1db2f9
commit 41115a96c0
5 changed files with 52 additions and 65 deletions

View File

@@ -1,4 +1,4 @@
import React, { useMemo, useState } from 'react'; import React, { useRef } from 'react';
import { import {
Box, Box,
@@ -16,11 +16,13 @@ import MyModal from '@/components/MyModal';
type Props = TextareaProps & { type Props = TextareaProps & {
title?: string; title?: string;
showSetModalModeIcon?: boolean;
// variables: string[]; // variables: string[];
}; };
const PromptTextarea = (props: Props) => { const PromptTextarea = (props: Props) => {
const ModalTextareaRef = useRef<HTMLTextAreaElement>(null);
const TextareaRef = useRef<HTMLTextAreaElement>(null);
const { t } = useTranslation(); const { t } = useTranslation();
const { title = t('core.app.edit.Prompt Editor'), value, ...childProps } = props; const { title = t('core.app.edit.Prompt Editor'), value, ...childProps } = props;
@@ -28,21 +30,30 @@ const PromptTextarea = (props: Props) => {
return ( return (
<> <>
<Editor {...childProps} value={value} showSetModalModeIcon onSetModalMode={onOpen} /> <Editor textareaRef={TextareaRef} {...childProps} onOpenModal={onOpen} />
{isOpen && ( {isOpen && (
<MyModal iconSrc="/imgs/modal/edit.svg" title={title} isOpen onClose={onClose}> <MyModal iconSrc="/imgs/modal/edit.svg" title={title} isOpen onClose={onClose}>
<ModalBody> <ModalBody>
<Editor <Editor
textareaRef={ModalTextareaRef}
{...childProps} {...childProps}
value={value}
minH={'300px'} minH={'300px'}
maxH={'auto'} maxH={'auto'}
minW={['100%', '512px']} minW={['100%', '512px']}
showSetModalModeIcon={false}
/> />
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button onClick={onClose}>{t('common.Confirm')}</Button> <Button
onClick={() => {
if (ModalTextareaRef.current && TextareaRef.current) {
TextareaRef.current.value = ModalTextareaRef.current.value;
}
onClose();
}}
>
{t('common.Confirm')}
</Button>
</ModalFooter> </ModalFooter>
</MyModal> </MyModal>
)} )}
@@ -53,23 +64,26 @@ const PromptTextarea = (props: Props) => {
export default PromptTextarea; export default PromptTextarea;
const Editor = React.memo(function Editor({ const Editor = React.memo(function Editor({
showSetModalModeIcon = true, onOpenModal,
onSetModalMode, textareaRef,
...props ...props
}: Props & { onSetModalMode?: () => void }) { }: Props & {
textareaRef: React.RefObject<HTMLTextAreaElement>;
onOpenModal?: () => void;
}) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Box h={'100%'} w={'100%'} position={'relative'}> <Box h={'100%'} w={'100%'} position={'relative'}>
<Textarea wordBreak={'break-all'} maxW={'100%'} {...props} /> <Textarea ref={textareaRef} wordBreak={'break-all'} maxW={'100%'} {...props} />
{showSetModalModeIcon && ( {onOpenModal && (
<Box <Box
zIndex={1} zIndex={1}
position={'absolute'} position={'absolute'}
bottom={1} bottom={1}
right={2} right={2}
cursor={'pointer'} cursor={'pointer'}
onClick={onSetModalMode} onClick={onOpenModal}
> >
<MyTooltip label={t('common.ui.textarea.Magnifying')}> <MyTooltip label={t('common.ui.textarea.Magnifying')}>
<MyIcon name={'fullScreenLight'} w={'14px'} color={'myGray.600'} /> <MyIcon name={'fullScreenLight'} w={'14px'} color={'myGray.600'} />
@@ -79,35 +93,3 @@ const Editor = React.memo(function Editor({
</Box> </Box>
); );
}); });
const VariableSelectBlock = React.memo(function VariableSelectBlock({
variables
}: {
variables: string[];
}) {
return <></>;
});
const Placeholder = React.memo(function Placeholder({
placeholder = ''
}: {
placeholder?: string;
}) {
return (
<Box
zIndex={0}
userSelect={'none'}
color={'myGray.400'}
px={3}
py={2}
position={'absolute'}
top={0}
right={0}
bottom={0}
left={0}
fontSize={'sm'}
>
{placeholder}
</Box>
);
});

View File

@@ -194,9 +194,8 @@ const AIChatSettingsModal = ({
placeholder={t('template.Quote Content Tip', { placeholder={t('template.Quote Content Tip', {
default: Prompt_QuoteTemplateList[0].value default: Prompt_QuoteTemplateList[0].value
})} })}
showSetModalModeIcon defaultValue={getValues(ModuleInputKeyEnum.aiChatQuoteTemplate)}
value={getValues(ModuleInputKeyEnum.aiChatQuoteTemplate)} onBlur={(e) => {
onChange={(e) => {
setValue(ModuleInputKeyEnum.aiChatQuoteTemplate, e.target.value); setValue(ModuleInputKeyEnum.aiChatQuoteTemplate, e.target.value);
setRefresh(!refresh); setRefresh(!refresh);
}} }}
@@ -220,9 +219,8 @@ const AIChatSettingsModal = ({
placeholder={t('template.Quote Prompt Tip', { placeholder={t('template.Quote Prompt Tip', {
default: Prompt_QuotePromptList[0].value default: Prompt_QuotePromptList[0].value
})} })}
showSetModalModeIcon defaultValue={getValues(ModuleInputKeyEnum.aiChatQuotePrompt)}
value={getValues(ModuleInputKeyEnum.aiChatQuotePrompt)} onBlur={(e) => {
onChange={(e) => {
setValue(ModuleInputKeyEnum.aiChatQuotePrompt, e.target.value); setValue(ModuleInputKeyEnum.aiChatQuotePrompt, e.target.value);
setRefresh(!refresh); setRefresh(!refresh);
}} }}

View File

@@ -1,4 +1,4 @@
import React from 'react'; import React, { useCallback } from 'react';
import type { RenderInputProps } from '../type'; import type { RenderInputProps } from '../type';
import { onChangeNode } from '../../../../FlowProvider'; import { onChangeNode } from '../../../../FlowProvider';
import { useTranslation } from 'next-i18next'; import { useTranslation } from 'next-i18next';
@@ -6,6 +6,22 @@ import PromptTextarea from '@/components/common/Textarea/PromptTextarea';
const TextareaRender = ({ item, moduleId }: RenderInputProps) => { const TextareaRender = ({ item, moduleId }: RenderInputProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const update = useCallback(
(value: string) => {
onChangeNode({
moduleId,
type: 'updateInput',
key: item.key,
value: {
...item,
value
}
});
},
[item, moduleId]
);
return ( return (
<PromptTextarea <PromptTextarea
title={t(item.label)} title={t(item.label)}
@@ -15,15 +31,7 @@ const TextareaRender = ({ item, moduleId }: RenderInputProps) => {
resize={'both'} resize={'both'}
defaultValue={item.value} defaultValue={item.value}
onBlur={(e) => { onBlur={(e) => {
onChangeNode({ update(e.target.value);
moduleId,
type: 'updateInput',
key: item.key,
value: {
...item,
value: e.target.value
}
});
}} }}
/> />
); );

View File

@@ -62,7 +62,7 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({
}); });
if (unconnected) { if (unconnected) {
const msg = `${item.name}】存在未填或未连接参数`; const msg = `${t(item.name)}】存在未填或未连接参数`;
toast({ toast({
status: 'warning', status: 'warning',
@@ -72,7 +72,7 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({
} }
} }
return modules; return modules;
}, [edges, nodes, toast]); }, [edges, nodes, t, toast]);
const { mutate: onclickSave, isLoading } = useRequest({ const { mutate: onclickSave, isLoading } = useRequest({
mutationFn: async (modules: ModuleItemType[]) => { mutationFn: async (modules: ModuleItemType[]) => {

View File

@@ -337,9 +337,8 @@ function ConfigForm({
bg={'myWhite.400'} bg={'myWhite.400'}
rows={5} rows={5}
placeholder={chatNodeSystemPromptTip} placeholder={chatNodeSystemPromptTip}
showSetModalModeIcon defaultValue={getValues('aiSettings.systemPrompt')}
value={getValues('aiSettings.systemPrompt')} onBlur={(e) => {
onChange={(e) => {
setValue('aiSettings.systemPrompt', e.target.value || ''); setValue('aiSettings.systemPrompt', e.target.value || '');
setRefresh(!refresh); setRefresh(!refresh);
}} }}