Add manage game popup
This commit is contained in:
4 files changed
+168
-2
No files matched your search
@@ -41,6 +41,7 @@ import DownloadsPopup from '@/popups/Downloads'
|
|||||||
import ManageVersionPopup from '@/popups/ManageVersion'
|
import ManageVersionPopup from '@/popups/ManageVersion'
|
||||||
import ModDownloadsPopup from '@/popups/ModDownloads'
|
import ModDownloadsPopup from '@/popups/ModDownloads'
|
||||||
import VersionChangelogPopup from '@/popups/VersionChangelog'
|
import VersionChangelogPopup from '@/popups/VersionChangelog'
|
||||||
|
import ManageGamePopup from '@/popups/ManageGame'
|
||||||
|
|
||||||
const roboto = Roboto({
|
const roboto = Roboto({
|
||||||
subsets: ['latin']
|
subsets: ['latin']
|
||||||
@@ -70,6 +71,7 @@ export default function RootLayout ({
|
|||||||
const [downloadQueue, setDownloadQueue] = useState<string[]>([])
|
const [downloadQueue, setDownloadQueue] = useState<string[]>([])
|
||||||
const [isProcessingQueue, setIsProcessingQueue] = useState<boolean>(false)
|
const [isProcessingQueue, setIsProcessingQueue] = useState<boolean>(false)
|
||||||
const [managingVersion, setManagingVersion] = useState<string | null>(null)
|
const [managingVersion, setManagingVersion] = useState<string | null>(null)
|
||||||
|
const [managingGame, setManagingGame] = useState<number | null>(null)
|
||||||
const [viewingInfoFromDownloads, setViewingInfoFromDownloads] =
|
const [viewingInfoFromDownloads, setViewingInfoFromDownloads] =
|
||||||
useState<boolean>(false)
|
useState<boolean>(false)
|
||||||
const [selectedGame, setSelectedGame] = useState<number | null>(null)
|
const [selectedGame, setSelectedGame] = useState<number | null>(null)
|
||||||
@@ -791,7 +793,9 @@ export default function RootLayout ({
|
|||||||
versionsList,
|
versionsList,
|
||||||
modsList,
|
modsList,
|
||||||
movingData,
|
movingData,
|
||||||
setMovingData
|
setMovingData,
|
||||||
|
managingGame,
|
||||||
|
setManagingGame
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -855,6 +859,8 @@ export default function RootLayout ({
|
|||||||
<ModDownloadsPopup />
|
<ModDownloadsPopup />
|
||||||
) : popupMode === 4 ? (
|
) : popupMode === 4 ? (
|
||||||
<VersionChangelogPopup />
|
<VersionChangelogPopup />
|
||||||
|
) : popupMode === 5 ? (
|
||||||
|
<ManageGamePopup />
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ export default function Installs () {
|
|||||||
setFadeOut,
|
setFadeOut,
|
||||||
setSelectedVersionList,
|
setSelectedVersionList,
|
||||||
setSelectedGame,
|
setSelectedGame,
|
||||||
setCategory
|
setCategory,
|
||||||
|
setManagingGame
|
||||||
} = useGlobal()
|
} = useGlobal()
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -78,6 +79,13 @@ export default function Installs () {
|
|||||||
setCategory(-1)
|
setCategory(-1)
|
||||||
router.push('/main/game?id=' + i.id)
|
router.push('/main/game?id=' + i.id)
|
||||||
}}
|
}}
|
||||||
|
onContextMenu={e => {
|
||||||
|
e.preventDefault()
|
||||||
|
setManagingGame(i.id)
|
||||||
|
setPopupMode(5)
|
||||||
|
setShowPopup(true)
|
||||||
|
setFadeOut(false)
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<div className='h-18 w-screen relative'>
|
<div className='h-18 w-screen relative'>
|
||||||
<p className='text-2xl'>{i.name}</p>
|
<p className='text-2xl'>{i.name}</p>
|
||||||
|
|||||||
@@ -0,0 +1,150 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import {
|
||||||
|
faCheck,
|
||||||
|
faCode,
|
||||||
|
faHardDrive,
|
||||||
|
faShieldHalved,
|
||||||
|
faWarning
|
||||||
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
import { useGlobal } from '@/providers/GlobalProvider'
|
||||||
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
import { useEffect, useMemo, useState } from 'react'
|
||||||
|
import prettyBytes from 'pretty-bytes'
|
||||||
|
import { BaseDirectory, exists, remove } from '@tauri-apps/plugin-fs'
|
||||||
|
|
||||||
|
export default function ManageGamePopup () {
|
||||||
|
const {
|
||||||
|
versionsList,
|
||||||
|
serverVersionList,
|
||||||
|
viewingInfoFromDownloads,
|
||||||
|
closePopup,
|
||||||
|
versions,
|
||||||
|
customDataLocation,
|
||||||
|
managingGame
|
||||||
|
} = useGlobal()
|
||||||
|
const [gameSize, setGameSize] = useState<number>(0)
|
||||||
|
|
||||||
|
const versionsInstalled = useMemo(() => {
|
||||||
|
return serverVersionList?.versions.filter(
|
||||||
|
vf => vf.game == managingGame && Object.keys(versionsList).includes(vf.id)
|
||||||
|
)
|
||||||
|
}, [serverVersionList, managingGame, versionsList])
|
||||||
|
const gameInfo = serverVersionList?.games.find(vf => vf.id == managingGame)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (viewingInfoFromDownloads || !versionsInstalled) return
|
||||||
|
|
||||||
|
let cancelled = false
|
||||||
|
|
||||||
|
const run = async () => {
|
||||||
|
let total = 0
|
||||||
|
setGameSize(0)
|
||||||
|
|
||||||
|
for (const version of versionsInstalled) {
|
||||||
|
if (cancelled) return
|
||||||
|
|
||||||
|
const size = await invoke<string>('folder_size', {
|
||||||
|
version: version.id
|
||||||
|
}).catch(() => '0')
|
||||||
|
|
||||||
|
total += Number(size)
|
||||||
|
setGameSize(total)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run()
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
cancelled = true
|
||||||
|
}
|
||||||
|
}, [versionsInstalled, viewingInfoFromDownloads])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<p className='text-xl text-center'>Viewing {gameInfo?.name}</p>
|
||||||
|
<div className='popup-content flex flex-col items-center justify-center gap-2 h-full'>
|
||||||
|
<div className='entry-info-item btntheme2' hidden={!gameInfo?.official}>
|
||||||
|
<FontAwesomeIcon icon={faCheck} color='#19c84b' />
|
||||||
|
<p>Official</p>
|
||||||
|
</div>
|
||||||
|
<div className='entry-info-item btntheme2' hidden={gameInfo?.official}>
|
||||||
|
<FontAwesomeIcon
|
||||||
|
icon={gameInfo?.verified ? faShieldHalved : faWarning}
|
||||||
|
color={gameInfo?.verified ? '#19c84b' : '#ffc800'}
|
||||||
|
/>
|
||||||
|
<p>{gameInfo?.verified ? 'Verified' : 'Unverified'}</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className='entry-info-item btntheme2'
|
||||||
|
hidden={gameInfo?.developer == null}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faCode} color='lightgray' />
|
||||||
|
<p>Developer: {gameInfo?.developer}</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className='entry-info-item btntheme2'
|
||||||
|
hidden={viewingInfoFromDownloads}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faHardDrive} color='lightgray' />
|
||||||
|
<p>
|
||||||
|
Size on disk:{' '}
|
||||||
|
{gameSize && gameSize > 0
|
||||||
|
? prettyBytes(gameSize, {
|
||||||
|
minimumFractionDigits: 2,
|
||||||
|
maximumFractionDigits: 2
|
||||||
|
})
|
||||||
|
: 'N/A'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className='entry-info-item btntheme2'
|
||||||
|
onClick={async () => {
|
||||||
|
closePopup()
|
||||||
|
if (!versionsInstalled) return
|
||||||
|
|
||||||
|
const updatedList = { ...versionsList }
|
||||||
|
|
||||||
|
for (const version of versionsInstalled)
|
||||||
|
delete updatedList[version.id]
|
||||||
|
|
||||||
|
await versions?.set('list', updatedList)
|
||||||
|
|
||||||
|
for (const version of versionsInstalled) {
|
||||||
|
const managingVersion = version.id
|
||||||
|
|
||||||
|
if (
|
||||||
|
await exists(
|
||||||
|
(customDataLocation ? customDataLocation + '/' : null) +
|
||||||
|
'game/' +
|
||||||
|
managingVersion,
|
||||||
|
{
|
||||||
|
baseDir: customDataLocation
|
||||||
|
? undefined
|
||||||
|
: BaseDirectory.AppLocalData
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
await remove(
|
||||||
|
(customDataLocation ? customDataLocation + '/' : null) +
|
||||||
|
'game/' +
|
||||||
|
managingVersion,
|
||||||
|
{
|
||||||
|
baseDir: customDataLocation
|
||||||
|
? undefined
|
||||||
|
: BaseDirectory.AppLocalData,
|
||||||
|
recursive: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
title='Click to uninstall this game. This will NOT remove any progress or any save files.'
|
||||||
|
hidden={viewingInfoFromDownloads}
|
||||||
|
>
|
||||||
|
Uninstall
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -62,6 +62,8 @@ type GlobalCtxType = {
|
|||||||
modsList: Record<string, Record<string, number>>
|
modsList: Record<string, Record<string, number>>
|
||||||
movingData: boolean
|
movingData: boolean
|
||||||
setMovingData: Dispatch<SetStateAction<boolean>>
|
setMovingData: Dispatch<SetStateAction<boolean>>
|
||||||
|
managingGame: number | null
|
||||||
|
setManagingGame: Dispatch<SetStateAction<number | null>>
|
||||||
}
|
}
|
||||||
|
|
||||||
const GlobalCtx = createContext<GlobalCtxType | null>(null)
|
const GlobalCtx = createContext<GlobalCtxType | null>(null)
|
||||||
|
|||||||
Reference in new issue
Block a user