diff --git a/traque-app/assets/images/heart.png b/traque-app/assets/images/heart.png deleted file mode 100644 index 4c02721..0000000 Binary files a/traque-app/assets/images/heart.png and /dev/null differ diff --git a/traque-app/assets/images/knife.png b/traque-app/assets/images/knife.png deleted file mode 100644 index 571cdbe..0000000 Binary files a/traque-app/assets/images/knife.png and /dev/null differ diff --git a/traque-app/assets/images/outOfZone.png b/traque-app/assets/images/outOfZone.png deleted file mode 100644 index 717cb3a..0000000 Binary files a/traque-app/assets/images/outOfZone.png and /dev/null differ diff --git a/traque-app/assets/images/ping/black.png b/traque-app/assets/images/ping/black.png deleted file mode 100644 index 82d9e53..0000000 Binary files a/traque-app/assets/images/ping/black.png and /dev/null differ diff --git a/traque-app/assets/images/ping/green.png b/traque-app/assets/images/ping/green.png deleted file mode 100644 index 9860f8d..0000000 Binary files a/traque-app/assets/images/ping/green.png and /dev/null differ diff --git a/traque-app/assets/images/ping/red.png b/traque-app/assets/images/ping/red.png deleted file mode 100644 index b438324..0000000 Binary files a/traque-app/assets/images/ping/red.png and /dev/null differ diff --git a/traque-app/assets/images/trash.svg b/traque-app/assets/images/trash.svg deleted file mode 100644 index bdd5c9a..0000000 --- a/traque-app/assets/images/trash.svg +++ /dev/null @@ -1,2 +0,0 @@ - -ionicons-v5-e \ No newline at end of file diff --git a/traque-back/team_socket.js b/traque-back/team_socket.js index 19d0289..6427060 100644 --- a/traque-back/team_socket.js +++ b/traque-back/team_socket.js @@ -37,13 +37,14 @@ export function playersBroadcast(event, data) { */ export function sendUpdatedTeamInformations(teamId) { const team = game.getTeam(teamId); + if (!team) return; teamBroadcast(teamId, "update_team", { // Identification name: team.name, captureCode: team.captureCode, // Chasing captured: team.captured, - enemyName: game.getTeam(team.chasing).name, + enemyName: game.getTeam(team.chasing)? game.getTeam(team.chasing).name : null, // Locations lastSentLocation: team.lastSentLocation, enemyLocation: team.enemyLocation, diff --git a/traque-front/app/admin/components/buttons.jsx b/traque-front/app/admin/components/buttons.jsx index 4acd5c1..82366c4 100644 --- a/traque-front/app/admin/components/buttons.jsx +++ b/traque-front/app/admin/components/buttons.jsx @@ -1,14 +1,14 @@ -export function MapButton({ icon, title }) { +export function MapButton({ icon, ...props }) { return ( - ); } -export function ControlButton({ icon, title }) { +export function ControlButton({ icon, ...props }) { return ( - ); diff --git a/traque-front/app/admin/components/liveMap.jsx b/traque-front/app/admin/components/liveMap.jsx index 509d34a..ff67d53 100644 --- a/traque-front/app/admin/components/liveMap.jsx +++ b/traque-front/app/admin/components/liveMap.jsx @@ -7,15 +7,16 @@ import useAdmin from "@/hook/useAdmin"; import { GameState } from "@/util/gameState"; const DEFAULT_ZOOM = 14; + const positionIcon = new L.Icon({ - iconUrl: '/icons/location.png', + iconUrl: '/icons/marker/blue.png', iconSize: [30, 30], iconAnchor: [15, 15], popupAnchor: [0, -15], shadowSize: [30, 30], }); -export default function LiveMap() { +export default function LiveMap({mapStyle, showZones, showNames, showArrows}) { const location = useLocation(Infinity); const [timeLeftNextZone, setTimeLeftNextZone] = useState(null); const { zoneExtremities, teams, nextZoneDate, getTeam, gameState } = useAdmin(); @@ -53,20 +54,17 @@ export default function LiveMap() { } return ( -
+
{gameState == GameState.PLAYING &&

{`Next zone in : ${formatTime(timeLeftNextZone)}`}

} - - + + - {gameState == GameState.PLAYING && zoneExtremities.begin && } - {gameState == GameState.PLAYING && zoneExtremities.end && } + {showZones && gameState == GameState.PLAYING && zoneExtremities.begin && } + {showZones && gameState == GameState.PLAYING && zoneExtremities.end && } {teams.map((team) => team.currentLocation && !team.captured && - {team.name} - + {showNames && {team.name}} + {showArrows && } )} diff --git a/traque-front/app/admin/components/teamSidePanel.jsx b/traque-front/app/admin/components/teamSidePanel.jsx index 9ed4f87..cf56d88 100644 --- a/traque-front/app/admin/components/teamSidePanel.jsx +++ b/traque-front/app/admin/components/teamSidePanel.jsx @@ -21,7 +21,7 @@ function DotLine({ label, value }) { function IconValue({ color, icon, value }) { return (
- +

{value}

); @@ -95,7 +95,7 @@ export default function TeamSidePanel({ selectedTeamId, onClose }) { } return ( -
+

{getStatus(team, gameState).label}

{team.name ?? NO_VALUE}

@@ -103,7 +103,7 @@ export default function TeamSidePanel({ selectedTeamId, onClose }) { Photo de l'équipe
- 0 ? "green" : "red"} icon="dude" value={team.sockets.length ?? NO_VALUE} /> + 0 ? "green" : "red"} icon="user" value={team.sockets.length ?? NO_VALUE} /> = 20 ? "green" : "red"} icon="battery" value={(team.battery ?? NO_VALUE) + "%"} /> +
onSelected(team.id)}>
- 0 ? "/icons/greendude.png" : "/icons/reddude.png"} className="w-4 h-4" /> - 20 ? "/icons/greenbattery.png" : "/icons/redbattery.png"} className="w-4 h-4" /> - + 0 ? "green" : "red"}.png`} className="w-4 h-4" /> + = 20 ? "green" : "red"}.png`} className="w-4 h-4" /> +

