diff --git a/traque-front/app/admin/layout.js b/traque-front/app/admin/layout.js index b39fe34..6c620ca 100644 --- a/traque-front/app/admin/layout.js +++ b/traque-front/app/admin/layout.js @@ -20,5 +20,5 @@ export default function AdminLayout({ children }) { - ) -} \ No newline at end of file + ); +} diff --git a/traque-front/app/admin/login/page.js b/traque-front/app/admin/login/page.js index 013d1b9..4bfb99f 100644 --- a/traque-front/app/admin/login/page.js +++ b/traque-front/app/admin/login/page.js @@ -5,8 +5,10 @@ import React from 'react' export default function AdminLoginPage() { const {login, useProtect} = useAdminConnexion(); + useProtect(); + return ( - ) + ); } diff --git a/traque-front/app/admin/page.js b/traque-front/app/admin/page.js index 9e62154..4f9fb58 100644 --- a/traque-front/app/admin/page.js +++ b/traque-front/app/admin/page.js @@ -12,7 +12,9 @@ const LiveMap = dynamic(() => import('@/components/admin/liveMap'), { ssr: false export default function AdminPage() { const { useProtect } = useAdminConnexion(); const { gameState, changeState } = useAdmin(); + useProtect(); + return (
diff --git a/traque-front/app/admin/parameters/page.js b/traque-front/app/admin/parameters/page.js index 6abfdbb..8e39b6f 100644 --- a/traque-front/app/admin/parameters/page.js +++ b/traque-front/app/admin/parameters/page.js @@ -9,7 +9,9 @@ const ZoneSelector = dynamic(() => import('@/components/admin/polygonZoneMap'), export default function AdminPage() { const { useProtect } = useAdminConnexion(); + useProtect(); + return (
@@ -18,5 +20,5 @@ export default function AdminPage() {
- ) + ); } \ No newline at end of file diff --git a/traque-front/app/admin/teams/page.js b/traque-front/app/admin/teams/page.js index a44758e..04d59b2 100644 --- a/traque-front/app/admin/teams/page.js +++ b/traque-front/app/admin/teams/page.js @@ -7,11 +7,11 @@ import useAdmin from '@/hook/useAdmin'; import React, { useState } from 'react' export default function TeamAdminPage() { - const [selectedTeamId, setSelectedTeamId] = useState(null); - const { addTeam } = useAdmin(); - const { useProtect } = useAdminConnexion(); - useProtect(); + const [selectedTeamId, setSelectedTeamId] = useState(null); + const { addTeam } = useAdmin(); + const { useProtect } = useAdminConnexion(); + useProtect(); return (
diff --git a/traque-front/components/admin/circleZoneMap.jsx b/traque-front/components/admin/circleZoneMap.jsx index c823fad..bda9760 100644 --- a/traque-front/components/admin/circleZoneMap.jsx +++ b/traque-front/components/admin/circleZoneMap.jsx @@ -15,14 +15,22 @@ const EditMode = { } function CircleDrawings({ minZone, setMinZone, maxZone, setMaxZone, editMode }) { - const { handleClick: maxClick, handleMouseMove: maxHover, center: maxCenter, radius: maxRadius } = useMapCircleDraw(minZone, setMinZone); - const { handleClick: minClick, handleMouseMove: minHover, center: minCenter, radius: minRadius } = useMapCircleDraw(maxZone, setMaxZone); + const { center: maxCenter, radius: maxRadius, handleLeftClick: maxLeftClick, handleRightClick: maxRightClick, handleMouseMove: maxHover } = useMapCircleDraw(maxZone, setMaxZone); + const { center: minCenter, radius: minRadius, handleLeftClick: minLeftClick, handleRightClick: minRightClick, handleMouseMove: minHover } = useMapCircleDraw(minZone, setMinZone); function handleLeftClick(e) { if (editMode == EditMode.MAX) { - maxClick(e); + maxLeftClick(e); } else { - minClick(e); + minLeftClick(e); + } + } + + function handleRightClick(e) { + if (editMode == EditMode.MAX) { + maxRightClick(e); + } else { + minRightClick(e); } } @@ -38,7 +46,7 @@ function CircleDrawings({ minZone, setMinZone, maxZone, setMaxZone, editMode })
{minCenter && minRadius && } {maxCenter && maxRadius && } - {}} onMouseMove={handleMouseMove} /> +
); } diff --git a/traque-front/components/admin/penaltySettings.jsx b/traque-front/components/admin/penaltySettings.jsx index e4bb135..721f7d5 100644 --- a/traque-front/components/admin/penaltySettings.jsx +++ b/traque-front/components/admin/penaltySettings.jsx @@ -33,17 +33,17 @@ export default function PenaltySettings() {

Penalties

Maximum Penalties

- setMaxPenalties(e.target.value)}> + setMaxPenalties(e.target.value)} />

Time out of the zone before a penalty

- setAllowedTimeOutOfZone(e.target.value)}> + setAllowedTimeOutOfZone(e.target.value)} />

Allowed time between position updates

- setAllowedTimeBetweenUpdates(e.target.value)}> + setAllowedTimeBetweenUpdates(e.target.value)} />
Apply
- ) + ); } diff --git a/traque-front/components/admin/placementMap.jsx b/traque-front/components/admin/placementMap.jsx index 4d7bc8e..1b52772 100644 --- a/traque-front/components/admin/placementMap.jsx +++ b/traque-front/components/admin/placementMap.jsx @@ -15,7 +15,7 @@ const positionIcon = new L.Icon({ export default function CircularAreaPicker({ area, setArea, markerPosition, ...props }) { const location = useLocation(Infinity); - const { handleClick, handleMouseMove, center, radius } = useMapCircleDraw(area, setArea); + const { center, radius, handleLeftClick, handleRightClick, handleMouseMove } = useMapCircleDraw(area, setArea); return ( @@ -24,10 +24,9 @@ export default function CircularAreaPicker({ area, setArea, markerPosition, ...p url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> {center && radius && } - {markerPosition && - } + {markerPosition && } - {}} onMouseMove={handleMouseMove} /> + ); } diff --git a/traque-front/components/admin/teamAdd.jsx b/traque-front/components/admin/teamAdd.jsx index 7a98bff..ce95408 100644 --- a/traque-front/components/admin/teamAdd.jsx +++ b/traque-front/components/admin/teamAdd.jsx @@ -1,9 +1,9 @@ -import React from 'react' +import { useState } from 'react' import { TextInput } from '../util/textInput' import { BlueButton } from '../util/button' export default function TeamAddForm({onAddTeam}) { - const [teamName, setTeamName] = React.useState(''); + const [teamName, setTeamName] = useState(''); function handleSubmit(e) { e.preventDefault(); @@ -22,5 +22,5 @@ export default function TeamAddForm({onAddTeam}) { +
- ) + ); } diff --git a/traque-front/components/admin/teamEdit.jsx b/traque-front/components/admin/teamEdit.jsx index 88896ed..a32eeb8 100644 --- a/traque-front/components/admin/teamEdit.jsx +++ b/traque-front/components/admin/teamEdit.jsx @@ -15,13 +15,9 @@ export default function TeamEdit({ selectedTeamId, setSelectedTeamId }) { const [newTeamName, setNewTeamName] = React.useState(''); const { updateTeam, getTeamName, removeTeam, getTeam, teams, gameState, startDate } = useAdmin(); const [team, setTeam] = useState({}); + const NEXT_PUBLIC_SOCKET_HOST = env("NEXT_PUBLIC_SOCKET_HOST"); - var protocol = "https://"; - if (NEXT_PUBLIC_SOCKET_HOST == "localhost") { - protocol = "http://"; - } - const SERVER_URL = protocol + NEXT_PUBLIC_SOCKET_HOST + "/back"; - console.log(SERVER_URL); + const SERVER_URL = (NEXT_PUBLIC_SOCKET_HOST == "localhost" ? "http://" : "https://") + NEXT_PUBLIC_SOCKET_HOST + "/back"; useEffect(() => { let team = getTeam(selectedTeamId); @@ -122,5 +118,5 @@ export default function TeamEdit({ selectedTeamId, setSelectedTeamId }) {
- ) + ); } diff --git a/traque-front/components/admin/teamList.jsx b/traque-front/components/admin/teamList.jsx index 5b58f6c..07312d7 100644 --- a/traque-front/components/admin/teamList.jsx +++ b/traque-front/components/admin/teamList.jsx @@ -29,20 +29,9 @@ export default function TeamList({selectedTeamId, onSelected}) { const {teams, reorderTeams} = useAdmin(); function onDragEnd(result) { - if (!result.destination) { - return; - } - - if (result.destination.index === result.source.index) { - return; - } - - const newTeams = reorder( - teams, - result.source.index, - result.destination.index - ); - + if (!result.destination) return; + if (result.destination.index === result.source.index) return; + const newTeams = reorder(teams, result.source.index, result.destination.index); reorderTeams(newTeams); } @@ -50,7 +39,7 @@ export default function TeamList({selectedTeamId, onSelected}) { {provided => ( -
    +
      {teams.map((team, i) => (
    • onSelected(team.id)}> diff --git a/traque-front/hook/useGame.jsx b/traque-front/hook/useGame.jsx index cdf7aa8..a6b3831 100644 --- a/traque-front/hook/useGame.jsx +++ b/traque-front/hook/useGame.jsx @@ -16,20 +16,5 @@ export default function useGame() { teamSocket.emit("capture", captureCode); } - return { - sendCurrentPosition, - capture, - enemyPosition: teamInfos?.enemyLocation || null, - enemyName: teamInfos?.enemyName || null, - currentPosition: teamInfos?.currentLocation || null, - startingArea: teamInfos?.startingArea || null, - captureCode: teamInfos?.captureCode || null, - name: teamInfos?.name || null, - ready: teamInfos?.ready || false, - captured: teamInfos?.captured || false, - locationSendDeadline: teamInfos?.locationSendDeadline || null, - penalties: teamInfos?.penalties || 0, - teamId, - gameState, - }; + return {...teamInfos, sendCurrentPosition, capture, teamId, gameState}; } diff --git a/traque-front/hook/useLocalStorage.jsx b/traque-front/hook/useLocalStorage.jsx index 5376f2b..148da5c 100644 --- a/traque-front/hook/useLocalStorage.jsx +++ b/traque-front/hook/useLocalStorage.jsx @@ -26,4 +26,4 @@ export default function useLocalStorage(key, initialValue) { } return [storedValue, setValue, loading]; -} \ No newline at end of file +} diff --git a/traque-front/hook/useLocation.jsx b/traque-front/hook/useLocation.jsx index bb25c3c..9e4e816 100644 --- a/traque-front/hook/useLocation.jsx +++ b/traque-front/hook/useLocation.jsx @@ -1,21 +1,23 @@ "use client"; import { useEffect, useState } from "react"; -/** - * A hook that returns the location of the user and updates it periodically - * @returns {Object} The location of the user - */ export default function useLocation(interval) { const [location, setLocation] = useState(); + useEffect(() => { function update() { - navigator.geolocation.getCurrentPosition((position) => { - setLocation([position.coords.latitude, position.coords.longitude]); - if(interval != Infinity) { - setTimeout(update, interval); - } - }, () => { }, { enableHighAccuracy: true, timeout: Infinity, maximumAge: 0 }); + navigator.geolocation.getCurrentPosition( + (position) => { + setLocation([position.coords.latitude, position.coords.longitude]); + if(interval != Infinity) { + setTimeout(update, interval); + } + }, + () => { }, + { enableHighAccuracy: true, timeout: Infinity, maximumAge: 0 } + ); } + update(); }, []); diff --git a/traque-front/hook/useMapCircleDraw.jsx b/traque-front/hook/useMapCircleDraw.jsx index fbcd9cd..7d23caa 100644 --- a/traque-front/hook/useMapCircleDraw.jsx +++ b/traque-front/hook/useMapCircleDraw.jsx @@ -12,7 +12,7 @@ export default function useMapCircleDraw(area, setArea) { setRadius(area?.radius || null); }, [area]) - function handleClick(e) { + function handleLeftClick(e) { if (!drawing) { setCenter(e.latlng); setRadius(null); @@ -23,11 +23,21 @@ export default function useMapCircleDraw(area, setArea) { } } + function handleRightClick(e) { + if (drawing) { + setDrawing(false); + setCenter(area?.center || null); + setRadius(area?.radius || null); + } else { + setArea(null); + } + } + function handleMouseMove(e) { if (drawing) { setRadius(e.latlng.distanceTo(center)); } } - return { handleClick, handleMouseMove, center, radius }; + return { center, radius, handleLeftClick, handleRightClick, handleMouseMove }; } diff --git a/traque-front/hook/useMapPolygonDraw.jsx b/traque-front/hook/useMapPolygonDraw.jsx index 1b78077..be168b7 100644 --- a/traque-front/hook/useMapPolygonDraw.jsx +++ b/traque-front/hook/useMapPolygonDraw.jsx @@ -1,5 +1,5 @@ "use client"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useMap } from "react-leaflet"; export default function useMapPolygonDraw(polygons, addPolygon, removePolygon) { @@ -9,6 +9,11 @@ export default function useMapPolygonDraw(polygons, addPolygon, removePolygon) { const [currentPolygon, setCurrentPolygon] = useState([]); const [highlightNodes, setHighlightNodes] = useState([]); + useEffect(() => { + setCurrentPolygon([]); + setHighlightNodes([]); + }, [polygons]) + function latlngEqual(latlng1, latlng2, epsilon = 1e-9) { return Math.abs(latlng1.lat - latlng2.lat) < epsilon && Math.abs(latlng1.lng - latlng2.lng) < epsilon; } diff --git a/traque-front/hook/usePasswordProtect.jsx b/traque-front/hook/usePasswordProtect.jsx index 7094812..6507e6f 100644 --- a/traque-front/hook/usePasswordProtect.jsx +++ b/traque-front/hook/usePasswordProtect.jsx @@ -4,6 +4,7 @@ import { useEffect } from "react"; export default function usePasswordProtect(loginPath, redirectPath, loading, loggedIn) { const path = usePathname(); + useEffect(() => { if (!loggedIn && !loading && path !== loginPath) { redirect(loginPath); diff --git a/traque-front/hook/useSocketAuth.jsx b/traque-front/hook/useSocketAuth.jsx index d42919a..92a0d2e 100644 --- a/traque-front/hook/useSocketAuth.jsx +++ b/traque-front/hook/useSocketAuth.jsx @@ -49,5 +49,5 @@ export default function useSocketAuth(socket, passwordName) { }, [waitingForResponse, savedPasswordLoading, savedPassword]); - return {login,logout,password: savedPassword, loggedIn, loading}; + return {login, logout, password: savedPassword, loggedIn, loading}; } diff --git a/traque-front/hook/useSocketListener.jsx b/traque-front/hook/useSocketListener.jsx index 00b52e5..7256a62 100644 --- a/traque-front/hook/useSocketListener.jsx +++ b/traque-front/hook/useSocketListener.jsx @@ -4,8 +4,6 @@ import { useEffect } from "react"; export default function useSocketListener(socket, event, callback) { useEffect(() => { socket.on(event,callback); - return () => { - socket.off(event, callback); - } + return () => socket.off(event, callback); }, []); }