= P & { rowGap?: string | number; children: React.ReactNode; }; + +export type GetResponsiveSxProps = { + marginY?: string; + paddingY?: string; + rowGap?: string; +}; + +export type ResponsiveSxProps = { + maxWidth: number; + marginY: { xs: string; sm: string; md: string }; + paddingY: { xs: string; sm: string; md: string }; + rowGap: { xs: string; sm: string; md: string }; + [key: string]: any; +}; diff --git a/src/utils/authUtils.ts b/src/utils/authUtils.ts new file mode 100644 index 0000000..f07c294 --- /dev/null +++ b/src/utils/authUtils.ts @@ -0,0 +1,29 @@ +/** + * Utilitaires liés à l'authentification, notamment la gestion des tokens JWT et la vérification de l'état d'authentification de l'utilisateur. + * Fournit des fonctions pour décoder les tokens JWT et vérifier leur validité en fonction de leur date d'expiration. + * @param {string} token Le token JWT à décoder. + * @returns {any | null} Le payload décodé du token, ou null en cas d'erreur de décodage. + */ +function decodeJwt(token: string): any | null { + try { + const payload = token.split(".")[1]; + return JSON.parse(atob(payload.replace(/-/g, "+").replace(/_/g, "/"))); + } catch { + return null; + } +} + +/** + * Vérifie si l'utilisateur est actuellement authentifié en vérifiant la présence d'un token JWT valide dans le stockage local. + * Décodé le token pour vérifier sa date d'expiration et s'assurer qu'il est encore valide. + * @returns {boolean} true si l'utilisateur est authentifié, false sinon. + */ +export function isAuthenticated(): boolean { + const token = localStorage.getItem("token"); + if (!token) return false; + const payload = decodeJwt(token); + if (!payload || !payload.exp) return false; + // exp est en secondes depuis epoch + const now = Math.floor(Date.now() / 1000); + return payload.exp > now; +} diff --git a/src/utils/responsiveUtils.ts b/src/utils/responsiveUtils.ts index b6057e4..faeb391 100644 --- a/src/utils/responsiveUtils.ts +++ b/src/utils/responsiveUtils.ts @@ -1,11 +1,24 @@ import { useTheme } from "@mui/material"; import { verticalMediaQuery } from "../theme"; +import type { + GetResponsiveSxProps, + ResponsiveSxProps, +} from "../types/responsiveTypes"; +/** + * Utilitaire pour générer des styles responsives basés sur les propriétés de marge, de padding et d'espacement entre les éléments. + * Utilise les breakpoints et les fonctions de thème de Material-UI pour créer des styles qui s'adaptent à différentes tailles d'écran et orientations. + * Permet de limiter les valeurs de marge, de padding et d'espacement à des maximums définis dans le thème pour éviter des espacements excessifs sur les grands écrans. + * @param {string} props.marginY La marge verticale à appliquer, qui sera limitée par les breakpoints du thème. + * @param {string} props.paddingY Le padding vertical à appliquer, qui sera limité par les breakpoints du thème. + * @param {string} props.rowGap L'espacement entre les éléments (row gap) à appliquer, qui sera limité par les breakpoints du thème. + * @returns {{ maxWidth: number; marginY: { xs: string; sm: string; md: string }; paddingY: { xs: string; sm: string; md: string }; rowGap: { xs: string; sm: string; md: string }; [key: string]: any;}} Un objet de styles responsives à appliquer aux composants. + */ export function getResponsiveSx({ marginY = "0px", paddingY = "0px", rowGap = "0px", -}) { +}: GetResponsiveSxProps): ResponsiveSxProps { const theme = useTheme(); const maxSpacing = theme.spacing(24); diff --git a/src/utils/urlUtils.ts b/src/utils/urlUtils.ts new file mode 100644 index 0000000..8d5dc81 --- /dev/null +++ b/src/utils/urlUtils.ts @@ -0,0 +1,14 @@ +/** + * Concatène proprement une base d'URL et un chemin, sans double slash. + * @param {string} baseUrl ex: http://localhost:4000/ + * @param {string} path ex: /4ntjnra6 + * @returns {string} ex: http://localhost:4000/4ntjnra6 + */ +export function joinUrl(baseUrl: string, path: string): string { + try { + return new URL(path, baseUrl).href; + } catch (err) { + console.error("URL invalide:", err); + return baseUrl + path; + } +}