Skip to content

Commit c9c9f88

Browse files
committed
When delete game returns 404, it still deletes from isolated storage
1 parent 95e4615 commit c9c9f88

4 files changed

Lines changed: 27 additions & 26 deletions

File tree

src/frontend/Sudoku.Blazor/Models/ApiResult.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ public class ApiResult<T>
1010
public static ApiResult<T> Success(T value) =>
1111
new ApiResult<T> { IsSuccess = true, Value = value, StatusCode = 200 };
1212

13-
public static ApiResult<T> Failure(string error) =>
14-
new ApiResult<T> { IsSuccess = false, Error = error };
13+
public static ApiResult<T> Failure(string error, int statusCode = 0) =>
14+
new ApiResult<T> { IsSuccess = false, Error = error, StatusCode = statusCode };
1515
}

src/frontend/Sudoku.Blazor/Services/GameStateManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public async Task DeleteGameAsync(string alias, string gameId)
5858
throw new ArgumentException("Game ID not set.");
5959
}
6060
var result = await gameApiClient.DeleteGameAsync(alias, gameId);
61-
if (!result.IsSuccess)
61+
if (!result.IsSuccess && result.StatusCode != 404)
6262
{
6363
throw new Exception("Failed to delete game from server.");
6464
}

src/frontend/Sudoku.Blazor/Services/HttpClients/GameApiClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public async Task<ApiResult<bool>> DeleteGameAsync(string alias, string gameId)
216216
{
217217
var error = await response.Content.ReadAsStringAsync();
218218
_logger.LogWarning("Failed to delete game. Status: {StatusCode}, Error: {Error}", response.StatusCode, error);
219-
return ApiResult<bool>.Failure($"Failed to delete game: {error}");
219+
return ApiResult<bool>.Failure($"Failed to delete game: {error}", (int)response.StatusCode);
220220
}
221221
}
222222
catch (Exception ex)

src/frontend/Sudoku.React/src/hooks/useGameService.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -108,30 +108,31 @@ export function useGameService(): UseGameServiceReturn {
108108
try {
109109
// Delete from API
110110
await apiClient.deleteGame(playerAlias, gameId);
111+
} catch (err) {
112+
if (!(err instanceof Error) || !err.message.startsWith('HTTP 404')) {
113+
const errorMessage = err instanceof Error ? err.message : 'Failed to delete game';
114+
setError(errorMessage);
115+
console.error('Failed to delete game:', err);
116+
throw err;
117+
}
118+
}
111119

112-
// Update local state
113-
setSavedGames(games => games.filter(g => g.id !== gameId));
114-
115-
// Clear current game if it's the one being deleted
116-
setCurrentGame(current => current?.id === gameId ? null : current);
117-
118-
// Update localStorage cache
119-
const cachedGames = localStorage.getItem('savedGames');
120-
if (cachedGames) {
121-
try {
122-
const parsedGames: GameModel[] = JSON.parse(cachedGames);
123-
const updatedGames = parsedGames.filter(g => g.id !== gameId);
124-
localStorage.setItem('savedGames', JSON.stringify(updatedGames));
125-
} catch {
126-
// If cache is corrupted, just remove it
127-
localStorage.removeItem('savedGames');
128-
}
120+
// Update local state (runs on success or 404 — game is gone either way)
121+
setSavedGames(games => games.filter(g => g.id !== gameId));
122+
123+
// Clear current game if it's the one being deleted
124+
setCurrentGame(current => current?.id === gameId ? null : current);
125+
126+
// Update localStorage cache
127+
const cachedGames = localStorage.getItem('savedGames');
128+
if (cachedGames) {
129+
try {
130+
const parsedGames: GameModel[] = JSON.parse(cachedGames);
131+
const updatedGames = parsedGames.filter(g => g.id !== gameId);
132+
localStorage.setItem('savedGames', JSON.stringify(updatedGames));
133+
} catch {
134+
localStorage.removeItem('savedGames');
129135
}
130-
} catch (err) {
131-
const errorMessage = err instanceof Error ? err.message : 'Failed to delete game';
132-
setError(errorMessage);
133-
console.error('Failed to delete game:', err);
134-
throw err; // Re-throw so calling component can handle it
135136
}
136137
}, [isLoading]);
137138

0 commit comments

Comments
 (0)