mirror of
https://git.rezel.net/LudoTech/traque.git
synced 2026-02-09 10:20:16 +01:00
admin interface basic functionalities
This commit is contained in:
12
traque-front/app/admin/layout.js
Normal file
12
traque-front/app/admin/layout.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import { AdminConnexionProvider } from "@/context/adminConnexionContext";
|
||||
import { AdminProvider } from "@/context/adminContext";
|
||||
|
||||
export default function AdminLayout({ children}) {
|
||||
return (
|
||||
<AdminConnexionProvider>
|
||||
<AdminProvider>
|
||||
{children}
|
||||
</AdminProvider>
|
||||
</AdminConnexionProvider>
|
||||
)
|
||||
}
|
||||
17
traque-front/app/admin/login/page.js
Normal file
17
traque-front/app/admin/login/page.js
Normal file
@@ -0,0 +1,17 @@
|
||||
"use client";
|
||||
import LoginForm from '@/components/team/loginForm'
|
||||
import { useAdminConnexion } from '@/context/adminConnexionContext';
|
||||
import { redirect } from 'next/navigation';
|
||||
import React, { useEffect } from 'react'
|
||||
|
||||
export default function AdminLoginPage() {
|
||||
const { login, loggedIn } = useAdminConnexion();
|
||||
useEffect(() => {
|
||||
if (loggedIn) {
|
||||
redirect("/admin");
|
||||
}
|
||||
}, [loggedIn]);
|
||||
return (
|
||||
<LoginForm title="Admin login" placeholder="Admin password" buttonText={"Login"} onSubmit={login} />
|
||||
)
|
||||
}
|
||||
36
traque-front/app/admin/page.js
Normal file
36
traque-front/app/admin/page.js
Normal file
@@ -0,0 +1,36 @@
|
||||
"use client";
|
||||
import TeamAddForm from '@/components/admin/teamAdd';
|
||||
import TeamEdit from '@/components/admin/teamEdit';
|
||||
import TeamList from '@/components/admin/teamList';
|
||||
import { useAdminConnexion } from '@/context/adminConnexionContext';
|
||||
import useAdmin from '@/hook/useAdmin';
|
||||
import { redirect } from 'next/navigation';
|
||||
import React, { useEffect, useState } from 'react'
|
||||
|
||||
|
||||
export default function Admin() {
|
||||
const [selectedTeamId, setSelectedTeamId] = useState(null);
|
||||
const { loggedIn } = useAdminConnexion();
|
||||
const { addTeam } = useAdmin();
|
||||
|
||||
useEffect(() => {
|
||||
if (!loggedIn) {
|
||||
redirect("/admin/login");
|
||||
}
|
||||
}, [loggedIn]);
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<div className='h-full p-10 flex flex-row justify-between'>
|
||||
<div className='w-5/12 h-full p-4 shadow-md rounded outline'>
|
||||
<h2 className='text-2xl text-center'>Team list</h2>
|
||||
<TeamAddForm onAddTeam={addTeam}/>
|
||||
<TeamList selectedTeamId={selectedTeamId} onSelected={setSelectedTeamId}/>
|
||||
</div>
|
||||
<div className='w-5/12 h-full p-4 shadow-md rounded outline'>
|
||||
<TeamEdit selectedTeamId={selectedTeamId} setSelectedTeamId={setSelectedTeamId}/>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import SocketProvider from "@/context/socketContext";
|
||||
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
|
||||
@@ -10,7 +11,9 @@ export const metadata = {
|
||||
export default function RootLayout({ children }) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body className={inter.className + " h-screen"}>{children}</body>
|
||||
<SocketProvider>
|
||||
<body className={inter.className + " h-screen"}>{children}</body>
|
||||
</SocketProvider>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
"use client"
|
||||
import LoginForm from "@/components/team/loginForm";
|
||||
|
||||
export default function Home() {
|
||||
function login(teamId) {
|
||||
console.log(teamId);
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
<LoginForm />
|
||||
<LoginForm title={"Team login"} placeholder={"team ID"} buttonText={"Login"} onSubmit={login}/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
"use client";
|
||||
import Button from '@/components/util/button';
|
||||
import dynamic from 'next/dynamic';
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import React, { useEffect } from 'react'
|
||||
import useGame from '../../hook/useGame';
|
||||
|
||||
//Load the map without SSR
|
||||
const LiveMap = dynamic(() => import('@/components/team/map'), {
|
||||
@@ -9,27 +10,13 @@ const LiveMap = dynamic(() => import('@/components/team/map'), {
|
||||
});
|
||||
|
||||
export default function Track() {
|
||||
const [currentPosition, setCurrentPosition] = useState([0,0]);
|
||||
const [enemyPosition, setEnemyPosition] = useState([0,0]);
|
||||
|
||||
useEffect(() => {
|
||||
const t = setTimeout(() => {
|
||||
setEnemyPosition([currentPosition[0] + Math.random() / 100, currentPosition[1] + Math.random() / 100]);
|
||||
}, 1000);
|
||||
return () => clearInterval(t);
|
||||
}, [currentPosition]);
|
||||
|
||||
useEffect(() => {
|
||||
navigator.geolocation.watchPosition((position) => {
|
||||
setCurrentPosition([position.coords.latitude, position.coords.longitude]);
|
||||
});
|
||||
}, []);
|
||||
const { currentPosition, enemyPosition, updateCurrentPosition, sendCurrentPosition } = useGame();
|
||||
|
||||
|
||||
return (
|
||||
<div className='h-full flex flex-col justify-between'>
|
||||
<LiveMap currentPosition={currentPosition} enemyPosition={enemyPosition} className="h-4/5" />
|
||||
<Button>Update position</Button>
|
||||
<Button onClick={sendCurrentPosition}>Update position</Button>
|
||||
<div className='shadow-lg m-5 p-2 flex flex-col text-center mx-auto w-4/5 rounded'>
|
||||
<p className='text-xl text-black'>30min</p>
|
||||
<p className='text-gray-700'> before penalty</p>
|
||||
|
||||
Reference in New Issue
Block a user