{team.name}

@@ -44,16 +45,14 @@ function TeamListItem({ itemSelected, team }) { ); } -export default function TeamList({selectedTeamId, onSelected}) { +export default function TeamViewer({selectedTeamId, onSelected}) { const { teams } = useAdmin(); return ( -
    - {teams.map((team) => ( -
  • onSelected(team.id)}> - -
  • - ))} -
+ + {(team) => ( + + )} + ); } diff --git a/traque-front/app/admin/layout.js b/traque-front/app/admin/layout.js index f20789a..6e252a3 100644 --- a/traque-front/app/admin/layout.js +++ b/traque-front/app/admin/layout.js @@ -5,9 +5,7 @@ export default function AdminLayout({ children }) { return ( -
- {children} -
+ {children}
); diff --git a/traque-front/app/admin/page.js b/traque-front/app/admin/page.js index 63c694b..6c5db05 100644 --- a/traque-front/app/admin/page.js +++ b/traque-front/app/admin/page.js @@ -4,16 +4,34 @@ import dynamic from "next/dynamic"; import Link from "next/link"; import { Section } from "@/components/section"; import { useAdminConnexion } from "@/context/adminConnexionContext"; +import useAdmin from "@/hook/useAdmin"; +import { GameState } from "@/util/gameState"; import TeamSidePanel from "./components/teamSidePanel"; -import TeamList from './components/teamViewer'; +import TeamViewer from './components/teamViewer'; import { MapButton, ControlButton } from './components/buttons'; // Imported at runtime and not at compile time const LiveMap = dynamic(() => import('./components/liveMap'), { ssr: false }); +const mapStyles = { + default: { + url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + attribution: '© OpenStreetMap' + }, + satellite: { + url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", + attribution: 'Tiles © Esri' + }, +} + export default function AdminPage() { const { useProtect } = useAdminConnexion(); const [selectedTeamId, setSelectedTeamId] = useState(null); + const { changeState } = useAdmin(); + const [mapStyle, setMapStyle] = useState(mapStyles.default); + const [showZones, setShowZones] = useState(true); + const [showNames, setShowNames] = useState(true); + const [showArrows, setShowArrows] = useState(false); useProtect(); @@ -24,6 +42,22 @@ export default function AdminPage() { setSelectedTeamId(id); } } + + function switchMapStyle() { + setMapStyle(mapStyle == mapStyles.default ? mapStyles.satellite : mapStyles.default); + } + + function switchZones() { + setShowZones(!showZones); + } + + function switchNames() { + setShowNames(!showNames); + } + + function switchArrows() { + setShowArrows(!showArrows); + } return (
@@ -32,36 +66,38 @@ export default function AdminPage() {

Page principale

-
-
- - - - - - - -
+
+ + + + {false && {}} />} + changeState(GameState.SETUP)} /> + changeState(GameState.PLACEMENT)} /> + changeState(GameState.PLAYING)} />
-
-
- -
+
+
- - setSelectedTeamId(null)}/> +
+ +
+ {selectedTeamId && +
+ setSelectedTeamId(null)}/> +
+ }
- - - - - - - + + + + + {false && } + {false && } + {false && }
diff --git a/traque-front/app/admin/parameters/components/teamManager.jsx b/traque-front/app/admin/parameters/components/teamManager.jsx index 0c93d9e..bc39377 100644 --- a/traque-front/app/admin/parameters/components/teamManager.jsx +++ b/traque-front/app/admin/parameters/components/teamManager.jsx @@ -1,5 +1,5 @@ -import React, { useState } from 'react' import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd'; +import { List } from '@/components/list'; import useAdmin from '@/hook/useAdmin'; function reorder(list, startIndex, endIndex) { @@ -9,23 +9,23 @@ function reorder(list, startIndex, endIndex) { return result; }; -function TeamListItem({ team, index }) { - const { removeTeam } = useAdmin(); +function TeamManagerItem({ team, index }) { + const { updateTeam, removeTeam } = useAdmin(); function handleRemove() { removeTeam(team.id); } return ( - onSelected(team.id)}> + {provided => (

