# 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 gst = useGlobalStates();
const session = gst.get('session');
if (session) {
return ;
}
return ;
};
/**
* Private routes (home, settings, etc.)
* Redirects to /login if not authenticated
*/
export const PrivateRoutes = () => {
const gst = useGlobalStates();
const session = gst.get('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'' qui retourne un objet avec des methodes de navigation :
```
import { useNavigation } from '@cap-rel/smartcommon';
const MyComponent = () => {
const nav = useNavigation();
return (
{/* Navigation simple */}
{/* Avec paramètres */}
{/* Retour en arrière */}
{/* Remplacer l'historique (builder chainable) */}
);
};
```
### Propriétés retournées
^ Propriété ^ Description ^
| ''nav.navigate(to, options)'' | Fonction de navigation React Router |
| ''nav.params'' | Paramètres de la route (useParams) |
| ''nav.searchParams'' | Query string (useSearchParams) |
| ''nav.location'' | Objet location courant |
| ''nav.history'' | Historique de navigation |
| ''nav.replace()'' | Builder chainable : remplacer au lieu de pousser |
| ''nav.state(value)'' | Builder chainable : passer un state |
| ''nav.to(path)'' | Builder chainable : executer la navigation |
### 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 nav = 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 nav = 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 gst = useGlobalStates();
const session = gst.get('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