fix: add input ref and focus search fields on toggle (#7766)

* fix: add input ref and focus search fields on toggle

* refactor(proxy): remove unnecessary delay in input focus timeouts
This commit is contained in:
oomeow
2026-08-18 15:38:31 +00:00
committed by GitHub
parent 2436d5cf6a
commit 42b91b6294
2 changed files with 10 additions and 2 deletions
+7 -2
View File
@@ -11,7 +11,7 @@ import WifiTetheringOffRounded from '@mui/icons-material/WifiTetheringOffRounded
import WifiTetheringRounded from '@mui/icons-material/WifiTetheringRounded'
import { Box, IconButton, type SxProps, TextField } from '@mui/material'
import { useDebounceFn } from 'ahooks'
import { memo, useEffect } from 'react'
import { memo, useEffect, useRef } from 'react'
import { flushSync } from 'react-dom'
import { useTranslation } from 'react-i18next'
@@ -62,6 +62,8 @@ export const ProxyGroupTools = memo(function ProxyGroupTools(props: Props) {
verge?.default_latency_test?.trim() ||
'http://cp.cloudflare.com/generate_204'
const inputRef = useRef<HTMLInputElement>(null)
useEffect(() => {
delayManager.setUrl(groupName, testUrl?.trim() || url || defaultLatencyUrl)
}, [groupName, testUrl, defaultLatencyUrl, url])
@@ -102,7 +104,7 @@ export const ProxyGroupTools = memo(function ProxyGroupTools(props: Props) {
{textState === 'filter' && (
<Box sx={{ flex: '1 1 auto' }}>
<BaseSearchBox
autoFocus
inputRef={inputRef}
defaultValue={filterText}
matchCase={filterMatchCase}
matchWholeWord={filterMatchWholeWord}
@@ -118,6 +120,7 @@ export const ProxyGroupTools = memo(function ProxyGroupTools(props: Props) {
{textState === 'url' && (
<TextField
inputRef={inputRef}
autoComplete="new-password"
hiddenLabel
autoSave="off"
@@ -205,6 +208,7 @@ export const ProxyGroupTools = memo(function ProxyGroupTools(props: Props) {
onHeadState({
textState: textState === 'url' ? null : 'url',
})
setTimeout(() => inputRef.current?.focus())
}}
>
{textState === 'url' ? (
@@ -249,6 +253,7 @@ export const ProxyGroupTools = memo(function ProxyGroupTools(props: Props) {
// eslint-disable-next-line @eslint-react/dom-no-flush-sync
flushSync(() => onHeadState({ open: true }))
onHeadState({ textState: textState === 'filter' ? null : 'filter' })
setTimeout(() => inputRef.current?.focus())
}}
>
{textState === 'filter' ? (