Interface web moderne développée en Next.js avec React et TypeScript pour la plateforme de traduction TalAIt.
âââââââââââââââââââââââââââââââââââââââ
â Next.js Frontend â
â âââââââââââââ ââââââââââââââââ â
â â /login â â /register â â
â âââââââŹââââââ ââââââââŹââââââââ â
â â â â
â ââââââââââŹâââââââââ â
â ⌠â
â ââââââââââââââââ â
â â /translate â â
â ââââââââŹââââââââ â
âââââââââââââââââŒââââââââââââââââââââââ
â JWT Bearer Token
âŒ
ââââââââââââââââ
â Backend API â
â (FastAPI) â
ââââââââââââââââ
- Framework: Next.js (App Router)
- Language: TypeScript
- UI Library: React
- Styling: Tailwind CSS 3
- HTTP Client: Fetch API native
- State Management: React Hooks (useState, useEffect)
- Routing: Next.js App Router
- Authentification: JWT (localStorage)
- Node.js
- npm ou yarn ou pnpm
- Backend API lancé sur
http://localhost:8000
git clone https://github.com/Assma-IBIKAS/talAIt_Plateforme_de_Traduction_Frontend.git
npm install
# ou
yarn install
# ou
pnpm installnpm run dev
# ou
yarn dev
# ou
pnpm devOuvrir http://localhost:3000
# Build l'image
docker build -t talait-frontend .
# Lancer le conteneur
docker run -p 3000:3000 talait-frontend# Depuis la racine du projet
docker-compose up -d frontendfrontend/
âââ app/
â âââ layout.tsx # Layout racine
â âââ page.tsx # Page d'accueil (redirect)
â âââ globals.css # Styles globaux
â âââ login/
â â âââ page.tsx # Page de connexion
â âââ register/
â â âââ page.tsx # Page d'inscription
â âââ translate/
â âââ page.tsx # Page de traduction
âââ public/
â âââ favicon.ico
â âââ images/
âââ types/
â âââ index.ts # Types TypeScript
âââ Dockerfile
âââ next.config.js
âââ tailwind.config.ts
âââ tsconfig.json
âââ package.json
Redirection automatique :
- Si JWT valide â
/translate - Si non authentifiĂ© â
/login
Fonctionnalités:
- Formulaire username + password
- Validation cÎté client
- Appel API
/login - Stockage JWT en localStorage
- Redirection vers
/translate - Messages d'erreur stylisés
- Lien vers page register
Code exemple:
const handleLogin = async () => {
const res = await fetch(`${API_URL}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({ username, password })
});
const data = await res.json();
localStorage.setItem('access_token', data.access_token);
router.push('/translate');
};Fonctionnalités:
- Formulaire création de compte
- Validation password (min 8 caractĂšres)
- Appel API
/register - Message de succĂšs
- Auto-redirection vers
/loginaprÚs 2s - Gestion des erreurs (username déjà pris, etc.)
Fonctionnalités principales:
-
Interface de traduction
- Textarea pour le texte source
- Select direction (FRâEN / ENâFR)
- Bouton "Traduire"
-
Résultats
- Affichage de résultat
- Gestion erreurs (token invalide, API down)
Protection:
useEffect(() => {
const token = localStorage.getItem('access_token');
if (!token) {
router.push('/login'); // Redirection si non authentifié
}
}, []);Appel API:
const handleTranslate = async () => {
const token = localStorage.getItem('access_token');
const res = await fetch(`${API_URL}/translate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ text, direction })
});
const data = await res.json();
setTranslatedText(data.translation);
};1. AccĂšs Ă l'app
â
2. Redirection automatique
ââ Si authentifiĂ© â /translate
ââ Si non auth â /login
â
3. Login ou Register
â
4. Réception JWT
â
5. Stockage en localStorage
â
6. AccĂšs Ă /translate
â
7. Saisie texte + choix direction
â
8. Click "Execute()"
â
9. Envoi requĂȘte avec JWT
â
10. Affichage résultat
â
11. Logout â suppression JWT â retour /login
// AprÚs login réussi
localStorage.setItem('access_token', token);
localStorage.setItem('username', username);
// Lecture du token
const token = localStorage.getItem('access_token');
// Logout
localStorage.removeItem('access_token');
localStorage.removeItem('username');// Dans chaque page protégée
useEffect(() => {
const token = localStorage.getItem('access_token');
if (!token) {
router.push('/login');
}
}, [router]);// Headers pour toutes les requĂȘtes protĂ©gĂ©es
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}| Code | Action Frontend |
|---|---|
| 401 | Redirect to /login + message |
| 403 | Show "AccÚs refusé" |
| 422 | Validation errors display |
| 500 | "Erreur serveur" message |
| 503 | "Service temporairement indisponible" |
try {
const res = await fetch(url, options);
const data = await res.json();
if (!res.ok) {
setError(data.detail || 'Une erreur est survenue');
return;
}
// Success
} catch (err) {
setError('Erreur réseau ou serveur');
}FROM node:22
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm","run","dev"] frontend:
build:
context: ./talAIt_Plateforme_de_Traduction_Frontend
dockerfile: Dockerfile
container_name: talait_frontend
ports:
- "3000:3000"
depends_on:
- backend// Vérifier expiration
if (res.status === 401) {
localStorage.removeItem('access_token');
router.push('/login');
}# Vérifier que le backend autorise l'origin
# Backend config (FastAPI):
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)Crafted with đ by TalAIt Design Team