diff --git a/src/hooks/useUnlockerSelection.ts b/src/hooks/useUnlockerSelection.ts new file mode 100644 index 0000000..422f0dc --- /dev/null +++ b/src/hooks/useUnlockerSelection.ts @@ -0,0 +1,71 @@ +import { useState, useCallback } from 'react' +import { Game } from '@/types' +import { ActionType } from '@/components/buttons' + +export interface UnlockerSelectionState { + visible: boolean + gameId: string | null + gameTitle: string | null +} + +/** + * Hook for managing unlocker selection on native games + */ +export function useUnlockerSelection() { + const [selectionState, setSelectionState] = useState({ + visible: false, + gameId: null, + gameTitle: null, + }) + + // Store the callback to call when user makes a selection + const [selectionCallback, setSelectionCallback] = useState<((action: ActionType) => void) | null>( + null + ) + + // Show the dialog and store the callback + const showUnlockerSelection = useCallback( + (game: Game, callback: (action: ActionType) => void) => { + setSelectionState({ + visible: true, + gameId: game.id, + gameTitle: game.title, + }) + // Wrap in function to avoid stale closure + setSelectionCallback(() => callback) + }, + [] + ) + + // User selected CreamLinux + const handleSelectCreamLinux = useCallback(() => { + setSelectionState({ visible: false, gameId: null, gameTitle: null }) + if (selectionCallback) { + selectionCallback('install_cream') + } + setSelectionCallback(null) + }, [selectionCallback]) + + // User selected SmokeAPI + const handleSelectSmokeAPI = useCallback(() => { + setSelectionState({ visible: false, gameId: null, gameTitle: null }) + if (selectionCallback) { + selectionCallback('install_smoke') + } + setSelectionCallback(null) + }, [selectionCallback]) + + // Close dialog without selection + const closeDialog = useCallback(() => { + setSelectionState({ visible: false, gameId: null, gameTitle: null }) + setSelectionCallback(null) + }, []) + + return { + selectionState, + showUnlockerSelection, + handleSelectCreamLinux, + handleSelectSmokeAPI, + closeDialog, + } +} \ No newline at end of file