feat: add setup button to edit game details

This commit is contained in:
Frank Schwenk
2026-09-22 16:04:47 +02:00
parent 678977ab23
commit c876a80b7e
11 changed files with 814 additions and 7 deletions
+25 -2
View File
@@ -10,8 +10,9 @@ import {
useCompletionModal,
} from '@lib/state';
import { GameService } from '@lib/data/gameService';
import type { StandardGame, Game, EndlosGame } from '@lib/domain/types';
import { isEndlosGame } from '@lib/domain/gameUtils';
import type { StandardGame, Game, EndlosGame, GameSetupData } from '@lib/domain/types';
import { applySetupData, isEndlosGame, isStandardGame } from '@lib/domain/gameUtils';
import { validateGameSetupData } from '@lib/domain/validation';
import { Layout } from '@lib/ui/Layout';
import GameListScreen from './screens/GameListScreen';
@@ -141,6 +142,27 @@ export default function App() {
}
}, [navigation.currentGameId, gameState.getGameById, gameState.updateGame, validationModal.showValidation]);
const handleUpdateGameSetup = useCallback(async (setupData: GameSetupData) => {
if (!navigation.currentGameId) return;
const game = gameState.getGameById(navigation.currentGameId);
if (!game || !isStandardGame(game)) return;
const validation = validateGameSetupData(setupData);
if (!validation.isValid) {
validationModal.showValidation(validation.errors.join('\n'));
return;
}
try {
const updatedGame = applySetupData(game, setupData);
await gameState.updateGame(navigation.currentGameId, updatedGame);
} catch (error) {
console.error('Failed to update game setup:', error);
validationModal.showValidation('Spieleinstellungen konnten nicht gespeichert werden.');
}
}, [navigation.currentGameId, gameState.getGameById, gameState.updateGame, validationModal.showValidation]);
const handleForfeit = async () => {
if (!navigation.currentGameId) return;
@@ -294,6 +316,7 @@ export default function App() {
onUndo={handleUndo}
onForfeit={handleForfeit}
onBack={navigation.showGameList}
onUpdateGameSetup={handleUpdateGameSetup}
/>
)}
+4 -1
View File
@@ -1,7 +1,7 @@
import { h } from 'preact';
import { Screen } from '@lib/ui/Layout';
import GameDetail from '@lib/features/game-detail/GameDetail';
import type { Game, EndlosGame } from '@lib/domain/types';
import type { Game, EndlosGame, GameSetupData } from '@lib/domain/types';
interface GameDetailScreenProps {
game?: Game;
@@ -11,6 +11,7 @@ interface GameDetailScreenProps {
onUndo: () => void;
onForfeit: () => void;
onBack: () => void;
onUpdateGameSetup?: (setupData: GameSetupData) => void;
}
export default function GameDetailScreen({
@@ -21,6 +22,7 @@ export default function GameDetailScreen({
onUndo,
onForfeit,
onBack,
onUpdateGameSetup,
}: GameDetailScreenProps) {
if (!game) {
return (
@@ -40,6 +42,7 @@ export default function GameDetailScreen({
onUndo={onUndo}
onForfeit={onForfeit}
onBack={onBack}
onUpdateGameSetup={onUpdateGameSetup}
/>
</Screen>
);