Fix listener issues

This commit is contained in:
2025-08-28 22:56:36 -07:00
parent ac1374038c
commit aec58cdbea

View File

@@ -185,10 +185,14 @@ export default function RootLayout ({
}, []) }, [])
useEffect(() => { useEffect(() => {
const unlistenProgress = listen<string>('download-progress', event => { let unlistenProgress: (() => void) | null = null
let unlistenDone: (() => void) | null = null
let unlistenFailed: (() => void) | null = null
let unlistenUninstalled: (() => void) | null = null
listen<string>('download-progress', event => {
const [versionName, progStr] = event.payload.split(':') const [versionName, progStr] = event.payload.split(':')
const prog = Number(progStr) const prog = Number(progStr)
setDownloadProgress(prev => { setDownloadProgress(prev => {
const i = prev.findIndex(d => d.version.version === versionName) const i = prev.findIndex(d => d.version.version === versionName)
if (i === -1) return prev if (i === -1) return prev
@@ -196,71 +200,77 @@ export default function RootLayout ({
copy[i] = { ...copy[i], progress: prog } copy[i] = { ...copy[i], progress: prog }
return copy return copy
}) })
}) }).then(f => (unlistenProgress = f))
const unlistenDone = listen<string>('download-done', async event => { listen<string>('download-done', event => {
const versionName = event.payload const versionName = event.payload
setDownloadProgress(prev => { setDownloadProgress(prev => {
const downloaded = prev.find(d => d.version.version === versionName) const downloaded = prev.find(d => d.version.version === versionName)
if (downloaded && downloadedVersionsConfig) { if (!downloaded) return prev
setDownloadedVersionsConfig(prevConfig => {
if (!prevConfig) return prevConfig
const newDownloaded = DownloadedVersion.import(downloaded.version) const newDownloaded = DownloadedVersion.import(downloaded.version)
const updatedConfig = { const updatedConfig = {
...downloadedVersionsConfig, ...prevConfig,
list: [...downloadedVersionsConfig.list, newDownloaded] list: [...prevConfig.list, newDownloaded]
} }
setDownloadedVersionsConfig(updatedConfig)
writeVersionsConfig(updatedConfig) writeVersionsConfig(updatedConfig)
} return updatedConfig
})
return prev.filter(d => d.version.version !== versionName) return prev.filter(d => d.version.version !== versionName)
}) })
activeDownloads.current-- activeDownloads.current--
runNext() runNext()
if (downloadProgress.length === 0) {
await notifyUser('Downloads Complete', 'All downloads have completed.')
}
})
const unlistenFailed = listen<string>('download-failed', async event => { setDownloadProgress(curr => {
if (curr.length === 0)
notifyUser('Downloads Complete', 'All downloads have completed.')
return curr
})
}).then(f => (unlistenDone = f))
listen<string>('download-failed', async event => {
const versionName = event.payload const versionName = event.payload
setDownloadProgress(prev => setDownloadProgress(prev =>
prev.map(d => prev.map(d =>
d.version.version === versionName ? { ...d, failed: true } : d d.version.version === versionName ? { ...d, failed: true } : d
) )
) )
activeDownloads.current-- activeDownloads.current--
runNext() runNext()
await notifyUser( await notifyUser(
'Download Failed', 'Download Failed',
`The download for version ${versionName} has failed.` `The download for version ${versionName} has failed.`
) )
}) }).then(f => (unlistenFailed = f))
const unlistenUninstalled = listen<string>( listen<string>('version-uninstalled', event => {
'version-uninstalled', const versionName = event.payload
async event => { setDownloadedVersionsConfig(prev => {
const versionName = event.payload if (!prev) return prev
setDownloadedVersionsConfig(prev => { const updatedList = prev.list.filter(
if (!prev) return prev v => v.version.version !== versionName
const updatedList = prev.list.filter( )
v => v.version.version !== versionName const updatedConfig = { ...prev, list: updatedList }
) writeVersionsConfig(updatedConfig)
const updatedConfig = { ...prev, list: updatedList } setManagingVersion(null)
writeVersionsConfig(updatedConfig) setFadeOut(true)
setManagingVersion(null) setTimeout(() => setShowPopup(false), 200)
setFadeOut(true) return updatedConfig
setTimeout(() => setShowPopup(false), 200) })
return updatedConfig }).then(f => (unlistenUninstalled = f))
})
}
)
return () => { return () => {
unlistenProgress.then(f => f()) unlistenProgress?.()
unlistenDone.then(f => f()) unlistenDone?.()
unlistenFailed.then(f => f()) unlistenFailed?.()
unlistenUninstalled.then(f => f()) unlistenUninstalled?.()
} }
}, [downloadedVersionsConfig, downloadProgress, notifyUser]) }, [notifyUser])
useEffect(() => { useEffect(() => {
const handler = (e: MouseEvent) => e.preventDefault() const handler = (e: MouseEvent) => e.preventDefault()