fix: add delay to WebSocket reconnection and improve event listener cleanup

This commit is contained in:
xmk23333 2025-12-08 19:43:20 +08:00
parent 51720296cc
commit 67aa17f6bb
4 changed files with 73 additions and 44 deletions

View File

@ -278,7 +278,7 @@ const mihomoTraffic = async (): Promise<void> => {
mihomoTrafficWs.onclose = (): void => { mihomoTrafficWs.onclose = (): void => {
if (trafficRetry) { if (trafficRetry) {
trafficRetry-- trafficRetry--
mihomoTraffic() setTimeout(mihomoTraffic, 1000)
} }
} }
@ -325,7 +325,7 @@ const mihomoMemory = async (): Promise<void> => {
mihomoMemoryWs.onclose = (): void => { mihomoMemoryWs.onclose = (): void => {
if (memoryRetry) { if (memoryRetry) {
memoryRetry-- memoryRetry--
mihomoMemory() setTimeout(mihomoMemory, 1000)
} }
} }
@ -373,7 +373,7 @@ const mihomoLogs = async (): Promise<void> => {
mihomoLogsWs.onclose = (): void => { mihomoLogsWs.onclose = (): void => {
if (logsRetry) { if (logsRetry) {
logsRetry-- logsRetry--
mihomoLogs() setTimeout(mihomoLogs, 1000)
} }
} }
@ -419,7 +419,7 @@ const mihomoConnections = async (): Promise<void> => {
mihomoConnectionsWs.onclose = (): void => { mihomoConnectionsWs.onclose = (): void => {
if (connectionsRetry) { if (connectionsRetry) {
connectionsRetry-- connectionsRetry--
mihomoConnections() setTimeout(mihomoConnections, 1000)
} }
} }

View File

@ -121,17 +121,14 @@ const Logs: React.FC = () => {
<Virtuoso <Virtuoso
ref={virtuosoRef} ref={virtuosoRef}
data={filteredLogs} data={filteredLogs}
itemContent={(i, log) => { itemContent={(i, log) => (
return (
<LogItem <LogItem
index={i} index={i}
key={log.payload + i}
time={log.time} time={log.time}
type={log.type} type={log.type}
payload={log.payload} payload={log.payload}
/> />
) )}
}}
/> />
</div> </div>
</BasePage> </BasePage>

View File

@ -75,18 +75,29 @@ const Override: React.FC = () => {
} }
} }
const addOverrideItemRef = useRef(addOverrideItem)
addOverrideItemRef.current = addOverrideItem
const tRef = useRef(t)
tRef.current = t
useEffect(() => { useEffect(() => {
pageRef.current?.addEventListener('dragover', (e) => { const element = pageRef.current
if (!element) return
const handleDragOver = (e: DragEvent): void => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
setFileOver(true) setFileOver(true)
}) }
pageRef.current?.addEventListener('dragleave', (e) => {
const handleDragLeave = (e: DragEvent): void => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
setFileOver(false) setFileOver(false)
}) }
pageRef.current?.addEventListener('drop', async (event) => {
const handleDrop = async (event: DragEvent): Promise<void> => {
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
if (event.dataTransfer?.files) { if (event.dataTransfer?.files) {
@ -94,7 +105,7 @@ const Override: React.FC = () => {
if (file.name.endsWith('.js') || file.name.endsWith('.yaml')) { if (file.name.endsWith('.js') || file.name.endsWith('.yaml')) {
const content = await readTextFile((file as File & { path: string }).path) const content = await readTextFile((file as File & { path: string }).path)
try { try {
await addOverrideItem({ await addOverrideItemRef.current({
name: file.name, name: file.name,
type: 'local', type: 'local',
file: content, file: content,
@ -104,15 +115,20 @@ const Override: React.FC = () => {
setFileOver(false) setFileOver(false)
} }
} else { } else {
alert(t('override.unsupportedFileType')) alert(tRef.current('override.unsupportedFileType'))
} }
} }
setFileOver(false) setFileOver(false)
}) }
element.addEventListener('dragover', handleDragOver)
element.addEventListener('dragleave', handleDragLeave)
element.addEventListener('drop', handleDrop)
return (): void => { return (): void => {
pageRef.current?.removeEventListener('dragover', () => {}) element.removeEventListener('dragover', handleDragOver)
pageRef.current?.removeEventListener('dragleave', () => {}) element.removeEventListener('dragleave', handleDragLeave)
pageRef.current?.removeEventListener('drop', () => {}) element.removeEventListener('drop', handleDrop)
} }
}, []) }, [])

View File

@ -156,26 +156,37 @@ const Profiles: React.FC = () => {
} }
} }
const handleInputKeyUp = useCallback( const handleImportRef = useRef(handleImport)
(e: KeyboardEvent<HTMLInputElement>) => { handleImportRef.current = handleImport
if (e.key !== 'Enter' || isUrlEmpty) return
handleImport() const addProfileItemRef = useRef(addProfileItem)
}, addProfileItemRef.current = addProfileItem
[isUrlEmpty]
) const tRef = useRef(t)
tRef.current = t
const handleInputKeyUp = useCallback((e: KeyboardEvent<HTMLInputElement>) => {
if (e.key !== 'Enter' || e.currentTarget.value.trim() === '') return
handleImportRef.current()
}, [])
useEffect(() => { useEffect(() => {
pageRef.current?.addEventListener('dragover', (e) => { const element = pageRef.current
if (!element) return
const handleDragOver = (e: DragEvent): void => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
setFileOver(true) setFileOver(true)
}) }
pageRef.current?.addEventListener('dragleave', (e) => {
const handleDragLeave = (e: DragEvent): void => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
setFileOver(false) setFileOver(false)
}) }
pageRef.current?.addEventListener('drop', async (event) => {
const handleDrop = async (event: DragEvent): Promise<void> => {
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
if (event.dataTransfer?.files) { if (event.dataTransfer?.files) {
@ -184,20 +195,25 @@ const Profiles: React.FC = () => {
try { try {
const path = window.api.webUtils.getPathForFile(file) const path = window.api.webUtils.getPathForFile(file)
const content = await readTextFile(path) const content = await readTextFile(path)
await addProfileItem({ name: file.name, type: 'local', file: content }) await addProfileItemRef.current({ name: file.name, type: 'local', file: content })
} catch (e) { } catch (e) {
alert(e) alert(e)
} }
} else { } else {
alert(t('profiles.error.unsupportedFileType')) alert(tRef.current('profiles.error.unsupportedFileType'))
} }
} }
setFileOver(false) setFileOver(false)
}) }
element.addEventListener('dragover', handleDragOver)
element.addEventListener('dragleave', handleDragLeave)
element.addEventListener('drop', handleDrop)
return (): void => { return (): void => {
pageRef.current?.removeEventListener('dragover', () => {}) element.removeEventListener('dragover', handleDragOver)
pageRef.current?.removeEventListener('dragleave', () => {}) element.removeEventListener('dragleave', handleDragLeave)
pageRef.current?.removeEventListener('drop', () => {}) element.removeEventListener('drop', handleDrop)
} }
}, []) }, [])