diff --git a/AppImage/components/lxc-app-panel.tsx b/AppImage/components/lxc-app-panel.tsx index 379242a4..5a4db6f3 100644 --- a/AppImage/components/lxc-app-panel.tsx +++ b/AppImage/components/lxc-app-panel.tsx @@ -529,13 +529,14 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci, c }, [vmid, managed]) useEffect(() => { const generation = targetGeneration.current - const request = ++nativeRequest.current + const request = nativeRequest.current + let cancelled = false if (managed) return fetchApi(`/api/vms/${vmid}/apps/native-discovery`).then(result => { - if (targetRef.current === vmid && targetGeneration.current === generation + if (!cancelled && targetRef.current === vmid && targetGeneration.current === generation && nativeRequest.current === request) setNativeDiscovery(result) }).catch(() => { /* cached metadata is optional; never initiate a scan */ }) - return () => { nativeRequest.current += 1 } + return () => { cancelled = true } }, [vmid, managed, cacheRevision]) const [adguardSetupAvailable, setAdguardSetupAvailable] = useState(false) const [error, setError] = useState(null) diff --git a/tests/lxc_updates/test_local_app_icons_ui.cjs b/tests/lxc_updates/test_local_app_icons_ui.cjs index 2927ce12..40887dff 100644 --- a/tests/lxc_updates/test_local_app_icons_ui.cjs +++ b/tests/lxc_updates/test_local_app_icons_ui.cjs @@ -55,6 +55,12 @@ async function editor(ports = [8080]) { } async function main() { await cachedImageContract() + const scanning = fixture() + scanning.renderParent(); await scanning.settle(); scanning.holdScan() + const pendingScan = scanning.button('searchApplications').props.onClick(); scanning.render() + scanning.renderParent(101, 1); await scanning.settle() + scanning.resolveScan(); await pendingScan; scanning.render() + assert.equal(scanning.button('searchApplications').props.disabled, false, 'revision must not leave an active Native Find stuck busy') const existing = fixture({apps: [{id: 'existing', name: 'Saved app', ports: [{port: 8080, scheme: 'http'}], state: {}}]}) existing.renderParent(); await existing.settle() const click = async key => {