feat: auto change inputbar height

This commit is contained in:
kangfenmao 2024-09-02 14:09:03 +08:00
parent cb95562e58
commit 11427a980c
2 changed files with 20 additions and 28 deletions

View File

@ -69,8 +69,6 @@ const resources = {
'input.new_topic': 'New Topic', 'input.new_topic': 'New Topic',
'input.topics': ' Topics ', 'input.topics': ' Topics ',
'input.clear': 'Clear', 'input.clear': 'Clear',
'input.expand': 'Expand',
'input.collapse': 'Collapse',
'input.clear.title': 'Clear all messages?', 'input.clear.title': 'Clear all messages?',
'input.clear.content': 'Are you sure to clear all messages?', 'input.clear.content': 'Are you sure to clear all messages?',
'input.placeholder': 'Type your message here...', 'input.placeholder': 'Type your message here...',
@ -307,8 +305,6 @@ const resources = {
'input.new_topic': '新话题', 'input.new_topic': '新话题',
'input.topics': ' 话题 ', 'input.topics': ' 话题 ',
'input.clear': '清除', 'input.clear': '清除',
'input.expand': '展开',
'input.collapse': '收起',
'input.clear.title': '清除所有消息?', 'input.clear.title': '清除所有消息?',
'input.clear.content': '确定要清除所有消息吗?', 'input.clear.content': '确定要清除所有消息吗?',
'input.placeholder': '在这里输入消息...', 'input.placeholder': '在这里输入消息...',

View File

@ -1,8 +1,6 @@
import { import {
ClearOutlined, ClearOutlined,
ControlOutlined, ControlOutlined,
FullscreenExitOutlined,
FullscreenOutlined,
HistoryOutlined, HistoryOutlined,
PauseCircleOutlined, PauseCircleOutlined,
PlusCircleOutlined, PlusCircleOutlined,
@ -44,9 +42,10 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
const [expended, setExpend] = useState(false) const [expended, setExpend] = useState(false)
const [estimateTokenCount, setEstimateTokenCount] = useState(0) const [estimateTokenCount, setEstimateTokenCount] = useState(0)
const generating = useAppSelector((state) => state.runtime.generating) const generating = useAppSelector((state) => state.runtime.generating)
const inputRef = useRef<TextAreaRef>(null) const textareaRef = useRef<TextAreaRef>(null)
const [images, setImages] = useState<string[]>([]) const [images, setImages] = useState<string[]>([])
const { t } = useTranslation() const { t } = useTranslation()
const containerRef = useRef(null)
_text = text _text = text
@ -131,7 +130,7 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
if ((e.ctrlKey || e.metaKey) && e.key === 'n') { if ((e.ctrlKey || e.metaKey) && e.key === 'n') {
addNewTopic() addNewTopic()
EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR) EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR)
inputRef.current?.focus() textareaRef.current?.focus()
} }
} }
} }
@ -144,7 +143,7 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
const unsubscribes = [ const unsubscribes = [
EventEmitter.on(EVENT_NAMES.EDIT_MESSAGE, (message: Message) => { EventEmitter.on(EVENT_NAMES.EDIT_MESSAGE, (message: Message) => {
setText(message.content) setText(message.content)
inputRef.current?.focus() textareaRef.current?.focus()
}), }),
EventEmitter.on(EVENT_NAMES.ESTIMATED_TOKEN_COUNT, _setEstimateTokenCount) EventEmitter.on(EVENT_NAMES.ESTIMATED_TOKEN_COUNT, _setEstimateTokenCount)
] ]
@ -152,14 +151,11 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
}, []) }, [])
useEffect(() => { useEffect(() => {
inputRef.current?.focus() textareaRef.current?.focus()
}, [assistant]) }, [assistant])
return ( return (
<Container <Container id="inputbar" className={inputFocus ? 'focus' : ''} ref={containerRef}>
id="inputbar"
style={{ minHeight: expended ? '60%' : 'var(--input-bar-height)' }}
className={inputFocus ? 'focus' : ''}>
<Textarea <Textarea
value={text} value={text}
onChange={(e) => setText(e.target.value)} onChange={(e) => setText(e.target.value)}
@ -168,11 +164,19 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
autoFocus autoFocus
contextMenu="true" contextMenu="true"
variant="borderless" variant="borderless"
ref={inputRef} rows={1}
styles={{ textarea: { paddingLeft: 0 } }} ref={textareaRef}
style={{ fontSize }}
styles={{ textarea: { paddingLeft: 0, boxSizing: 'border-box', padding: '10px 15px 5px' } }}
onFocus={() => setInputFocus(true)} onFocus={() => setInputFocus(true)}
onBlur={() => setInputFocus(false)} onBlur={() => setInputFocus(false)}
style={{ fontSize }} onInput={() => {
const textArea = textareaRef.current?.resizableTextArea?.textArea
if (textArea) {
textArea.style.height = 'auto'
textArea.style.height = textArea?.scrollHeight > 400 ? '400px' : `${textArea?.scrollHeight}px`
}
}}
/> />
<Toolbar> <Toolbar>
<ToolbarMenu> <ToolbarMenu>
@ -205,11 +209,6 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
</ToolbarButton> </ToolbarButton>
</Tooltip> </Tooltip>
<AttachmentButton images={images} setImages={setImages} ToolbarButton={ToolbarButton} /> <AttachmentButton images={images} setImages={setImages} ToolbarButton={ToolbarButton} />
<Tooltip placement="top" title={expended ? t('chat.input.collapse') : t('chat.input.expand')} arrow>
<ToolbarButton type="text" onClick={() => setExpend(!expended)}>
{expended ? <FullscreenExitOutlined /> : <FullscreenOutlined />}
</ToolbarButton>
</Tooltip>
{showInputEstimatedTokens && ( {showInputEstimatedTokens && (
<TextCount> <TextCount>
<Tooltip title={t('chat.input.context_count.tip') + ' | ' + t('chat.input.estimated_tokens.tip')}> <Tooltip title={t('chat.input.context_count.tip') + ' | ' + t('chat.input.estimated_tokens.tip')}>
@ -248,9 +247,6 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
} }
const Container = styled.div` const Container = styled.div`
display: flex;
flex-direction: column;
height: var(--input-bar-height);
border: 1px solid var(--color-border-soft); border: 1px solid var(--color-border-soft);
transition: all 0.3s ease; transition: all 0.3s ease;
position: relative; position: relative;
@ -265,11 +261,11 @@ const Textarea = styled(TextArea)`
border-radius: 0; border-radius: 0;
display: flex; display: flex;
flex: 1; flex: 1;
margin: 10px 15px 0 15px;
font-family: Ubuntu; font-family: Ubuntu;
resize: vertical; resize: vertical;
overflow: auto; overflow: auto;
width: auto; width: 100%;
box-sizing: border-box;
` `
const Toolbar = styled.div` const Toolbar = styled.div`
@ -278,7 +274,7 @@ const Toolbar = styled.div`
justify-content: space-between; justify-content: space-between;
padding: 0 8px; padding: 0 8px;
padding-bottom: 0; padding-bottom: 0;
margin: 3px 0; margin-bottom: 4px;
` `
const ToolbarMenu = styled.div` const ToolbarMenu = styled.div`