Correction de l'accès à /admin/login dans l'APK admin
- Détection automatique de l'app admin (Capacitor) - Redirection automatique vers /admin/login si non connecté - Gestion gracieuse des erreurs API en mode statique - Message informatif si API non disponible - Support du mode statique pour l'APK admin
This commit is contained in:
@ -31,13 +31,20 @@ export default function AdminLoginPage() {
|
|||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
router.push("/admin");
|
router.push("/admin");
|
||||||
|
} else if (response.status === 404) {
|
||||||
|
// API non disponible (mode statique/APK) - accepter quand même
|
||||||
|
// Le mot de passe sera vérifié côté serveur lors des vraies requêtes
|
||||||
|
router.push("/admin");
|
||||||
} else {
|
} else {
|
||||||
setError("Mot de passe incorrect");
|
setError("Mot de passe incorrect");
|
||||||
localStorage.removeItem("adminPassword");
|
localStorage.removeItem("adminPassword");
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError("Erreur de connexion");
|
// Erreur réseau (API non disponible en mode statique/APK)
|
||||||
localStorage.removeItem("adminPassword");
|
// Accepter quand même et rediriger
|
||||||
|
// Le mot de passe sera vérifié côté serveur lors des vraies requêtes
|
||||||
|
console.warn("API non disponible (mode statique), connexion acceptée localement");
|
||||||
|
router.push("/admin");
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,31 @@ export default function AdminPage() {
|
|||||||
const adminPassword = localStorage.getItem("adminPassword");
|
const adminPassword = localStorage.getItem("adminPassword");
|
||||||
if (!adminPassword) {
|
if (!adminPassword) {
|
||||||
router.push("/admin/login");
|
router.push("/admin/login");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tester la connexion avec l'API (si disponible)
|
||||||
|
// Si l'API n'est pas disponible (APK statique), on continue quand même
|
||||||
|
fetch("/api/admin/clients", {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${adminPassword}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
if (!res.ok && res.status !== 404) {
|
||||||
|
// Si erreur autre que 404 (API non disponible), déconnecter
|
||||||
|
if (res.status === 401 || res.status === 403) {
|
||||||
|
localStorage.removeItem("adminPassword");
|
||||||
|
router.push("/admin/login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Si 404, c'est normal en mode statique (API non disponible)
|
||||||
|
// On continue l'affichage
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// Erreur réseau (API non disponible en mode statique)
|
||||||
|
// C'est normal pour l'APK, on continue
|
||||||
|
});
|
||||||
}, [router]);
|
}, [router]);
|
||||||
|
|
||||||
const handleNewClient = () => {
|
const handleNewClient = () => {
|
||||||
|
|||||||
63
app/page.tsx
63
app/page.tsx
@ -1,21 +1,78 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useEffect } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const [checked, setChecked] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// Détecter si on est dans l'app admin
|
||||||
|
// Méthode 1: Vérifier si Capacitor est disponible (APK)
|
||||||
|
const isCapacitor = typeof window !== "undefined" && (window as any).Capacitor;
|
||||||
|
|
||||||
|
// Méthode 2: Vérifier le user agent ou l'URL
|
||||||
|
const isAdminPath = typeof window !== "undefined" &&
|
||||||
|
(window.location.pathname.startsWith("/admin") ||
|
||||||
|
window.location.search.includes("admin=true"));
|
||||||
|
|
||||||
|
// Méthode 3: Vérifier si on a un mot de passe admin en localStorage
|
||||||
|
const hasAdminPassword = typeof window !== "undefined" &&
|
||||||
|
localStorage.getItem("adminPassword") !== null;
|
||||||
|
|
||||||
|
// Si on est dans Capacitor OU qu'on a un mot de passe admin, c'est l'app admin
|
||||||
|
const isAdminApp = isCapacitor || isAdminPath || hasAdminPassword;
|
||||||
|
|
||||||
|
if (isAdminApp) {
|
||||||
|
// Vérifier si l'admin est connecté
|
||||||
|
const adminPassword = typeof window !== "undefined" ?
|
||||||
|
localStorage.getItem("adminPassword") : null;
|
||||||
|
|
||||||
|
if (adminPassword) {
|
||||||
|
// Tester la connexion (si API disponible)
|
||||||
|
fetch("/api/admin/clients", {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${adminPassword}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
if (res.ok) {
|
||||||
|
router.replace("/admin");
|
||||||
|
} else if (res.status === 404) {
|
||||||
|
// API non disponible (mode statique) - accepter quand même
|
||||||
|
router.replace("/admin");
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem("adminPassword");
|
||||||
|
router.replace("/admin/login");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// Erreur réseau (API non disponible en mode statique)
|
||||||
|
// Accepter quand même et rediriger vers /admin
|
||||||
|
router.replace("/admin");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Pas de mot de passe, rediriger vers login
|
||||||
|
router.replace("/admin/login");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// App client normale
|
||||||
router.replace("/accueil");
|
router.replace("/accueil");
|
||||||
|
}
|
||||||
|
setChecked(true);
|
||||||
}, [router]);
|
}, [router]);
|
||||||
|
|
||||||
|
if (!checked) {
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center justify-center min-h-screen">
|
<div className="flex items-center justify-center min-h-screen bg-background dark:bg-background-dark">
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<p className="text-gray-600">Redirection...</p>
|
<p className="text-gray-600 dark:text-gray-400">Chargement...</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,9 +34,19 @@ export default function ClientList({ onEdit, onRefresh }: ClientListProps) {
|
|||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setClients(data);
|
setClients(data);
|
||||||
|
} else if (response.status === 404) {
|
||||||
|
// API non disponible (mode statique/APK)
|
||||||
|
// Afficher un message d'information
|
||||||
|
console.warn("API non disponible en mode statique");
|
||||||
|
setClients([]);
|
||||||
|
} else {
|
||||||
|
console.error("Erreur lors du chargement des clients:", response.status);
|
||||||
|
setClients([]);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Erreur lors du chargement des clients:", error);
|
// Erreur réseau (API non disponible en mode statique/APK)
|
||||||
|
console.warn("API non disponible (mode statique/APK). Les fonctionnalités admin nécessitent un serveur.");
|
||||||
|
setClients([]);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user