diff --git a/traque-front/app/admin/layout.js b/traque-front/app/admin/layout.js index a951f13..3873e4a 100644 --- a/traque-front/app/admin/layout.js +++ b/traque-front/app/admin/layout.js @@ -7,13 +7,11 @@ export default function AdminLayout({ children}) {
-
-
Admin
-
    -
  • Home
  • -
  • Teams
  • -
  • Map
  • -
+
+
    +
  • Admin
  • +
  • Teams
  • +
{children} diff --git a/traque-front/app/admin/page.js b/traque-front/app/admin/page.js index 8e22c46..4708951 100644 --- a/traque-front/app/admin/page.js +++ b/traque-front/app/admin/page.js @@ -9,21 +9,29 @@ import dynamic from "next/dynamic"; const ZoneSelector = dynamic(() => import('@/components/admin/zoneSelector').then((mod) => mod.ZoneSelector), { ssr: false }); +const LiveMap = dynamic(() => import('@/components/admin/mapPicker').then((mod) => mod.LiveMap), { + ssr: false +}); export default function AdminPage() { const { useProtect } = useAdminConnexion(); const { gameState, changeState } = useAdmin(); useProtect(); return ( -
-
-

Game state

- Current : {gameState} - changeState(GameState.SETUP)}>Reset game - changeState(GameState.PLACEMENT)}>Start placement - changeState(GameState.PLAYING)}>Start game +
+
+
+

Game state

+ Current : {gameState} + changeState(GameState.SETUP)}>Reset game + changeState(GameState.PLACEMENT)}>Start placement + changeState(GameState.PLAYING)}>Start game +
{gameState == GameState.PLACEMENT &&
} {(gameState == GameState.SETUP || gameState == GameState.PLACEMENT) && } + {gameState == GameState.PLAYING &&
+ +
}
) } \ No newline at end of file diff --git a/traque-front/components/admin/mapPicker.jsx b/traque-front/components/admin/mapPicker.jsx index 5fe6ab5..e511c3b 100644 --- a/traque-front/components/admin/mapPicker.jsx +++ b/traque-front/components/admin/mapPicker.jsx @@ -2,8 +2,9 @@ import { useLocation } from "@/hook/useLocation"; import { useEffect, useState } from "react"; import "leaflet/dist/leaflet.css"; -import { Circle, MapContainer, Marker, TileLayer, useMap } from "react-leaflet"; +import { Circle, MapContainer, Marker, Popup, TileLayer, useMap } from "react-leaflet"; import { useMapCircleDraw } from "@/hook/mapDrawing"; +import useAdmin from "@/hook/useAdmin"; function MapPan(props) { const map = useMap(); @@ -91,4 +92,34 @@ export function ZonePicker({ minZone, setMinZone, maxZone, setMaxZone, editMode, ) +} + +export function LiveMap() { + const location = useLocation(Infinity); + const { zone, zoneExtremities, teams, getTeamName } = useAdmin(); + return ( + + + + {zone && } + {zoneExtremities && } + {zoneExtremities && } + {teams.map((team) => team.currentLocation && !team.captured && + + {team.name} +

Chasing : {getTeamName(team.chasing)}

+

Chased by : {getTeamName(team.chased)}

+
+
)} +
+ ) } \ No newline at end of file diff --git a/traque-front/components/admin/teamReady.jsx b/traque-front/components/admin/teamReady.jsx index 21eb6d3..504ed79 100644 --- a/traque-front/components/admin/teamReady.jsx +++ b/traque-front/components/admin/teamReady.jsx @@ -2,7 +2,7 @@ import useAdmin from "@/hook/useAdmin" export function TeamReady() { const {teams} = useAdmin(); - return
+ return

Teams ready status

{teams.map((team) => team.ready ? (
diff --git a/traque-front/components/admin/zoneSelector.jsx b/traque-front/components/admin/zoneSelector.jsx index b769a5d..2ef1781 100644 --- a/traque-front/components/admin/zoneSelector.jsx +++ b/traque-front/components/admin/zoneSelector.jsx @@ -37,7 +37,7 @@ export function ZoneSelector() { }, [minZone, maxZone]); - return
+ return

Edit zones

{editMode == EditMode.MIN && setEditMode(EditMode.MAX)}>Edit end zone} {editMode == EditMode.MAX && setEditMode(EditMode.MIN)}>Edit start zone} diff --git a/traque-front/context/adminContext.jsx b/traque-front/context/adminContext.jsx index 3f1e9d4..8c4ab65 100644 --- a/traque-front/context/adminContext.jsx +++ b/traque-front/context/adminContext.jsx @@ -10,6 +10,8 @@ const adminContext = createContext(); function AdminProvider({ children }) { const [teams, setTeams] = useState([]); const [zoneSettings, setZoneSettings] = useState(null) + const [zone, setZone] = useState(null); + const [zoneExtremities, setZoneExtremities] = useState(null); const { adminSocket } = useSocket(); const { loggedIn } = useAdminConnexion(); const [gameState, setGameState] = useState(GameState.SETUP); @@ -23,8 +25,10 @@ function AdminProvider({ children }) { //Bind listeners to update the team list and the game status on socket message useSocketListener(adminSocket, "teams", setTeams); useSocketListener(adminSocket, "zone_settings", setZoneSettings); + useSocketListener(adminSocket, "zone", setZone); + useSocketListener(adminSocket, "new_zone", setZoneExtremities); - const value = useMemo(() => ({ teams, zoneSettings, setZoneSettings, setTeams, gameState }), [zoneSettings, teams, gameState]); + const value = useMemo(() => ({ zone, zoneExtremities, teams, zoneSettings, setZoneSettings, setTeams, gameState }), [zoneSettings, teams, gameState, zone, zoneExtremities]); return ( {children} diff --git a/traque-front/hook/useAdmin.jsx b/traque-front/hook/useAdmin.jsx index 6c25284..42f764f 100644 --- a/traque-front/hook/useAdmin.jsx +++ b/traque-front/hook/useAdmin.jsx @@ -2,7 +2,7 @@ import { useAdminContext } from "@/context/adminContext"; import { useSocket } from "@/context/socketContext"; export default function useAdmin(){ - const {teams, gameState, zoneSettings } = useAdminContext(); + const {teams, gameState, zoneSettings, zone, zoneExtremities } = useAdminContext(); const {adminSocket} = useSocket(); function pollTeams() { @@ -42,6 +42,6 @@ export default function useAdmin(){ adminSocket.emit("set_zone_settings", zone); } - return {teams, zoneSettings, gameState,changeZoneSettings, pollTeams, getTeam, getTeamName, reorderTeams, addTeam, removeTeam, changeState, updateTeam }; + return {teams, zoneSettings, gameState, zone, zoneExtremities,changeZoneSettings, pollTeams, getTeam, getTeamName, reorderTeams, addTeam, removeTeam, changeState, updateTeam }; } \ No newline at end of file