1import{c as Ne,j as e,X as $e,d as Pe,r as o,u as Ee,i as Me,l as ze,b as Ie,o as _e}from"./index-CyVA1wZG.js";import{c as Ue,b3 as N,b4 as y,b5 as w,e as ae,bh as H,bi as X,w as fe,l as Ae,aK as pe,bq as ne}from"./impersonation-banner-D_-on_xF.js";import{f as D}from"./timezone-utils-Di2WsDPr.js";import{P as re}from"./page-shell-Dh0kFaWJ.js";import{L as ve}from"./loading-DfhTHglN.js";import{C as he,P as Ke}from"./colors-CdgjSOMV.js";import{R as Oe,E as qe,X as Be,Y as We,B as Ze,K as He}from"./generateCategoricalChart-yYT6d1rt.js";import{L as Xe,a as ie}from"./LineChart-Bg__41v1.js";import{m as Re}from"./maskUtils-Yp8-D2EU.js";import{S as Ge}from"./send-3NBqOeP2.js";import{c as Ye}from"./App-CWO1MySO.js";import{E as Qe}from"./eye-nDwGkKxV.js";import{N as ue}from"./nova-resource-page-tJJ4o3y3.js";import{N as Je}from"./nova-status-tiles-CdCILmr5.js";import{a as Ve,N as Se}from"./date-time-picker-Cq4LNC5d.js";import{N as De}from"./nova-empty-state-BKte_8-o.js";import{a as et}from"./nova-page-loading-skeleton-BazY73MQ.js";import{N as tt,a as ce}from"./nova-tabs-4Yum497P.js";import{N as st}from"./nova-pagination-2PP_Mw-p.js";import{a as Te,c as ke}from"./nova-table-columns-C66BCWpB.js";import{T as at,b as le,c as de}from"./tabs-BSv5s0B5.js";import{A as nt}from"./arrow-left-DYJneMpH.js";import{D as rt}from"./download-BgrmGuYP.js";import"./index-Cjkq8cs_.js";import"./format-cwji8z7Q.js";import"./subDays-DPIRz014.js";import"./useDocForPage-BGLLPY-H.js";import"./index-dgb7teI0.js";import"./value-BTdN53H7.js";import"./minimize-2-N7svW4OO.js";import"./calendar-DeeSB-aS.js";import"./clock-UctaHBkk.js";import"./calendar-UomhDNlY.js";import"./skeleton-B2sPiNj4.js";import"./checkbox-Bz5Ppm-b.js";function Fe({data:t}){const{t:r}=Ne();return e.jsx(Oe,{width:"100%",height:300,children:e.jsxs(Xe,{data:t,children:[e.jsx(qe,{strokeDasharray:"3 3"}),e.jsx(Be,{dataKey:"date"}),e.jsx(We,{}),e.jsx(Ze,{}),e.jsx(He,{}),e.jsx(ie,{type:"monotone",dataKey:"sent",stroke:he.blue500,strokeWidth:2,name:`${r("dashboard.sent")}`}),e.jsx(ie,{type:"monotone",dataKey:"delivered",stroke:Ke,strokeWidth:2,name:`${r("dashboard.delivered")}`}),e.jsx(ie,{type:"monotone",dataKey:"read",stroke:he.amber400,strokeWidth:2,name:`${r("dashboard.read")}`}),e.jsx(ie,{type:"monotone",dataKey:"failed",stroke:he.red500,strokeWidth:2,name:`${r("dashboard.failed")}`})]})})}const _=(t,r)=>Me.getState().t(t,r),ge=({data:t,timezone:r})=>!t||t.length===0?e.jsx("div",{className:"h-64 flex items-center justify-center text-content-tertiary",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"w-8 h-8 mx-auto mb-2 text-content-muted"}),e.jsx("p",{children:_("campaigns.noChartDataAvailable")})]})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-sm text-content-secondary mb-4",children:"Daily Performance Overview"}),t.map((d,f)=>e.jsxs("div",{className:"border rounded-lg p-4 bg-surface",children:[e.jsxs("div",{className:"flex justify-between items-center mb-3",children:[e.jsx("span",{className:"font-medium text-content",children:d.date}),e.jsxs("div",{className:"text-sm text-content-tertiary",children:["Total: ",(d.sent||0)+(d.delivered||0)+(d.read||0)+(d.failed||0)]})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 text-sm",children:[e.jsxs("div",{className:"text-center p-2 bg-tint-info rounded",children:[e.jsx("div",{className:"text-blue-600 font-bold text-lg",children:d.sent||0}),e.jsx("div",{className:"text-content-secondary text-xs",children:_("campaigns.sent")})]}),e.jsxs("div",{className:"text-center p-2 bg-tint-success rounded",children:[e.jsx("div",{className:"text-green-600 font-bold text-lg",children:d.delivered||0}),e.jsx("div",{className:"text-content-secondary text-xs",children:_("campaigns.delivered")})]}),e.jsxs("div",{className:"text-center p-2 bg-tint-warning rounded",children:[e.jsx("div",{className:"text-orange-600 font-bold text-lg",children:d.read||0}),e.jsx("div",{className:"text-content-secondary text-xs",children:_("campaigns.read")})]}),e.jsxs("div",{className:"text-center p-2 bg-tint-danger rounded",children:[e.jsx("div",{className:"text-red-600 font-bold text-lg",children:d.failed||0}),e.jsx("div",{className:"text-content-secondary text-xs",children:_("campaigns.failed")})]})]})]},f))]}),it=({data:t,timezone:r})=>{const[d,f]=o.useState(!1);if(o.useEffect(()=>{f(!1)},[t]),d)return e.jsx(ge,{data:t,timezone:r});try{return!t||!Array.isArray(t)||t.length===0?e.jsx("div",{className:"h-64 flex items-center justify-center text-content-tertiary",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"w-8 h-8 mx-auto mb-2 text-content-muted"}),e.jsx("p",{children:_("campaigns.noChartDataAvailable")})]})}):t.some(m=>m&&typeof m=="object"&&m.date&&m.date!=="Unknown"&&(m.sent>0||m.delivered>0||m.read>0||m.failed>0))?e.jsx("div",{children:e.jsx(Fe,{data:t})}):e.jsx(ge,{data:t,timezone:r})}catch(P){return console.error("Chart error:",P),f(!0),e.jsx(ge,{data:t,timezone:r})}};function ct(){const{t}=Ne(),{campaignId:r}=$e(),{user:d}=Pe(),{hasPermission:f}=Ue(),P=f("contacts:mask"),[m,ye]=o.useState(!1),[A,T]=o.useState(null),[oe,G]=o.useState(!0),[O,q]=o.useState(null),[Y,me]=o.useState(0),[E,R]=o.use
1State(1),[B]=o.useState(10),C=d?.timezone||"UTC";o.useEffect(()=>{if(!r)return;(async()=>{G(!0),q(null);try{const c=await fetch(`/api/analytics/campaigns/${r}?tz=${encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC")}`);if(!c.ok)throw new Error(`Failed to fetch campaign analytics: ${c.status} ${c.statusText}`);const x=await c.json();T(x)}catch(c){console.error("Fetch error:",c),q(c.message||"Unknown error occurred while fetching campaign data")}finally{G(!1)}})()},[r,Y]);const{data:Q,isLoading:xe,refetch:be}=Ee({queryKey:[`/api/analytics/campaigns/${r}/messages`,E,B],queryFn:async()=>{const s=await fetch(`/api/analytics/campaigns/${r}/messages?page=${E}&limit=${B}`);if(!s.ok)throw new Error("Failed to fetch campaign messages");return s.json()},enabled:!!r}),k=Q?.data||[],h=Q?.pagination||{page:1,limit:10,total:0,totalPages:0},l=A?.campaign||{},we=Array.isArray(A?.dailyStats)?A.dailyStats:[],F=Array.isArray(A?.recipientStats)?A.recipientStats:[],M=Array.isArray(A?.errorAnalysis)?A.errorAnalysis:[],n=s=>{const c=Number(s);return isNaN(c)||c<0?0:c},J=n(l.deliveredCount),b=n(l.recipientCount),L=n(l.readCount);n(l.repliedCount);const u=n(l.failedCount),z=n(l.sentCount)+J+L,$=J+L,V=b>0?Math.round($/b*100):0,W=s=>{const c=(s||"").toLowerCase();return c?c.charAt(0).toUpperCase()+c.slice(1):"Unknown"},U=b>0?Math.round(L/b*100):0,Z=b>0?Math.round(u/b*100):0,ee=we.map((s,c)=>{const x=p=>{if(p==null)return 0;const g=Number(p);return isNaN(g)?0:g},I=p=>{try{if(!p)return`Day ${c+1}`;let g;if(typeof p=="string")p.match(/^\d{4}-\d{2}-\d{2}$/)?g=new Date(p+"T00:00:00.000Z"):g=new Date(p);else if(p instanceof Date)g=p;else return`Day ${c+1}`;return isNaN(g.getTime())?(console.warn("Invalid date:",p),`Day ${c+1}`):g.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"})}catch(g){return console.error("Error formatting date:",g,p),`Day ${c+1}`}};return!s||typeof s!="object"?(console.warn("Invalid stat object:",s),{date:`Day ${c+1}`,sent:0,delivered:0,read:0,failed:0}):{date:I(s.date),sent:x(s.sent),delivered:x(s.delivered),read:x(s.read),failed:x(s.failed)}});return oe?e.jsx(re,{title:t("campaigns.campaignAnalytics"),subtitle:"Loading...",height:"fill",padding:"comfortable",children:e.jsx(ve,{size:"lg",text:"Loading campaign analytics..."})}):O?e.jsx(re,{title:t("campaigns.campaignAnalytics"),subtitle:"Error loading campaign",height:"fill",padding:"comfortable",children:e.jsx(N,{children:e.jsxs(y,{className:"text-center py-12",children:[e.jsx(w,{className:"w-12 h-12 text-red-400 mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-medium text-content mb-2",children:"Error Loading Campaign"}),e.jsx("p",{className:"text-content-tertiary mb-4",children:O}),e.jsx("div",{className:"flex justify-center",children:e.jsx(ae,{onClick:()=>me(s=>s+1),variant:"default",children:"Try Again"})})]})})}):l?.id?e.jsxs(re,{title:`Campaign: ${l.name||"Unnamed Campaign"}`,subtitle:"Detailed campaign performance analytics",docPath:"workspace/whatsapp/campaigns",padding:"none",contentClassName:"px-6 py-4 space-y-6",children:[e.jsxs(N,{children:[e.jsx(H,{children:e.jsx(X,{children:t("campaigns.campaignDetails")})}),e.jsxs(y,{children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("common.type")}),e.jsx("p",{className:"font-medium",children:l.type||"Unknown"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.status")}),e.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-medium rounded-full 2 ${l.status==="active"||l.status==="completed"?"bg-tint-success-strong text-tint-success-fg":l.status==="failed"?"bg-tint-danger-strong text-tint-danger-fg":l.status==="processing"?"bg-tint-info-strong text-tint-info-fg":"bg-surface-subtle text-content"}`,children:W(l.status)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.apiType")}),e.jsx("p",{className:"font-medium",children:l.apiType||"Unknown"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.campaignType")}),e.jsx("p",{className:"font-medium capitalize",children:l.campaignType||"Unknown"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.template")}),e.jsx("p",{className:"font-medium",children:l.templateName||"No template"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("common.language")}),e.jsx("p",{className:"font-medium",children:l.templateLanguage||"Unknown"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.created")}),e.jsx("p",{className:"font-medium",children:l.createdAt?D(l.createdAt,C):"Unknown"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.scheduled")}
2),e.jsx("p",{className:"font-medium",children:l.scheduledAt?D(l.scheduledAt,C):"Immediate"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.completed")}),e.jsx("p",{className:"font-medium",children:l.completedAt?D(l.completedAt,C):"In Progress"})]})]}),l.description&&e.jsxs("div",{className:"mt-4 pt-4 border-t",children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("common.description")}),e.jsx("p",{className:"font-medium",children:l.description})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-6 gap-6",children:[e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.recipients")}),e.jsx("p",{className:"text-2xl font-bold text-content",children:n(l.recipientCount).toLocaleString()})]}),e.jsx("div",{className:"p-2 bg-tint-info rounded-lg",children:e.jsx(fe,{className:"w-6 h-6 text-blue-600"})})]})})}),e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.messagesSent")}),e.jsx("p",{className:"text-2xl font-bold text-content",children:z.toLocaleString()})]}),e.jsx("div",{className:"p-2 bg-tint-success rounded-lg",children:e.jsx(Ge,{className:"w-6 h-6 text-green-600"})})]})})}),e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.failed")}),e.jsx("p",{className:"text-2xl font-bold text-red-600",children:u.toLocaleString()})]}),e.jsx("div",{className:"p-2 bg-tint-danger rounded-lg",children:e.jsx(Ae,{className:"w-6 h-6 text-red-600"})})]})})}),e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.deliveryRate")}),e.jsxs("p",{className:"text-2xl font-bold text-green-600",children:[V,"%"]}),e.jsx("div",{className:"w-full bg-surface-strong rounded-full h-2 mt-2",children:e.jsx("div",{className:"bg-green-500 h-2 rounded-full transition-all duration-300",style:{width:`${Math.min(V,100)}%`}})})]}),e.jsx("div",{className:"p-2 bg-tint-success rounded-lg",children:e.jsx(Ye,{className:"w-6 h-6 text-green-600"})})]})})}),e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.readRate")}),e.jsxs("p",{className:"text-2xl font-bold text-orange-600",children:[U.toFixed(1),"%"]}),e.jsx("div",{className:"w-full bg-surface-strong rounded-full h-2 mt-2",children:e.jsx("div",{className:"bg-orange-500 h-2 rounded-full transition-all duration-300",style:{width:`${Math.min(U,100)}%`}})})]}),e.jsx("div",{className:"p-2 bg-tint-warning rounded-lg",children:e.jsx(Qe,{className:"w-6 h-6 text-orange-600"})})]})})}),e.jsx(N,{className:"hover-lift",children:e.jsx(y,{className:"p-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-content-secondary",children:t("campaigns.failureRate")}),e.jsxs("p",{className:"text-2xl font-bold text-red-600",children:[Z.toFixed(1),"%"]}),e.jsx("div",{className:"w-full bg-surface-strong rounded-full h-2 mt-2",children:e.jsx("div",{className:"bg-red-500 h-2 rounded-full transition-all duration-300",style:{width:`${Math.min(Z,100)}%`}})})]}),e.jsx("div",{className:"p-2 bg-tint-danger rounded-lg",children:e.jsx(Ae,{className:"w-6 h-6 text-red-600"})})]})})})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs(N,{className:"lg:col-span-2",children:[e.jsx(H,{children:e.jsx(X,{children:t("campaigns.dailyPerformance")})}),e.jsx(y,{children:ee.length>0?e.jsx(it,{data:ee,timezone:C}):e.jsx("div",{className:"h-64 flex items-center justify-center text-content-tertiary",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"w-8 h-8 mx-auto mb-2 text-content-muted"}),e.jsx("p",{children:t("campaigns.noDailyPerformanceDataAvailable")}),e.jsx("p",{className:"text-sm text-content-muted mt-1",children:"This campaign may not have detailed daily tracking data."})]})})})]}),e.jsxs(N,{children:[e.jsx(H,{children:e.jsx(X,{children:t("campaigns.messageStatusDistribution")})}),e.jsx(y,{children:F.length>0?e.jsx("div",{className:"space-y-4",children:F.map((s,c)=>{const x=F.reduce((p,g)=>p+n(g.count),0),I=n(s.count),te=x>0?I/x*100:0;return e.jsxs("div",{className:"flex items-center justify-between p-2 rounded-lg bg-surface-muted",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("div",{className:`w-3 h-3 rounded-full ${s.status==="delivered"?"bg-green-500":s.status==="read"?"bg-blue-500":s.status==="failed"?"bg-red-500":s.status==="pending"?"bg-yellow-500":s.status==="sent"?"bg-purple-500":"bg-gray-500"}`}),e.jsx("span",{className:"text-sm capitalize font-medium",children:s.status||"Unknown"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("span",{className:"text-sm font-bold",children:I}),e.jsxs("span",{className:"text-sm text-content-tertiary",children:["(",te.toFixed(1),"%)"]})]})]},`${s.status}-${c}`)})}):e.jsx("div",{className:"h-32 flex items-center justify-center text-content-tertiary",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"w-6 h-6 mx-auto mb-1 text-content-muted"}),e.jsx("p",{className:"text-sm",children:t("campaigns.noStatusDataAvailable")})]})})})]})]}),M.length>0&&e.jsxs(N,{children:[e.jsx(H,{children:e.jsx(X,{children:t("campaigns.errorAnalysis")})}),e.jsx(y,{children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-surface-muted [&_tr]:border-y [&_tr]:border-line [&_th:first-child]:rounded-none [&_th:last-child]:rounded-none",children:e.jsxs("tr",{children:[e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Error Code"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Error Message"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Occurrences"})]})}),e.jsx("tbody",{className:"bg-surface divide-y divide-line",children:M.map((s,c)=>e.jsxs("tr",{className:"hover:bg-surface-muted",children:[e.jsx("td",{className:"px-6 py-4 text-sm text-content",children:e.jsx("code",{className:"bg-surface-subtle px-2 py-1 rounded text-xs",children:s.errorCode||"N/A"})}),e.jsx("td",{className:"px-6 py-4 text-sm text-content",children:s.errorMessage||"No error message provided"}),e.jsx("td",{className:"px-6 py-4 text-sm text-content font-medium",children:n(s.count)})]},c))})]})})})]}),e.jsxs(N,{children:[e.jsx(H,{children:e.jsx(X,{children:t("campaigns.targetAudience")})}),e.jsx(y,{children:xe?e.jsx(ve,{size:"sm",text:"Loading messages..."}):k.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{className:"bg-surface-muted [&_tr]:border-y [&_tr]:border-line [&_th:first-child]:rounded-none [&_th:last-child]:rounded-none",children:e.jsxs("tr",{children:[e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Phone"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Status"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Status Description"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Updated"}),e.jsx("th",{className:"h-12 px-4 align-middle text-sm font-medium text-muted-foreground text-left",children:"Created"})]})}),e.jsx("tbody",{className:"bg-surface divide-y divide-line",children:k.map(s=>e.jsxs("tr",{className:"hover:bg-surface-muted",children:[e.jsx("td",{className:"px-4 py-3 text-sm text-content font-medium",children:s.phone?P?Re(s.phone):s.phone:"Unknown"}),e.jsx("td",{className:"px-4 py-3 text-sm",children:e.jsx("span",{className:`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${s.status==="delivered"?"bg-tint-success-strong text-tint-success-fg":s.status==="read"?"bg-tint-info-strong text-tint-info-fg":s.status==="failed"?"bg-tint-danger-strong text-tint-danger-fg":s.status==="sent"?"bg-tint-success-strong text-tint-success-fg":"bg-surface-subtle text-content"}`,children:s.status?s.status.charAt(0).toUpperCase()+s.status.slice(1):"Unknown"})}),e.jsx("td",{className:"px-4 py-3 text-sm text-content-secondary",children:s.statusDescription||s.errorCode||"â"}),e.jsx("td",{className:"px-4 py-3 text-sm text-content-secondary",children:s.updatedAt?D(s.updatedAt,C):"â"}),e.jsx("td",{className:"px-4 py-3 text-sm text-content-secondary",children:s.createdAt?D(s.createdAt,C):"â"})]},s.id))})]})}),h.totalPages>1&&h.total>0&&e.jsxs("div",{className:"mt-4 flex items-center justify-between border-t pt-4",children:[e.jsxs("div",{className:"text-sm text-content-secondary",children:["Showing ",(h.page-1)*h.limit+1," to"," ",Math.min(h.page*h.limit,h.total)," of"," ",h.total," results"]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(ae,{variant:"outline",size:"sm",onClick:()=>R(s=>Math.max(1,s-1)),disabled:E===1,children:"Previous"}),e.jsxs("div",{className:"flex items-center gap-1",children:[Array.from({length:Math.min(5,h.totalPages)},(s,c)=>{const x=c+1;return e.jsx(ae,{variant:E===x?"default":"outline",size:"sm",onClick:()=>R(x),children:x},x)}),h.totalPages>5&&e.jsx("span",{className:"px-2",children:"..."})]}),e.jsx(ae,{variant:"outline",size:"sm",onClick:()=>R(s=>Math.min(h.totalPages,s+1)),disabled:E===h.totalPages,children:"Next"})]})]})]}):e.jsxs("div",{className:"text-center py-8 text-content-tertiary",children:[e.jsx(fe,{className:"w-12 h-12 mx-auto mb-2 text-content-muted"}),e.jsx("p",{children:t("campaigns.noMessagesFoundForThisCampaign")})]})})]})]}):e.jsx(re,{title:t("campaigns.campaignAnalytics"),subtitle:"Campaign not found",height:"fill",padding:"comfortable",children:e.jsx(N,{children:e.jsxs(y,{className:"text-center py-12",children:[e.jsx(w,{className:"w-12 h-12 text-content-muted mx-auto mb-4"}),e.jsx("h3",{className:"text-lg font-medium text-content mb-2",children:"Campaign Not Found"}),e.jsx("p",{className:"text-content-tertiary mb-4",children:"The requested campaign could not be found or you don't have access to it."})]})})})}const K=(t,r)=>Me.getState().t(t,r),Le=t=>t==="active"||t==="completed"?"success":t==="processing"?"info":t==="failed"?"danger":"neutral",lt=t=>t==="delivered"||t==="sent"?"success":t==="read"?"info":t==="failed"?"danger":"neutral",je=({data:t,timezone:r})=>!t||t.length===0?e.jsx("div",{className:"flex h-64 items-center justify-center text-[var(--nova-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"mx-auto mb-2 h-8 w-8 text-[var(--nova-text-muted)]"}),e.jsx("p",{children:K("campaigns.noChartDataAvailable")})]})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"mb-4 text-sm text-[var(--nova-text-secondary)]",children:"Daily Performance Overview"}),t.map((d,f)=>e.jsxs("div",{className:"rounded-lg border border-[var(--nova-border)] bg-[var(--nova-panel-bg)] p-4",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsx("span",{className:"font-medium text-[var(--nova-text-primary)]",children:d.date}),e.jsxs("div",{className:"text-sm text-[var(--nova-text-muted)]",children:["Total: ",(d.sent||0)+(d.delivered||0)+(d.read||0)+(d.failed||0)]})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 text-sm",children:[e.jsxs("div",{className:"rounded-lg bg-tint-info p-2 text-center",children:[e.jsx("div",{className:"text-lg font-bold text-blue-600",children:d.sent||0}),e.jsx("div",{className:"text-xs text-[var(--nova-text-secondary)]",children:K("campaigns.sent")})]}),e.jsxs("div",{className:"rounded-lg bg-tint-success p-2 text-center",children:[e.jsx("div",{className:"text-lg font-bold text-green-600",children:d.delivered||0}),e.jsx("div",{className:"text-xs text-[var(--nova-text-secondary)]",children:K("campaigns.delivered")})]}),e.jsxs("div",{className:"rounded-lg bg-tint-warning p-2 text-center",children:[e.jsx("div",{className:"text-lg font-bold text-orange-600",children:d.read||0}),e.jsx("div",{className:"text-xs text-[var(--nova-text-secondary)]",children:K("campaigns.read")})]}),e.jsxs("div",{className:"rounded-lg bg-tint-danger p-2 text-center",children:[e.jsx("div",{className:"text-lg font-bold text-red-600",children:d.failed||0}),e.jsx("div",{className:"text-xs text-[var(--nova-text-secondary)]",children:K("campaigns.failed")})]})]})]},f))]}),dt=({data:t,timezone:r})=>{const[d,f]=o.useState(!1);if(o.useEffect(()=>{f(!1)},[t]),d)return e.jsx(je,{data:t,timezone:r});try{return!t||!Array.isArray(t)||t.length===0?e.jsx("div",{className:"flex h-64 items-center justify-center text-[var(--nova-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"mx-auto mb-2 h-8 w-8 text-[var(--nova-text-muted)]"}),e.jsx("p",{children:K("campaigns.noChartDataAvailable")})]})}):t.some(m=>m&&typeof m=="object"&&m.date&&m.date!=="Unknown"&&(m.sent>0||m.delivered>0||m.read>0||m.failed>0))?e.jsx("div",{children:e.jsx(Fe,{data:t})}):e.jsx(je,{data:t,timezone:r})}catch{return f(!0),e.jsx(je,{data:t,timezone:r})}};function ot(){const{t}=Ne(),{campaignId:r}=$e(),[,d]=ze(),{user:f}=Pe(),{hasPermission:P}=Ue(),m=P("contacts:mask"),[ye,A]=o.useState(!1),[T,oe]=o.useState(null),[G,O]=o.useState(!0),[q,Y]=o.useState(null),[me,E]=o.useState(0),[R,B]=o.use
2State(1),[C,Q]=o.useState(10),[xe,be]=o.useState("overview"),k=f?.timezone||"UTC";o.useEffect(()=>{if(!r)return;(async()=>{O(!0),Y(null);try{const i=await fetch(`/api/analytics/campaigns/${r}?tz=${encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC")}`);if(!i.ok)throw new Error(`Failed to fetch campaign analytics: ${i.status} ${i.statusText}`);const j=await i.json();oe(j)}catch(i){Y(i.message||"Unknown error occurred while fetching campaign data")}finally{O(!1)}})()},[r,me]);const{data:h,isLoading:l,refetch:we}=Ee({queryKey:[`/api/analytics/campaigns/${r}/messages`,R,C],queryFn:async()=>{const a=await fetch(`/api/analytics/campaigns/${r}/messages?page=${R}&limit=${C}`);if(!a.ok)throw new Error("Failed to fetch campaign messages");return a.json()},enabled:!!r}),F=h?.data||[],M=h?.pagination||{page:1,total:0,totalPages:0},n=T?.campaign||{},J=Array.isArray(T?.dailyStats)?T.dailyStats:[],b=Array.isArray(T?.recipientStats)?T.recipientStats:[],L=Array.isArray(T?.errorAnalysis)?T.errorAnalysis:[],u=a=>{const i=Number(a);return isNaN(i)||i<0?0:i},z=a=>b.length===0?null:b.filter(i=>String(i?.status||"").toLowerCase()===a).reduce((i,j)=>i+u(j?.count),0),$=u(n.recipientCount),V=z("sent")??u(n.sentCount),W=z("delivered")??u(n.deliveredCount),U=z("read")??u(n.readCount);u(n.repliedCount);const Z=z("failed")??u(n.failedCount),ee=V+W+U,s=W+U,c=$>0?Math.round(s/$*100):0,x=a=>{const i=(a||"").toLowerCase();return i?i.charAt(0).toUpperCase()+i.slice(1):t("campaigns.unknown")},I=$>0?Math.round(U/$*100):0,te=$>0?Math.round(Z/$*100):0,p=J.map((a,i)=>{const j=v=>{if(v==null)return 0;const S=Number(v);return isNaN(S)?0:S},se=v=>{try{if(!v)return`Day ${i+1}`;let S;if(typeof v=="string")v.match(/^\d{4}-\d{2}-\d{2}$/)?S=new Date(v+"T00:00:00.000Z"):S=new Date(v);else if(v instanceof Date)S=v;else return`Day ${i+1}`;return isNaN(S.getTime())?`Day ${i+1}`:S.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"})}catch{return`Day ${i+1}`}};return!a||typeof a!="object"?{date:`Day ${i+1}`,sent:0,delivered:0,read:0,failed:0}:{date:se(a.date),sent:j(a.sent),delivered:j(a.delivered),read:j(a.read),failed:j(a.failed)}}),g=async a=>{if(!r){ne({title:t("campaigns.exportFailed"),description:t("campaigns.campaignIdIsMissing"),variant:"destructive"});return}A(!0);try{const j=await(await Ie("POST",`/api/campaigns/${r}/export`)).json();j.success?ne({title:t("campaigns.exportStarted"),description:t("campaigns.youWillReceiveAnEmailWithTheExcelFileShortly")}):ne({title:t("campaigns.exportFailed"),description:j.message||"Failed to start export",variant:"destructive"})}catch(i){ne({title:t("campaigns.exportFailed"),description:i?.message||t("campaigns.failedToExportCampaignReport"),variant:"destructive"})}finally{A(!1)}};return G?e.jsx(et,{title:t("campaigns.campaignAnalytics"),subtitle:"Loading...",statCount:5,columns:3}):q?e.jsx(ue,{title:t("campaigns.campaignAnalytics"),subtitle:"Error loading campaign",panel:!1,children:e.jsx(De,{icon:e.jsx(w,{className:"h-8 w-8"}),title:"Error Loading Campaign",description:q,action:e.jsx(Ve,{onClick:()=>E(a=>a+1),children:t("common.tryAgain")})})}):n?.id?e.jsx(ue,{title:`Campaign: ${n.name||"Unnamed Campaign"}`,docPath:"workspace/whatsapp/campaigns",subtitle:t("campaigns.analyticsSubtitle"),panel:!1,actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(Se,{onClick:()=>d("/campaigns"),children:[e.jsx(nt,{className:"h-4 w-4"}),t("campaigns.backToCampaigns")]}),e.jsxs(Se,{onClick:()=>g(),disabled:ye,children:[e.jsx(rt,{className:"h-4 w-4"}),t("common.export")]})]}),topContent:e.jsx("div",{className:"flex flex-wrap gap-2",children:e.jsx(pe,{tone:Le(n.status),children:x(n.status)})}),filters:e.jsx(Je,{items:[{id:"recipients",label:t("campaigns.recipients"),value:u(n.recipientCount).toLocaleString()},{id:"messagesSent",label:t("campaigns.messagesSent"),value:ee.toLocaleString()},{id:"delivered",label:t("campaigns.delivered"),value:W.toLocaleString()},{id:"read",label:t("campaigns.read"),value:U.toLocaleString()},{id:"failed",label:t("campaigns.failed"),value:Z.toLocaleString()},{id:"deliveryRate",label:t("campaigns.deliveryRate"),value:`${c}%`},{id:"readRate",label:t("campaigns.readRate"),value:`${I.toFixed(1)}%`},{id:"failureRate",label:t("campaigns.failureRate"),value:`${te.toFixed(1)}%`}]}),children:e.jsxs(at,{value:xe,onValueChange:be,children:[e.jsxs(tt,{children:[e.jsx(le,{value:"overview",className:ce,children:t("campaigns.campaignDetails")}),e.jsx(le,{value:"performance",className:ce,children:t("campaigns.performance")}),L.length>0&&e.jsx(le,{value:"errors",className:ce,children:t("campaigns.errorAnalysis")}),e.jsx(le,{value:"audience",className:ce,children:t("campaigns.targetAudience")})]}),e.jsxs(de,{value:"overview",className:"pt-4",children:[e.jsx("h2",{className:"text-base font-semibold text-[var(--nova-text-primary)]",children:t("campaigns.campaignDetails")}),e.jsxs("div",{className:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("common.type")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.type||t("campaigns.unknown")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.status")}),e.jsx(pe,{tone:Le(n.status),children:x(n.status)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.apiType")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.apiType||t("campaigns.unknown")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.campaignType")}),e.jsx("p",{className:"font-medium capitalize text-[var(--nova-text-primary)]",children:n.campaignType||t("campaigns.unknown")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.template")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.templateName||t("campaigns.noTemplate")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("common.language")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.templateLanguage||t("campaigns.unknown")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.created")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.createdAt?D(n.createdAt,k):t("campaigns.unknown")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.scheduled")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.scheduledAt?D(n.scheduledAt,k):t("campaigns.immediate")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("campaigns.completed")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.completedAt?D(n.completedAt,k):t("campaigns.inProgress")})]})]}),n.description&&e.jsxs("div",{className:"mt-4 border-t border-[var(--nova-border)] pt-4",children:[e.jsx("p",{className:"text-sm text-[var(--nova-text-muted)]",children:t("common.description")}),e.jsx("p",{className:"font-medium text-[var(--nova-text-primary)]",children:n.description})]})]}),e.jsx(de,{value:"performance",className:"pt-4",children:e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-3",children:[e.jsxs("div",{className:"lg:col-span-2",children:[e.jsx("h2",{className:"text-base font-semibold text-[var(--nova-text-primary)]",children:t("campaigns.dailyPerformance")}),e.jsx("div",{className:"mt-4",children:p.length>0?e.jsx(dt,{data:p,timezone:k}):e.jsx("div",{className:"flex h-64 items-center justify-center text-[var(--nova-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"mx-auto mb-2 h-8 w-8 text-[var(--nova-text-muted)]"}),e.jsx("p",{children:t("campaigns.noDailyPerformanceDataAvailable")}),e.jsx("p",{className:"mt-1 text-sm text-[var(--nova-text-muted)]",children:t("campaigns.dailyTrackingUnavailable")})]})})})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-semibold text-[var(--nova-text-primary)]",children:t("campaigns.messageStatusDistribution")}),e.jsx("div",{className:"mt-4",children:b.length>0?e.jsx("div",{className:"space-y-4",children:b.map((a,i)=>{const j=b.reduce((v,S)=>v+u(S.count),0),se=u(a.count),Ce=j>0?se/j*100:0;return e.jsxs("div",{className:"flex items-center justify-between rounded-lg bg-[var(--nova-hover-bg)] p-2",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("div",{className:`h-3 w-3 rounded-full ${a.status==="delivered"?"bg-green-500":a.status==="read"?"bg-blue-500":a.status==="failed"?"bg-red-500":a.status==="pending"?"bg-yellow-500":a.status==="sent"?"bg-purple-500":"bg-gray-500"}`}),e.jsx("span",{className:"text-sm font-medium capitalize",children:a.status||t("campaigns.unknown")})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx("span",{className:"text-sm font-bold",children:se}),e.jsxs("span",{className:"text-sm text-[var(--nova-text-muted)]",children:["(",Ce.toFixed(1),"%)"]})]})]},`${a.status}-${i}`)})}):e.jsx("div",{className:"flex h-32 items-center justify-center text-[var(--nova-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx(w,{className:"mx-auto mb-1 h-6 w-6 text-[var(--nova-text-muted)]"}),e.jsx("p",{className:"text-sm",children:t("campaigns.noStatusDataAvailable")})]})})})]})]})}),L.length>0&&e.jsxs(de,{value:"errors",className:"pt-4",children:[e.jsx("h2",{className:"text-base font-semibold text-[var(--nova-text-primary)]",children:t("campaigns.errorAnalysis")}),e.jsx("div",{className:"mt-4 overflow-x-auto",children:e.jsxs("table",{className:"nova-table w-full border-collapse text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx(Te,{}),e.jsx("th",{children:t("campaigns.errorCode")}),e.jsx("th",{children:t("campaigns.errorMessage")}),e.jsx("th",{children:t("campaigns.occurrences")})]})}),e.jsx("tbody",{children:L.map((a,i)=>e.jsxs("tr",{children:[e.jsx(ke,{page:1,pageSize:L.length,index:i}),e.jsx("td",{children:e.jsx("code",{className:"rounded-md bg-[var(--nova-hover-bg)] px-2 py-1 text-xs",children:a.errorCode||t("campaigns.notAvailable")})}),e.jsx("td",{children:a.errorMessage||t("campaigns.noErrorMessageProvided")}),e.jsx("td",{className:"font-medium",children:u(a.count)}
2)]},i))})]})})]}),e.jsxs(de,{value:"audience",className:"pt-4",children:[e.jsx("h2",{className:"text-base font-semibold text-[var(--nova-text-primary)]",children:t("campaigns.targetAudience")}),e.jsx("div",{className:"mt-4",children:l?e.jsx(ve,{size:"sm",text:t("campaigns.loadingMessages")}):F.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"nova-table w-full border-collapse text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx(Te,{}),e.jsx("th",{children:t("common.phone")}),e.jsx("th",{children:t("common.status")}),e.jsx("th",{children:t("campaigns.statusDescription")}),e.jsx("th",{children:t("common.updated")}),e.jsx("th",{children:t("common.created")})]})}),e.jsx("tbody",{children:F.map((a,i)=>e.jsxs("tr",{children:[e.jsx(ke,{page:M.page,pageSize:C,index:i}),e.jsx("td",{className:"font-medium",children:a.phone?m?Re(a.phone):a.phone:t("campaigns.unknown")}),e.jsx("td",{children:e.jsx(pe,{tone:lt(a.status),children:a.status?a.status.charAt(0).toUpperCase()+a.status.slice(1):t("campaigns.unknown")})}),e.jsx("td",{className:"text-[var(--nova-text-secondary)]",children:a.statusDescription||a.errorCode||"â"}),e.jsx("td",{className:"text-[var(--nova-text-secondary)]",children:a.updatedAt?D(a.updatedAt,k):"â"}),e.jsx("td",{className:"text-[var(--nova-text-secondary)]",children:a.createdAt?D(a.createdAt,k):"â"})]},a.id))})]})}),e.jsx(st,{page:M.page,totalPages:Math.max(M.totalPages,1),total:M.total,pageSize:C,onPageChange:B,onPageSizeChange:a=>{Q(a),B(1)}})]}):e.jsxs("div",{className:"py-8 text-center text-[var(--nova-text-muted)]",children:[e.jsx(fe,{className:"mx-auto mb-2 h-12 w-12 text-[var(--nova-text-muted)]"}),e.jsx("p",{children:t("campaigns.noMessagesFoundForThisCampaign")})]})})]})]})}):e.jsx(ue,{title:t("campaigns.campaignAnalytics"),subtitle:"Campaign not found",panel:!1,children:e.jsx(De,{icon:e.jsx(w,{className:"h-8 w-8"}),title:"Campaign Not Found",description:"The requested campaign could not be found or you don't have access to it."})})}function Zt(){const{isNova:t}=_e();return t?e.jsx(ot,{}):e.jsx(ct,{})}export{Zt 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.