Page admin : appelle l'API au lieu du front, et resynchronise le rôle
Build & Deploy / build (push) Successful in 20s

Admin.tsx faisait ses 8 appels en relatif (`/admin/users?token=…`), donc vers
le nginx du front et non vers l'API. Le fallback SPA répondait index.html en
HTTP 200 : le res.json() partait en erreur de parsing — « The string did not
match the expected pattern » sous Safari. Les appels passent désormais par
API_URL, comme le reste du front.

App.tsx ne lisait le user que depuis localStorage, instantané pris au login :
une promotion en admin n'y apparaissait jamais et AdminRoute éjectait le compte
de /admin jusqu'à reconnexion. Le profil est resynchronisé depuis /me au
montage.

Restent 404 côté API : /admin/scrapers/logs et /admin/scrapers/run, que la page
appelle mais que le backend n'expose pas (les scrapers tournent via le cron
hôte). Le panneau affichera une erreur franche au lieu d'une erreur de parsing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-15 16:13:55 +02:00
co-authored by Claude Opus 5
parent b5f362fde1
commit 0c1b9f5670
2 changed files with 26 additions and 9 deletions
+17 -1
View File
@@ -21,7 +21,7 @@ import BackToTop from "./components/BackToTop";
import styles from "./App.module.css";
import { getDocuments, type ApiDocument } from "./services/theapi";
import { getDocuments, API_URL, type ApiDocument } from "./services/theapi";
type NavItem =
| "home"
@@ -104,6 +104,22 @@ export default function App() {
: location.pathname === "/admin"? "admin"
: "home";
// Le user de localStorage est un instantané pris au login : un changement de
// rôle en base n'y apparaît jamais. On le resynchronise depuis /me au montage,
// sinon un compte promu admin reste bloqué hors de /admin jusqu'à reconnexion.
useEffect(() => {
const token = localStorage.getItem("authToken");
if (!token) return;
fetch(`${API_URL}/me?token=${encodeURIComponent(token)}`)
.then((res) => (res.ok ? res.json() : Promise.reject(res.status)))
.then((freshUser: User) => {
localStorage.setItem("user", JSON.stringify(freshUser));
setAuthState((prev) => ({ ...prev, user: freshUser }));
})
.catch((err) => console.error("Rafraîchissement du profil impossible :", err));
}, []);
useEffect(() => {
if (authState.isAuthenticated) {
getDocuments()