Fix some issues

This commit is contained in:
2026-02-04 16:47:54 -07:00
parent 1c540ad35b
commit fbe3feec9d
2 changed files with 182 additions and 165 deletions

View File

@@ -1,6 +1,6 @@
'use client' 'use client'
import { useEffect, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
import Sidebar from './componets/Sidebar' import Sidebar from './componets/Sidebar'
import './Globals.css' import './Globals.css'
import { DownloadProgress } from './types/DownloadProgress' import { DownloadProgress } from './types/DownloadProgress'
@@ -111,15 +111,21 @@ export default function RootLayout ({
}) })
} }
function getVersionInfo (id: string | undefined): GameVersion | undefined { const getVersionInfo = useCallback(
if (!id) return undefined (id: string | undefined): GameVersion | undefined => {
return serverVersionList?.versions.find(v => v.id === id) if (!id) return undefined
} return serverVersionList?.versions.find(v => v.id === id)
},
[serverVersionList]
)
function getGameInfo (game: number | undefined): Game | undefined { const getGameInfo = useCallback(
if (!game) return undefined (game: number | undefined): Game | undefined => {
return serverVersionList?.games.find(g => g.id === game) if (!game) return undefined
} return serverVersionList?.games.find(g => g.id === game)
},
[serverVersionList]
)
function getListOfGames (): Game[] { function getListOfGames (): Game[] {
if (!downloadedVersionsConfig?.list) return [] if (!downloadedVersionsConfig?.list) return []
@@ -292,89 +298,89 @@ export default function RootLayout ({
return () => document.removeEventListener('contextmenu', handler) return () => document.removeEventListener('contextmenu', handler)
}, []) }, [])
async function downloadVersions ( const downloadVersions = useCallback(
list: string[], async (list: string[], currentConfig: VersionsConfig): Promise<void> => {
currentConfig: VersionsConfig if (list.length === 0) return
): Promise<void> { setSelectedVersionList([])
if (list.length === 0) return
setSelectedVersionList([])
const newDownloads = list.map( const newDownloads = list.map(
version => version =>
new DownloadProgress(version, 0, 0, false, true, false, false, 0, 0) new DownloadProgress(version, 0, 0, false, true, false, false, 0, 0)
)
setDownloadProgress(newDownloads)
for (const download of newDownloads) {
const info = getVersionInfo(download.version)
if (!info) {
setDownloadProgress(prev =>
prev.filter(d => d.version !== download.version)
)
continue
}
const gameInfo = getGameInfo(info.game)
if (!gameInfo) {
setDownloadProgress(prev =>
prev.filter(d => d.version !== download.version)
)
continue
}
setDownloadProgress(prev =>
prev.map(d =>
d.version === download.version ? { ...d, queued: false } : d
)
) )
try { setDownloadProgress(newDownloads)
await axios.get(
'https://games.lncvrt.xyz/api/launcher/download?id=' + info.id
)
} catch {}
const res = await invoke<string>('download', { for (const download of newDownloads) {
url: info.downloadUrl, const info = getVersionInfo(download.version)
name: info.id, if (!info) {
executable: info.executable, setDownloadProgress(prev =>
hash: info.sha512sum prev.filter(d => d.version !== download.version)
}) )
continue
if (res === '1') {
setDownloadProgress(prev =>
prev.filter(d => d.version !== download.version)
)
const date = Date.now()
const newConfig = {
...currentConfig,
list: { ...currentConfig.list, [download.version]: date }
} }
setDownloadedVersionsConfig(newConfig)
writeVersionsConfig(newConfig) const gameInfo = getGameInfo(info.game)
} else { if (!gameInfo) {
setDownloadProgress(prev =>
prev.filter(d => d.version !== download.version)
)
continue
}
setDownloadProgress(prev => setDownloadProgress(prev =>
prev.map(d => prev.map(d =>
d.version === download.version d.version === download.version ? { ...d, queued: false } : d
? { ...d, queued: false, failed: true, progress: 0 }
: d
) )
) )
if (normalConfig?.settings.allowNotifications)
await notifyUser( try {
'Download Failed', await axios.get(
`The download for version ${info.displayName} has failed.` 'https://games.lncvrt.xyz/api/launcher/download?id=' + info.id
) )
} catch {}
const res = await invoke<string>('download', {
url: info.downloadUrl,
name: info.id,
executable: info.executable,
hash: info.sha512sum
})
if (res === '1') {
setDownloadProgress(prev =>
prev.filter(d => d.version !== download.version)
)
const date = Date.now()
const newConfig = {
...currentConfig,
list: { ...currentConfig.list, [download.version]: date }
}
setDownloadedVersionsConfig(newConfig)
writeVersionsConfig(newConfig)
} else {
setDownloadProgress(prev =>
prev.map(d =>
d.version === download.version
? { ...d, queued: false, failed: true, progress: 0 }
: d
)
)
if (normalConfig?.settings.allowNotifications)
await notifyUser(
'Download Failed',
`The download for version ${info.displayName} has failed.`
)
}
} }
}
if (normalConfig?.settings.allowNotifications) if (normalConfig?.settings.allowNotifications)
await notifyUser('Downloads Finished', 'All downloads have finished.') await notifyUser('Downloads Finished', 'All downloads have finished.')
setFadeOut(true) setFadeOut(true)
setTimeout(() => setShowPopup(false), 200) setTimeout(() => setShowPopup(false), 200)
} },
[getGameInfo, getVersionInfo, normalConfig]
)
useEffect(() => { useEffect(() => {
if (revisionCheck.current) return if (revisionCheck.current) return
@@ -404,7 +410,7 @@ export default function RootLayout ({
await downloadVersions(versionsToSelect, newConfig) await downloadVersions(versionsToSelect, newConfig)
})() })()
}, [serverVersionList, downloadedVersionsConfig]) }, [serverVersionList, downloadedVersionsConfig, downloadVersions])
return ( return (
<> <>

View File

@@ -50,24 +50,22 @@ export default function Settings () {
label='Allow sending notifications' label='Allow sending notifications'
value={allowNotifications} value={allowNotifications}
onChange={async () => { onChange={async () => {
while (normalConfig != null) { if (!normalConfig) return
setAllowNotifications(!allowNotifications) setAllowNotifications(!allowNotifications)
setNormalConfig({ setNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
allowNotifications: !allowNotifications allowNotifications: !allowNotifications
} }
}) })
writeNormalConfig({ await writeNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
allowNotifications: !allowNotifications allowNotifications: !allowNotifications
} }
}) })
break
}
}} }}
title='This setting does as you expect, allow the launcher to send notifications for when stuff like downloading is done.' title='This setting does as you expect, allow the launcher to send notifications for when stuff like downloading is done.'
/> />
@@ -75,24 +73,22 @@ export default function Settings () {
label='Always show games in sidebar' label='Always show games in sidebar'
value={alwaysShowGamesInSidebar} value={alwaysShowGamesInSidebar}
onChange={async () => { onChange={async () => {
while (normalConfig != null) { if (!normalConfig) return
setAlwaysShowGamesInSidebar(!alwaysShowGamesInSidebar) setAlwaysShowGamesInSidebar(!alwaysShowGamesInSidebar)
setNormalConfig({ setNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
alwaysShowGamesInSidebar: !alwaysShowGamesInSidebar alwaysShowGamesInSidebar: !alwaysShowGamesInSidebar
} }
}) })
writeNormalConfig({ await writeNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
alwaysShowGamesInSidebar: !alwaysShowGamesInSidebar alwaysShowGamesInSidebar: !alwaysShowGamesInSidebar
} }
}) })
break
}
}} }}
title="This setting will make it so when you are on a page like this, the games won't disappear." title="This setting will make it so when you are on a page like this, the games won't disappear."
/> />
@@ -100,24 +96,22 @@ export default function Settings () {
label='Show Installs/Launch/Manage Buttons' label='Show Installs/Launch/Manage Buttons'
value={useLegacyInteractButtons} value={useLegacyInteractButtons}
onChange={async () => { onChange={async () => {
while (normalConfig != null) { if (!normalConfig) return
setUseLegacyInteractButtons(!useLegacyInteractButtons) setUseLegacyInteractButtons(!useLegacyInteractButtons)
setNormalConfig({ setNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
useLegacyInteractButtons: !useLegacyInteractButtons useLegacyInteractButtons: !useLegacyInteractButtons
} }
}) })
writeNormalConfig({ await writeNormalConfig({
...normalConfig, ...normalConfig,
settings: { settings: {
...normalConfig.settings, ...normalConfig.settings,
useLegacyInteractButtons: !useLegacyInteractButtons useLegacyInteractButtons: !useLegacyInteractButtons
} }
}) })
break
}
}} }}
title='Enable the legacy method of using the installs/launch/manage buttons. In the future this setting may be removed so try and get used to the new method.' title='Enable the legacy method of using the installs/launch/manage buttons. In the future this setting may be removed so try and get used to the new method.'
/> />
@@ -125,13 +119,22 @@ export default function Settings () {
label='Use wine when needed to launch games' label='Use wine when needed to launch games'
value={useWineOnUnixWhenNeeded} value={useWineOnUnixWhenNeeded}
onChange={async () => { onChange={async () => {
while (normalConfig != null) { if (!normalConfig) return
setUseWineOnUnixWhenNeeded(!useWineOnUnixWhenNeeded) setUseWineOnUnixWhenNeeded(!useWineOnUnixWhenNeeded)
normalConfig.settings.useWineOnUnixWhenNeeded = setNormalConfig({
!useWineOnUnixWhenNeeded ...normalConfig,
await writeNormalConfig(normalConfig) settings: {
break ...normalConfig.settings,
} useWineOnUnixWhenNeeded: !useWineOnUnixWhenNeeded
}
})
await writeNormalConfig({
...normalConfig,
settings: {
...normalConfig.settings,
useWineOnUnixWhenNeeded: !useWineOnUnixWhenNeeded
}
})
}} }}
className={platform() == 'linux' ? '' : 'hidden'} className={platform() == 'linux' ? '' : 'hidden'}
/> />
@@ -142,12 +145,22 @@ export default function Settings () {
type='text' type='text'
value={wineOnUnixCommand} value={wineOnUnixCommand}
onChange={async e => { onChange={async e => {
while (normalConfig != null) { if (!normalConfig) return
setWineOnUnixCommand(e.target.value) setWineOnUnixCommand(e.target.value)
normalConfig.settings.wineOnUnixCommand = e.target.value setNormalConfig({
await writeNormalConfig(normalConfig) ...normalConfig,
break settings: {
} ...normalConfig.settings,
wineOnUnixCommand: e.target.value
}
})
await writeNormalConfig({
...normalConfig,
settings: {
...normalConfig.settings,
wineOnUnixCommand: e.target.value
}
})
}} }}
className={`input-field my-1 ${ className={`input-field my-1 ${
platform() == 'linux' && useWineOnUnixWhenNeeded ? '' : 'hidden' platform() == 'linux' && useWineOnUnixWhenNeeded ? '' : 'hidden'
@@ -159,25 +172,23 @@ export default function Settings () {
className='ml-2 bg-(--col2) border border-(--col4) rounded-md' className='ml-2 bg-(--col2) border border-(--col4) rounded-md'
value={theme} value={theme}
onChange={async e => { onChange={async e => {
if (!normalConfig) return
const newTheme = parseInt(e.target.value) const newTheme = parseInt(e.target.value)
while (normalConfig != null) { setTheme(newTheme)
setTheme(newTheme) setNormalConfig({
setNormalConfig({ ...normalConfig,
...normalConfig, settings: {
settings: { ...normalConfig.settings,
...normalConfig.settings, theme: newTheme
theme: newTheme }
} })
}) await writeNormalConfig({
writeNormalConfig({ ...normalConfig,
...normalConfig, settings: {
settings: { ...normalConfig.settings,
...normalConfig.settings, theme: newTheme
theme: newTheme }
} })
})
break
}
}} }}
> >
<option value={0}>Dark (default)</option> <option value={0}>Dark (default)</option>