import { SettingProvider } from "../../hooks/Setting"; import ThemeProvider from "../../hooks/Theme"; import DraggableResizable from "./DraggableResizable"; import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import MenuItem from "@mui/material/MenuItem"; import Grid from "@mui/material/Grid"; import Box from "@mui/material/Box"; import Divider from "@mui/material/Divider"; import IconButton from "@mui/material/IconButton"; import DoneIcon from "@mui/icons-material/Done"; import DragIndicatorIcon from "@mui/icons-material/DragIndicator"; import UnfoldLessIcon from "@mui/icons-material/UnfoldLess"; import UnfoldMoreIcon from "@mui/icons-material/UnfoldMore"; import PushPinIcon from "@mui/icons-material/PushPin"; import PushPinOutlinedIcon from "@mui/icons-material/PushPinOutlined"; import LockIcon from "@mui/icons-material/Lock"; import LockOpenIcon from "@mui/icons-material/LockOpen"; import CloseIcon from "@mui/icons-material/Close"; import Typography from "@mui/material/Typography"; import { useI18n } from "../../hooks/I18n"; import { OPT_LANGS_FROM, OPT_LANGS_TO } from "../../config"; import { useState, useRef, useMemo } from "react"; import TranCont from "./TranCont"; import DictCont from "./DictCont"; import SugCont from "./SugCont"; import CopyBtn from "./CopyBtn"; import { isValidWord } from "../../libs/utils"; import { isMobile } from "../../libs/mobile"; function Header({ setShowPopup, simpleStyle, setSimpleStyle, hideClickAway, setHideClickAway, followSelection, setFollowSelection, mouseHover, }) { if (!isMobile && simpleStyle && !mouseHover) { return; } return ( e.stopPropagation()} onTouchEnd={(e) => e.stopPropagation()} > {`${process.env.REACT_APP_NAME} v${process.env.REACT_APP_VERSION}`} { setHideClickAway((pre) => !pre); }} > {hideClickAway ? ( ) : ( )} { setFollowSelection((pre) => !pre); }} > {followSelection ? ( ) : ( )} { setSimpleStyle((pre) => !pre); }} > {simpleStyle ? ( ) : ( )} { setShowPopup(false); }} > ); } function TranForm({ text, setText, tranboxSetting, transApis, simpleStyle, langDetector, enDict, }) { const i18n = useI18n(); const [editMode, setEditMode] = useState(false); const [editText, setEditText] = useState(""); const [apiSlug, setApiSlug] = useState(tranboxSetting.apiSlug); const [fromLang, setFromLang] = useState(tranboxSetting.fromLang); const [toLang, setToLang] = useState(tranboxSetting.toLang); const inputRef = useRef(null); const optApis = useMemo( () => transApis .filter((api) => !api.isDisabled) .map((api) => ({ key: api.apiSlug, name: api.apiName || api.apiSlug, })), [transApis] ); return ( {!simpleStyle && ( <> { setFromLang(e.target.value); }} > {OPT_LANGS_FROM.map(([lang, name]) => ( {name} ))} { setToLang(e.target.value); }} > {OPT_LANGS_TO.map(([lang, name]) => ( {name} ))} { setApiSlug(e.target.value); }} > {optApis.map(({ key, name }) => ( {name} ))} { setEditText(e.target.value); }} onFocus={() => { setEditMode(true); setEditText(text); }} onBlur={() => { setEditMode(false); setText(editText.trim()); }} InputProps={{ endAdornment: ( {editMode ? ( { e.stopPropagation(); }} > ) : ( )} ), }} /> )} {(!simpleStyle || !isValidWord(text) || !toLang.startsWith("zh") || enDict === "-") && ( )} {enDict !== "-" && ( <> )} ); } export default function TranBox({ text, setText, setShowBox, tranboxSetting, transApis, boxSize, setBoxSize, boxPosition, setBoxPosition, simpleStyle, setSimpleStyle, hideClickAway, setHideClickAway, followSelection, setFollowSelection, extStyles, langDetector, enDict, }) { const [mouseHover, setMouseHover] = useState(false); // todo: 这里的 SettingProvider 不应和 background 的共用 return ( } onClick={(e) => e.stopPropagation()} onMouseEnter={() => setMouseHover(true)} onMouseLeave={() => setMouseHover(false)} > ); }