import { AccessTimeRounded, MyLocationRounded, NetworkCheckRounded, SearchOffRounded, SearchRounded, VisibilityRounded, VisibilityOffRounded, WifiTetheringRounded, WifiTetheringOffRounded, SortByAlphaRounded, SortRounded, } from '@mui/icons-material' import { Box, IconButton, TextField, type SxProps } from '@mui/material' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { BaseSearchBox } from '@/components/base' import { useVerge } from '@/hooks/use-verge' import delayManager from '@/services/delay' import { showNotice } from '@/services/notice-service' import { debugLog } from '@/utils/debug' import { isValidUrl } from '@/utils/network' import type { ProxySortType } from './use-filter-sort' import type { HeadState } from './use-head-state' interface Props { sx?: SxProps url?: string groupName: string headState: HeadState onLocation: () => void onCheckDelay: () => void onHeadState: (val: Partial) => void } const defaultSx: SxProps = {} export const ProxyHead = ({ sx = defaultSx, url, groupName, headState, onHeadState, onLocation, onCheckDelay, }: Props) => { const { showType, sortType, filterText, textState, testUrl, filterMatchCase, filterMatchWholeWord, filterUseRegularExpression, } = headState const { t } = useTranslation() const [autoFocus, setAutoFocus] = useState(false) useEffect(() => { // fix the focus conflict const timer = setTimeout(() => setAutoFocus(true), 100) return () => clearTimeout(timer) }, []) const { verge } = useVerge() const defaultLatencyUrl = verge?.default_latency_test?.trim() || 'http://cp.cloudflare.com/generate_204' useEffect(() => { delayManager.setUrl(groupName, testUrl?.trim() || url || defaultLatencyUrl) }, [groupName, testUrl, defaultLatencyUrl, url]) return ( { debugLog(`[ProxyHead] 点击延迟测试按钮,组: ${groupName}`) // Remind the user that it is custom test url if (testUrl?.trim() && textState !== 'filter') { debugLog(`[ProxyHead] 使用自定义测试URL: ${testUrl}`) onHeadState({ textState: 'url' }) } if (testUrl?.trim() && !isValidUrl(testUrl)) { showNotice.warning('proxies.feedback.warnings.invalidTestUrl') return } onCheckDelay() }} > onHeadState({ sortType: ((sortType + 1) % 3) as ProxySortType }) } > {sortType !== 1 && sortType !== 2 && } {sortType === 1 && } {sortType === 2 && } onHeadState({ textState: textState === 'url' ? null : 'url' }) } > {textState === 'url' ? ( ) : ( )} onHeadState({ showType: !showType })} > {showType ? : } onHeadState({ textState: textState === 'filter' ? null : 'filter' }) } > {textState === 'filter' ? : } {textState === 'filter' && ( onHeadState({ filterText: state.text, filterMatchCase: state.matchCase, filterMatchWholeWord: state.matchWholeWord, filterUseRegularExpression: state.useRegularExpression, }) } /> )} {textState === 'url' && ( onHeadState({ testUrl: e.target.value })} sx={{ ml: 0.5, flex: '1 1 auto', input: { py: 0.65, px: 1 } }} /> )} ) }