feat: add some funcs
This commit is contained in:
@@ -4,9 +4,15 @@ import type {
|
||||
ProgressEvent,
|
||||
GameLogLine,
|
||||
DeviceCodeInfo,
|
||||
UpdateStatus
|
||||
UpdateStatus,
|
||||
PackMeta
|
||||
} from '../../shared/ipc'
|
||||
|
||||
/** Découpe une chaîne d'args JVM en tableau (espaces, vides ignorés). */
|
||||
function parseArgs(s: string): string[] {
|
||||
return s.split(/\s+/).filter(Boolean)
|
||||
}
|
||||
|
||||
type Status = 'loading' | 'logged-out' | 'logged-in' | 'working' | 'running'
|
||||
|
||||
export default function App(): JSX.Element {
|
||||
@@ -17,8 +23,10 @@ export default function App(): JSX.Element {
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
const [authCode, setAuthCode] = useState<DeviceCodeInfo | null>(null)
|
||||
const [maxMemoryMb, setMaxMemoryMb] = useState(8192)
|
||||
const [jvmArgs, setJvmArgs] = useState('')
|
||||
const [appVersion, setAppVersion] = useState('')
|
||||
const [update, setUpdate] = useState<UpdateStatus | null>(null)
|
||||
const [pack, setPack] = useState<PackMeta | null>(null)
|
||||
const consoleRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
// Restaure la session + réglages au démarrage.
|
||||
@@ -30,10 +38,13 @@ export default function App(): JSX.Element {
|
||||
window.api.getAppVersion()
|
||||
])
|
||||
setMaxMemoryMb(s.maxMemoryMb)
|
||||
setJvmArgs(s.extraJvmArgs.join(' '))
|
||||
setAppVersion(v)
|
||||
setProfile(p)
|
||||
setStatus(p ? 'logged-in' : 'logged-out')
|
||||
})()
|
||||
// Récupère le nom/version réels du pack (tolérant au offline).
|
||||
void window.api.getPackMeta().then((m) => m && setPack(m))
|
||||
}, [])
|
||||
|
||||
// Abonnements aux événements main -> renderer.
|
||||
@@ -97,13 +108,21 @@ export default function App(): JSX.Element {
|
||||
void window.api.openInstanceDir()
|
||||
}
|
||||
|
||||
async function handlePlay(): Promise<void> {
|
||||
function handleOpenLogs(): void {
|
||||
void window.api.openLogsDir()
|
||||
}
|
||||
|
||||
function handleStop(): void {
|
||||
void window.api.stopGame()
|
||||
}
|
||||
|
||||
async function handlePlay(opts?: { repair?: boolean }): Promise<void> {
|
||||
setError(null)
|
||||
setLogs([])
|
||||
setStatus('working')
|
||||
await window.api.setSettings({ maxMemoryMb, extraJvmArgs: [] })
|
||||
await window.api.setSettings({ maxMemoryMb, extraJvmArgs: parseArgs(jvmArgs) })
|
||||
try {
|
||||
await window.api.play()
|
||||
await window.api.play(opts)
|
||||
} catch (e) {
|
||||
setError(`Échec du lancement : ${(e as Error).message}`)
|
||||
setStatus('logged-in')
|
||||
@@ -178,7 +197,9 @@ export default function App(): JSX.Element {
|
||||
<div className="topbar">
|
||||
<div className="brand">
|
||||
OFLauncher
|
||||
<span className="pack">All The Mods 10 · 1.21.1</span>
|
||||
<span className="pack">
|
||||
{pack ? `${pack.name} · MC ${pack.minecraft}` : 'All The Mods 10 · 1.21.1'}
|
||||
</span>
|
||||
</div>
|
||||
<div className="profile">
|
||||
<img src={`https://mc-heads.net/avatar/${profile?.uuid}`} alt="" />
|
||||
@@ -220,14 +241,34 @@ export default function App(): JSX.Element {
|
||||
onChange={(e) => setMaxMemoryMb(Number(e.target.value))}
|
||||
/>
|
||||
Mo
|
||||
<input
|
||||
className="jvm"
|
||||
type="text"
|
||||
placeholder="Args JVM (avancé)"
|
||||
value={jvmArgs}
|
||||
disabled={busy}
|
||||
onChange={(e) => setJvmArgs(e.target.value)}
|
||||
/>
|
||||
<button className="linkbtn" onClick={() => void handlePlay({ repair: true })} disabled={busy}>
|
||||
Vérifier les fichiers
|
||||
</button>
|
||||
<button className="linkbtn" onClick={handleOpenInstance}>
|
||||
Ouvrir le dossier de l'instance
|
||||
Ouvrir l'instance
|
||||
</button>
|
||||
<button className="linkbtn" onClick={handleOpenLogs}>
|
||||
Ouvrir les logs
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<button className="play" onClick={handlePlay} disabled={busy}>
|
||||
{status === 'running' ? 'En jeu…' : busy ? 'Patiente…' : 'Jouer'}
|
||||
</button>
|
||||
{status === 'running' ? (
|
||||
<button className="play stop" onClick={handleStop}>
|
||||
Arrêter le jeu
|
||||
</button>
|
||||
) : (
|
||||
<button className="play" onClick={() => void handlePlay()} disabled={busy}>
|
||||
{busy ? 'Patiente…' : 'Jouer'}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
{error && <div className="error">{error}</div>}
|
||||
</div>
|
||||
|
||||
@@ -123,6 +123,20 @@ body {
|
||||
|
||||
.progress {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
/* Fenêtre réduite : la barre de progression passe sur sa propre ligne
|
||||
(sinon les réglages la compriment jusqu'à la rendre invisible). */
|
||||
@media (max-width: 1200px) {
|
||||
.footer {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.progress {
|
||||
order: -1;
|
||||
flex-basis: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.progress .label {
|
||||
@@ -180,6 +194,15 @@ button.play:disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
button.play.stop {
|
||||
background: var(--danger);
|
||||
color: #2a0606;
|
||||
}
|
||||
|
||||
button.play.stop:hover:not(:disabled) {
|
||||
background: #ff6258;
|
||||
}
|
||||
|
||||
.center {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
@@ -214,6 +237,7 @@ button.play:disabled {
|
||||
.settings {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
font-size: 13px;
|
||||
color: var(--text-dim);
|
||||
@@ -228,6 +252,10 @@ button.play:disabled {
|
||||
padding: 4px 6px;
|
||||
}
|
||||
|
||||
.settings input.jvm {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.error {
|
||||
color: var(--danger);
|
||||
font-size: 13px;
|
||||
|
||||
Reference in New Issue
Block a user