Merge remote-tracking branch 'refs/remotes/origin/main'

This commit is contained in:
Alexis Leboeuf
2026-01-08 16:53:46 +01:00
5 changed files with 67 additions and 35 deletions

View File

@@ -12,7 +12,7 @@ export class Ligne{
export class User{ export class User{
id!: number; id!: number;
keycloakId!: String; keycloakId!: string;
nom!: string; nom!: string;
prenom!:string; prenom!:string;
email!: string; email!: string;
@@ -32,6 +32,16 @@ export class Admin extends User{
this.email = ""; //TODO this.email = ""; //TODO
} }
toDTO():AdminDTO{
const dto:AdminDTO = {
id: this.id,
id_keycloak: this.keycloakId,
name: this.nom,
prenom: this.prenom,
};
return dto;
}
} }
export class Athlete extends User{ export class Athlete extends User{
@@ -53,6 +63,21 @@ export class Athlete extends User{
this.sessionsID = dto?.sessionIds ?? []; this.sessionsID = dto?.sessionIds ?? [];
this.sessions = []; this.sessions = [];
} }
toDTO():AthleteDTO{
const dto:AthleteDTO = {
id: this.id,
id_keycloak: this.keycloakId,
name: this.nom,
prenom: this.prenom,
categorie: "",
niveau: "",
groupes: this.groupes,
sessionIds: this.sessionsID,
};
return dto;
}
} }
export class Coach extends User{ export class Coach extends User{
@@ -73,6 +98,19 @@ export class Coach extends User{
this.sessionsID = dto?.sessionIds ?? []; this.sessionsID = dto?.sessionIds ?? [];
this.sessions = []; this.sessions = [];
} }
toDTO():CoachDTO{
const dto:CoachDTO = {
id: this.id,
id_keycloak: this.keycloakId,
name: this.nom,
prenom: this.prenom,
sessionIds: this.sessionsID,
};
return dto;
}
} }
export class Session{ export class Session{

View File

@@ -1,5 +1,5 @@
import { useEffect, useState } from "react" import { useEffect, useState } from "react"
import { getUserTest, Session, User } from "../classes" import { Athlete, Coach, Session} from "../classes"
import { useLocalData } from "../context/useLocalData" import { useLocalData } from "../context/useLocalData"
import './style/edt.css'; import './style/edt.css';
import {updateSessionsOfUserAPI } from "../requetes"; import {updateSessionsOfUserAPI } from "../requetes";
@@ -41,11 +41,13 @@ export const EDT =() =>{
var maxDate = getNextDay(date,6) var maxDate = getNextDay(date,6)
var newWeek: Session[] = [] var newWeek: Session[] = []
user.sessions.forEach(session => { if(user instanceof Athlete || user instanceof Coach){
if((session.creneau >= date && session.creneau <= maxDate && !session.isRecurrent) || (session.isRecurrent && session.creneau<maxDate)){ user.sessions.forEach(session => {
newWeek.push(session); if((session.creneau >= date && session.creneau <= maxDate && !session.isRecurrent) || (session.isRecurrent && session.creneau<maxDate)){
} newWeek.push(session);
}); }
});
}
setSessions(newWeek); setSessions(newWeek);
} }

View File

@@ -4,6 +4,7 @@ import { Athlete, User } from '../classes';
import { useLocalData } from '../context/useLocalData'; import { useLocalData } from '../context/useLocalData';
import { postAthlete } from '../requetes'; import { postAthlete } from '../requetes';
import { clearAuthToken, setAuthToken } from '../api'; import { clearAuthToken, setAuthToken } from '../api';
import { AthleteDTO } from '../classesDTO';
export const Login =() =>{ export const Login =() =>{
const {user,setUser} = useLocalData() const {user,setUser} = useLocalData()
@@ -11,12 +12,23 @@ export const Login =() =>{
useEffect(() => { useEffect(() => {
const syncAndLoadUser = async () => { const syncAndLoadUser = async () => {
const newAthlete:Athlete = new Athlete() if (keycloak.authenticated && keycloak.token && keycloak.tokenParsed) {
try {
const athlete:Athlete = await postAthlete(newAthlete) const newAthlete: Athlete = new Athlete();
newAthlete.keycloakId = keycloak.tokenParsed.sub || "";
setAuthToken(keycloak.token); newAthlete.email = keycloak.tokenParsed.email || "";
setUser(athlete); newAthlete.nom = keycloak.tokenParsed.family_name || "";
newAthlete.prenom = keycloak.tokenParsed.given_name || "";
const newAthleteDTO: AthleteDTO =newAthlete.toDTO();
setAuthToken(keycloak.token);
const athlete: Athlete = await postAthlete(newAthlete);
setUser(athlete);
} catch (error) {
console.error("Error :", error);
}
}
};
/*postAthlete /*postAthlete
if (keycloak.authenticated && keycloak.token) { if (keycloak.authenticated && keycloak.token) {
const tokenParsed = keycloak.tokenParsed; const tokenParsed = keycloak.tokenParsed;
@@ -44,7 +56,7 @@ export const Login =() =>{
console.error("Sync fetch failed:", error); console.error("Sync fetch failed:", error);
} }
}*/ }*/
};
syncAndLoadUser(); syncAndLoadUser();
}, [keycloak.authenticated, keycloak.token, setUser]); }, [keycloak.authenticated, keycloak.token, setUser]);

View File

@@ -1,20 +0,0 @@
import React, { useState } from "react";
import { getUserTest, User, Session } from "../classes";
import RessourcePanel from "./ressourcePanel";
import { LocalDataContext } from "../context/LocalDataContext";
export default function TestApp() {
const initialUser = getUserTest();
initialUser.role = "Athlete"; // Change role here for testing
const [user, setUser] = useState<User>(initialUser);
const [sessions, setSessions] = useState<Session[]>(initialUser.sessions || []);
const [users, setUsers] = useState<User[]>([initialUser]);
return (
<LocalDataContext.Provider value={{ user, setUser, sessions, setSessions, users, setUsers }}>
<h1>Test Utilisateur</h1>
<div>Nom: {String(user.nom)}</div>
<RessourcePanel />
</LocalDataContext.Provider>
);
}

View File

@@ -128,7 +128,7 @@ export async function postActivityAPI(session: Session, activity: Activite){
export async function postAthlete(athlete: Athlete):Promise<Athlete>{ export async function postAthlete(athlete: Athlete):Promise<Athlete>{
try { try {
const response = await api.post<Athlete>("/athlete/create/",athlete); const response = await api.post<Athlete>("/athlete/create/",athlete.toDTO);
console.log(response); console.log(response);
return response.data; return response.data;
} catch (error) { } catch (error) {