{team.name}

{String(team.id).padStart(6, '0').replace(/(\d{3})(\d{3})/, "$1 $2")}

- - + updateTeam(team.id, { captured: !team.captured })} /> +
@@ -34,17 +34,8 @@ function TeamListItem({ team, index }) { ); } -export default function TeamList() { - const { teams, reorderTeams, addTeam } = useAdmin(); - const [teamName, setTeamName] = useState(''); - - function handleSubmit(e) { - e.preventDefault(); - if (teamName !== "") { - addTeam(teamName); - setTeamName("") - } - } +export default function TeamManager() { + const { teams, reorderTeams } = useAdmin(); function onDragEnd(result) { if (!result.destination) return; @@ -54,29 +45,19 @@ export default function TeamList() { } return ( -
-
-
- setTeamName(e.target.value)} type="text" className="w-full h-full p-4 ring-1 ring-inset ring-gray-300" /> -
-
- -
-
- - - {provided => ( -
    - {teams.map((team, i) => ( -
  • - -
  • - ))} - {provided.placeholder} -
- )} -
-
-
+ + + {provided => ( +
+ + {(team, i) => ( + + )} + + {provided.placeholder} +
+ )} +
+
); } diff --git a/traque-front/app/admin/parameters/page.js b/traque-front/app/admin/parameters/page.js index 71afbae..d5b0f5f 100644 --- a/traque-front/app/admin/parameters/page.js +++ b/traque-front/app/admin/parameters/page.js @@ -7,15 +7,16 @@ import { Section } from "@/components/section"; import { useAdminConnexion } from "@/context/adminConnexionContext"; import useAdmin from '@/hook/useAdmin'; import Messages from "./components/messages"; -import TeamList from './components/teamManager'; +import TeamManager from './components/teamManager'; // Imported at runtime and not at compile time const ZoneSelector = dynamic(() => import('./components/polygonZoneMap'), { ssr: false }); export default function AdminPage() { - const {penaltySettings, changePenaltySettings} = useAdmin(); + const {penaltySettings, changePenaltySettings, addTeam} = useAdmin(); const { useProtect } = useAdminConnexion(); const [allowedTimeBetweenUpdates, setAllowedTimeBetweenUpdates] = useState(""); + const [teamName, setTeamName] = useState(''); useProtect(); @@ -30,10 +31,18 @@ export default function AdminPage() { changePenaltySettings({allowedTimeBetweenPositionUpdate: Number(allowedTimeBetweenUpdates)}); } } + + function handleSubmit(e) { + e.preventDefault(); + if (teamName !== "") { + addTeam(teamName); + setTeamName("") + } + } return (
-
+
@@ -41,19 +50,27 @@ export default function AdminPage() {

Paramètres

-
-
- -
-

Interval between position updates

-
- setAllowedTimeBetweenUpdates(e.target.value)} onBlur={applySettings} /> -
+
+
+
+ setTeamName(e.target.value)} type="text" className="w-full h-full p-4 ring-1 ring-inset ring-gray-300" /> +
+
+ +
+
+
+ +
+
+

Interval between position updates

