diff --git a/app/(main)/[teamId]/page.js b/app/(main)/[teamId]/page.js index f9b6e6e..05da71a 100644 --- a/app/(main)/[teamId]/page.js +++ b/app/(main)/[teamId]/page.js @@ -360,6 +360,7 @@ export default function TeamPage({ params }) { margin: 0; font-size: 24px; font-weight: bold; + color: white; } .team-code { @@ -392,6 +393,7 @@ export default function TeamPage({ params }) { display: flex; align-items: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + border: 2px solid #68543c; /* Add 2px thick border with the same brown color as banner */ } .member-avatar { diff --git a/app/(main)/admin/page.js b/app/(main)/admin/page.js index 3f6d17e..fd05f53 100644 --- a/app/(main)/admin/page.js +++ b/app/(main)/admin/page.js @@ -242,12 +242,6 @@ export default function AdminDashboard() { return (
-
router.push("/team-selection")} - > - ← -
Admin Dashboard
@@ -337,20 +331,13 @@ export default function AdminDashboard() { .page-header { display: flex; - justify-content: space-between; + justify-content: center; align-items: center; padding: 1rem; background-color: #68543c; color: white; } - .back-button { - font-size: 1.5rem; - cursor: pointer; - width: 40px; - text-align: center; - } - .page-title { font-size: 1.2rem; font-weight: 600; @@ -358,6 +345,7 @@ export default function AdminDashboard() { .placeholder { width: 40px; + display: none; } .admin-content { diff --git a/app/api/hunt/timer/route.js b/app/api/hunt/timer/route.js index 0eec5a3..10a2717 100644 --- a/app/api/hunt/timer/route.js +++ b/app/api/hunt/timer/route.js @@ -4,6 +4,37 @@ import { verifyToken } from "@/app/api/auth/[...nextauth]/route"; export const dynamic = "force-dynamic"; // Disable caching +// Helper function to ensure the hunt_timer table exists +async function ensureTableExists() { + try { + // Check if the table exists by querying it + await queryOne("SELECT name FROM sqlite_master WHERE type='table' AND name='hunt_timer'"); + + // If no error was thrown, the table exists + return true; + } catch (error) { + console.error("Error checking for hunt_timer table:", error); + + // Try to create the table + try { + await run(` + CREATE TABLE IF NOT EXISTS hunt_timer ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + active INTEGER NOT NULL DEFAULT 0, + start_time TEXT NOT NULL, + end_time TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + `); + console.log("hunt_timer table created successfully"); + return true; + } catch (createError) { + console.error("Failed to create hunt_timer table:", createError); + return false; + } + } +} + // GET endpoint to get current timer status export async function GET(request) { try { @@ -20,6 +51,15 @@ export async function GET(request) { return Response.json({ error: "Invalid session" }, { status: 401 }); } + // Ensure the table exists + const tableExists = await ensureTableExists(); + if (!tableExists) { + return Response.json( + { error: "Database table not found" }, + { status: 500 } + ); + } + // Get the current hunt timer status const timerStatus = await queryOne( "SELECT active, start_time, end_time FROM hunt_timer ORDER BY id DESC LIMIT 1" @@ -59,43 +99,80 @@ export async function POST(request) { } const userData = verifyToken(sessionToken); - if (!userData || userData.role !== "admin") { + if (!userData) { + return Response.json({ error: "Invalid session" }, { status: 401 }); + } + + console.log("User role:", userData.role); + + // Check if user is admin (more lenient check) + if (!(userData.role === "admin" || userData.isAdmin === true || userData.is_admin === 1)) { return Response.json( { error: "Unauthorized: Admin access required" }, { status: 403 } ); } + // Ensure the table exists + const tableExists = await ensureTableExists(); + if (!tableExists) { + return Response.json( + { error: "Database table not found" }, + { status: 500 } + ); + } + const body = await request.json(); const { action, endTime } = body; + console.log("Timer action:", action, "End time:", endTime); + if (action === "start") { - // Get current time in ISO format - const startTime = new Date().toISOString(); + try { + // Get current time in ISO format + const startTime = new Date().toISOString(); - // Insert new timer record - await run( - "INSERT INTO hunt_timer (active, start_time, end_time) VALUES (?, ?, ?)", - [1, startTime, endTime || null] - ); + // First, deactivate any existing timers + await run("UPDATE hunt_timer SET active = 0 WHERE active = 1"); - return Response.json({ - success: true, - message: "Timer started successfully", - startTime, - endTime: endTime || null, - }); + // Insert new timer record + await run( + "INSERT INTO hunt_timer (active, start_time, end_time) VALUES (?, ?, ?)", + [1, startTime, endTime || null] + ); + + return Response.json({ + success: true, + message: "Timer started successfully", + startTime, + endTime: endTime || null, + }); + } catch (dbError) { + console.error("Database error starting timer:", dbError); + return Response.json( + { error: "Database error: " + dbError.message }, + { status: 500 } + ); + } } else if (action === "stop") { - // Update the most recent timer to inactive - await run( - "UPDATE hunt_timer SET active = 0, end_time = ? WHERE id = (SELECT id FROM hunt_timer ORDER BY id DESC LIMIT 1)", - [new Date().toISOString()] - ); + try { + // Update the most recent timer to inactive + await run( + "UPDATE hunt_timer SET active = 0, end_time = ? WHERE active = 1", + [new Date().toISOString()] + ); - return Response.json({ - success: true, - message: "Timer stopped successfully", - }); + return Response.json({ + success: true, + message: "Timer stopped successfully", + }); + } catch (dbError) { + console.error("Database error stopping timer:", dbError); + return Response.json( + { error: "Database error: " + dbError.message }, + { status: 500 } + ); + } } else { return Response.json( { error: "Invalid action. Use 'start' or 'stop'." }, @@ -104,6 +181,8 @@ export async function POST(request) { } } catch (error) { console.error("Error managing timer:", error); - return Response.json({ error: "Failed to manage timer" }, { status: 500 }); + return Response.json({ + error: "Failed to manage timer: " + error.message + }, { status: 500 }); } } diff --git a/clue_hunt.db b/clue_hunt.db index f09b7c5..8baf3d0 100644 Binary files a/clue_hunt.db and b/clue_hunt.db differ