adding resume game in manager page

This commit is contained in:
RandyJC
2025-12-09 14:18:57 +01:00
parent 760fc93c1b
commit 84b269d2d1
3 changed files with 57 additions and 3 deletions

View File

@@ -11,7 +11,7 @@ import Button from "@rahoot/web/components/Button"
import { useEvent, useSocket } from "@rahoot/web/contexts/socketProvider" import { useEvent, useSocket } from "@rahoot/web/contexts/socketProvider"
import { useManagerStore } from "@rahoot/web/stores/manager" import { useManagerStore } from "@rahoot/web/stores/manager"
import { useRouter } from "next/navigation" import { useRouter } from "next/navigation"
import { useState } from "react" import { useEffect, useState } from "react"
const Manager = () => { const Manager = () => {
const { gameId, setGameId, setStatus } = useManagerStore() const { gameId, setGameId, setStatus } = useManagerStore()
@@ -23,6 +23,7 @@ const Manager = () => {
const [showEditor, setShowEditor] = useState(false) const [showEditor, setShowEditor] = useState(false)
const [showMedia, setShowMedia] = useState(false) const [showMedia, setShowMedia] = useState(false)
const [showTheme, setShowTheme] = useState(false) const [showTheme, setShowTheme] = useState(false)
const [resumeGameId, setResumeGameId] = useState<string | null>(null)
useEvent("manager:quizzList", (quizzList) => { useEvent("manager:quizzList", (quizzList) => {
setIsAuth(true) setIsAuth(true)
@@ -32,9 +33,20 @@ const Manager = () => {
useEvent("manager:gameCreated", ({ gameId, inviteCode }) => { useEvent("manager:gameCreated", ({ gameId, inviteCode }) => {
setGameId(gameId) setGameId(gameId)
setStatus(STATUS.SHOW_ROOM, { text: "Waiting for the players", inviteCode }) setStatus(STATUS.SHOW_ROOM, { text: "Waiting for the players", inviteCode })
setResumeGameId(gameId)
router.push(`/game/manager/${gameId}`) router.push(`/game/manager/${gameId}`)
}) })
useEvent(
"manager:successReconnect",
({ gameId, status, players, currentQuestion }) => {
setGameId(gameId)
setStatus(status.name, status.data)
setResumeGameId(gameId)
router.push(`/game/manager/${gameId}`)
},
)
const handleAuth = (password: string) => { const handleAuth = (password: string) => {
socket?.emit("manager:auth", password) socket?.emit("manager:auth", password)
} }
@@ -46,6 +58,20 @@ const Manager = () => {
socket?.emit("manager:setBreak", { gameId, active }) socket?.emit("manager:setBreak", { gameId, active })
} }
const handleResume = () => {
if (!resumeGameId) return
socket?.emit("manager:reconnect", { gameId: resumeGameId })
}
useEffect(() => {
try {
const stored = localStorage.getItem("last_manager_game_id")
if (stored) {
setResumeGameId(stored)
}
} catch {}
}, [])
if (!isAuth) { if (!isAuth) {
return <ManagerPassword onSubmit={handleAuth} /> return <ManagerPassword onSubmit={handleAuth} />
} }
@@ -90,6 +116,8 @@ const Manager = () => {
onManage={() => setShowEditor(true)} onManage={() => setShowEditor(true)}
onMedia={() => setShowMedia(true)} onMedia={() => setShowMedia(true)}
onTheme={() => setShowTheme(true)} onTheme={() => setShowTheme(true)}
resumeGameId={resumeGameId}
onResume={handleResume}
/> />
) )
} }

View File

@@ -10,6 +10,8 @@ type Props = {
onManage?: () => void onManage?: () => void
onMedia?: () => void onMedia?: () => void
onTheme?: () => void onTheme?: () => void
resumeGameId?: string | null
onResume?: () => void
} }
const SelectQuizz = ({ const SelectQuizz = ({
@@ -18,6 +20,8 @@ const SelectQuizz = ({
onManage, onManage,
onMedia, onMedia,
onTheme, onTheme,
resumeGameId,
onResume,
}: Props) => { }: Props) => {
const [selected, setSelected] = useState<string | null>(null) const [selected, setSelected] = useState<string | null>(null)
@@ -44,6 +48,14 @@ const SelectQuizz = ({
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h1 className="text-2xl font-bold">Select a quizz</h1> <h1 className="text-2xl font-bold">Select a quizz</h1>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
{resumeGameId && onResume && (
<button
className="rounded-md bg-amber-500 px-3 py-1 text-sm font-semibold text-white shadow"
onClick={onResume}
>
Resume game
</button>
)}
{onMedia && ( {onMedia && (
<button <button
className="text-sm font-semibold text-gray-700 underline" className="text-sm font-semibold text-gray-700 underline"

View File

@@ -25,7 +25,16 @@ const initialState = {
export const useManagerStore = create<ManagerStore<StatusDataMap>>((set) => ({ export const useManagerStore = create<ManagerStore<StatusDataMap>>((set) => ({
...initialState, ...initialState,
setGameId: (gameId) => set({ gameId }), setGameId: (gameId) => {
try {
if (gameId) {
localStorage.setItem("last_manager_game_id", gameId)
} else {
localStorage.removeItem("last_manager_game_id")
}
} catch {}
set({ gameId })
},
setStatus: (name, data) => set({ status: createStatus(name, data) }), setStatus: (name, data) => set({ status: createStatus(name, data) }),
resetStatus: () => set({ status: null }), resetStatus: () => set({ status: null }),
@@ -35,5 +44,10 @@ export const useManagerStore = create<ManagerStore<StatusDataMap>>((set) => ({
players: typeof players === "function" ? players(state.players) : players, players: typeof players === "function" ? players(state.players) : players,
})), })),
reset: () => set(initialState), reset: () => {
try {
localStorage.removeItem("last_manager_game_id")
} catch {}
set(initialState)
},
})) }))