- 🚫 Ce formulaire n’est pas encore disponible.
+ 🚫 Ce formulaire n'est pas encore disponible.
@@ -49,7 +49,7 @@ export const ParrainageStudent = () => {
*/}
- 🚫 Ce formulaire n’est pas encore disponible.
+ 🚫 Ce formulaire n'est pas encore disponible.
diff --git a/frontend/src/components/Plannings/planningSection.tsx b/frontend/src/components/Plannings/planningSection.tsx
index 87dab9c..9c9f725 100644
--- a/frontend/src/components/Plannings/planningSection.tsx
+++ b/frontend/src/components/Plannings/planningSection.tsx
@@ -99,7 +99,7 @@ export const PlanningSection = () => {
>
) : (
- 🚫 Ce planning n’est pas encore disponible.
+ 🚫 Ce planning n'est pas encore disponible.
)}
diff --git a/frontend/src/components/WEI_SDI_Food/sdiSection.tsx b/frontend/src/components/WEI_SDI_Food/sdiSection.tsx
index 977e4b9..6d1d0df 100644
--- a/frontend/src/components/WEI_SDI_Food/sdiSection.tsx
+++ b/frontend/src/components/WEI_SDI_Food/sdiSection.tsx
@@ -30,14 +30,14 @@ export const SdiSection = () => {
🎉 Participe à la Soirée d'Intégration (SDI) !
- Un événement incroyable t’attend… Inscris-toi dès maintenant pour ne rien rater de cette Soirée d’Intégration 2025 !
+ Un événement incroyable t'attend… Inscris-toi dès maintenant pour ne rien rater de cette Soirée d'Intégration 2025 !
{!isSDIOpen ? (
- 🚫 La billetterie de la Soirée d'intégration(SDI) n’est pas encore disponible.
+ 🚫 La billetterie de la Soirée d'intégration(SDI) n'est pas encore disponible.
Reste connecté, elle ouvrira bientôt !
diff --git a/frontend/src/components/challenge/challengeList.tsx b/frontend/src/components/challenge/challengeList.tsx
index 9c5a35d..1f99736 100644
--- a/frontend/src/components/challenge/challengeList.tsx
+++ b/frontend/src/components/challenge/challengeList.tsx
@@ -16,25 +16,25 @@ export const UserChallengeList = () => {
const [isChallOpen, setIsChallOpen] = useState(false);
const [loading, setLoading] = useState(true);
- useEffect(() => {
- const init = async () => {
- try {
- await fetchInitialData();
- const status = await checkChallengeStatus();
- setIsChallOpen(status);
- } catch (error) {
- console.error("Erreur lors de la récupération des données :", error);
- await Swal.fire({
- icon: "error",
- title: "Oups...",
- text: "Une erreur est survenue lors de la récupération des données.",
- });
- } finally {
- setLoading(false);
- }
- };
- init();
-}, []);
+ useEffect(() => {
+ const init = async () => {
+ try {
+ await fetchInitialData();
+ const status = await checkChallengeStatus();
+ setIsChallOpen(status);
+ } catch (error) {
+ console.error("Erreur lors de la récupération des données :", error);
+ await Swal.fire({
+ icon: "error",
+ title: "Oups...",
+ text: "Une erreur est survenue lors de la récupération des données.",
+ });
+ } finally {
+ setLoading(false);
+ }
+ };
+ init();
+ }, []);
const fetchInitialData = async () => {
await Promise.all([fetchChallenges(), fetchFactions()]);
@@ -44,7 +44,7 @@ export const UserChallengeList = () => {
const fetchChallenges = async () => {
try {
const challenges = await getAllChallenges();
- const challengesFiltered = challenges.filter((c : Challenge) => c.category != "Free")
+ const challengesFiltered = challenges.filter((c: Challenge) => c.category != "Free")
setAvailableChallenges(challengesFiltered);
} catch (err) {
console.error("Erreur lors du chargement des challenges", err);
@@ -122,7 +122,7 @@ export const UserChallengeList = () => {
{loading ? (
Chargement en cours...
) : !isChallOpen ? (
-
+
🚫 Les challenges ne sont pas encore ouverts.
) : availableChallenges.length === 0 ? (
diff --git a/frontend/src/components/footer.tsx b/frontend/src/components/footer.tsx
new file mode 100644
index 0000000..9ef9bfd
--- /dev/null
+++ b/frontend/src/components/footer.tsx
@@ -0,0 +1,19 @@
+export const Footer = () => {
+ const currentYear = new Date().getFullYear();
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/components/home/infosSection.tsx b/frontend/src/components/home/infosSection.tsx
index 1688e5c..4e23515 100644
--- a/frontend/src/components/home/infosSection.tsx
+++ b/frontend/src/components/home/infosSection.tsx
@@ -8,23 +8,22 @@ export const Infos = () => {
return (
{/* Hero Carousel */}
-
+
{["Home1", "Home2", "Home3", "Home4"].map((img, i) => (
-
+
{/* Overlay sombre */}
@@ -69,7 +68,7 @@ export const Infos = () => {
La petite histoire
- Chaque année, deux factions composées d'une multitude d'équipes s'affrontent. Le thème de cette année : Vilains vs Justiciers .
+ Chaque année, deux factions composées d'une multitude d'équipes s'affrontent. Le thème de cette année : Divinités vs Monstres .
diff --git a/frontend/src/components/legals/legalsSection.tsx b/frontend/src/components/legals/legalsSection.tsx
new file mode 100644
index 0000000..c8c03df
--- /dev/null
+++ b/frontend/src/components/legals/legalsSection.tsx
@@ -0,0 +1,98 @@
+import { Link } from "react-router-dom";
+
+export const LegalsSection = () => {
+ return (
+
+
+
+
Mentions Légales
+
Informations légales et conformité RGPD
+
+
+
+
+ Editeur du Site
+
+
+
BDE UTT
+
Association loi 1901
+
N° RNA : W103000735
+
N° SIRET : 44838667200019
+
N° SIREN : 448386672
+
+
+
+
+ Le projet Intégration UTT est porté par l'association BDE UTT.
+
+
+
+
+ Propriétaire et Hébergeur
+
+
+
UTT Net Group
+
Association loi 1901
+
N° RNA : W103000699
+
N° RCS : 500164249
+
+
+
+
+
+
+ Protection des Données Personnelles
+
+ Le site collecte et traite des données personnelles conformément a la loi Informatique et Libertés du 6 janvier 1978 modifiée et au RGPD EU-2016/679.
+
+
+ Pour plus d'informations, consultez notre{" "}
+
+ Politique de confidentialite
+
+ .
+
+
+
+
+ Droits d'Auteur
+
+ L'ensemble du contenu de ce site est protegé par le droit d'auteur. Sauf mention contraire, les contenus relatifs au projet Integration UTT sont diffusés sous la responsabilité du BDE UTT. Toute reproduction, distribution ou modification est interdite sans autorisation écrite préalable.
+
+
+
+
+ Credits
+
+ Ce site est developpé pour le projet Integration UTT du BDE UTT, avec le support technique de l'association UTT Net Group.
+
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/frontend/src/components/navbar.tsx b/frontend/src/components/navbar.tsx
index 0b4d9c3..2693945 100644
--- a/frontend/src/components/navbar.tsx
+++ b/frontend/src/components/navbar.tsx
@@ -12,6 +12,10 @@ interface NavItem {
to: string;
icon?: React.ComponentType>;
rolesAllowed?: string[]; // ["Admin", "Respo CE", ...]
+ public?: boolean;
+ showWhen?: "always" | "auth" | "guest";
+ kind?: "link" | "action";
+ onClick?: () => void;
children?: NavItem[]; // pour dropdown
}
@@ -19,85 +23,106 @@ export const Navbar = () => {
const { pathname } = useLocation();
const token = getToken();
const [menuOpen, setMenuOpen] = useState(false);
+ const isAuthenticated = Boolean(token);
+ const { userPermission, userRoles = [] } = token ? decodeToken(token) : { userPermission: undefined, userRoles: [] };
+ const roles = [userPermission, ...userRoles.map(r => r.roleName)].filter(Boolean) as string[];
+
+ const handleLogout = () => {
+ localStorage.removeItem("authToken");
+ window.location.href = "/";
+ };
useEffect(() => {
setMenuOpen(false);
}, [pathname]);
- if (!token) return null;
- const { userPermission, userRoles = [] } = decodeToken(token);
- const roles = [userPermission, ...userRoles.map(r => r.roleName)];
-
const navItems: NavItem[] = [
- { label: "Home", to: "/Home", icon: HomeIcon },
- { label: "Plannings", to: "/Plannings" },
- { label: "Parrainage", to: "/Parrainage" },
- { label: "Challenges", to: "/Challenges" },
- { label: "Mes Actus", to: "/News" },
- {
- label: "Permanences",
- to: "#",
- children: [
- { label: "Listes des permanences", to: "/PermanencesList", rolesAllowed: ["Admin", "Student"] },
- { label: "Mes permanences", to: "/MyPermanences", rolesAllowed: ["Admin", "Student"] },
- { label: "Faire l'appel", to: "/PermanencesAppeal", rolesAllowed: ["Admin", "Student"] },
- ],
- },
- {
- label: "Events",
- to: "#",
- children: [
- { label: "Shotgun", to: "/Shotgun", rolesAllowed: ["Admin", "Student"] },
- { label: "WEI", to: "/Wei" },
- { label: "SDI", to: "/SDI" },
- { label: "Repas", to: "/Food" },
- { label: "Defis Commissions", to: "/Games", rolesAllowed: ["Admin", "Student"] },
- ],
- },
- { label: "Mon compte", to: "/Profil", icon: UsersIcon },
- {
- label: "Admin",
- to: "#",
- icon: CogIcon,
- children: [
- { label: "Users", to: "/admin/users", rolesAllowed: ["Admin"] },
- { label: "Roles", to: "/admin/roles", rolesAllowed: ["Admin"] },
- { label: "Teams", to: "/admin/teams", rolesAllowed: ["Admin", "Respo CE"] },
- { label: "Factions", to: "/admin/factions", rolesAllowed: ["Admin", "Respo CE"] },
- { label: "Events", to: "/admin/events", rolesAllowed: ["Admin"] },
- { label: "Permanences", to: "/admin/permanences", rolesAllowed: ["Admin", "Respo CE"] },
- { label: "Challenge", to: "/admin/challenge", rolesAllowed: ["Admin", "Arbitre"] },
- { label: "Export / Import", to: "/admin/export-import", rolesAllowed: ["Admin"] },
- { label: "Email", to: "/admin/email", rolesAllowed: ["Admin"] },
- { label: "News", to: "/admin/news", rolesAllowed: ["Admin", "Communication"] },
- { label: "Tentes", to: "/admin/tent", rolesAllowed: ["Admin"] },
- { label: "Bus", to: "/admin/bus", rolesAllowed: ["Admin"] },
- { label: "Games", to: "/admin/games", rolesAllowed: ["Admin"] },
- ],
- },
-
-];
+ { label: "Home", to: "/Home", icon: HomeIcon },
+ { label: "Plannings", to: "/Plannings" },
+ { label: "Parrainage", to: "/Parrainage" },
+ { label: "Challenges", to: "/Challenges" },
+ { label: "Mes Actus", to: "/News" },
+ {
+ label: "Permanences",
+ to: "#",
+ children: [
+ { label: "Listes des permanences", to: "/PermanencesList", rolesAllowed: ["Admin", "Student"] },
+ { label: "Mes permanences", to: "/MyPermanences", rolesAllowed: ["Admin", "Student"] },
+ { label: "Faire l'appel", to: "/PermanencesAppeal", rolesAllowed: ["Admin", "Student"] },
+ ],
+ },
+ {
+ label: "Events",
+ to: "#",
+ children: [
+ { label: "Shotgun", to: "/Shotgun", rolesAllowed: ["Admin", "Student"] },
+ { label: "WEI", to: "/Wei" },
+ { label: "SDI", to: "/SDI" },
+ { label: "Repas", to: "/Food" },
+ { label: "Defis Commissions", to: "/Games", rolesAllowed: ["Admin", "Student"] },
+ ],
+ },
+ { label: "Mon compte", to: "/Profil", icon: UsersIcon },
+ {
+ label: "Admin",
+ to: "#",
+ icon: CogIcon,
+ children: [
+ { label: "Users", to: "/admin/users", rolesAllowed: ["Admin"] },
+ { label: "Roles", to: "/admin/roles", rolesAllowed: ["Admin"] },
+ { label: "Teams", to: "/admin/teams", rolesAllowed: ["Admin", "Respo CE"] },
+ { label: "Factions", to: "/admin/factions", rolesAllowed: ["Admin", "Respo CE"] },
+ { label: "Events", to: "/admin/events", rolesAllowed: ["Admin"] },
+ { label: "Permanences", to: "/admin/permanences", rolesAllowed: ["Admin", "Respo CE"] },
+ { label: "Challenge", to: "/admin/challenge", rolesAllowed: ["Admin", "Arbitre"] },
+ { label: "Export / Import", to: "/admin/export-import", rolesAllowed: ["Admin"] },
+ { label: "Email", to: "/admin/email", rolesAllowed: ["Admin"] },
+ { label: "News", to: "/admin/news", rolesAllowed: ["Admin", "Communication"] },
+ { label: "Tentes", to: "/admin/tent", rolesAllowed: ["Admin"] },
+ { label: "Bus", to: "/admin/bus", rolesAllowed: ["Admin"] },
+ { label: "Games", to: "/admin/games", rolesAllowed: ["Admin"] },
+ ],
+ },
+ {
+ label: "Déconnexion",
+ to: "/",
+ kind: "action",
+ showWhen: "auth",
+ onClick: handleLogout,
+ },
+ {
+ label: "Se connecter",
+ to: "/",
+ public: true,
+ showWhen: "guest",
+ },
+ ];
- // helper d’autorisation
- const isAllowed = (item: NavItem): boolean => {
- // Si l'item a une restriction directe
- if (item.rolesAllowed) {
- return item.rolesAllowed.some(r => roles.includes(r));
- }
- // Si l'item a des enfants, on vérifie au moins un enfant
- if (item.children && item.children.length > 0) {
- return item.children.some(child => isAllowed(child));
- }
+ const canShowItem = (item: NavItem): boolean => {
+ if (item.showWhen === "auth") return isAuthenticated;
+ if (item.showWhen === "guest") return !isAuthenticated;
- // Sinon accessible par défaut
- return true;
-};
+ if (!isAuthenticated) {
+ if (item.public) return true;
- const handleLogout = () => {
- localStorage.removeItem("authToken");
- window.location.href = "/";
+ if (item.children && item.children.length > 0) {
+ return item.children.some(child => canShowItem(child));
+ }
+
+ return false;
+ }
+
+ if (item.rolesAllowed) {
+ return item.rolesAllowed.some(r => roles.includes(r));
+ }
+
+ if (item.children && item.children.length > 0) {
+ return item.children.some(child => canShowItem(child));
+ }
+
+ return true;
};
return (
@@ -124,24 +149,18 @@ export const Navbar = () => {
{/* Menu desktop */}
{navItems.map(item =>
- isAllowed(item) ? (
+ canShowItem(item) ? (
{item.children ? (
-
+
+ ) : item.kind === "action" ? (
+
) : (
)}
) : null
)}
-
-
- Déconnexion
-
-
@@ -155,24 +174,20 @@ export const Navbar = () => {
className="lg:hidden bg-blue-700 overflow-hidden"
>
{navItems.map(item =>
- isAllowed(item) ? (
+ canShowItem(item) ? (
{!item.children ? (
-
+ item.kind === "action" ? (
+
+ ) : (
+
+ )
) : (
-
+
)}
) : null
)}
-
-
- Déconnexion
-
-
)}
@@ -180,6 +195,29 @@ export const Navbar = () => {
);
};
+const NavActionItem = ({
+ item,
+ mobile = false,
+}: {
+ item: NavItem;
+ mobile?: boolean;
+}) => {
+ const base = mobile ? "block py-2 px-4 text-left w-full" : "inline-flex items-center py-2";
+
+ return (
+
+ {item.icon && (
+
+ )}
+ {item.label}
+
+ );
+};
+
// Composant MenuItem
const MenuItem = ({
item,
@@ -207,26 +245,19 @@ const MenuItem = ({
);
};
-// Composant Dropdown (desktop & mobile)
// Composant Dropdown (desktop & mobile)
const Dropdown = ({
item,
mobile = false,
+ canShowItem,
}: {
item: NavItem;
mobile?: boolean;
+ canShowItem: (item: NavItem) => boolean;
}) => {
const [open, setOpen] = useState(false);
const trigger = mobile ? "p-4" : "py-2 cursor-pointer";
- // helper pour roles
- const token = getToken();
- const { userPermission, userRoles = [] } = token ? decodeToken(token) : {};
- const roles = [userPermission, ...(userRoles?.map((r: any) => r.roleName) || [])];
-
- const isAllowed = (child: NavItem) =>
- !child.rolesAllowed || child.rolesAllowed.some(r => roles.includes(r));
-
return (
{item.children!
- .filter(child => isAllowed(child)) // ✅ filtre selon les rôles
+ .filter(child => canShowItem(child))
.map(child => (
{
+ return (
+
+
+
+
Politique de Confidentialité
+
Vos données personnelles et votre vie privée
+
+
+
+
+ Vie Privée et Données à Caractère Personnel
+
+ A l'Université de Technologie de Troyes et au sein des associations BDE UTT et UTT Net Group, nous respectons votre vie privée. Les données collectées et utilisées par la plateforme Integration UTT sont nécessaires pour la gestion des membres, des inscriptions aux évènements et des services propoés pendant l'intégration.
+
+
+
+
+ Données Personnelles Collectées
+
+ Les données suivantes sont effectivement stockées et traitées par la plateforme Intégration UTT.
+
+
+ Identité: nom, prenom
+ Coordonnées: adresse email UTT, contact saisi dans le profil (optionnel)
+ Données de compte: mot de passe de connexion chiffré, date de création
+ Informations profil: branche/niveau suivie à l'UTT, majorité
+ Liaison externe optionnelle: identifiant Discord en cas de connexion Discord (optionnel)
+ Organisation intégration: éuipe, faction, rôles et préférences de rôles/commissions (optionnel, pour les organisateurs uniquement)
+ Participation aux services: inscriptions permanences, attribution bus, binôme tente, validations de challenges
+
+
+
+
+ Comment Ces Informations Sont-Elles Utilisées ?
+
+ Les données à caractère personnel sont des informations qui permettent sous quelque forme que ce soit, directement ou indirectement, l'identification des personnes physiques auxquelles elles s'appliquent.
+
+ Ces informations sont utilisées pour :
+
+ Permettre l'authentification (mot de passe ou CAS), la gestion de session et la sécurisation des accès
+ Gérer les comptes utilisateurs, les droits d'accès et les rôles d'organisation
+ Permettre les fonctionnalités du site: profil, affectations d'equipes/factions, permanences, bus, tentes, challenges et évènements
+ Afficher certaines informations aux organisateurs pour la coordination opérationnelle (ex: contact, équipe, rôle)
+ Lier un compte Discord lorsque l'utilisateur active cette option
+ Executer des opérations d'administration (support, import/export, modération et gestion interne)
+
+
+
+
+ Durée de Conservation des Données
+
+ Les données personnelles sont conservées pendant un (1) an maximum, puis supprimées.
+
+ Des données anonymisées peuvent être conservées à des fins statistiques et d'amélioration du service, mais ne permettent pas l'identification des individus.
+
+ Les cookies de session sont détruits à la déconnexion ou à leur expiration.
+
+
+
+ Vos Droits sur Vos Données
+ Conformément à la réglementation sur les données à caractère personnel, vous disposez des droits suivants :
+
+ Droit d'accès : obtenir une copie de vos données
+ Droit de rectification : corriger des données inexactes vous concernant
+ Droit à l'effacement : demander la suppression de vos données
+ Droit d'opposition : vous opposer au traitement de vos données
+ Droit à la portabilité : récupérer vos données dans un format structuré
+
+
+
+
+ Comment Exercer Vos Droits ?
+ Si vous avez des questions ou que vous souhaitez exercer vos droits (accès, rectification, suppression), vous pouvez :
+
+
+ Envoyer un courriel à {" "}
+
+ integration@utt.fr
+
+
+
+ Contacter le délégué à la protection des données :{" "}
+
+ ung+dpo@utt.fr
+
+
+
+ Par courrier : UTT Net Group, 12 rue Marie Curie, CS 42060, 10004 TROYES CEDEX
+
+
+
+ Si vous estimez, après nous avoir contacté, que vos droits ne sont pas respectés, vous pouvez adresser une réclamation en ligne à la CNIL ou par voie postale.
+
+
+
+
+ Responsable du Traitement
+
+ Le responsable du traitement des données pour la plateforme Intégration UTT est Arthur Dodin , Président de l'association UTT Net Group.
+
+
+ L'équipe technique et les administrateurs du site pourront accéder aux données dans le cadre de la gestion de la plateforme et du support technique.
+
+
+
+
+ Sécurité des Données
+
+ Nous mettons en œuvre toutes les mesures techniques et organisationnelles appropriées afin de garantir un niveau de sécurité adapté au risque, conformément aux exigences du RGPD.
+
+ Ces données ne seront en aucun cas échangées, distribuées ou vendues à un tiers.
+
+
+
+ Cookies
+
+ Nous utilisons des cookies afin d'obtenir des statistiques sur notre site web. Ces informations ne seront en aucun cas vendues, échangées ou données. Ces cookies sont anonymisés.
+
+
+ Afin d'assurer le fonctionnement du service à l'utilisateur authentifié, des cookies de session sont inscrits sur le navigateur lors de l'authentification sur le site. Ceux-ci ont pour seule fonction d'assurer la persistance de la session authentifiée de l'utilisateur. Ils sont détruits lors de la déconnexion ou à leur expiration.
+
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/frontend/src/components/profil/profilForm.tsx b/frontend/src/components/profil/profilForm.tsx
index 55eb0ef..b22662a 100644
--- a/frontend/src/components/profil/profilForm.tsx
+++ b/frontend/src/components/profil/profilForm.tsx
@@ -20,7 +20,7 @@ const branchOptions = [
{ value: "SN_APPR", label: "Systeme Numérique en Apprentissage" },
{ value: "Branch", label: "Branche" },
{ value: "MM", label: "Mécanique et Matériaux" },
- { value : "Master", label: "Master"},
+ { value: "Master", label: "Master" },
{ value: "RI", label: "Ressources International" },
];
@@ -46,7 +46,7 @@ export const ProfilForm = () => {
const handleSubmit = async () => {
setLoading(true);
- const response = await updateCurrentUser({ branch : branch, contact : contact });
+ const response = await updateCurrentUser({ branch: branch, contact: contact });
alert(response.message);
setLoading(false);
};
@@ -92,33 +92,37 @@ export const ProfilForm = () => {
isClearable
/>
-
-
Contact
-
setContact(e.target.value)} />
+
+ {user.permission === "Student" || user.permission === "Admin" ? (
+ Contact - Comment tes nouveaux pourront te contacter !
+ ) : (
+ Contact (visible uniquement pour les organisateurs)
+ )}
+ setContact(e.target.value)} className={user.contact === null || user.contact === "" ? "bg-white" : ""} />
{loading ? "Enregistrement..." : "💾 Sauvegarder"}
- <>
- {user.discord_id ? (
-
- ✅ Ton compte Discord est bien lié !
-
- ) : (
-
{
- window.location.href =
- "https://discord.com/oauth2/authorize?client_id=1400196109434884189&response_type=code&redirect_uri=https%3A%2F%2Fintegration.utt.fr%2Fdiscord&scope=identify";
- }}
- className="w-full bg-indigo-600 hover:bg-indigo-700 flex items-center justify-center gap-2 text-white py-2 rounded"
- >
-
- Lier mon compte Discord
-
- )}
- >
+ <>
+ {user.discord_id ? (
+
+ ✅ Ton compte Discord est bien lié !
+
+ ) : (
+
{
+ window.location.href =
+ "https://discord.com/oauth2/authorize?client_id=1400196109434884189&response_type=code&redirect_uri=https%3A%2F%2Fintegration.utt.fr%2Fdiscord&scope=identify";
+ }}
+ className="w-full bg-indigo-600 hover:bg-indigo-700 flex items-center justify-center gap-2 text-white py-2 rounded"
+ >
+
+ Lier mon compte Discord
+
+ )}
+ >
-
+
);
};
diff --git a/frontend/src/components/shotgun/preregisterCESection.tsx b/frontend/src/components/shotgun/preregisterCESection.tsx
index 9f29082..edc6de7 100644
--- a/frontend/src/components/shotgun/preregisterCESection.tsx
+++ b/frontend/src/components/shotgun/preregisterCESection.tsx
@@ -40,7 +40,7 @@ export const PreregisterCESection = () => {
>
) : (
- La pré-inscription est actuellement fermée.
+ 🚫 La pré-inscription est actuellement fermée.
)}
diff --git a/frontend/src/components/shotgun/preregisterTeamSection.tsx b/frontend/src/components/shotgun/preregisterTeamSection.tsx
index 84c057d..e4b665d 100644
--- a/frontend/src/components/shotgun/preregisterTeamSection.tsx
+++ b/frontend/src/components/shotgun/preregisterTeamSection.tsx
@@ -152,7 +152,7 @@ export const PreregisterTeamSection = () => {
>
) : (
- La pré-inscription est actuellement fermée.
+ 🚫 La pré-inscription est actuellement fermée.
)}
diff --git a/frontend/src/components/shotgun/shotgunSection.tsx b/frontend/src/components/shotgun/shotgunSection.tsx
index 0da54c8..5d84bcf 100644
--- a/frontend/src/components/shotgun/shotgunSection.tsx
+++ b/frontend/src/components/shotgun/shotgunSection.tsx
@@ -75,11 +75,10 @@ export const Shotgun = () => {
{message && (
{message}
@@ -87,7 +86,7 @@ export const Shotgun = () => {
) : (
- Le shotgun n'est pas encore ouvert.
+ 🚫 Le shotgun n'est pas encore ouvert.
)}
diff --git a/frontend/src/pages/challenge.tsx b/frontend/src/pages/challenge.tsx
index 502f20a..5d93500 100644
--- a/frontend/src/pages/challenge.tsx
+++ b/frontend/src/pages/challenge.tsx
@@ -1,18 +1,17 @@
import { UserChallengeList } from "../components/challenge/challengeList";
import { Navbar } from "../components/navbar";
+import { Footer } from "../components/footer";
export const ChallPage = () => (
-
-
-
-
-
);
diff --git a/frontend/src/pages/food.tsx b/frontend/src/pages/food.tsx
index 5fc9180..e5aaae3 100644
--- a/frontend/src/pages/food.tsx
+++ b/frontend/src/pages/food.tsx
@@ -1,20 +1,19 @@
import { Navbar } from "../components/navbar";
-import { FoodSection } from "../components/WEI_SDI_Food/foodSection";
+import { FoodSection } from "../components/WEI_SDI_Food/foodSection"
+import { Footer } from "../components/footer";
export const FoodPage = () => {
-
- return(
+
+ return (
-
-
- );
+ );
}
\ No newline at end of file
diff --git a/frontend/src/pages/games.tsx b/frontend/src/pages/games.tsx
index 36e46b7..08aa247 100644
--- a/frontend/src/pages/games.tsx
+++ b/frontend/src/pages/games.tsx
@@ -1,18 +1,17 @@
import { RoleLeaderboard } from "../components/Games/roleLeaderboard";
import { Navbar } from "../components/navbar";
+import { Footer } from "../components/footer";
export const GamesPage = () => (
-
-
-
-
-
);
diff --git a/frontend/src/pages/home.tsx b/frontend/src/pages/home.tsx
index 9508ce1..d0d9b19 100644
--- a/frontend/src/pages/home.tsx
+++ b/frontend/src/pages/home.tsx
@@ -1,7 +1,8 @@
// src/pages/index.tsx
import { Navbar } from "../components/navbar";
import { Infos } from "../components/home/infosSection";
-import {SocialLinks} from "../components/home/socialSection";
+import { SocialLinks } from "../components/home/socialSection";
+import { Footer } from "../components/footer";
export const HomePage = () => {
@@ -11,9 +12,7 @@ export const HomePage = () => {
-
+
);
}
diff --git a/frontend/src/pages/legals.tsx b/frontend/src/pages/legals.tsx
new file mode 100644
index 0000000..697bb32
--- /dev/null
+++ b/frontend/src/pages/legals.tsx
@@ -0,0 +1,15 @@
+// src/pages/legals.tsx
+import { Navbar } from "../components/navbar";
+import { Footer } from "../components/footer";
+import { LegalsSection } from "../components/legals/legalsSection";
+
+export const LegalsPage = () => {
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/pages/news.tsx b/frontend/src/pages/news.tsx
index 73bee95..32b03bf 100644
--- a/frontend/src/pages/news.tsx
+++ b/frontend/src/pages/news.tsx
@@ -1,17 +1,16 @@
import { Navbar } from "../components/navbar";
import { MyNews } from "../components/news/newsSection";
+import { Footer } from "../components/footer";
export const NewsPage = () => (
-
-
-
-
-
);
diff --git a/frontend/src/pages/parrainage.tsx b/frontend/src/pages/parrainage.tsx
index 38191aa..82bf5d1 100644
--- a/frontend/src/pages/parrainage.tsx
+++ b/frontend/src/pages/parrainage.tsx
@@ -2,6 +2,7 @@ import { Navbar } from "../components/navbar";
import { useNavigate } from "react-router-dom";
import { ParrainageNewStudent, ParrainageStudent } from "../components/Parrainnage/parrainageForm";
import { getPermission } from "../services/requests/user.service";
+import { Footer } from "../components/footer";
export const ParrainagePage = () => {
@@ -12,23 +13,21 @@ export const ParrainagePage = () => {
if (!permission) {
navigate("/");
return null;
-}
- return(
-
-
-
-
+ }
+ return (
+
+
+
+
- {(permission === "Nouveau" || permission === "Admin") && (
-
)}
+ {(permission === "Nouveau" || permission === "Admin") && (
+
)}
- {(permission === "Student" || permission === "Admin") && (
-
)}
+ {(permission === "Student" || permission === "Admin") && (
+
)}
+
+
-
-
);
}
\ No newline at end of file
diff --git a/frontend/src/pages/perm.tsx b/frontend/src/pages/perm.tsx
index 9e35979..991cf3f 100644
--- a/frontend/src/pages/perm.tsx
+++ b/frontend/src/pages/perm.tsx
@@ -16,6 +16,7 @@ import { DecodedToken } from "../interfaces/token.interfaces";
import { Navbar } from "../components/navbar";
import { RespoPresenceManagement } from "../components/permanence/appealPerm";
import { MyPermanencesList } from "../components/permanence/permUser";
+import { Footer } from "../components/footer";
export const AvailablePermanencesPage: React.FC = () => {
const [permanences, setPermanences] = useState
([]);
@@ -59,16 +60,16 @@ export const AvailablePermanencesPage: React.FC = () => {
return (
);
};
@@ -133,14 +134,14 @@ export const MyPermanencesPage: React.FC = () => {
return (
);
};
@@ -192,9 +193,7 @@ export const RespoCallPage = () => {
)}
-
+
);
};
diff --git a/frontend/src/pages/plannings.tsx b/frontend/src/pages/plannings.tsx
index ca8f0bb..2a5c2d5 100644
--- a/frontend/src/pages/plannings.tsx
+++ b/frontend/src/pages/plannings.tsx
@@ -1,5 +1,6 @@
import { Navbar } from "../components/navbar";
import { PlanningSection } from "../components/Plannings/planningSection";
+import { Footer } from "../components/footer";
export const PlanningsPage = () => (
@@ -7,11 +8,9 @@ export const PlanningsPage = () => (
-
+
);
\ No newline at end of file
diff --git a/frontend/src/pages/privacy.tsx b/frontend/src/pages/privacy.tsx
new file mode 100644
index 0000000..77b9090
--- /dev/null
+++ b/frontend/src/pages/privacy.tsx
@@ -0,0 +1,15 @@
+// src/pages/privacy.tsx
+import { Navbar } from "../components/navbar";
+import { Footer } from "../components/footer";
+import { PrivacySection } from "../components/privacy/privacySection";
+
+export const PrivacyPage = () => {
+
+ return (
+
+ );
+}
diff --git a/frontend/src/pages/profil.tsx b/frontend/src/pages/profil.tsx
index 43afa08..da84fca 100644
--- a/frontend/src/pages/profil.tsx
+++ b/frontend/src/pages/profil.tsx
@@ -3,26 +3,25 @@ import { Navbar } from "../components/navbar";
import { UserPreferences } from "../components/profil/roleForm";
import { getPermission } from "../services/requests/user.service";
import { ProfilForm } from "../components/profil/profilForm";
+import { Footer } from "../components/footer";
export const ProfilPage = () => {
- const navigate = useNavigate();
- const permission = getPermission();
+ const navigate = useNavigate();
+ const permission = getPermission();
- if (!permission) {
- navigate("/");
- return null;
- }
+ if (!permission) {
+ navigate("/");
+ return null;
+ }
return (
- < ProfilForm/>
+
{(permission === "Student" || permission === "Admin") && (
)}
-
+
);
}
\ No newline at end of file
diff --git a/frontend/src/pages/sdi.tsx b/frontend/src/pages/sdi.tsx
index 016af1b..9e80517 100644
--- a/frontend/src/pages/sdi.tsx
+++ b/frontend/src/pages/sdi.tsx
@@ -1,20 +1,18 @@
import { Navbar } from "../components/navbar";
-import { SdiSection } from "../components/WEI_SDI_Food/sdiSection";
-
+import { SdiSection } from "../components/WEI_SDI_Food/sdiSection";
+import { Footer } from "../components/footer";
export const SdiPage = () => {
-
- return(
+
+ return (
-
-
- );
+ );
}
\ No newline at end of file
diff --git a/frontend/src/pages/shotgun.tsx b/frontend/src/pages/shotgun.tsx
index a8ef5e6..0a8bb3b 100644
--- a/frontend/src/pages/shotgun.tsx
+++ b/frontend/src/pages/shotgun.tsx
@@ -2,6 +2,7 @@ import { Navbar } from "../components/navbar";
import { PreregisterCESection } from "../components/shotgun/preregisterCESection";
import { PreregisterTeamSection } from "../components/shotgun/preregisterTeamSection";
import { Shotgun } from "../components/shotgun/shotgunSection";
+import { Footer } from "../components/footer";
export const ShotgunPage = () => (
@@ -15,8 +16,6 @@ export const ShotgunPage = () => (
-
+
);
diff --git a/frontend/src/pages/wei.tsx b/frontend/src/pages/wei.tsx
index 88377e5..e7fdf5e 100644
--- a/frontend/src/pages/wei.tsx
+++ b/frontend/src/pages/wei.tsx
@@ -3,17 +3,18 @@ import { WeiSection } from "../components/WEI_SDI_Food/weiSection";
import { TentPublic } from "../components/tent/tentSection";
import { useNavigate } from "react-router-dom";
import { getPermission } from "../services/requests/user.service";
+import { Footer } from "../components/footer";
export const WeiPage = () => {
- const navigate = useNavigate();
- const permission = getPermission();
+ const navigate = useNavigate();
+ const permission = getPermission();
+
+ if (!permission) {
+ navigate("/");
+ return null;
+ }
- if (!permission) {
- navigate("/");
- return null;
- }
-
return (
@@ -23,9 +24,7 @@ export const WeiPage = () => {
{(permission === "Nouveau" || permission === "Admin") && }
-
+
);
};
\ No newline at end of file
diff --git a/frontend/src/services/requests/user.service.ts b/frontend/src/services/requests/user.service.ts
index 9f5d316..f7e5cf1 100644
--- a/frontend/src/services/requests/user.service.ts
+++ b/frontend/src/services/requests/user.service.ts
@@ -3,90 +3,93 @@ import { User } from '../../interfaces/user.interface';
import api from '../api';
export const getPermission = (): string | null => {
- const token = localStorage.getItem('authToken');
- if (token) {
- try {
- // Suppose que le token est un JWT et qu'il contient un payload avec un rôle
- const decodedToken = JSON.parse(atob(token.split('.')[1])); // Décodage du token JWT
- return decodedToken?.userPermission || null; // Retourne le rôle ou null
- } catch (error) {
- console.error('Erreur lors du décodage du token:', error);
- return null;
- }
+ const token = localStorage.getItem('authToken');
+ if (token) {
+ try {
+ // Suppose que le token est un JWT et qu'il contient un payload avec un rôle
+ const decodedToken = JSON.parse(atob(token.split('.')[1])); // Décodage du token JWT
+ return decodedToken?.userPermission || null; // Retourne le rôle ou null
+ } catch (error) {
+ console.error('Erreur lors du décodage du token:', error);
+ return null;
}
- return null;
- };
+ }
+ return null;
+};
export const isAdmin = (): boolean => {
return getPermission() === 'Admin';
};
+export const isConnected = (): boolean => {
+ return getPermission() !== null;
+};
export const getUsers = async () => {
- const response = await api.get("/user/user/getusers");
- const users = response.data.data;
-
- return users;
+ const response = await api.get("/user/user/getusers");
+ const users = response.data.data;
+
+ return users;
}
export const getUsersAdmin = async () => {
- const response = await api.get("/user/admin/getusers");
- const users = response.data.data;
-
- return users;
-
+ const response = await api.get("/user/admin/getusers");
+ const users = response.data.data;
+
+ return users;
+
}
export const getUsersByPermission = async () => {
- const response = await api.get("/user/admin/getusersbypermission");
- const users = response.data.data;
-
- return users;
+ const response = await api.get("/user/admin/getusersbypermission");
+ const users = response.data.data;
+
+ return users;
}
export const getCurrentUser = async () => {
- const res = await api.get("/user/user/me");
+ const res = await api.get("/user/user/me");
return res.data.data;
};
export const updateCurrentUser = async (data: Partial