+
+ setAllowedTimeBetweenUpdates(e.target.value)} onBlur={applySettings} />
-
+
diff --git a/traque-front/components/list.jsx b/traque-front/components/list.jsx new file mode 100644 index 0000000..8f26c0d --- /dev/null +++ b/traque-front/components/list.jsx @@ -0,0 +1,14 @@ +export function List({array, children}) { + // The elements of array have to be identified by a field id + return ( +
+
    + {array.map((elem, i) => ( +
  • + {children(elem, i)} +
  • + ))} +
+
+ ); +} diff --git a/traque-front/components/section.jsx b/traque-front/components/section.jsx index a75d7fe..8f94874 100644 --- a/traque-front/components/section.jsx +++ b/traque-front/components/section.jsx @@ -1,12 +1,14 @@ -export function Section({title, className, children}) { +export function Section({title, outerClassName, innerClassName, children}) { return ( -
+

{title}

-
- {children} +
+
+ {children} +
diff --git a/traque-front/public/icons/battery/black.png b/traque-front/public/icons/battery/black.png new file mode 100644 index 0000000..1c311e3 Binary files /dev/null and b/traque-front/public/icons/battery/black.png differ diff --git a/traque-front/public/icons/greenbattery.png b/traque-front/public/icons/battery/green.png similarity index 100% rename from traque-front/public/icons/greenbattery.png rename to traque-front/public/icons/battery/green.png diff --git a/traque-front/public/icons/battery/red.png b/traque-front/public/icons/battery/red.png new file mode 100644 index 0000000..c255a56 Binary files /dev/null and b/traque-front/public/icons/battery/red.png differ diff --git a/traque-front/public/icons/greendude.png b/traque-front/public/icons/greendude.png deleted file mode 100644 index e8fd9b4..0000000 Binary files a/traque-front/public/icons/greendude.png and /dev/null differ diff --git a/traque-front/public/icons/heart/grey.png b/traque-front/public/icons/heart/grey.png new file mode 100644 index 0000000..ca6bea4 Binary files /dev/null and b/traque-front/public/icons/heart/grey.png differ diff --git a/traque-front/public/icons/heart/heart.png b/traque-front/public/icons/heart/heart.png new file mode 100644 index 0000000..a87c669 Binary files /dev/null and b/traque-front/public/icons/heart/heart.png differ diff --git a/traque-front/public/icons/heart/pink.png b/traque-front/public/icons/heart/pink.png new file mode 100644 index 0000000..6285247 Binary files /dev/null and b/traque-front/public/icons/heart/pink.png differ diff --git a/traque-front/public/icons/location/black.png b/traque-front/public/icons/location/black.png new file mode 100644 index 0000000..2beb8ec Binary files /dev/null and b/traque-front/public/icons/location/black.png differ diff --git a/traque-front/public/icons/greenlocation.png b/traque-front/public/icons/location/green.png similarity index 100% rename from traque-front/public/icons/greenlocation.png rename to traque-front/public/icons/location/green.png diff --git a/traque-front/public/icons/location/red.png b/traque-front/public/icons/location/red.png new file mode 100644 index 0000000..64bbfa0 Binary files /dev/null and b/traque-front/public/icons/location/red.png differ diff --git a/traque-front/public/icons/location.png b/traque-front/public/icons/marker/blue.png similarity index 100% rename from traque-front/public/icons/location.png rename to traque-front/public/icons/marker/blue.png diff --git a/traque-front/public/icons/marker/grey.png b/traque-front/public/icons/marker/grey.png new file mode 100644 index 0000000..5cc7cf6 Binary files /dev/null and b/traque-front/public/icons/marker/grey.png differ diff --git a/traque-front/public/icons/target.png b/traque-front/public/icons/marker/red.png similarity index 100% rename from traque-front/public/icons/target.png rename to traque-front/public/icons/marker/red.png diff --git a/traque-front/public/icons/redbattery.png b/traque-front/public/icons/redbattery.png deleted file mode 100644 index b5d9f7f..0000000 Binary files a/traque-front/public/icons/redbattery.png and /dev/null differ diff --git a/traque-front/public/icons/reddude.png b/traque-front/public/icons/reddude.png deleted file mode 100644 index 9f2d2ed..0000000 Binary files a/traque-front/public/icons/reddude.png and /dev/null differ diff --git a/traque-front/public/icons/redlocation.png b/traque-front/public/icons/redlocation.png deleted file mode 100644 index 0dcef30..0000000 Binary files a/traque-front/public/icons/redlocation.png and /dev/null differ diff --git a/traque-front/public/icons/trash.png b/traque-front/public/icons/trash.png new file mode 100644 index 0000000..0ac07e3 Binary files /dev/null and b/traque-front/public/icons/trash.png differ diff --git a/traque-app/assets/images/user/black.png b/traque-front/public/icons/user/black.png similarity index 100% rename from traque-app/assets/images/user/black.png rename to traque-front/public/icons/user/black.png diff --git a/traque-app/assets/images/user/green.png b/traque-front/public/icons/user/green.png similarity index 100% rename from traque-app/assets/images/user/green.png rename to traque-front/public/icons/user/green.png diff --git a/traque-app/assets/images/user/red.png b/traque-front/public/icons/user/red.png similarity index 100% rename from traque-app/assets/images/user/red.png rename to traque-front/public/icons/user/red.png diff --git a/traque-front/public/images/logo_traque.png b/traque-front/public/images/logo_traque.png new file mode 100644 index 0000000..8fe43be Binary files /dev/null and b/traque-front/public/images/logo_traque.png differ