From 16f87537a2d68345b6663ea54040dca29cd256a4 Mon Sep 17 00:00:00 2001 From: Teo Date: Wed, 19 Feb 2025 13:24:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=BF=BB=E8=AF=91=E9=A1=B5UI?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/translate/TranslatePage.tsx | 250 ++++++------------ 1 file changed, 85 insertions(+), 165 deletions(-) diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index 624d639e..7bcda1f7 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -9,11 +9,10 @@ import { fetchTranslate } from '@renderer/services/ApiService' import { getDefaultTranslateAssistant } from '@renderer/services/AssistantService' import { Assistant, Message } from '@renderer/types' import { runAsyncFunction, uuid } from '@renderer/utils' -import { Button, Select, Space } from 'antd' +import { Button, Flex, Select, Space } from 'antd' import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' import { isEmpty } from 'lodash' -import { debounce } from 'lodash' -import React, { FC, useCallback, useEffect, useRef, useState } from 'react' +import { FC, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import styled from 'styled-components' @@ -37,76 +36,6 @@ const TranslatePage: FC = () => { _result = result _targetLanguage = targetLanguage - const safetyMarginOfTextarea = (textarea: HTMLTextAreaElement): number => { - const defaultSafetyMargin = 30 - const lineHeight = window.getComputedStyle(textarea).lineHeight - if (lineHeight.endsWith('px')) { - const safetyMargin = parseInt(lineHeight.slice(0, -2)) - if (Number.isNaN(safetyMargin)) { - return defaultSafetyMargin - } else { - return safetyMargin + 4 - } - } else { - return defaultSafetyMargin - } - } - - const updateTextareaToMaxHeight = (textarea: HTMLTextAreaElement, safetyMargin: number) => { - const { top: textareaTop } = textarea.getBoundingClientRect() - textarea.style.height = `${window.innerHeight - safetyMargin - textareaTop}px` - } - - const updateTextareaHeight = useCallback((textarea: HTMLTextAreaElement, contentContainer: HTMLDivElement | null) => { - textarea.style.height = 'auto' - const unlimitedHeightUpdate = () => { - textarea.style.height = `${textarea.scrollHeight}px` - } - const safetyMargin = safetyMarginOfTextarea(textarea) - - if (contentContainer) { - const { bottom: textareaBottom, top: textareaTop } = textarea.getBoundingClientRect() - const { bottom: contentContainerBottom } = contentContainer.getBoundingClientRect() - if (textareaBottom !== 0 && contentContainerBottom !== 0) { - if (contentContainerBottom - textareaTop - textarea.scrollHeight < safetyMargin) { - updateTextareaToMaxHeight(textarea, safetyMargin) - } else { - unlimitedHeightUpdate() - } - } else { - unlimitedHeightUpdate() - } - } else { - unlimitedHeightUpdate() - } - }, []) - - const handleInput = (event: React.ChangeEvent) => { - updateTextareaHeight(event.target, contentContainerRef.current) - } - - useEffect(() => { - // Initialize when switching to this page - if (textAreaRef?.current?.resizableTextArea?.textArea) { - updateTextareaHeight(textAreaRef.current.resizableTextArea.textArea, contentContainerRef.current) - } - - const debounceHandleResize = debounce( - () => { - if (textAreaRef?.current?.resizableTextArea) { - updateTextareaHeight(textAreaRef.current.resizableTextArea.textArea, contentContainerRef.current) - } - }, - 16, - { maxWait: 16 } - ) - - const handleResize = () => debounceHandleResize() - - window.addEventListener('resize', handleResize) - return () => window.removeEventListener('resize', handleResize) - }, [textAreaRef, updateTextareaHeight]) - const onTranslate = async () => { if (!text.trim()) { return @@ -182,55 +111,25 @@ const TranslatePage: FC = () => { } return ( - + {t('translate.title')} - - { - setTargetLanguage(value) - db.settings.put({ id: 'translate:target:language', value }) - }} - optionRender={(option) => ( - - - {option.data.emoji} - - {option.label} - - )} - /> - - - - -