Page admin : appelle l'API au lieu du front, et resynchronise le rôle
Build & Deploy / build (push) Successful in 20s
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:
+17
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user