Skip to content

Commit bc8283a

Browse files
authored
Merge pull request #7 from truearken/dev
Dev
2 parents f957ce2 + 7a87c10 commit bc8283a

File tree

4 files changed

+84
-74
lines changed

4 files changed

+84
-74
lines changed

TODO.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
### General
44

5-
- [ ] Updater
5+
- [x] Updater
66
- [x] Make it a Desktop App
77
- [x] Settings (eg toggle Auto Select)
88
- [ ] Skin Randomizer
@@ -34,4 +34,3 @@
3434

3535
- [x] Apply loadout when agent selection time runs out
3636
- [x] Wait for VALORANT to start when starting
37-
- [ ] Switch to protobuf

frontend/src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
33
"productName": "ValoVault",
4-
"version": "0.2.3",
4+
"version": "0.2.4",
55
"identifier": "me.truearken",
66
"build": {
77
"frontendDist": "../out",

frontend/src/app/page.tsx

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Toast from '@/components/Toast';
1212
import SettingsCard from '@/components/SettingsCard';
1313
import ConfirmationModal from '@/components/ConfirmationModal';
1414
import { Preset, LoadoutItemV1 } from '@/lib/types';
15-
import { getPlayerLoadout, applyLoadout, getPresets, savePresets, getHealth } from '@/services/api';
15+
import { getPlayerLoadout, applyLoadout, getPresets, savePresets } from '@/services/api';
1616
import { getSettings, saveSettings } from '@/services/settings';
1717
import { LocalClientError } from '@/lib/errors';
1818
import { useData } from '@/context/DataContext';
@@ -26,7 +26,7 @@ const defaultPreset: Preset = {
2626
};
2727

2828
export default function Home() {
29-
const { agents, loading: dataContextLoading } = useData();
29+
const { agents, loading: dataContextLoading, isClientHealthy } = useData();
3030
const [currentLoadout, setCurrentLoadout] = useState<Record<string, LoadoutItemV1>>(defaultPreset.loadout);
3131
const [presets, setPresets] = useState<Preset[]>([]);
3232
const [selectedPreset, setSelectedPreset] = useState<Preset | null>(defaultPreset);
@@ -49,6 +49,7 @@ export default function Home() {
4949

5050
const loadData = useCallback(async () => {
5151
try {
52+
setIsLoading(true);
5253
const [playerLoadout, fetchedPresets, settings] = await Promise.all([
5354
getPlayerLoadout(),
5455
getPresets(),
@@ -66,7 +67,6 @@ export default function Home() {
6667
setIsLoading(false);
6768
} catch (error) {
6869
if (error instanceof LocalClientError) {
69-
setLoadingMessage("Waiting for VALORANT to start...");
7070
setIsLoading(true);
7171
} else {
7272
console.error(error);
@@ -78,24 +78,14 @@ export default function Home() {
7878
}, []);
7979

8080
useEffect(() => {
81-
loadData();
82-
}, [loadData]);
83-
84-
useEffect(() => {
85-
const healthCheck = async () => {
86-
const isHealthy = await getHealth();
87-
if (isHealthy && isLoading) {
88-
loadData();
89-
} else if (!isHealthy && !isLoading) {
90-
setIsLoading(true);
91-
setLoadingMessage("Waiting for VALORANT to start...");
92-
}
93-
};
94-
95-
const intervalId = setInterval(healthCheck, 3000);
96-
97-
return () => clearInterval(intervalId);
98-
}, [isLoading, loadData]);
81+
if (isClientHealthy) {
82+
setLoadingMessage('Loading application data...');
83+
loadData();
84+
} else {
85+
setIsLoading(true);
86+
setLoadingMessage("Waiting for VALORANT to start...");
87+
}
88+
}, [isClientHealthy, loadData]);
9989

10090
useEffect(() => {
10191
if (autoSelectAgent !== undefined) {
@@ -254,14 +244,12 @@ export default function Home() {
254244
if (error instanceof LocalClientError) {
255245
setErrorMessage(error.message);
256246
setShowErrorModal(true);
257-
} else {
258-
console.error(error);
259247
}
248+
} finally {
249+
setIsEditing(false);
250+
setEditingPreset(null);
251+
setOriginalPreset(null);
260252
}
261-
262-
setIsEditing(false);
263-
setEditingPreset(null);
264-
setOriginalPreset(null);
265253
};
266254

267255
const handlePresetDelete = (presetId: string) => {
@@ -315,8 +303,6 @@ export default function Home() {
315303
setIsNewPresetFromPlus(false);
316304
};
317305

318-
319-
320306
const handleCloseErrorModal = () => {
321307
setShowErrorModal(false);
322308
};
@@ -368,12 +354,15 @@ export default function Home() {
368354

369355
if (isLoading || dataContextLoading) {
370356
return (
371-
<div className="d-flex flex-column justify-content-center align-items-center vh-100">
372-
<div className="spinner-border" role="status">
373-
<span className="visually-hidden">Loading...</span>
357+
<>
358+
<Header performUpdateAction={handleUpdate} />
359+
<div className="d-flex flex-column justify-content-center align-items-center vh-100">
360+
<div className="spinner-border" role="status">
361+
<span className="visually-hidden">Loading...</span>
362+
</div>
363+
<p className="mt-3">{loadingMessage}</p>
374364
</div>
375-
<p className="mt-3">{loadingMessage}</p>
376-
</div>
365+
</>
377366
);
378367
}
379368

@@ -415,7 +404,7 @@ export default function Home() {
415404
</div>
416405
</div>
417406
</main>
418-
{isEditing && <Footer onSave={handleSave} onCancel={handleCancel} onSaveAsNew={() => handleOpenPresetNameModal(false)} onApply={handleApply} showSaveButton={originalPreset?.uuid !== 'default-preset'} />}
407+
{isEditing && <Footer onSave={handleSave} onCancel={handleCancel} onSaveAsNew={() => handleOpenPresetNameModal(false)} onApply={handleApply} showSaveButton={originalPreset?.uuid !== 'default-preset'} />}
419408
<PresetNameModal show={showPresetNameModal} onClose={handleClosePresetNameModal} onSave={handleSavePresetName} initialName={renamingPreset?.name} />
420409
<ErrorModal show={showErrorModal} onClose={handleCloseErrorModal} message={errorMessage} />
421410
<Toast show={showToast} onClose={() => setShowToast(false)} message={toastMessage} />
@@ -428,4 +417,4 @@ export default function Home() {
428417
/>
429418
</>
430419
);
431-
}
420+
}
Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
"use client";
22

3-
import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
3+
import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';
44
import { Agent, Weapon, GunBuddy, ContentTier } from '@/lib/types';
5-
import { getAgents, getWeapons, getGunBuddies, getContentTiers, getOwnedSkins, getOwnedGunBuddies } from '@/services/api';
5+
import { getAgents, getWeapons, getGunBuddies, getContentTiers, getOwnedSkins, getOwnedGunBuddies, getHealth } from '@/services/api';
6+
import { LocalClientError } from '@/lib/errors';
67

78
interface DataContextType {
89
agents: Agent[];
@@ -13,6 +14,7 @@ interface DataContextType {
1314
ownedChromaIDs: string[];
1415
ownedBuddyIDs: string[];
1516
loading: boolean;
17+
isClientHealthy: boolean;
1618
}
1719

1820
const DataContext = createContext<DataContextType | undefined>(undefined);
@@ -26,47 +28,67 @@ export function DataProvider({ children }: { children: ReactNode }) {
2628
const [ownedChromaIDs, setOwnedChromaIDs] = useState<string[]>([]);
2729
const [ownedBuddyIDs, setOwnedBuddyIDs] = useState<string[]>([]);
2830
const [loading, setLoading] = useState(true);
31+
const [isClientHealthy, setIsClientHealthy] = useState(false);
2932

30-
useEffect(() => {
31-
async function loadData() {
32-
try {
33-
setLoading(true);
34-
const [agentsData, weaponsData, gunBuddiesData, contentTiersData, ownedSkins, ownedGunBuddies] = await Promise.all([
35-
getAgents(),
36-
getWeapons(),
37-
getGunBuddies(),
38-
getContentTiers(),
39-
getOwnedSkins(),
40-
getOwnedGunBuddies(),
41-
]);
42-
setAgents(agentsData);
43-
setWeapons(weaponsData);
44-
setContentTiers(contentTiersData);
45-
46-
const levels = ownedSkins.LevelIds;
47-
for (const gun of weaponsData) {
48-
const defaultSkin = gun.skins.find(s => s.uuid == gun.defaultSkinUuid)!;
49-
levels.push(defaultSkin.levels[0].uuid)
50-
}
51-
setOwnedLevelIDs(levels);
52-
setOwnedChromaIDs(ownedSkins.ChromaIds);
53-
setOwnedBuddyIDs(ownedGunBuddies.LevelIds);
33+
const loadData = useCallback(async () => {
34+
try {
35+
setLoading(true);
36+
const [agentsData, weaponsData, gunBuddiesData, contentTiersData, ownedSkins, ownedGunBuddies] = await Promise.all([
37+
getAgents(),
38+
getWeapons(),
39+
getGunBuddies(),
40+
getContentTiers(),
41+
getOwnedSkins(),
42+
getOwnedGunBuddies(),
43+
]);
44+
setAgents(agentsData);
45+
setWeapons(weaponsData);
46+
setContentTiers(contentTiersData);
5447

55-
const ownedBuddyDetails = gunBuddiesData.filter(b => ownedGunBuddies.LevelIds.includes(b.levels[0].uuid));
56-
setOwnedBuddies(ownedBuddyDetails);
48+
const levels = ownedSkins.LevelIds;
49+
for (const gun of weaponsData) {
50+
const defaultSkin = gun.skins.find(s => s.uuid == gun.defaultSkinUuid)!;
51+
levels.push(defaultSkin.levels[0].uuid)
52+
}
53+
setOwnedLevelIDs(levels);
54+
setOwnedChromaIDs(ownedSkins.ChromaIds);
55+
setOwnedBuddyIDs(ownedGunBuddies.LevelIds);
5756

58-
} catch (error) {
59-
console.error("Failed to load initial data", error);
60-
} finally {
57+
const ownedBuddyDetails = gunBuddiesData.filter(b => ownedGunBuddies.LevelIds.includes(b.levels[0].uuid));
58+
setOwnedBuddies(ownedBuddyDetails);
59+
setLoading(false);
60+
} catch (error) {
61+
if (error instanceof LocalClientError) {
62+
setLoading(true);
63+
} else {
6164
setLoading(false);
6265
}
6366
}
64-
65-
loadData();
6667
}, []);
6768

69+
useEffect(() => {
70+
const healthCheck = async () => {
71+
const isHealthy = await getHealth();
72+
setIsClientHealthy(isHealthy);
73+
if (isHealthy) {
74+
if (loading) {
75+
loadData();
76+
}
77+
} else {
78+
if (!loading) {
79+
setLoading(true);
80+
}
81+
}
82+
};
83+
84+
healthCheck();
85+
const intervalId = setInterval(healthCheck, 3000);
86+
87+
return () => clearInterval(intervalId);
88+
}, [loading, loadData]);
89+
6890
return (
69-
<DataContext.Provider value={{ agents, weapons, ownedBuddies, contentTiers, ownedLevelIDs, ownedChromaIDs, ownedBuddyIDs, loading }}>
91+
<DataContext.Provider value={{ agents, weapons, ownedBuddies, contentTiers, ownedLevelIDs, ownedChromaIDs, ownedBuddyIDs, loading, isClientHealthy }}>
7092
{children}
7193
</DataContext.Provider>
7294
);
@@ -78,4 +100,4 @@ export function useData() {
78100
throw new Error('useData must be used within a DataProvider');
79101
}
80102
return context;
81-
}
103+
}

0 commit comments

Comments
 (0)