@@ -28,6 +28,11 @@ const CHAT_HISTORY_MAX = 50;
2828interface ChatEntry { id : string ; nick : string ; role : "host" | "spectator" ; text : string ; }
2929const chatHistory : ChatEntry [ ] = [ ] ;
3030
31+ /** Квиз перешёл на «Колесо адептов» — куда вернуться по кнопке ведущего. */
32+ let adeptsWheelActive = false ;
33+ let adeptsWheelReturnHref : string | null = null ;
34+ let adeptsWheelCurrentTurnSeat = 0 ;
35+
3136function lobbyPayload ( ) : {
3237 gameStarted : boolean ;
3338 boardIndex : number ;
@@ -100,6 +105,44 @@ export function setupQuizNav(io: Server) {
100105 ) ;
101106 } ) ;
102107
108+ socket . on ( "hostAdeptsWheelOpen" , ( payload : unknown ) => {
109+ const po = payload && typeof payload === "object" ? ( payload as Record < string , unknown > ) : { } ;
110+ const hrefRaw = po [ "returnHref" ] ;
111+ const returnHref =
112+ typeof hrefRaw === "string" && hrefRaw . length > 0 && hrefRaw . length < 2048 ? hrefRaw : null ;
113+ const rawSeat = po [ "currentTurnSeat" ] ;
114+ const seatNum = typeof rawSeat === "number" ? rawSeat : Number ( rawSeat ) ;
115+ const currentTurnSeat =
116+ Number . isInteger ( seatNum ) && seatNum >= 0 && seatNum <= 4 ? seatNum : 0 ;
117+ if ( ! returnHref ) return ;
118+ adeptsWheelActive = true ;
119+ adeptsWheelReturnHref = returnHref ;
120+ adeptsWheelCurrentTurnSeat = currentTurnSeat ;
121+ ns . emit ( "adeptsWheelOpened" , {
122+ returnHref,
123+ currentTurnSeat,
124+ } ) ;
125+ logger . info ( { returnHref, currentTurnSeat } , "Quiz adepts wheel opened" ) ;
126+ } ) ;
127+
128+ socket . on ( "hostAdeptsWheelReturn" , ( ) => {
129+ if ( ! adeptsWheelActive || ! adeptsWheelReturnHref ) return ;
130+ const href = adeptsWheelReturnHref ;
131+ adeptsWheelActive = false ;
132+ adeptsWheelReturnHref = null ;
133+ ns . emit ( "adeptsWheelReturn" , { returnHref : href } ) ;
134+ logger . info ( { returnHref : href } , "Quiz adepts wheel return" ) ;
135+ } ) ;
136+
137+ socket . on ( "requestAdeptsWheelState" , ( ) => {
138+ if ( adeptsWheelActive && adeptsWheelReturnHref ) {
139+ socket . emit ( "adeptsWheelOpened" , {
140+ returnHref : adeptsWheelReturnHref ,
141+ currentTurnSeat : adeptsWheelCurrentTurnSeat ,
142+ } ) ;
143+ }
144+ } ) ;
145+
103146 socket . on ( "hostNavigate" , ( payload : { boardIndex ?: unknown } ) => {
104147 if ( ! gameStarted ) return ;
105148 const raw = payload ?. boardIndex ;
@@ -124,6 +167,8 @@ export function setupQuizNav(io: Server) {
124167 lastBoardIndex = null ;
125168 seatPlayerNicks = [ ] ;
126169 lobbyEmojiLineIndex = - 1 ;
170+ adeptsWheelActive = false ;
171+ adeptsWheelReturnHref = null ;
127172 clearQuizPlayers ( ) ;
128173 ns . emit ( "returnToLogin" , { } ) ;
129174 ns . emit ( "lobbyState" , lobbyPayload ( ) ) ;
0 commit comments