veza/.build/incus/web/js/AdminDashboardPage-D5ThFcyn.js
senke 1ed6e7f07b state-ownership: delete unused optimisticStoreUpdates.ts file
- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file)
- File was unused - no imports found in codebase
- Mutations already use React Query's onMutate pattern
- No TypeScript errors after deletion
- Actions 4.4.1.2 and 4.4.1.3 complete
2026-01-15 19:26:53 +01:00

2 lines
11 KiB
JavaScript

import{o as d,r,a3 as ce,aD as m,l as x,j as e,aA as ne,aL as i,aN as c,aO as n,bg as u,aM as l,B as C,az as le,ao as de,bO as B,q as I,aP as oe,a9 as ue,a8 as me,G as xe,aQ as he}from"./chunk-Cad8leGS.js";import{B as j}from"./chunk-BlDLB1ZZ.js";import{T as pe,a as je,b as v,c as g}from"./chunk-DWbKrX8g.js";import{A as E}from"./chunk-BoPufJSi.js";import{P as fe}from"./chunk-C2j-MMB3.js";import{u as ve}from"./index-D792PhRw.js";import{f as V,a as q}from"./chunk-B4NZlYwU.js";import"./chunk-wkfC2Tom.js";import"./chunk-VMUEamc6.js";import"./chunk-Df4po8fP.js";import"./chunk-B7sOPOlf.js";async function ge(o){try{return(await d.get("/audit/logs",{params:o})).data}catch(a){throw a instanceof E&&a.response?.status===403?new Error("Forbidden: You do not have admin permissions to access audit logs"):a}}async function Ne(o){try{return(await d.get("/audit/stats",{params:o})).data}catch(a){throw a instanceof E&&a.response?.status===403?new Error("Forbidden: You do not have admin permissions to access audit stats"):a}}async function ye(o){try{return(await d.get("/audit/suspicious",{params:o})).data}catch(a){throw a instanceof E&&a.response?.status===403?new Error("Forbidden: You do not have admin permissions to detect suspicious activity"):a}}function Re(){const[o,a]=r.useState(!0),[h,D]=r.useState(null),[p,z]=r.useState(null),[F,G]=r.useState([]),[N,M]=r.useState([]),[y,O]=r.useState([]),[Q,Y]=r.useState([]),[b,$]=r.useState(""),[w,H]=r.useState("overview"),[S,J]=r.useState(1),[A,K]=r.useState(0),f=50,{toast:W}=ce(),_=ve();r.useEffect(()=>{X()},[]);const X=async()=>{a(!0),D(null);try{await Promise.all([Z(),ee(),P(),L(),R()])}catch(s){const t=m(s);x.error("Failed to load admin dashboard:",{error:t.message}),D(t.message),(t.code===403||t.message.includes("Forbidden"))&&(W({message:"Vous n'avez pas les permissions administrateur",type:"error"}),_("/dashboard"))}finally{a(!1)}},Z=async()=>{try{const[s,t,U]=await Promise.allSettled([d.get("/users",{params:{limit:1}}),d.get("/tracks",{params:{limit:1}}),d.get("/playlists",{params:{limit:1}})]),te=s.status==="fulfilled"&&s.value.data?.pagination?.total||0,ae=t.status==="fulfilled"&&t.value.data?.pagination?.total||0,re=U.status==="fulfilled"&&U.value.data?.pagination?.total||0,ie=(await d.get("/users",{params:{limit:1e3,is_active:!0}})).data?.users?.filter(k=>k.last_login_at&&new Date(k.last_login_at)>new Date(Date.now()-720*60*60*1e3)).length||0;z({total_users:te,active_users:ie,total_tracks:ae,total_playlists:re})}catch(s){const t=m(s);x.error("Failed to load system stats:",{error:t.message})}},ee=async()=>{try{const s=await Ne();G(s.stats||[])}catch(s){const t=m(s);x.error("Failed to load audit stats:",{error:t.message})}},P=async()=>{try{const s=await ye({hours:24});M(s.activities||[])}catch(s){const t=m(s);x.error("Failed to load suspicious activities:",{error:t.message})}},L=async()=>{try{const s=await ge({limit:10});O(s.logs||[])}catch(s){const t=m(s);x.error("Failed to load recent logs:",{error:t.message})}},R=async()=>{try{const s=await d.get("/users",{params:{page:S,limit:f,search:b||void 0}});Y(s.data?.users||[]),K(s.data?.pagination?.total||0)}catch(s){const t=m(s);x.error("Failed to load users:",{error:t.message})}};r.useEffect(()=>{w==="users"&&R()},[b,w,S]);const T=s=>s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toString(),se=s=>{switch(s){case"admin":return"error";case"creator":return"default";default:return"secondary"}};return o?e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx("div",{className:"flex items-center justify-center h-[400px]",children:e.jsx(ne,{})})}):h&&h.includes("Forbidden")?e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsx(n,{className:"text-destructive",children:"Accès refusé"}),e.jsx(u,{children:"Vous n'avez pas les permissions nécessaires pour accéder à cette page."})]}),e.jsx(l,{children:e.jsx(C,{onClick:()=>_("/dashboard"),children:"Retour au dashboard"})})]})}):e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs("h1",{className:"text-3xl font-bold mb-2 flex items-center gap-2",children:[e.jsx(le,{className:"h-8 w-8"}),"Dashboard Administrateur"]}),e.jsx("p",{className:"text-muted-foreground",children:"Gestion du système et surveillance des activités"})]}),h&&!h.includes("Forbidden")&&e.jsx(i,{className:"mb-6 border-destructive",children:e.jsxs(c,{children:[e.jsx(n,{className:"text-destructive",children:"Erreur"}),e.jsx(u,{children:h})]})}),e.jsxs(pe,{value:w,onValueChange:H,className:"space-y-4",children:[e.jsxs(je,{children:[e.jsx(v,{value:"overview",children:"Vue d'ensemble"}),e.jsx(v,{value:"users",children:"Utilisateurs"}),e.jsx(v,{value:"audit",children:"Audit"}),e.jsx(v,{value:"security",children:"Sécurité"})]}),e.jsxs(g,{value:"overview",className:"space-y-4",children:[p&&e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[e.jsxs(i,{children:[e.jsxs(c,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(n,{className:"text-sm font-medium",children:"Total utilisateurs"}),e.jsx(de,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(l,{children:[e.jsx("div",{className:"text-2xl font-bold",children:T(p.total_users)}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[p.active_users," actifs (30j)"]})]})]}),e.jsxs(i,{children:[e.jsxs(c,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(n,{className:"text-sm font-medium",children:"Total pistes"}),e.jsx(B,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(l,{children:e.jsx("div",{className:"text-2xl font-bold",children:T(p.total_tracks)})})]}),e.jsxs(i,{children:[e.jsxs(c,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(n,{className:"text-sm font-medium",children:"Total playlists"}),e.jsx(B,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsx(l,{children:e.jsx("div",{className:"text-2xl font-bold",children:T(p.total_playlists)})})]}),e.jsxs(i,{children:[e.jsxs(c,{className:"flex flex-row items-center justify-between space-y-0 pb-2",children:[e.jsx(n,{className:"text-sm font-medium",children:"Activités suspectes"}),e.jsx(I,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(l,{children:[e.jsx("div",{className:"text-2xl font-bold",children:N.length}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Dernières 24h"})]})]})]}),F.length>0&&e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsxs(n,{className:"flex items-center gap-2",children:[e.jsx(oe,{className:"h-5 w-5"}),"Statistiques d'audit"]}),e.jsx(u,{children:"Actions les plus fréquentes"})]}),e.jsx(l,{children:e.jsx("div",{className:"space-y-2",children:F.slice(0,10).map((s,t)=>e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s.action}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.resource})]}),e.jsx(j,{variant:"default",children:s.count})]},t))})})]}),y.length>0&&e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsxs(n,{className:"flex items-center gap-2",children:[e.jsx(ue,{className:"h-5 w-5"}),"Logs récents"]}),e.jsx(u,{children:"Dernières activités enregistrées"})]}),e.jsx(l,{children:e.jsx("div",{className:"space-y-2",children:y.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium",children:s.action}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s.resource," •"," ",V(new Date(s.timestamp||s.created_at),{addSuffix:!0,locale:q})]})]}),e.jsx(j,{variant:"default",children:s.user_id?.slice(0,8)})]},s.id))})})]})]}),e.jsx(g,{value:"users",className:"space-y-4",children:e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsx(n,{children:"Gestion des utilisateurs"}),e.jsx(u,{children:"Liste et gestion des utilisateurs du système"})]}),e.jsxs(l,{children:[e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"relative",children:[e.jsx(me,{className:"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx(xe,{placeholder:"Rechercher un utilisateur...",value:b,onChange:s=>$(s.target.value),className:"pl-8"})]})}),e.jsx("div",{className:"space-y-2",children:Q.map(s=>e.jsx("div",{className:"flex items-center justify-between p-3 border rounded hover:bg-accent cursor-pointer",onClick:()=>_(`/u/${s.username}`),children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"font-medium",children:s.username}),e.jsx(j,{variant:se(s.role),children:s.role}),!s.is_active&&e.jsx(j,{variant:"secondary",children:"Inactif"}),!s.is_verified&&e.jsx(j,{variant:"default",children:"Non vérifié"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.email}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Créé le"," ",new Date(s.created_at).toLocaleDateString("fr-FR")]})]})},s.id))}),A>f&&e.jsx(fe,{currentPage:S,totalPages:Math.ceil(A/f),onPageChange:J,totalItems:A,itemsPerPage:f,showItemsInfo:!0,className:"mt-4"})]})]})}),e.jsx(g,{value:"audit",className:"space-y-4",children:e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsxs(n,{className:"flex items-center gap-2",children:[e.jsx(he,{className:"h-5 w-5"}),"Logs d'audit"]}),e.jsx(u,{children:"Historique complet des activités système"})]}),e.jsxs(l,{children:[e.jsx(C,{onClick:L,variant:"secondary",className:"mb-4",children:"Actualiser"}),e.jsx("div",{className:"space-y-2",children:y.map(s=>e.jsx("div",{className:"p-3 border rounded",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s.action}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s.resource," • ",s.user_id]}),s.metadata&&e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:JSON.stringify(s.metadata)})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:V(new Date(s.timestamp||s.created_at),{addSuffix:!0,locale:q})})]})},s.id))})]})]})}),e.jsx(g,{value:"security",className:"space-y-4",children:e.jsxs(i,{children:[e.jsxs(c,{children:[e.jsxs(n,{className:"flex items-center gap-2",children:[e.jsx(I,{className:"h-5 w-5"}),"Activités suspectes"]}),e.jsx(u,{children:"Activités détectées comme suspectes dans les dernières 24 heures"})]}),e.jsxs(l,{children:[e.jsx(C,{onClick:P,variant:"secondary",className:"mb-4",children:"Actualiser"}),N.length===0?e.jsx("p",{className:"text-muted-foreground",children:"Aucune activité suspecte détectée"}):e.jsx("div",{className:"space-y-2",children:N.map((s,t)=>e.jsxs("div",{className:"p-3 border border-destructive rounded",children:[e.jsx("p",{className:"font-medium text-destructive",children:s.reason||"Activité suspecte"}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s.user_id," • ",s.ip_address]}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:s.description})]},t))})]})]})})]})]})}export{Re as AdminDashboardPage};
//# sourceMappingURL=AdminDashboardPage-D5ThFcyn.js.map