1import{r,j as e,a8 as b,T as N,k as w,aI as Y,ah as l,s as h,d as I}from"./index-WiYOppbq.js";import{A as ee}from"./AdminLayout-Bx-gy48z.js";import{C as R,a as z,b as K,d as O,c as U}from"./card-C_ptBL97.js";import{B as y}from"./badge-DJc_n6hF.js";import{S as q}from"./send-CE7WhniT.js";import{T as se}from"./trash-2-9Wml9UHN.js";import{P as te}from"./plus-BUjSokme.js";import{S as ae}from"./save-CYYJIimp.js";import{C as ne}from"./circle-check-Dz8sPyZQ.js";import{C as g}from"./circle-x-D27CYFio.js";import"./sidebar-BhGg8DPR.js";import"./use-mobile-DmL4H4u1.js";import"./separator-CgfkoQb4.js";import"./skeleton-5fXjnHUF.js";import"./file-text-C8T1DGa8.js";import"./package-CJ2A47KB.js";import"./image-n7cmdYfv.js";import"./chart-column-ogzJM-AP.js";import"./receipt-aG5UuOtJ.js";import"./truck-6aimhdzq.js";import"./palette-CPVc6nvm.js";import"./wrench-DrbQI_C9.js";import"./settings-Ciuh58AF.js";function Te(){const[H,P]=r.useState([]),[Z,v]=r.useState(!0),[S,k]=r.useState(null),[x,C]=r.useState({}),[E,T]=r.useState({}),[D,F]=r.useState(""),[M,J]=r.useState(""),[u,_]=r.useState(!1),[B,f]=r.useState([]),V=async()=>{const s=D.trim().toLowerCase();if(!s||!s.includes("@")){l.error("Bitte eine gültige E-Mail eingeben");return}_(!0);const a=new Date().toISOString(),t=`admin-test-${crypto.randomUUID()}`;try{const{error:n}=await h.functions.invoke("send-transactional-email",{body:{templateName:"admin-test-email",recipientEmail:s,idempotencyKey:t,templateData:{sentAt:new Date().toLocaleString("de-DE"),note:M||void 0}}});if(n)throw n;f(o=>[{recipient:s,status:"pending",sentAt:a},...o]);const c=Date.now()+3e4;let i="pending",m=null;for(;Date.now()<c;){await new Promise(p=>setTimeout(p,2e3));const{data:o}=await h.from("email_send_log").select("status, error_message, created_at").eq("template_name","admin-test-email").eq("recipient_email",s).gte("created_at",a).order("created_at",{ascending:!1}).limit(5),d=o==null?void 0:o[0];if(d&&(i=d.status,m=d.error_message??null,i!=="pending"))break}f(o=>{const d=[...o],p=d.findIndex($=>$.recipient===s&&$.sentAt===a);return p>=0&&(d[p]={...d[p],status:i,error:m}),d}),i==="sent"?l.success(`Test-Mail an ${s} zugestellt`):i==="pending"?l.info(`Test-Mail an ${s} wurde in die Warteschlange gestellt`):l.error(`Test-Mail Status: ${i}${m?" â "+m:""}`)}catch(n){l.error("Versand fehlgeschlagen: "+((n==null?void 0:n.message)??String(n))),f(c=>[{recipient:s,status:"failed",error:(n==null?void 0:n.message)??String(n),sentAt:a},...c])}finally{_(!1)}},W=s=>{const a={sent:{label:"Zugestellt",cls:"bg-green-100 text-green-800 border-green-300",icon:ne},pending:{label:"Warteschlange",cls:"bg-yellow-100 text-yellow-800 border-yellow-300",icon:I},failed:{label:"Fehlgeschlagen",cls:"bg-red-100 text-red-800 border-red-300",icon:g},dlq:{label:"Endgültig fehlgeschlagen",cls:"bg-red-100 text-red-800 border-red-300",icon:g},suppressed:{label:"Unterdrückt",cls:"bg-gray-200 text-gray-800 border-gray-300",icon:g},bounced:{label:"Bounce",cls:"bg-red-100 text-red-800 border-red-300",icon:g},complained:{label:"Beschwerde",cls:"bg-red-100 text-red-800 border-red-300",icon:g},unknown:{label:"Unbekannt",cls:"bg-gray-100 text-gray-800 border-gray-300",icon:I}},t=a[s]??a.unknown,n=t.icon;return e.jsxs(y,{variant:"outline",className:`gap-1 ${t.cls}`,children:[e.jsx(n,{className:"h-3 w-3"})," ",t.label]})},L=async()=>{v(!0);const{data:s,error:a}=await h.from("notification_settings").select("*").order("category",{ascending:!0}).order("label",{ascending:!0});if(a)l.error("Fehler beim Laden: "+a.message);else{const t=s??[];P(t);const n={};t.forEach(c=>n[c.id]={...c,recipients:[...c.recipients??[]]}),C(n)}v(!1)};r.useEffect(()=>{L()},[]);const j=(s,a)=>C(t=>({...t,[s]:{...t[s],...a}})),A=s=>{const a=(E[s]??"").trim().toLowerCase();if(!a||!a.includes("@")){l.error("Bitte eine gültige E-Mail eingeben");return}const t=x[s];if(t.recipients.includes(a)){l.info("E-Mail ist bereits hinterlegt");return}j(s,{recipients:[...t.recipients,a]}),T(n=>({...n,[s]:""}))},G=(s,a)=>{const t=x[s];j(s,{recipients:t.recipients.filter(n=>n!==a)})},X=async s=>{const a=x[s];k(s);const{error:t}=await h.from("notification_settings").update({enabled:a.enabled,recipients:a.recipients}).eq("id",s);k(null),t?l.error("Speichern fehlgeschlagen: "+t.message):(l.success("Gespeichert"),L())},Q=H.reduce((s,a)=>{var t;return(s[t=a.category]??(s[t]=[])).push(a),s},{});return e.jsx(ee,{children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-display",children:"Benachrichtigungen"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Zentrale Verwaltung aller automatisierten E-Mails. Hier kannst du festlegen, ob eine Benachrichtigung verschickt wird und an welche internen Empfänger."})]}),e.jsxs(R,{children:[e.jsxs(z,{children:[e.jsxs(K,{className:"text-base flex items-center gap-2",children:[e.jsx(q,{className:"h-4 w-4"})," Test-E-Mail senden"]}),e.jsx(O,{children:"Sende eine Test-Mail an eine beliebige Adresse und sieh den Zustellstatus live."})]}),e.jsxs(U,{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsx(b,{type:"email",placeholder:"[email protected]",value:D,onChange:s=>F(s.target.value),disabled:u}),e.jsx(b,{type:"text",placeholder:"Optionale Notiz (erscheint in der Mail)",value:M,onChange:s=>J(s.target.value),disabled:u}),e.jsxs(N,{onClick:V,disabled:u,className:"shrink-0",children:[u?e.jsx(w,{className:"h-4 w-4 mr-1 animate-spin"}):e.jsx(q,{className:"h-4 w-4 mr-1"}),"Senden"]})]}),B.length>0&&e.jsxs("div",{className:"space-y-2 pt-2 border-t",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:"Letzte Tests"}),B.slice(0,8).map((s,a)=>e.jsxs("div",{className:"flex items-center justify-between gap-2 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx("span",{className:"truncate",children:s.recipient}),e.jsx("span",{className:"text-xs text-muted-foreground",children:new Date(s.sentAt).toLocaleTimeString("de-DE")})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[s.error&&e.jsx("span",{className:"text-xs text-red-600 truncate max-w-[200px]",title:s.error,children:s.error}),W(s.status)]})]},a))]})]})]}),Z?e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[e.jsx(w,{className:"h-4 w-4 animate-spin"})," Ladeâ¦"]}):Object.entries(Q).map(([s,a])=>e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-sm uppercase tracking-wide text-muted-foreground",children:s}),a.map(t=>{const n=x[t.id]??t,c=n.enabled!==t.enabled||JSON.stringify(n.recipients)!==JSON.stringify(t.recipients);return e.jsxs(R,{children:[e.jsxs(z,{className:"flex flex-row items-start justify-between gap-4 space-y-0",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs(K,{className:"text-base flex items-center gap-2",children:[t.label,e.jsx(y,{variant:"outline",className:"text-[10px] font-mono",children:t.key})]}),t.description&&e.jsx(O,{children:t.description})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:n.enabled?"aktiv":"deaktiviert"}),e.jsx(Y,{checked:n.enabled,onCheckedChange:i=>
1j(t.id,{enabled:i})})]})]}),e.jsxs(U,{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium mb-2",children:"Empfänger"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[n.recipients.length===0&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"Keine internen Empfänger hinterlegt"}),n.recipients.map(i=>e.jsxs(y,{variant:"secondary",className:"gap-1 pr-1",children:[i,e.jsx("button",{onClick:()=>G(t.id,i),className:"ml-1 rounded hover:bg-destructive/20 p-0.5","aria-label":`Entfernen ${i}`,children:e.jsx(se,{className:"h-3 w-3"})})]},i))]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(b,{type:"email",placeholder:"[email protected]",value:E[t.id]??"",onChange:i=>T(m=>({...m,[t.id]:i.target.value})),onKeyDown:i=>{i.key==="Enter"&&(i.preventDefault(),A(t.id))}}),e.jsxs(N,{variant:"outline",onClick:()=>A(t.id),children:[e.jsx(te,{className:"h-4 w-4 mr-1"})," Hinzufügen"]})]}),e.jsx("div",{className:"flex justify-end",children:e.jsxs(N,{onClick:()=>X(t.id),disabled:!c||S===t.id,size:"sm",children:[S===t.id?e.jsx(w,{className:"h-4 w-4 mr-1 animate-spin"}):e.jsx(ae,{className:"h-4 w-4 mr-1"}),"Speichern"]})})]})]},t.id)})]},s))]})})}export{Te 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.