fix: guard ssh status async state (#3546)
This commit is contained in:
parent
170c995d89
commit
83ea282b7d
|
|
@ -1,4 +1,4 @@
|
|||
import { useCallback, useEffect, useState } from 'react'
|
||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { toast } from 'sonner'
|
||||
import { Loader2, Server, ServerOff } from 'lucide-react'
|
||||
import {
|
||||
|
|
@ -41,16 +41,28 @@ export function SshDisconnectedDialog({
|
|||
status
|
||||
}: SshDisconnectedDialogProps): React.JSX.Element {
|
||||
const [connecting, setConnecting] = useState(false)
|
||||
const mountedRef = useRef(true)
|
||||
|
||||
useEffect(() => {
|
||||
mountedRef.current = true
|
||||
return () => {
|
||||
mountedRef.current = false
|
||||
}
|
||||
}, [])
|
||||
|
||||
const handleReconnect = useCallback(async () => {
|
||||
setConnecting(true)
|
||||
try {
|
||||
await window.api.ssh.connect({ targetId })
|
||||
onOpenChange(false)
|
||||
if (mountedRef.current) {
|
||||
onOpenChange(false)
|
||||
}
|
||||
} catch (err) {
|
||||
toast.error(err instanceof Error ? err.message : 'Reconnection failed')
|
||||
} finally {
|
||||
setConnecting(false)
|
||||
if (mountedRef.current) {
|
||||
setConnecting(false)
|
||||
}
|
||||
}
|
||||
}, [targetId, onOpenChange])
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useCallback, useState } from 'react'
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { AlertTriangle, Cloud, Loader2, MonitorSmartphone, Server, ServerOff } from 'lucide-react'
|
||||
import { toast } from 'sonner'
|
||||
import {
|
||||
|
|
@ -113,8 +113,16 @@ function TargetRow({
|
|||
syncStatus: RemoteWorkspaceSyncStatus | undefined
|
||||
}): React.JSX.Element {
|
||||
const [busy, setBusy] = useState(false)
|
||||
const mountedRef = useRef(true)
|
||||
const recordFeatureInteraction = useAppStore((s) => s.recordFeatureInteraction)
|
||||
|
||||
useEffect(() => {
|
||||
mountedRef.current = true
|
||||
return () => {
|
||||
mountedRef.current = false
|
||||
}
|
||||
}, [])
|
||||
|
||||
const handleConnect = useCallback(async () => {
|
||||
setBusy(true)
|
||||
try {
|
||||
|
|
@ -123,7 +131,9 @@ function TargetRow({
|
|||
} catch (err) {
|
||||
toast.error(err instanceof Error ? err.message : 'Connection failed')
|
||||
} finally {
|
||||
setBusy(false)
|
||||
if (mountedRef.current) {
|
||||
setBusy(false)
|
||||
}
|
||||
}
|
||||
}, [recordFeatureInteraction, targetId])
|
||||
|
||||
|
|
@ -135,7 +145,9 @@ function TargetRow({
|
|||
} catch (err) {
|
||||
toast.error(err instanceof Error ? err.message : 'Disconnect failed')
|
||||
} finally {
|
||||
setBusy(false)
|
||||
if (mountedRef.current) {
|
||||
setBusy(false)
|
||||
}
|
||||
}
|
||||
}, [recordFeatureInteraction, targetId])
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue