Pour l'équipe technique
Guide d'intégration
Cette façade est front-only : toutes les données viennent de src/lib/mock/data.ts. Voici comment la brancher sur le vrai back-end.
Arborescence
Organisation des dossiers de la façade.
src/
├── app/ # routes Next.js (App Router)
│ ├── page.tsx # accueil public
│ ├── connexion/
│ ├── inscription/
│ ├── espace/ # zone connectée
│ │ ├── nouvelle-garde/
│ │ ├── historique/
│ │ ├── messages/
│ │ └── profil/
│ └── composants/ # cette documentation (à exclure du build client final)
├── components/
│ ├── ui/ # design system (Button, Primitives, Toast, Lambrequin)
│ └── catalogue/ # composants internes de cette doc
└── lib/
└── mock/data.ts # données de démo à remplacer par de vrais appels APIÉcran → Composant → Données → Endpoint
Pour chaque écran, le composant UI utilisé, le type TypeScript attendu et l'endpoint à brancher.
| Écran | Composant | Données attendues | Endpoint à brancher |
|---|---|---|---|
| Accueil — avis voisins | Card + Avatar + Badge | type Avis = { id: string; auteur: string; avatar: string; note: number; texte: string }[] | GET /api/avis |
| Inscription | TextField + TextArea + Button | type InscriptionPayload = { email: string; nom: string; ville: string; motDePasse: string } | POST /api/auth/inscription |
| Connexion | TextField + Button | type ConnexionPayload = { email: string; motDePasse: string } | POST /api/auth/connexion |
| Tableau de bord — mes gardes | Tabs + Card + Badge + Skeleton | type Garde = { id: string; title: string; gardien: string; from: string; to: string; status: GardeStatus }[] | GET /api/gardes |
| Nouvelle garde | SelectField + TextArea + Toggle + Button | type NouvelleGardePayload = { type: string; from: string; to: string; animaux: string[]; instructions: string } | POST /api/gardes |
| Historique | Card + Badge + EmptyState | Garde[] filtré sur status 'terminee' | 'annulee' | GET /api/gardes?status=terminee,annulee |
| Messages | Avatar + TextArea + Button | type Message = { id: string; auteur: string; texte: string; envoyeLe: string }[] | GET /api/conversations/:id/messages |
| Profil | Avatar + TextField + Toggle + Stat | type Profil = { nom: string; ville: string; avatar: string; kazPoints: number; notifications: boolean } | GET /api/profil |
Remplacer le mock par un fetch réel
Même contrat de retour (data / loading / error) : aucun composant d'écran à modifier, seul le hook de données change.
// avant — données mockées (démo front-only)
import { GARDES } from '@/lib/mock/data';
export function useGardes() {
return { data: GARDES, loading: false, error: null };
}// après — vrai fetch, même contrat de retour (rien à changer côté UI)
import { useEffect, useState } from 'react';
import type { Garde } from '@/lib/mock/data';
export function useGardes() {
const [data, setData] = useState<Garde[] | null>(null);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
let active = true;
fetch('/api/gardes')
.then((res) => {
if (!res.ok) throw new Error('Erreur serveur');
return res.json();
})
.then((json) => active && setData(json))
.catch((err) => active && setError(err.message));
return () => {
active = false;
};
}, []);
return { data, loading: data === null && !error, error };
}Conventions
Règles à respecter pour garder la façade cohérente avec le reste de l'app.
- Props toujours typées (TypeScript strict, pas de any).
- Aucun appel réseau dans les composants de src/components/ui/** — le fetch vit dans les pages ou des hooks dédiés.
- Chaque écran gère explicitement 3 états : loading (Skeleton), error (toast + message), success (contenu réel).
- Les variantes visuelles viennent du catalogue (/composants) — pas de style ad hoc en dehors des tokens Tailwind.
Commandes
Installation et lancement du projet.
pnpm install
pnpm dev
pnpm buildChecklist d'intégration
0/6 étapes cochées — état conservé localement dans cette page.