1import{t as s,r as t,h as d,j as e,S as w,C as P,T as I,f as j,Y as $,F as B}from"./index-TdxVxAlO.js";import{A as T,S as p,a as v}from"./AdminLayout-DGuzapTB.js";import{R as F}from"./refresh-cw-Dzc2smng.js";import{C as K}from"./circle-x-hqK9OoCF.js";const M=new Set(["delivered","cancelled","skipped"]);function E(a){return a==="delivered"?"good":["failed","cancelled"].includes(a)?"poor":["pending_configuration","retry_scheduled"].includes(a)?"fair":"info"}function L(a){return a?a.ready?"Provider credentials and sender are available.":a.message||"Configuration is incomplete.":"Checking configurationâ¦"}function X(){const a=s.notifications.list.useQuery(),r=s.delivery.readiness.useQuery(),c=s.delivery.list.useQuery({limit:100}),o=s.delivery.summary.useQuery(),n=s.useUtils(),[l,Q]=t.useState(""),[y,b]=t.useState(""),[g,f]=t.useState(""),[u,q]=t.useState(!0),[h,z]=t.useState(!1),[R,U]=t.useState(()=>crypto.randomUUID()),[m,S]=t.useState(null),x=s.delivery.history.useQuery({id:m??0},{enabled:m!==null}),A=s.delivery.queueBroadcast.useMutation({onSuccess:i=>{d.success(`${i.created} delivery item(s) created${i.duplicateCount?`; ${i.duplicateCount} duplicate item(s) safely skipped`:""}. ${i.created?"Review their lifecycle below.":"No eligible recipients yet."}`),U(crypto.randomUUID()),n.delivery.list.invalidate(),n.delivery.summary.invalidate()},onError:i=>d.error(i.message)}),N=s.delivery.retry.useMutation({onSuccess:i=>{d.success(i.attempted?"Provider attempt completed; review resulting status.":"No provider request was made; configuration is still pending."),n.delivery.list.invalidate(),n.delivery.summary.invalidate()},onError:i=>d.error(i.message)}),C=s.delivery.cancel.useMutation({onSuccess:()=>{d.success("Delivery item cancelled."),n.delivery.list.invalidate(),n.delivery.summary.invalidate()},onError:i=>d.error(i.message)});t.useEffect(()=>{const i=a.data?.find(_=>String(_.id)===l);i&&(b(i.title),f(i.message||`${i.title} 2 3View the update: ${i.url||""}`.trim()))},[l,a.data]);const k=r.data?.provider??"none",D=r.data?.noProviderMode??!0;return e.jsxs(T,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:46",title:"Delivery Queue",description:"Queue deadline and result updates for subscribed readers. In-site alerts stay live independently; outbound records never claim delivery until an external provider confirms it.",actions:e.jsxs("a",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:46",className:"admin-ghost-button",href:"/outbound-delivery-activation.md",target:"_blank",rel:"noreferrer",children:[e.jsx(B,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:46",size:14})," Activation guide"]}),children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:47",className:"admin-stat-grid",children:[e.jsx(p,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:48",label:"Provider mode",value:k==="none"?"No provider":k.replaceAll("_"," + "),delta:D?"Safe no-provider mode":"Credentials required",tone:D?"saffron":"mint",icon:w}),e.jsx(p,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:49",label:"Pending configuration",value:String(o.data?.pending_configuration??0),delta:"No external request made",tone:"saffron",icon:P}),e.jsx(p,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:50",label:"Retry / failed",value:String((o.data?.retry_scheduled??0)+(o.data?.failed??0)),delta:"Review errors before retry",tone:"coral",icon:I}),e.jsx(p,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:51",label:"Provider accepted",value:String(o.data?.queued??0),delta:"Queued is not delivery receipt",tone:"blue",icon:j})]}),D&&e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:53",className:"admin-notice",children:[e.jsx(I,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:53",size:15}),e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:53",children:[e.jsx("strong",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:53",children:"Outbound delivery is code-ready but inactive."})," Choosing a provider in Site Settings and adding verified credentials later will activate send attempts. Current in-site notifications, subscribers, and exports remain fully operational."]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:54",className:"admin-grid-2",children:[e.jsxs(v,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:55",title:"Queue an alert broadcast",description:"Create durable delivery records for active subscribers. SMS is included only for future verified, explicitly opted-in phone numbers.",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:56",className:"admin-form-grid",children:[e.jsxs("label",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:57",className:"span-2",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:57",children:"Use an existing in-site notification"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:57",value:l,onCh
3ange:i=>Q(i.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:57",value:"",children:"Custom delivery content"}),a.data?.filter(i=>i.active).map(i=>e.jsx("option",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:57",value:i.id,children:i.title},i.id))]})]}),e.jsxs("label",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:58",className:"span-2",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:58",children:"Subject"}),e.jsx("input",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:58",value:y,onChange:i=>b(i.target.value),placeholder:"RPSC deadline reminder"})]}),e.jsxs("label",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:59",className:"span-2",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:59",children:"Message"}),e.jsx("textarea",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:59",rows:5,value:g,onChange:i=>f(i.target.value),placeholder:"Write a concise deadline or result updateâ¦"})]}),e.jsxs("label",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:60",className:"admin-check",children:[e.jsx("input",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:60",type:"checkbox",checked:u,onChange:i=>q(i.target.checked)})," Email active subscribers"]}
3),e.jsxs("label",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:61",className:"admin-check",children:[e.jsx("input",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:61",type:"checkbox",checked:h,onChange:i=>z(i.target.checked)})," SMS verified opt-ins"]})]}),e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:63",className:"admin-primary-button",disabled:!y.trim()||!g.trim()||!u&&!h||A.isPending,onClick:()=>A.mutate({notificationId:l?Number(l):null,subject:y,body:g,batchKey:R,channels:[u?"email":null,h?"sms":null].filter(Boolean)}),children:[e.jsx(j,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:63",size:14})," ",A.isPending?"Queueingâ¦":"Create delivery records"]})]}),e.jsx(v,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:65",title:"Credential readiness",description:"Secrets are deliberately excluded from database settings and must be stored securely when you activate a provider.",children:e.jsxs("ul",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:66",className:"admin-list",children:[e.jsxs("li",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:67",children:[e.jsx($,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:67",size:14}),e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:67",children:[e.jsx("strong",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:67",children:"Email"}),e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:67",children:L(r.data?.email)})]})]}),e.jsxs("li",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:68",children:[e.jsx(j,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:68",size:14}),e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:68",children:[e.jsx("strong",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:68",children:"SMS"}),e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:68",children:L(r.data?.sms)})]})]}),e.jsxs("li",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:69",children:[e.jsx(w,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:69",size:14}),e.jsxs("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:69",children:[e.jsx("strong",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:69",children:"Safeguard"}),e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:69",children:"A provider API acceptance is tracked as queued. Only a verified receipt/webhook should mark a recipient delivery as delivered."})]})]})]})})]}),e.jsx(v,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:73",title:"Delivery lifecycle",description:"Use retry only after reviewing the error and correcting configuration. Pending configuration means no email or SMS request has been attempted.",children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-table-wrap",children:e.jsxs("table",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-table",children:[e.jsx("thead",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:[e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Recipient"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Channel"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Status"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Attempts"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Provider detail"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:"Updated"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74"})]})}),e.jsxs("tbody",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:[c.isLoading?e.jsx("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",colSpan:7,children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-empty",children:"Loading delivery recordsâ¦"})})}):c.data?.map(i=>e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:[e.jsxs("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:[e.jsx("strong",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:i.recipient}),e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-table-sub",children:i.subject||"EduPortal update"})]}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:i.channel.toUpperCase()}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:`score-chip ${E(i.status)}`,children:i.status.replaceAll("_"," ")})}),e.jsxs("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:[i.attemptCount," / ",i.maxAttempts]}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:i.errorMessage||i.providerMessageId||(i.status==="queued"?"Provider accepted; awaiting receipt":"â")})}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:new Date(i.updatedAt).toLocaleStr
3ing("en-IN")}),e.jsxs("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-row-actions",children:[e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-ghost-button",onClick:()=>S(i.id),children:[e.jsx(P,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",size:13})," History"]}),!M.has(i.status)&&e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-ghost-button",disabled:N.isPending,onClick:()=>N.mutate({id:i.id}),children:[e.jsx(F,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",size:13})," Retry"]}),!M.has(i.status)&&e.jsxs("button",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-ghost-button danger",disabled:C.isPending,onClick:()=>{confirm("Cancel this delivery record?")&&C.mutate({id:i.id})},children:[e.jsx(K,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",size:13})," Cancel"]})]})]},i.id)),!c.isLoading&&!c.data?.length&&e.jsx("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",children:e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",colSpan:7,children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:74",className:"admin-empty",children:"No outbound delivery records yet. In-site notifications continue to work independently."})})})]})]})})}),m!==null&&e.jsx(v,{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",title:`Attempt history #${m}`,description:"Each retry is preserved as an immutable history record. Provider acceptance remains distinct from recipient delivery confirmation.",actions:e.jsx("button",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:"admin-ghost-button",onClick:()=>S(null),children:"Close history"}),children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:"admin-table-wrap",children:e.jsxs("table",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:"admin-table",children:[e.jsx("thead",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:[e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Attempt"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Action"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Status"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Provider reference / error"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Started"}),e.jsx("th",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:"Completed"})]})}),e.jsxs("tbody",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:[x.isLoading?e.jsx("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",colSpan:6,children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:"admin-empty",children:"Loading attempt historyâ¦"})})}):x.data?.map(i=>e.jsxs("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:[e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:i.attemptNumber||"â"}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:i.action.replaceAll("_"," ")}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:e.jsx("span",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:`score-chip ${E(i.status)}`,children:i.status.replaceAll("_"," ")})}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:e.jsx("small",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:i.errorMessage||i.providerMessageId||i.errorCode||"â"})}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:i.attemptedAt?new Date(i.attemptedAt).toLocaleString("en-IN"):"â"}),e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:i.completedAt?new Date(i.completedAt).toLocaleStr
3ing("en-IN"):"â"})]},i.id)),!x.isLoading&&!x.data?.length&&e.jsx("tr",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",children:e.jsx("td",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",colSpan:6,children:e.jsx("div",{"data-loc":"client/src/pages/admin/AdminDelivery.tsx:76",className:"admin-empty",children:"No delivery events have been recorded yet."})})})]})]})})})]})}export{X 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.