1import{d as ne,a as le,u as de,r as o,s as x,j as e}from"./index-DfbPMtFZ.js";import{H as ce,B as g,U as oe,F as he}from"./Footer-DkkU8vMF.js";import{B as d,I as xe}from"./Combination-DdoM_vzj.js";import{C as u,b as m,c as j,a as f,d as S}from"./card-DN9U93Ar.js";import{T as ue,a as me,b as _,c as k}from"./tabs-O9pKp1Yw.js";import{T as y,a as z,b as v,c as t,d as D,e as a}from"./table-ChU2A1Ri.js";import{D as C,a as B,b as F,c as A,d as E,e as I,f as je}from"./dialog-CUfzLZNo.js";import{T as M}from"./textarea-B6myJTMQ.js";import{L as fe}from"./label-BPIIdxfs.js";import{S as ve,a as pe,b as ge,c as Ne,d as T}from"./select-BpTHHfDC.js";import{S as be}from"./SEOHead-CT9CEd2t.js";import{E as J}from"./eye-CWNprXLp.js";import{S as we}from"./square-pen-DF2sHq46.js";import{S as P}from"./star-DebO7FFT.js";import{C as $}from"./circle-x-3O67_aVB.js";import{C as X}from"./circle-check-big-Dpzop9Rf.js";import{F as Se}from"./flag-lqiTSeng.js";import"./shield-gTmsYmaS.js";import"./index-BdQq_4o_.js";import"./index-DL1OQS8_.js";import"./chevron-down-B7uBTmvX.js";const Ue=()=>{const{user:h}=ne(),{toast:c}=le(),p=de(),[Z,Q]=o.useState(!1),[W,Y]=o.useState(!0),[N,ee]=o.useState([]),[G,se]=o.useState([]),[H,re]=o.useState([]),[i,V]=o.useState(null),[l,ie]=o.useState(null),[b,w]=o.useState("");o.useEffect(()=>{if(!h){p("/auth");return}te()},[h,p]);const te=async()=>{try{const{data:s,error:r}=await x.rpc("has_role",{_user_id:h==null?void 0:h.id,_role:"admin"});if(r){console.error("Error checking admin status:",r),p("/dashboard");return}if(!s){c({title:"Zugriff verweigert",description:"Sie haben keine Berechtigung für das Admin-Dashboard.",variant:"destructive"}),p("/dashboard");return}Q(!0),R()}catch(s){console.error("Error checking admin status:",s),p("/dashboard")}finally{Y(!1)}},R=async()=>{await Promise.all([q(),K(),O()])},q=async()=>{try{const{data:s,error:r}=await x.from("listings").select("*").order("created_at",{ascending:!1});if(r)throw r;ee(s||[])}catch(s){console.error("Error fetching listings:",s)}},K=async()=>{try{const{data:s,error:r}=await x.from("profiles").select("*").order("created_at",{ascending:!1});if(r)throw r;se(s||[])}catch(s){console.error("Error fetching profiles:",s)}},O=async()=>{try{const{data:s,error:r}=await x.from("listing_reports").select(` 2 *, 3 listing:listings(title, user_id) 4 `).eq("status","pending").order("created_at",{ascending:!1});if(r)throw r;re(s||[])}catch(s){console.error("Error fetching reports:",s)}},ae=async(s,r)=>{try{const{error:n}=await x.from("listings").update({status:r}).eq("id",s);if(n)throw n;c({title:"Status aktualisiert",description:`Inserat-Status wurde auf "${r}" geändert.`}),q()}catch(n){console.error("Error updating listing status:",n),c({title:"Fehler",description:"Status konnte nicht aktualisiert werden.",variant:"destructive"})}},L=async(s,r)=>{try{const{error:n}=await x.from("profiles").update({is_verified:r,verification_notes:b||null}).eq("user_id",s);if(n)throw n;c({title:"Verifizierung aktualisiert",description:`Benutzer wurde ${r?"verifiziert":"nicht verifiziert"}.`}),w(""),K()}catch(n){console.error("Error updating user verification:",n),c({title:"Fehler",description:"Verifizierung konnte nicht aktualisiert werden.",variant:"destructive"})}},U=async(s,r)=>{try{const{error:n}=await x.from("listing_reports").update({status:r,reviewed_at:new Date().toISOString(),reviewed_by:h==null?void 0:h.id,admin_notes:b||null}).eq("id",s);if(n)throw n;c({title:"Bericht bearbeitet",description:`Bericht wurde als "${r}" markiert.`}),w(""),O()}catch(n){console.error("Error resolving report:",n),c({title:"Fehler",description:"Bericht konnte nicht bearbeitet werden.",variant:"destructive"})}};return W?e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"Lade Admin-Dashboard..."})]})}):Z?e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx(be,{title:"Admin Dashboard - Fitnessprofi",description:"Administrationsbereich für die Moderation von Inseraten und Benutzern",noIndex:!0}),e.jsx(ce,{}),e.jsxs("main",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-3xl font-bold text-foreground",children:"Admin Dashboard"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"Verwaltung von Inseraten, Benutzern und Berichten"})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-6 mb-8",children:[e.jsxs(u,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(j,{className:"text-sm font-medium",children:"Gesamt Inserate"})}),e.jsx(f,{children:e.jsx("div",{className:"text-2xl font-bold",children:N.length})})]}),e.jsxs(u,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(j,{className:"text-sm font-medium",children:"Aktive Inserate"})}),e.jsx(f,{children:e.jsx("div",{className:"text-2xl font-bold text-green-600",children:N.filter(s=>s.status==="active").length})})]}),e.jsxs(u,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(j,{className:"text-sm font-medium",children:"Registrierte Benutzer"})}),e.jsx(f,{children:e.jsx("div",{className:"text-2xl font-bold",children:G.length})})]}),e.jsxs(u,{children:[e.jsx(m,{className:"pb-2",children:e.jsx(j,{className:"text-sm font-medium",children:"Offene Berichte"})}),e.jsx(f,{children:e.jsx("div",{className:"text-2xl font-bold text-orange-600",children:H.length})})]})]}),e.jsxs(ue,{defaultValue:"listings",className:"space-y-6",children:[e.jsxs(me,{children:[e.jsx(_,{value:"listings",children:"Inserate"}),e.jsx(_,{value:"featured",children:"Featured"}),e.jsx(_,{value:"users",children:"Benutzer"}
4),e.jsx(_,{value:"reports",children:"Berichte"})]}),e.jsx(k,{value:"listings",className:"space-y-6",children:e.jsxs(u,{children:[e.jsxs(m,{children:[e.jsx(j,{children:"Inserate verwalten"}),e.jsx(S,{children:"Ãberprüfen und moderieren Sie alle Inserate auf der Plattform"})]}),e.jsx(f,{children:e.jsxs(y,{children:[e.jsx(z,{children:e.jsxs(v,{children:[e.jsx(t,{children:"Titel"}),e.jsx(t,{children:"Preis"}),e.jsx(t,{children:"Status"}),e.jsx(t,{children:"Kategorie"}),e.jsx(t,{children:"Erstellt"}),e.jsx(t,{children:"Aktionen"})]})}),e.jsx(D,{children:N.map(s=>e.jsxs(v,{children:[e.jsx(a,{className:"font-medium",children:s.title}),e.jsxs(a,{children:["â¬",s.price.toFixed(2)]}),e.jsx(a,{children:e.jsx(g,{variant:s.status==="active"?"default":"secondary",children:s.status})}),e.jsx(a,{children:s.category}),e.jsx(a,{children:new Date(s.created_at).toLocaleDateString("de-DE")}),e.jsx(a,{children:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(d,{variant:"outline",size:"sm",onClick:()=>p(`/buy/${s.id}`),children:e.jsx(J,{className:"w-4 h-4"})}),e.jsxs(C,{children:[e.jsx(B,{asChild:!0,children:e.jsx(d,{variant:"outline",size:"sm",onClick:()=>V(s),children:e.jsx(we,{className:"w-4 h-4"})})}),e.jsxs(F,{children:[e.jsxs(A,{children:[e.jsx(E,{children:"Inserat moderieren"}),e.jsx(I,{children:"Status des Inserats ändern"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium",children:i==null?void 0:i.title}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[i==null?void 0:i.description.substring(0,100),"..."]})]}),e.jsxs(ve,{onValueChange:r=>ae(i==null?void 0:i.id,r),children:[e.jsx(pe,{children:e.jsx(ge,{placeholder:"Status auswählen"})}),e.jsxs(Ne,{children:[e.jsx(T,{value:"active",children:"Aktiv"}),e.jsx(T,{value:"sold",children:"Verkauft"}),e.jsx(T,{value:"suspended",children:"Gesperrt"}),e.jsx(T,{value:"deleted",children:"Gelöscht"})]})]})]})]})]})]})})]},s.id))})]})})]})}),e.jsx(k,{value:"featured",className:"space-y-6",children:e.jsxs(u,{children:[e.jsxs(m,{children:[e.jsx(j,{children:"Featured Listings verwalten"}),e.jsx(S,{children:"Verwalten Sie bezahlte Featured Listings und deren Laufzeit"})]}),e.jsx(f,{children:e.jsxs(y,{children:[e.jsx(z,{children:e.jsxs(v,{children:[e.jsx(t,{children:"Titel"}),e.jsx(t,{children:"Preis"}),e.jsx(t,{children:"Featured Status"}),e.jsx(t,{children:"Läuft bis"}),e.jsx(t,{children:"Aktionen"})]})}),e.jsx(D,{children:N.map(s=>e.jsxs(v,{children:[e.jsx(a,{className:"font-medium",children:s.title}),e.jsxs(a,{children:["â¬",s.price.toFixed(2)]}),e.jsx(a,{children:s.is_featured?e.jsxs(g,{className:"bg-accent text-accent-foreground",children:[e.jsx(P,{className:"w-3 h-3 mr-1"}),"Featured"]}):e.jsx(g,{variant:"outline",children:"Normal"})}),e.jsx(a,{children:s.featured_until?e.jsx("span",{className:new Date(s.featured_until)<new Date?"text-destructive":"text-foreground",children:new Date(s.featured_until).toLocaleDateString("de-DE")}):e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx(a,{children:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsxs(C,{children:[e.jsx(B,{asChild:!0,children:e.jsx(d,{variant:s.is_featured?"outline":"default",size:"sm",onClick:()=>V(s),children:s.is_featured?e.jsxs(e.Fragment,{children:[e.jsx($,{className:"w-4 h-4 mr-1"}),"Deaktivieren"]}):e.jsxs(e.Fragment,{children:[e.jsx(P,{className:"w-4 h-4 mr-1"}),"Aktivieren"]})})}),e.jsxs(F,{children:[e.jsxs(A,{children:[e.jsx(E,{children:"Featured Status verwalten"}),e.jsx(I,{children:"Inserat als Featured markieren oder deaktivieren"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium mb-2",children:i==null?void 0:i.title}),e.jsxs("p",{className:"text-sm text-muted-foreground mb-4",children:["â¬",i==null?void 0:i.price.toFixed(2)," ⢠",i==null?void 0:i.category]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(fe,{children:"Featured bis (optional)"}),e.jsx(xe,{type:"datetime-local",defaultValue:i!=null&&i.featured_until?new Date(i.featured_until).toISOString().slice(0,16):"",onCh
4ange:r=>{i&&V({...i,featured_until:r.target.value?new Date(r.target.value).toISOString():void 0})}}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Leer lassen für unbegrenzte Laufzeit"})]})]}),e.jsx(je,{children:e.jsx(d,{onClick:async()=>{if(i)try{const{error:r}=await x.from("listings").update({is_featured:!i.is_featured,featured_until:i.featured_until||null}).eq("id",i.id);if(r)throw r;c({title:"Erfolgreich aktualisiert",description:`Featured Status für "${i.title}" wurde aktualisiert.`}),R()}catch(r){console.error("Error updating featured status:",r),c({title:"Fehler",description:"Featured Status konnte nicht aktualisiert werden.",variant:"destructive"})}},children:i!=null&&i.is_featured?"Deaktivieren":"Als Featured markieren"})})]})]}),e.jsx(d,{variant:"outline",size:"sm",onClick:()=>p(`/buy/${s.id}`),children:e.jsx(J,{className:"w-4 h-4"})})]})})]},s.id))})]})})]})}),e.jsx(k,{value:"users",className:"space-y-6",children:e.jsxs(u,{children:[e.jsxs(m,{children:[e.jsx(j,{children:"Benutzer verwalten"}),e.jsx(S,{children:"Ãberprüfen und verifizieren Sie Benutzerkonten"})]}),e.jsx(f,{children:e.jsxs(y,{children:[e.jsx(z,{children:e.jsxs(v,{children:[e.jsx(t,{children:"E-Mail"}),e.jsx(t,{children:"Anzeigename"}),e.jsx(t,{children:"Verkäufer"}),e.jsx(t,{children:"Verifiziert"}),e.jsx(t,{children:"Bewertung"}),e.jsx(t,{children:"Registriert"}),e.jsx(t,{children:"Aktionen"})]})}),e.jsx(D,{children:G.map(s=>e.jsxs(v,{children:[e.jsx(a,{className:"font-medium",children:s.email}),e.jsx(a,{children:s.display_name||"Nicht gesetzt"}),e.jsx(a,{children:e.jsx(g,{variant:s.is_seller?"default":"secondary",children:s.is_seller?"Ja":"Nein"})}),e.jsx(a,{children:e.jsx(g,{variant:s.is_verified?"default":"secondary",children:s.is_verified?"Verifiziert":"Nicht verifiziert"})}),e.jsx(a,{children:s.rating_average?`${s.rating_average.toFixed(1)} (${s.rating_count})`:"Keine Bewertungen"}),e.jsx(a,{children:new Date(s.created_at).toLocaleDateString("de-DE")}),e.jsx(a,{children:e.jsxs(C,{children:[e.jsx(B,{asChild:!0,children:e.jsx(d,{variant:"outline",size:"sm",onClick:()=>ie(s),children:e.jsx(oe,{className:"w-4 h-4"})})}),e.jsxs(F,{children:[e.jsxs(A,{children:[e.jsx(E,{children:"Benutzer moderieren"}),e.jsx(I,{children:"Verifizierungsstatus ändern"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium",children:l==null?void 0:l.email}),e.jsx("p",{className:"text-sm text-muted-foreground",children:(l==null?void 0:l.display_name)||"Kein Anzeigename"})]}),e.jsx(M,{placeholder:"Admin-Notizen (optional)",value:b,onChange:r=>w(r.target.value)}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsxs(d,{onClick:()=>L(l==null?void 0:l.user_id,!0),className:"flex-1",children:[e.jsx(X,{className:"w-4 h-4 mr-2"}),"Verifizieren"]}),e.jsxs(d,{variant:"outline",onClick:()=>L(l==null?void 0:l.user_id,!1),className:"flex-1",children:[e.jsx($,{className:"w-4 h-4 mr-2"}),"Nicht verifiziert"]})]})]})]})]})})]},s.user_id))})]})})]})}),e.jsx(k,{value:"reports",className:"space-y-6",children:e.jsxs(u,{children:[e.jsxs(m,{children:[e.jsx(j,{children:"Berichte verwalten"}),e.jsx(S,{children:"Bearbeiten Sie gemeldete Inserate und Inhalte"})]}),e.jsx(f,{children:e.jsxs(y,{children:[e.jsx(z,{children:e.jsxs(v,{children:[e.jsx(t,{children:"Inserat"}),e.jsx(t,{children:"Grund"}),e.jsx(t,{children:"Beschreibung"}),e.jsx(t,{children:"Gemeldet am"}),e.jsx(t,{children:"Aktionen"})]})}),e.jsx(D,{children:H.map(s=>{var r;return e.jsxs(v,{children:[e.jsx(a,{className:"font-medium",children:((r=s.listing)==null?void 0:r.title)||"Gelöschtes Inserat"}),e.jsx(a,{children:e.jsx(g,{variant:"outline",children:s.reason})}),e.jsx(a,{className:"max-w-xs truncate",children:s.description||"Keine Beschreibung"}),e.jsx(a,{children:new Date(s.created_at).toLocaleDateString("de-DE")}),e.jsx(a,{children:e.jsxs(C,{children:[e.jsx(B,{asChild:!0,children:e.jsx(d,{variant:"outline",size:"sm",children:e.jsx(Se,{className:"w-4 h-4"})})}),e.jsxs(F,{children:[e.jsxs(A,{children:[e.jsx(E,{children:"Bericht bearbeiten"}),e.jsx(I,{children:"Entscheiden Sie über diesen Bericht"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("h4",{className:"font-medium",children:["Grund: ",s.reason]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.description||"Keine zusätzliche Beschreibung"})]}),e.jsx(M,{placeholder:"Admin-Notizen zur Entscheidung",value:b,onChange:n=>w(n.target.value)}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsxs(d,{onClick:()=>U(s.id,"resolved"),className:"flex-1",children:[e.jsx(X,{className:"w-4 h-4 mr-2"}),"Berechtigt"]}),e.jsxs(d,{variant:"outline",onClick:()=>U(s.id,"dismissed"),className:"flex-1",children:[e.jsx($,{className:"w-4 h-4 mr-2"}),"Abweisen"]})]})]})]})]})})]},s.id)})})]})})]})})]})]}),e.jsx(he,{})]}):null};export{Ue as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.