refactor: Ensure genreKey is always recomputed before use
- Recompute genreKey inside useEffect and save functions to ensure current values - Prevents potential closure issues with stale genreKey values - Improves code quality and prevents future bugs
This commit is contained in:
@@ -69,10 +69,13 @@ export function useGameState(
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const today = getTodayISOString();
|
const today = getTodayISOString();
|
||||||
|
|
||||||
|
// Always recompute genreKey to ensure it's current
|
||||||
|
const currentGenreKey = getGenreKey(isSpecial ? null : genre, isSpecial, isSpecial ? genre || undefined : undefined);
|
||||||
|
|
||||||
// Try to load from backend first
|
// Try to load from backend first
|
||||||
const loadFromBackend = async () => {
|
const loadFromBackend = async () => {
|
||||||
try {
|
try {
|
||||||
const backendState = await loadPlayerState(genreKey);
|
const backendState = await loadPlayerState(currentGenreKey);
|
||||||
|
|
||||||
if (backendState) {
|
if (backendState) {
|
||||||
const { gameState: loadedState, statistics: loadedStats } = backendState;
|
const { gameState: loadedState, statistics: loadedStats } = backendState;
|
||||||
@@ -88,7 +91,7 @@ export function useGameState(
|
|||||||
setGameState(newState);
|
setGameState(newState);
|
||||||
setStatistics(loadedStats); // Keep statistics across days
|
setStatistics(loadedStats); // Keep statistics across days
|
||||||
// Save new state to backend
|
// Save new state to backend
|
||||||
await savePlayerState(genreKey, newState, loadedStats);
|
await savePlayerState(currentGenreKey, newState, loadedStats);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -99,7 +102,7 @@ export function useGameState(
|
|||||||
const newStats = createNewStatistics();
|
const newStats = createNewStatistics();
|
||||||
setStatistics(newStats);
|
setStatistics(newStats);
|
||||||
// Save to backend for cross-domain sync
|
// Save to backend for cross-domain sync
|
||||||
await savePlayerState(genreKey, newState, newStats);
|
await savePlayerState(currentGenreKey, newState, newStats);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -113,7 +116,7 @@ export function useGameState(
|
|||||||
setStatistics(newStats);
|
setStatistics(newStats);
|
||||||
// Try to save to backend (may fail, but we try)
|
// Try to save to backend (may fail, but we try)
|
||||||
try {
|
try {
|
||||||
await savePlayerState(genreKey, newState, newStats);
|
await savePlayerState(currentGenreKey, newState, newStats);
|
||||||
} catch (saveError) {
|
} catch (saveError) {
|
||||||
console.error('[gameState] Failed to save new state to backend:', saveError);
|
console.error('[gameState] Failed to save new state to backend:', saveError);
|
||||||
}
|
}
|
||||||
@@ -121,7 +124,7 @@ export function useGameState(
|
|||||||
};
|
};
|
||||||
|
|
||||||
loadFromBackend();
|
loadFromBackend();
|
||||||
}, [genre, isSpecial, genreKey]); // Re-run when genre or isSpecial changes
|
}, [genre, isSpecial]); // Re-run when genre or isSpecial changes
|
||||||
|
|
||||||
const saveState = async (newState: GameState) => {
|
const saveState = async (newState: GameState) => {
|
||||||
setGameState(newState);
|
setGameState(newState);
|
||||||
@@ -129,7 +132,9 @@ export function useGameState(
|
|||||||
// Save to backend only
|
// Save to backend only
|
||||||
if (statistics) {
|
if (statistics) {
|
||||||
try {
|
try {
|
||||||
await savePlayerState(genreKey, newState, statistics);
|
// Always use the current genreKey (recompute it in case genre/isSpecial changed)
|
||||||
|
const currentGenreKey = getGenreKey(isSpecial ? null : genre, isSpecial, isSpecial ? genre || undefined : undefined);
|
||||||
|
await savePlayerState(currentGenreKey, newState, statistics);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[gameState] Failed to save to backend:', error);
|
console.error('[gameState] Failed to save to backend:', error);
|
||||||
// No fallback - backend is required for cross-domain sync
|
// No fallback - backend is required for cross-domain sync
|
||||||
@@ -163,7 +168,9 @@ export function useGameState(
|
|||||||
// Save to backend only
|
// Save to backend only
|
||||||
if (gameState) {
|
if (gameState) {
|
||||||
try {
|
try {
|
||||||
await savePlayerState(genreKey, gameState, newStats);
|
// Always use the current genreKey (recompute it in case genre/isSpecial changed)
|
||||||
|
const currentGenreKey = getGenreKey(isSpecial ? null : genre, isSpecial, isSpecial ? genre || undefined : undefined);
|
||||||
|
await savePlayerState(currentGenreKey, gameState, newStats);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[gameState] Failed to save statistics to backend:', error);
|
console.error('[gameState] Failed to save statistics to backend:', error);
|
||||||
// No fallback - backend is required for cross-domain sync
|
// No fallback - backend is required for cross-domain sync
|
||||||
|
|||||||
Reference in New Issue
Block a user