# Routage Documentation [React Router v7](https://reactrouter.com/) SmartMaker utilise **React Router** pour gérer la navigation entre les pages de l'application (Single Page Application). ## Configuration de base ### Créer le Router ``` // src/components/app/Router/index.jsx import { BrowserRouter, Routes, Route } from 'react-router-dom'; import { LoginPage } from '../../pages/public/LoginPage'; import { HomePage } from '../../pages/private/HomePage'; import { Error404Page } from '../../pages/errors/Error404Page'; export const Router = () => { return ( } /> } /> } /> ); }; ``` ### Intégrer dans App.jsx ``` // src/App.jsx import { Provider } from '@cap-rel/smartcommon'; import { Router } from './components/app/Router'; import { config } from './appConfig'; export const App = () => { return ( ); }; ``` ## Routes protégées ### Guards d'authentification ``` // src/components/app/Router/Guards/index.jsx import { Outlet, Navigate } from 'react-router-dom'; import { useGlobalStates } from '@cap-rel/smartcommon'; /** * Routes publiques (login, register, etc.) * Redirige vers / si déjà connecté */ export const PublicRoutes = () => { const [session] = useGlobalStates('session'); if (session) { return ; } return ; }; /** * Routes privées (home, settings, etc.) * Redirige vers /login si non connecté */ export const PrivateRoutes = () => { const [session] = useGlobalStates('session'); if (!session) { return ; } return ; }; ``` ### Utiliser les Guards ``` // src/components/app/Router/index.jsx import { BrowserRouter, Routes, Route } from 'react-router-dom'; import { PublicRoutes, PrivateRoutes } from './Guards'; // Pages publiques import { WelcomePage } from '../../pages/public/WelcomePage'; import { LoginPage } from '../../pages/public/LoginPage'; // Pages privées import { HomePage } from '../../pages/private/HomePage'; import { SettingsPage } from '../../pages/private/SettingsPage'; import { ItemPage } from '../../pages/private/ItemPage'; // Erreurs import { Error404Page } from '../../pages/errors/Error404Page'; export const Router = () => { return ( {/* Routes publiques */} }> } /> } /> {/* Routes privées */} }> } /> } /> } /> {/* Fallback 404 */} } /> ); }; ``` ## Navigation ### Hook useNavigation SmartCommon expose ''useNavigation'' pour naviguer entre les pages : ``` import { useNavigation } from '@cap-rel/smartcommon'; const MyComponent = () => { const navigate = useNavigation(); return (
{/* Navigation simple */} {/* Avec paramètres */} {/* Retour en arrière */} {/* Remplacer l'historique (pas de retour possible) */}
); }; ``` ### Composant Link Pour les liens simples, utilisez le composant ''Link'' : ``` import { Link } from 'react-router-dom'; const Navigation = () => { return ( ); }; ``` ## Paramètres de route ### Paramètres dynamiques ``` // Route avec paramètre :id } /> // Récupérer le paramètre import { useParams } from 'react-router-dom'; const ItemPage = () => { const { id } = useParams(); // id = "123" pour /items/123 return
Item #{id}
; }; ``` ### Paramètres multiples ``` // Route avec plusieurs paramètres } /> const PostPage = () => { const { userId, postId } = useParams(); // ... }; ``` ### Query strings ``` import { useSearchParams } from 'react-router-dom'; const SearchPage = () => { const [searchParams, setSearchParams] = useSearchParams(); // Lire : /search?q=test&page=2 const query = searchParams.get('q'); // "test" const page = searchParams.get('page'); // "2" // Modifier const handleSearch = (newQuery) => { setSearchParams({ q: newQuery, page: '1' }); }; return ( handleSearch(e.target.value)} /> ); }; ``` ## Routes imbriquées ### Layout partagé ``` // src/components/app/Router/index.jsx }> {/* Layout avec navigation bottom */} }> } /> } /> } /> {/* Pages sans navigation bottom */} } /> } /> ``` ### Composant Layout ``` // src/components/layouts/MainLayout/index.jsx import { Outlet } from 'react-router-dom'; import { useNavigation } from '@cap-rel/smartcommon'; export const MainLayout = () => { const navigate = useNavigation(); return (
{/* Contenu de la page (Outlet = enfant de la route) */}
{/* Navigation fixe en bas */}
); }; ``` ## Animations de transition ### Configuration dans appConfig ``` // appConfig.js export const config = { pages: { // Depuis la home "/": { "/settings": "slideLeft", // Home → Settings : slide vers la gauche "/items/*": "slideLeft", // Home → Item : slide vers la gauche "*": "fade", // Autres : fade }, // Depuis settings "/settings": { "/": "slideRight", // Settings → Home : slide vers la droite }, // Par défaut "*": "fade", }, }; ``` ### Animations disponibles ^ Animation ^ Description ^ | ''fade'' | Fondu enchaîné | | ''slideLeft'' | Glissement vers la gauche | | ''slideRight'' | Glissement vers la droite | | ''zoom'' | Zoom avant/arrière | Voir [[animations|Animations]] pour plus de détails. ## Gestion d'erreurs ### Page 404 ``` // src/components/pages/errors/Error404Page/index.jsx import { useNavigation } from '@cap-rel/smartcommon'; export const Error404Page = () => { const navigate = useNavigation(); return (

404

Page non trouvée

); }; ``` ### Redirection conditionnelle ``` import { Navigate, useLocation } from 'react-router-dom'; import { useGlobalStates } from '@cap-rel/smartcommon'; const RequireAuth = ({ children }) => { const [session] = useGlobalStates('session'); const location = useLocation(); if (!session) { // Sauvegarder l'URL pour rediriger après login return ; } return children; }; ``` ## Bonnes pratiques ### Structure des routes * Groupez les routes par type (public, private, errors) * Utilisez des guards pour la protection * Placez le fallback ''*'' en dernier ### Navigation * Préférez ''useNavigation'' de SmartCommon * Utilisez ''replace: true'' pour les redirections (login, logout) * Évitez les chemins hardcodés, utilisez des constantes ### Performance * Lazy loading pour les grosses pages * Animations légères sur mobile * Pré-chargement des données critiques ## Voir aussi * [[animations|Animations]] - Transitions de pages * [[composants_et_pages|Composants et pages]] - Structure des pages * [[hooks|Hooks]] - useNavigation * [[configuration|Configuration]] - Options du Provider