@@ -4,23 +4,55 @@ import { GameStateProvider, useGameState } from '@context/GameStateContext';
44import { GenreEditorProvider } from '@context/GenreEditorContext' ;
55import { ThemeToggle } from '@components/ui/ThemeToggle' ;
66import { Button } from '@components/ui/Button' ;
7+ import { Modal } from '@components/ui/Modal' ;
78import { GenreSelector } from '@components/game/GenreSelector' ;
89import { QuestionFlow } from '@components/game/QuestionFlow' ;
910import { BingoBoard } from '@components/game/BingoBoard' ;
1011import { GenreEditor } from '@components/editor/GenreEditor' ;
11- import { handleSharedGenreOnLoad } from '@utils/shareGenre' ;
12+ import { getSharedGenreFromUrl , handleSharedGenreImport , clearShareUrl } from '@utils/shareGenre' ;
13+ import type { Genre } from '@data/types' ;
1214
1315type AppMode = 'game' | 'editor' ;
1416
1517function AppContent ( ) {
1618 const { selectedGenre, board } = useGameState ( ) ;
1719 const [ mode , setMode ] = useState < AppMode > ( 'game' ) ;
20+ const [ sharedGenre , setSharedGenre ] = useState < Genre | null > ( null ) ;
21+ const [ importModal , setImportModal ] = useState ( false ) ;
22+ const [ successModal , setSuccessModal ] = useState < string > ( '' ) ;
23+ const [ errorModal , setErrorModal ] = useState < string > ( '' ) ;
1824
1925 // Handle shared genre links on mount
2026 useEffect ( ( ) => {
21- handleSharedGenreOnLoad ( ) ;
27+ const genre = getSharedGenreFromUrl ( ) ;
28+ if ( genre ) {
29+ setSharedGenre ( genre ) ;
30+ setImportModal ( true ) ;
31+ }
2232 } , [ ] ) ;
2333
34+ const handleImportConfirm = ( ) => {
35+ if ( sharedGenre ) {
36+ handleSharedGenreImport (
37+ sharedGenre ,
38+ ( message ) => {
39+ setImportModal ( false ) ;
40+ setSuccessModal ( message ) ;
41+ } ,
42+ ( message ) => {
43+ setImportModal ( false ) ;
44+ setErrorModal ( message ) ;
45+ }
46+ ) ;
47+ }
48+ } ;
49+
50+ const handleImportCancel = ( ) => {
51+ setImportModal ( false ) ;
52+ setSharedGenre ( null ) ;
53+ clearShareUrl ( ) ;
54+ } ;
55+
2456 if ( mode === 'editor' ) {
2557 return (
2658 < div className = "min-h-screen bg-[var(--color-bg)] text-[var(--color-text)] transition-colors duration-200" >
@@ -64,6 +96,33 @@ function AppContent() {
6496 { /* Board generated - show bingo board */ }
6597 { selectedGenre && board && < BingoBoard /> }
6698 </ main >
99+
100+ { /* Shared Genre Import Modals */ }
101+ < Modal
102+ isOpen = { importModal }
103+ onClose = { handleImportCancel }
104+ onConfirm = { handleImportConfirm }
105+ title = "Import Shared Genre"
106+ message = { `Import shared genre "${ sharedGenre ?. name } "?\n\nThis will save it to your browser and make it available in the genre selector.` }
107+ type = "confirm"
108+ confirmText = "Import"
109+ />
110+
111+ < Modal
112+ isOpen = { ! ! successModal }
113+ onClose = { ( ) => setSuccessModal ( '' ) }
114+ title = "Success"
115+ message = { successModal }
116+ type = "alert"
117+ />
118+
119+ < Modal
120+ isOpen = { ! ! errorModal }
121+ onClose = { ( ) => setErrorModal ( '' ) }
122+ title = "Error"
123+ message = { errorModal }
124+ type = "alert"
125+ />
67126 </ div >
68127 ) ;
69128}
0 commit comments