1"use strict";(self.webpackChunkmrassistant_frontend=self.webpackChunkmrassistant_frontend||[]).push([[109],{4746:(e,a,t)=>{t.d(a,{A:()=>n});t(9950);var r=t(4414);const s=function(){for(var e=arguments.length,a=new Array(e),t=0;t<e;t++)a[t]=arguments[t];return a.filter(Boolean).join(" ")},n=e=>{let{tabs:a,activeTab:t,onChange:n}=e;const l=a.length>5?"grid-cols-2 sm:grid-cols-3 lg:grid-cols-6":5===a.length?"grid-cols-2 sm:grid-cols-3 lg:grid-cols-5":"grid-cols-2 sm:grid-cols-4";return(0,r.jsx)("nav",{className:"-mx-3 mt-2 border-t border-gray-200/80 bg-gray-50 dark:border-edge dark:bg-surface-page sm:-mx-4","aria-label":"Section tabs",children:(0,r.jsx)("div",{className:s("grid w-full",l),children:a.map((e,l)=>{var i;return(0,r.jsxs)("button",{type:"button",onClick:()=>n(e.id),className:s("relative w-full px-2 py-2.5 text-center text-xs font-medium transition-colors sm:px-3 sm:py-2.5 sm:text-[13px]",l%2===0&&"max-sm:border-r max-sm:border-gray-200/80 max-sm:dark:border-edge",l<2&&a.length>2&&"max-sm:border-b max-sm:border-gray-200/80 max-sm:dark:border-edge",l<a.length-1&&"sm:border-r sm:border-gray-200/80 sm:dark:border-edge",t===e.id?"bg-accent/10 text-accent dark:bg-accent/15 dark:text-accent-text":"text-gray-600 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-neutral-800/80"),"aria-current":t===e.id?"page":void 0,children:[t===e.id?(0,r.jsx)("span",{className:"absolute inset-x-0 bottom-0 h-0.5 bg-accent dark:bg-accent-text"}):null,(0,r.jsx)("span",{className:"block truncate sm:hidden",children:null!==(i=e.shortLabel)&&void 0!==i?i:e.label}),(0,r.jsx)("span",{className:"hidden truncate sm:block",children:e.label})]},e.id)})})})}},6109:(e,a,t)=>{t.r(a),t.d(a,{default:()=>Z});var r=t(960),s=t(9950),n=t(998),l=t(691),i=t(2074),c=t(7130),d=t(431),o=t(7871),m=t(1029);const u={listCampaigns:async()=>{const e=(await m.Ay.get("/campaigns",{suppressErrorToast:!0})).data;return Array.isArray(e)?e:[]},createCampaign:async e=>(await m.Ay.post("/campaigns",e,{showSuccessToast:!1})).data,getCampaignStatus:async e=>(await m.Ay.get(`/campaigns/${encodeURIComponent(e)}`)).data,getCampaignResults:async e=>(await m.Ay.get(`/campaigns/${encodeURIComponent(e)}/results`,{suppressErrorToast:!0})).data};var g=t(8832),h=t(7091),x=t(2759),p=t(475);var y=t(1789);var b=t(1115);var f=t(3152);var j=t(3159),N=t(2714),v=t(6800),k=t(6073),w=t(7412),C=t(9585);const S=["phone_number","to_number","from_number","status","outcome","duration_seconds","duration","started_at","ended_at","call_id","error","message"];function _(e){if(!e)return[];if(Array.isArray(e))return e.filter(e=>null!=e&&"object"===typeof e).map(e=>e);if("object"!==typeof e)return[];const a=e;if(null!=a.error&&!Array.isArray(a.results)&&!Array.isArray(a.items)&&!Array.isArray(a.calls))return[];for(const t of["results","items","calls","rows","data"])if(Array.isArray(a[t]))return _(a[t]);return[]}function A(e){if(!e)return{kind:"empty"};if("object"===typeof e&&null!==e&&"error"in e){var a;const t=String(null!==(a=e.error)&&void 0!==a?a:"Could not load results");if(0===_(e).length)return{kind:"error",message:t}}const t=_(e);if(0===t.length)return{kind:"empty"};const s=function(e){const a=new Set;e.forEach(e=>Object.keys(e).forEach(e=>a.add(e)));const t=S.filter(e=>a.has(e)),r=Array.from(a).filter(e=>!t.includes(e)).sort();return[...t,...r].slice(0,8)}(t);return{kind:"table",columns:s,rows:t.map(e=>{const a={};return s.forEach(t=>{var s;a[t]=null==(s=e[t])?r.V5:"object"===typeof s?JSON.stringify(s):String(s)}),a})}}var T=t(4414);const $=e=>{let{data:a,loading:t}=e;if(t)return(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"Loading results\u2026"});const s=A(a);return"error"===s.kind?(0,T.jsx)("p",{className:"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800 dark:border-red-900/40 dark:bg-red-950/30 dark:text-red-300",children:s.message}):"empty"===s.kind?(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"No campaign results yet. Outcomes appear here after calls complete."}):(0,T.jsx)("div",{className:"overflow-x-auto rounded-lg border border-gray-200 dark:border-dark-600",children:(0,T.jsxs)("table",{className:"min-w-full divide-y divide-gray-200 text-xs dar
1k:divide-dark-600",children:[(0,T.jsx)("thead",{className:"bg-gray-50 dark:bg-dark-900/50",children:(0,T.jsx)("tr",{children:s.columns.map(e=>(0,T.jsx)("th",{scope:"col",className:"whitespace-nowrap px-3 py-2 text-left font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400",children:e.replace(/_/g," ")},e))})}),(0,T.jsx)("tbody",{className:"divide-y divide-gray-100 bg-white dark:divide-dark-700 dark:bg-dark-800/50",children:s.rows.map((e,a)=>(0,T.jsx)("tr",{className:"hover:bg-gray-50/80 dark:hover:bg-dark-700/50",children:s.columns.map(a=>{var t;return(0,T.jsx)("td",{className:"whitespace-nowrap px-3 py-2 text-gray-800 dark:text-gray-200",children:String(null!==(t=e[a])&&void 0!==t?t:r.V5)},a)})},a))})]})})};var L=t(2989),F=t(8907),I=t(7334),R=t(3621),B=t(5205),V=t(7624);const D=n._C.outbound,O=n.RV.info,M=n.RV.download,E=function(){for(var e=arguments.length,a=new Array(e),t=0;t<e;t++)a[t]=arguments[t];return a.filter(Boolean).join(" ")},q=e=>{let{label:a,hint:t,htmlFor:r,children:s,className:n}=e;return(0,T.jsxs)("div",{className:E("flex flex-col gap-1",n),children:[(0,T.jsx)("label",{htmlFor:r,className:R.Q2,children:a}),s,t?(0,T.jsx)("p",{className:R.Z6,children:t}):null]})},P=[{value:"africa",label:"Africa/Kampala"},{value:"america",label:"America/New_York"},{value:"europe",label:"Europe/London"}],U=e=>{let{isOpen:a,onClose:t,busy:r=!1,campaignName:n,onCampaignNameChange:l,assistant:i,onAssistantChange:c,agents:d,fromNumber:o,onFromNumberChange:m,agentNumbers:u,numbersLoading:g=!1,csvFile:h,onCsvFileChange:x,targetNumber:p,onTargetNumberChange:y,sendTiming:b,onSendTimingChange:f,scheduleDate:j,onScheduleDateChange:N,scheduleTime:v,onScheduleTimeChange:k,timezone:w,onTimezoneChange:C,onDownloadTemplate:S,onSubmit:_}=e;const A=(0,s.useRef)(null);(0,s.useEffect)(()=>{!h&&A.current&&(A.current.value="")},[h]);const $=(0,s.useMemo)(()=>d.map(e=>({value:e.id,label:e.name})),[d]),U=(0,s.useMemo)(()=>g?[]:u.map(e=>({value:e,label:e})),[u,g]);return(0,T.jsx)(I.A,{isOpen:a,onClose:t,busy:r,width:"lg",title:"New campaign",subtitle:"Upload targets, pick an assistant, and launch outbound calls",icon:(0,T.jsx)(D,{className:"h-4 w-4","aria-hidden":!0}),titleId:"create-campaign-drawer-title",asForm:!0,onSubmit:_,footer:(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)("button",{type:"button",onClick:t,disabled:r,className:B.If,children:"Cancel"}),(0,T.jsx)("button",{type:"submit",disabled:r,className:B.QH,children:r?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(L.A,{className:"h-3.5 w-3.5 animate-spin","aria-hidden":!0}),"Launching\u2026"]}):"Launch campaign"})]}),children:(0,T.jsxs)("div",{className:"space-y-4",children:[(0,T.jsxs)("div",{className:R.f4,children:[(0,T.jsx)("p",{className:`${R.th} mb-2.5`,children:"Campaign"}),(0,T.jsx)(q,{label:"Name",htmlFor:"campaign-name",children:(0,T.jsx)("input",{id:"campaign-name",type:"text",value:n,onChange:e=>l(e.target.value),placeholder:"Summer outreach",className:R.s1,required:!0})})]}),(0,T.jsxs)("div",{className:R.f4,children:[(0,T.jsx)("p",{className:`${R.th} mb-2.5`,children:"Assistant & number"}),(0,T.jsxs)("div",{className:"grid gap-3 sm:grid-cols-2",children:[(0,T.jsx)(q,{label:"Assistant",children:(0,T.jsx)(V.A,{value:i,onChange:c,placeholder:d.length?"Select assistant":"No assistants",options:$})}),(0,T.jsx)(q,{label:"From number",hint:u.length?"Connected to the selected assistant.":"No number linked to this assistant yet. Assign one under Phone Numbers, then reopen this drawer.",children:(0,T.jsx)(V.A,{value:o,onChange:m,placeholder:g?"Loading numbers\u2026":u.length?"Select number":"No numbers connected",options:U,disabled:g||0===u.length})})]})]}),(0,T.jsxs)("div",{className:`${R.f4} flex gap-2`,children:[(0,T.jsx)(O,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-gray-500 dark:text-gray-400","aria-hidden":!0}),(0,T.jsxs)("div",{className:"min-w-0",children:[(0,T.jsx)("p",{className:"text-xs font-medium text-gray-900 dark:text-gray-100",children:"Best practices"}),(0,T.jsxs)("p",{className:`mt-0.5 ${R.Z6}`,children:["Learn how to avoid spam flagging and optimize your calling strategy."," ",(0,T.jsx)("a",{href:"#",className:"font-medium text-accent hover:underline",children:"Spam flagging best practices"})]})]})]}),(0,T.jsxs)("div",{className:R.f4,children:[(0,T.jsxs)("div",{className:"mb-2.5 flex items-center justify-between gap-2",children:[(0,T.jsx)("p",{className:R.th,children:"Targets"}),(0,T.jsxs)("button",{type:"button",onClick:S,className:"inline-flex items-center gap-1 text-[11px] font-medium text-gray-600 transition-colors hover:text-accent dark:text-gray-400",children:[(0,T.jsx)(M,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Download template"]})]}),(0,T.jsx)("input",{id:"upload-csv-input",type:"file",ref:A,accept:".csv",className:"hidden",onChange:e=>{var a;return x((null===(a=e.target.files)||void 0===a?void 0:a[0])||null)}}),(0,T.jsx)("button",{type:"button",onClick:()=>{var e;return null===(e=A.current)||void 0===e?void 0:e.click()},className:"w-full rounded-lg border border-dashed border-gray-300 bg-white/60 px-3 py-6 transition-colors hover:border-accent/40 hover:bg-gray-50 dark:border-edge dark:bg-surface/40 dark:hover:bg-white/5",children:(0,T.jsxs)("div",{className:"flex flex-col items-center gap-2 text-center",children:[(0,T.jsx)(F.A,{className:"h-8 w-8 text-gray-400 dark:text-gray-500","aria-hidden":!0}),(0,T.jsx)("p",{className:"text-xs font-medium text-gray-700 dark:text-gray-300",children:h?`Selected: ${h.name}`:"Click to upload a CSV of phone numbers"}
1),(0,T.jsx)("p",{className:R.Z6,children:"Maximum file size: 5MB"})]})}),(0,T.jsx)("div",{className:"mt-3 border-t border-gray-200/70 pt-3 dark:border-edge",children:(0,T.jsx)(q,{label:"Single target (optional)",htmlFor:"target-number",hint:"Or upload a CSV above.",children:(0,T.jsx)("input",{id:"target-number",type:"text",value:p,onChange:e=>y(e.target.value),placeholder:"+1 555 123 4567",className:R.s1})})})]}),(0,T.jsxs)("div",{className:R.f4,children:[(0,T.jsx)("p",{className:`${R.th} mb-2.5`,children:"Schedule"}),(0,T.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,T.jsx)("button",{type:"button",onClick:()=>f("now"),className:E(R.MS,"now"===b&&R.k6),children:(0,T.jsx)("span",{className:"font-medium",children:"Send now"})}),(0,T.jsx)("button",{type:"button",onClick:()=>f("later"),className:E(R.MS,"later"===b&&R.k6),children:(0,T.jsx)("span",{className:"font-medium",children:"Schedule for later"})})]}),"later"===b?(0,T.jsxs)("div",{className:"mt-3 grid gap-3 border-t border-gray-200/70 pt-3 dark:border-edge sm:grid-cols-3",children:[(0,T.jsx)(q,{label:"Date",htmlFor:"schedule-date",children:(0,T.jsx)("input",{id:"schedule-date",type:"text",value:j,onChange:e=>N(e.target.value),placeholder:"Today",className:R.s1})}),(0,T.jsx)(q,{label:"Time",htmlFor:"schedule-time",children:(0,T.jsx)("input",{id:"schedule-time",type:"text",value:v,onChange:e=>k(e.target.value),placeholder:"10:45 PM",className:R.s1})}),(0,T.jsx)(q,{label:"Timezone",children:(0,T.jsx)(V.A,{value:w,onChange:C,placeholder:"Select timezone",options:P})})]}):null]})]})})};var z=t(4746),K=t(9399),Q=t(9893);function H(e){if("number"!==typeof e||!Number.isFinite(e)||e<0)return r.V5;return`${Math.floor(e/60)}:${Math.floor(e%60).toString().padStart(2,"0")}`}const Z=()=>{var e,a;const[t,m]=(0,i.ok)(),[S,_]=(0,s.useState)(!1),[A,L]=(0,s.useState)(""),[F,I]=(0,s.useState)(""),[R,B]=(0,s.useState)(""),{data:V}=(0,g.i)(),D=(0,s.useMemo)(()=>(0,N.tR)(V),[V]),O=function(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return(0,h.I)({queryKey:x.l.campaigns,queryFn:async()=>{try{return await u.listCampaigns()}catch{return[]}},enabled:e,...p.P1,staleTime:6e4,gcTime:6e5})}(),M=null!==(e=O.data)&&void 0!==e?e:[],E=O.isLoading,q=O.isFetching,P=O.refetch,[Z,W]=(0,s.useState)(""),[X,J]=(0,s.useState)("now"),[Y,G]=(0,s.useState)(""),[ee,ae]=(0,s.useState)(""),[te,re]=(0,s.useState)(""),[se,ne]=(0,s.useState)(null),[le,ie]=(0,s.useState)(!1),[ce,de]=(0,s.useState)(null),[oe,me]=(0,s.useState)(null),[ue,ge]=(0,s.useState)(!1),[he,xe]=(0,s.useState)(!1),[pe,ye]=(0,s.useState)(null),[be,fe]=(0,s.useState)(null),je=(0,s.useRef)(null),[Ne,ve]=(0,s.useState)(""),ke=function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{enabled:t=!0,refetchInterval:r=8e3}=a;return(0,h.I)({queryKey:x.l.outboundCalls(e),queryFn:async()=>{const a=await y.Ay.listAgentCalls(e,{limit:100,direction:"outbound"}),t=(0,y.a$)(a).map(y.QD),r=t.filter(e=>!e.direction||"outbound"===e.direction.toLowerCase());return r.length?r:t},enabled:t&&!!e,staleTime:5e3,gcTime:3e5,refetchInterval:!(!t||!e)&&r,meta:{swr:!0,notifyOnChange:!0,notifyLabel:"New Content loaded"}})}(Ne,{refetchInterval:8e3}),we=null!==(a=ke.data)&&void 0!==a?a:[],Ce=ke.isLoading,Se=ke.isFetching,_e=ke.refetch,{data:Ae,isLoading:Te}=function(e){let a=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return(0,h.I)({queryKey:x.l.agentPhoneNumbers(e),queryFn:async()=>{try{const a=await b.A.list(e);return Array.isArray(a)?a:[]}catch{return[]}},enabled:a&&!!e,staleTime:12e4,gcTime:6e5})}(R,!!R),{data:$e,isLoading:Le}=function(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return(0,h.I)({queryKey:x.l.ownedPhoneNumbers,queryFn:async()=>{try{return await f.Ay.listOwned()}catch{return[]}},enabled:e,staleTime:12e4,gcTime:6e5})}(S||!!R),Fe=Te||Le,Ie=(0,s.useMemo)(()=>D.find(e=>e.id===R)||null,[D,R]),Re=(0,s.useMemo)(()=>{const e=(0,j.Zl)(Ae),a=new Set([R,null===Ie||void 0===Ie?void 0:Ie.externalId].map(e=>null!=e?String(e).trim():"").filter(Boolean)),t=($e||[]).filter(e=>{if(!a.size)return!1;const t=null!=e.agent_id?String(e.agent_id).trim():"";return Boolean(t&&a.has(t))}).map(e=>
1String(e.e164||"").trim()).filter(Boolean),r=new Set,s=[];for(const n of[...e,...t]){const e=n.replace(/\s+/g,"");e&&!r.has(e)&&(r.add(e),s.push(n))}return s},[Ae,$e,R,Ie]),[Be,Ve]=(0,s.useState)(null),[De,Oe]=(0,s.useState)(!1),[Me,Ee]=(0,s.useState)(!1),[qe,Pe]=(0,s.useState)(null),[Ue,ze]=(0,s.useState)([]),[Ke,Qe]=(0,s.useState)(""),[He,Ze]=(0,s.useState)(""),[We,Xe]=(0,s.useState)(""),{toast:Je}=(0,o.dj)(),Ye=(0,s.useRef)(null),Ge=(0,s.useRef)(0),ea=(0,s.useRef)(null),[aa,ta]=(0,s.useState)(""),[ra,sa]=(0,s.useState)(""),na="campaigns"===t.get("tab")?"campaigns":"calls",la=(0,s.useMemo)(()=>{const e=aa.trim().toLowerCase();return e?M.filter(a=>{const t=String(a.campaign_id||a.id||"");return`${a.name||""} ${t} ${a.status||""}`.toLowerCase().includes(e)}):M},[M,aa]),ia=(0,s.useMemo)(()=>{const e=ra.trim().toLowerCase();return e?we.filter(a=>`${a.call_id} ${a.to_number||""} ${a.from_number||""} ${a.status}`.toLowerCase().includes(e)):we},[we,ra]),ca="campaigns"===na?E&&0===M.length?"\u2026":String(la.length):Ce&&0===we.length?"\u2026":String(ia.length);(0,s.useCallback)(e=>{Ne&&x.q.setQueryData(x.l.outboundCalls(Ne),a=>e(null!==a&&void 0!==a?a:[]))},[Ne]);(0,s.useEffect)(()=>((()=>{if(!ce||je.current)return;const e=window.setInterval(async()=>{try{const e=await u.getCampaignStatus(ce);me(e),null!==e&&void 0!==e&&e.status&&["completed","failed","cancelled"].includes(String(e.status).toLowerCase())&&je.current&&(clearInterval(je.current),je.current=null)}catch{}},5e3);je.current=e})(),()=>{je.current&&(clearInterval(je.current),je.current=null)}),[ce]);(0,s.useEffect)(()=>{!R&&D.length>0&&B(D[0].id)},[R,D]),(0,s.useEffect)(()=>{Re.length>0?W(Re[0]):W("")},[R,Re]);(0,s.useEffect)(()=>{if(0===D.length)return;const e=t.get("agentId");e&&D.some(a=>a.id===e)?ve(e):ve(e=>e&&D.some(a=>a.id===e)?e:D[0].id)},[D,t]);const da=()=>{var e;null===(e=Ye.current)||void 0===e||e.call(Ye),Ye.current=null,ea.current=null},oa=()=>{da(),Oe(!1),Ve(null),Pe(null),ze([]),Qe(""),Xe("")},ma=async e=>{Ge.current+=1;const a=Ge.current;da(),Ee(!0),Pe(null),ze([]),Qe(""),Ze(e.status),Xe("");let t=[],r="";try{if(Ne)try{const s={...e.raw||{},call_id:e.call_id},n=await(0,y.m9)(Ne,D,s,e.call_id,{include_ai_summary:!0,listMatchHints:{callerNumber:e.from_number||void 0,calledNumber:e.to_number||void 0,startTimeIso:e.created_at}});if(a!==Ge.current)return;null!=n&&"object"===typeof n&&(r=(0,y.xQ)(n),t=(0,y.II)(n,n.messages))}catch{}const[s,n,l,i,c]=await Promise.all([y.Ay.getDetail(e.call_id,{silent:!0}).catch(()=>null),y.Ay.getStatus(e.call_id,{silent:!0}).catch(()=>null),y.Ay.getArtifact(e.call_id,{silent:!0}).catch(()=>null),y.Ay.getRecordingRaw(e.call_id,{silent:!0}).catch(()=>null),y.Ay.getRecording(e.call_id).catch(()=>"")]);if(a!==Ge.current)return;const d=s&&"object"===typeof s?s:n&&"object"===typeof n?n:null,o=d;Ze(null!=(null===o||void 0===o?void 0:o.status)?String(o.status):null!=(null===o||void 0===o?void 0:o.state)?String(o.state):e.status);const m=o?(0,w.D)(o):"";if(Xe(m?(0,C.f2)(m):""),0===t.length&&(t=(0,y.II)(null!==s&&void 0!==s?s:n,l,e.raw)),0===t.length&&Ne)try{const s={...e.raw||{},call_id:e.call_id},n=await(0,y.m9)(Ne,D,s,e.call_id,{include_ai_summary:!1,listMatchHints:{callerNumber:e.from_number||void 0,calledNumber:e.to_number||void 0,startTimeIso:e.created_at}});if(a!==Ge.current)return;null!=n&&"object"===typeof n&&(t=(0,y.II)(n,n.messages),r||(r=(0,y.xQ)(n)))}catch{}Qe(r),ze(t);let u=null;if("string"===typeof c&&c.trim()&&(u=c.trim()),!u){const e=(0,y.FK)(i);e&&(u=e)}if(!u&&d){const e=(0,y.FK)(d);e&&(u=e)}if(!u&&n&&"object"===typeof n){const e=(0,y.FK)(n);e&&(u=e)}if(!u&&l&&"object"===typeof l){const e=(0,y.FK)(l);e&&(u=e)}const g=e.raw||{};if(!u)for(const e of["recording_url","audio_recording_url","recording_download_url","recording_file_url"]){const a=g[e];if("string"===typeof a&&a.trim()){const e=(0,v.AR)(a);if(e){u=e;break}}}if(!u){const e=(0,y.FK)(g);e&&(u=e)}if(u)try{const{playbackUrl:e,revoke:t}=await(0,k.r5)(u);a!==Ge.current?t():(Ye.current=t,ea.current=u.trim(),Pe(e))}catch{a===Ge.current&&Je("Could not load recording (check you are signed in)","error")}}catch{Je("Could not load call details","error")}finally{a===Ge.current&&Ee(!1)}},ua=e=>{Ve(e),Oe(!0),ma(e)},ga=n.ek.outbound,ha=n.RV.add,xa=n.RV.refresh,pa=n.RV.search,ya=n.RV.view,ba=n.RV.close;return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)("div",{className:K.e1,children:(0,T.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col px-3 pb-3 pt-0 sm:px-4 lg:px-6",children:[(0,T.jsxs)("div",{className:`${K.Au} mb-0 border-b-0 pb-0`,children:[(0,T.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,T.jsxs)("div",{className:"min-w-0 flex items-center gap-2",children:[(0,T.jsx)("div",{className:l.ib,children:(0,T.jsx)(ga,{className:l.$4,"aria-hidden":"true"})}),(0,T.jsx)("h1",{className:`truncate text-lg font-semibold sm:text-xl ${l.W}`,children:"Outbound"}),(0,T.jsx)("span",{className:"shrink-0 rounded-full bg-gray-200/80 px-2 py-0.5 text-[10px] font-medium tabular-nums text-gray-600 dark:bg-dark-700 dark:text-gray-300",children:ca})]}),(0,T.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,T.jsxs)("button",{type:"button",onClick:()=>_(!0),className:"inline-flex items-center gap-1 rounded-lg bg-accent px-2 py-1.5 text-xs font-medium text-white hover:bg-accent-hover",children:[(0,T.jsx)(ha,{className:"h-4 w-4"}),(0,T.jsx)("span",{className:"hidden sm:inline",children:"Create campaign"})]}),(0,T.jsx)("button",{type:"button",onClick:()=>"campaigns"===na?void P():Ne&&void _e(),disabled:"campaigns"===na?q:!Ne||Se,className:Q.TI,title:"Refresh","aria-label":"Refresh",children:(0,T.jsx)(xa,{className:"h-4 w-4 "+(("campaigns"===na?q:Se)?"animate-spin":"")})})]})]}),(0,T.jsx)("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-400",children:"campaigns"===na?"Campaigns launched from this workspace.":"Outbound calls for the selected assistant. Refreshes automatically."}),(0,T.jsx)(z.A,{tabs:[{id:"calls",label:"Outbound calls",shortLabel:"Calls"},{id:"campaigns",label:"Campaigns",shortLabel:"Campaigns"}],activeTab:na,onChange:e=>{var a;"calls"===(a=e)?(t.delete("tab"),m(t,{replace:!0})):m({tab:a},{replace:!0})}})]}),(0,T.jsxs)("div",{className:K.Cc,children:["campaigns"===na?(0,T.jsxs)("div",{className:K.Fj,children:[(0,T.jsxs)("div",{className:K.XL,children:[(0,T.jsx)(pa,{className:"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-gray-400","aria-hidden":!0}),(0,T.jsx)("input",{type:"search",value:aa,onChange:e=>ta(e.target.value),placeholder:"Search campaigns\u2026",className:`${K.jB} pl-7`,"aria-label":"Search campaigns"})]}),(0,T.jsx)("button",{type:"button",onClick:()=>{P()},disabled:q,className:`${Q.TI}
1 ${K.Ti}`,"aria-label":"Refresh campaigns",children:(0,T.jsx)(xa,{className:"h-3.5 w-3.5 "+(q?"animate-spin":"")})})]}):(0,T.jsxs)("div",{className:K.zs,children:[(0,T.jsxs)("select",{id:"calls-agent-select",value:Ne,onChange:e=>{const a=e.target.value;ve(a),m(e=>{const t=new URLSearchParams(e);return a?t.set("agentId",a):t.delete("agentId"),t},{replace:!0})},className:K.jB,"aria-label":"Assistant",children:[0===D.length&&(0,T.jsx)("option",{value:"",children:"No assistants"}),D.map(e=>(0,T.jsx)("option",{value:e.id,children:e.name},e.id))]}),(0,T.jsxs)("div",{className:K.XL,children:[(0,T.jsx)(pa,{className:"pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-gray-400","aria-hidden":!0}),(0,T.jsx)("input",{type:"search",value:ra,onChange:e=>sa(e.target.value),placeholder:"Search calls\u2026",className:`${K.jB} pl-7`,"aria-label":"Search calls"})]}),(0,T.jsx)("button",{type:"button",onClick:()=>Ne&&void _e(),disabled:!Ne||Se,className:`${Q.TI} ${K.Ti}`,"aria-label":"Refresh calls",children:(0,T.jsx)(xa,{className:"h-3.5 w-3.5 "+(Se?"animate-spin":"")})})]}),(0,T.jsx)("p",{className:"mt-1 text-[11px] text-gray-500 dark:text-gray-400",children:"campaigns"===na?`${la.length} campaign${1===la.length?"":"s"}`:`${ia.length} call${1===ia.length?"":"s"}`})]}),(0,T.jsx)("div",{className:`${K.Df} flex min-h-0 flex-1 flex-col`,children:"campaigns"===na?E&&0===M.length?(0,T.jsx)(d.A,{variant:"outbound",rows:6,className:"border-0 shadow-none"}):0===la.length?(0,T.jsxs)("div",{className:"px-4 py-12 text-center",children:[(0,T.jsx)(ga,{className:"mx-auto h-8 w-8 text-gray-400"}),(0,T.jsx)("p",{className:"mt-2 text-sm font-medium text-gray-900 dark:text-white",children:aa.trim()?"No campaigns match your search":"No campaigns yet"}),(0,T.jsx)("p",{className:"mt-0.5 text-xs text-gray-500 dark:text-gray-400",children:aa.trim()?"Try a different search.":"Create one to start outbound calling."})]}):(0,T.jsx)("div",{className:K.IL,children:(0,T.jsxs)("table",{className:"w-full text-xs",children:[(0,T.jsx)("thead",{children:(0,T.jsxs)("tr",{children:[(0,T.jsx)("th",{className:K.BL,children:"Name"}),(0,T.jsx)("th",{className:K.BL,children:"Status"}),(0,T.jsx)("th",{className:`${K.BL} hidden md:table-cell`,children:"Assistant"}),(0,T.jsx)("th",{className:K.BL,children:"Created"}),(0,T.jsx)("th",{className:`${K.BL} text-right`,children:"\xb7\xb7\xb7"})]})}),(0,T.jsx)("tbody",{className:"divide-y divide-gray-200/80 dark:divide-neutral-700",children:la.map((e,a)=>{const t=String(e.campaign_id||e.id||`campaign-${a}`);return(0,T.jsxs)("tr",{className:"hover:bg-gray-50/80 dark:hover:bg-neutral-800/50",children:[(0,T.jsx)("td",{className:"px-2 py-2 font-medium text-gray-900 dark:text-gray-100",children:e.name||t}),(0,T.jsx)("td",{className:"px-2 py-2",children:(0,T.jsx)("span",{className:"rounded-full bg-gray-100 px-1.5 py-px text-[10px] font-medium dark:bg-dark-700",children:e.status||r.V5})}),(0,T.jsx)("td",{className:"hidden truncate px-2 py-2 font-mono text-[10px] text-gray-600 dark:text-gray-400 md:table-cell",children:e.assistant_id||r.V5}),(0,T.jsx)("td",{className:"whitespace-nowrap px-2 py-2 text-gray-600 dark:text-gray-400 tabular-nums",children:e.created_at?(0,Q.He)(String(e.created_at)):r.V5}),(0,T.jsx)("td",{className:"px-2 py-2 text-right",children:(0,T.jsx)("button",{type:"button",onClick:()=>{(async e=>{ye(e),ge(!0),xe(!0),fe(null);try{const a=await u.getCampaignResults(e);fe(a)}catch{fe({error:"Could not load results"})}finally{xe(!1)}})(t)},className:Q.UF,title:"View results","aria-label":`View results for ${e.name||t}`,children:(0,T.jsx)(ya,{className:"h-3.5 w-3.5"})})})]},t)})})]})}):0===D.length?(0,T.jsx)("div",{className:"px-4 py-12 text-center text-sm text-gray-500 dark:text-gray-400",children:"No assistants loaded. Add an assistant, then refresh."}):Ne?Ce&&0===we.length?(0,T.jsx)(d.A,{variant:"call-history",rows:8,className:"border-0 shadow-none"}):0===ia.length?(0,T.jsxs)("div",{className:"px-4 py-12 text-center",children:[(0,T.jsx)(ga,{className:"mx-auto h-8 w-8 text-gray-400"}),(0,T.jsx)("p",{className:"mt-2 text-sm font-medium text-gray-900 dark:text-white",children:ra.trim()?"No calls match your search":"No outbound calls yet"}),(0,T.jsx)("p",{className:"mt-0.5 text-xs text-gray-500 dark:text-gray-400",children:ra.trim()?"Try a different search.":"Launch a campaign or wait for activity, then refresh."})]}):(0,T.jsx)("div",{className:K.IL,children:(0,T.jsxs)("table",{className:"w-full text-xs",children:[(0,T.jsx)("thead",{children:(0,T.jsxs)("tr",{children:[(0,T.jsx)("th",{className:`${K.BL} hidden lg:table-cell`,children:"Call ID"}),(0,T.jsx)("th",{className:K.BL,children:"To"}),(0,T.jsx)("th",{className:`${K.BL} hidden sm:table-cell`,children:"From"}),(0,T.jsx)("th",{className:K.BL,children:"Status"}),(0,T.jsx)("th",{className:`${K.BL} hidden md:table-cell`,children:"Dur"}),(0,T.jsx)("th",{className:K.BL,children:"Time"}),(0,T.jsx)("th",{className:`${K.BL} text-right`,children:"\xb7\xb7\xb7"})]})}),(0,T.jsx)("tbody",{className:"divide-y divide-gray-200/80 dark:divide-neutral-700",children:ia.map(e=>{const a=!/completed|ended|failed|cancelled|no-answer|busy/i.test(e.status);return(0,T.jsxs)("tr",{className:"cursor-pointer transition-colors hover:bg-gray-50/80 dark:hover:bg-neutral-800/50",onClick:()=>ua(e),children:[(0,T.jsx)("td",{className:"hidden truncate px-2 py-2 font-mono text-[10px] text-gray-800 dark:text-gray-200 lg:table-cell",title:e.call_id,children:e.call_id}),(0,T.jsx)("td",{className:"truncate px-2 py-2 text-gray-900 dark:text-white",children:e.to_number||r.V5}),(0,T.jsx)("td",{className:"hidden truncate px-2 py-2 text-gray-700 dark:text-gray-300 sm:table-cell",children:e.from_number||r.V5}),(0,T.jsx)("td",{className:"px-2 py-2",children:(0,T.jsx)("span",{className:`rounded-full px-1.5 py-px text-[10px] font-medium ${(0,Q.qm)(e.status)}`,children:(0,Q.Rh)(e.status)})}),(0,T.jsx)("td",{className:"hidden whitespace-nowrap px-2 py-2 tabular-nums text-gray-700 dark:text-gray-300 md:table-cell",children:H(e.duration_seconds)}),(0,T.jsx)("td",{className:"whitespace-nowrap px-2 py-2 tabular-nums text-gray-700 dark:text-gray-300",children:e.created_at?(0,Q.He)(e.created_at):r.V5}),(0,T.jsx)("td",{className:"px-2 py-2 text-right",children:(0,T.jsxs)("div",{className:"flex items-center justify-end gap-1",children:[(0,T.jsx)("button",{type:"button",onClick:a=>{a.stopPropagation(),ua(e)},className:Q.UF,title:"View details","aria-label":"View call",children:(0,T.jsx)(ya,{className:"h-3.5 w-3.5"})}),a?(0,T.jsx)("button",{type:"button",onClick:a=>{a.stopPropagation(),(async e=>{try{await y.Ay.end(e),Je("Call ended","success"),Ne&&_e()}catch(a){Je((null===a||void 0===a?void 0:a.message)||"Failed to end call","error")}})(e.call_id)},className:"text-[10px] font-semibold text-gray-600 hover:underline dark:text-gray-300",children:"End"}):null]})})]},e.call_id)})})]})}):(0,T.jsx)("div",{className:"px-4 py-12 text-center text-sm text-gray-500 dark:text-gray-400",children:"Select an assistant to load calls."})})]})}),De&&Be&&(0,T.jsxs)("div",{className:"fixed inset-0 z-[190] flex justify-end",children:[(0,T.jsx)("button",{type:"button",className:"absolute inset-0 bg-black/50","aria-label":"Close call details",onClick:oa}),(0,T.jsxs)("aside",{className:"relative w-full max-w-lg sm:max-w-xl h-full bg-white dark:bg-gray-950 border-l border-gray-200 dark:border-gray-800 shadow-2xl flex flex-col overflow-hidden",children:[(0,T.jsxs)("div",{className:"flex items-start justify-between gap-3 px-5 py-4 border-b border-gray-200 dark:border-gray-800",children:[(0,T.jsxs)("div",{className:"min-w-0",children:[(0,T.jsx)("h3",{className:"text-lg font-bold text-gray-900 dark:text-white truncate",children:"Call details"}),(0,T.jsx)("p",{className:"text-xs font-mono text-gray-500 dark:text-gray-400 truncate mt-0.5",title:Be.call_id,children:Be.call_id}),(0,T.jsxs)("p",{className:"text-xs text-gray-600 dark:text-gray-300 mt-1",children:["Status: ",(0,T.jsx)("span",{className:"font-semibold text-accent",children:He||r.V5}),We?(0,T.jsxs)(T.Fragment,{children:[" ","\xb7 End reason: ",(0,T.jsx)("span",{className:"font-medium",children:We})]}):null]})]}),(0,T.jsx)("button",{type:"button",onClick:oa,className:"p-2 rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800","aria-label":"Close",children:(0,T.jsx)(ba,{className:"h-5 w-5"})})]}),(0,T.jsxs)("div",{className:"flex-1 overflow-y-auto px-5 py-4 space-y-6",children:[Me&&(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"Loading recording and transcript\u2026"}),(0,T.jsxs)("section",{children:[(0,T.jsx)("h4",{className:"text-sm font-bold text-gray-900 dark:text-white mb-2",children:"Recording"}),qe?(0,T.jsxs)("div",{className:"space-y-2",children:[(0,T.jsx)("audio",{controls:!0,className:"w-full",preload:"metadata",children:(0,T.jsx)("source",{src:qe,type:(0,v.Wg)(ea.current||"")||"audio/mp4"})}),(0,T.jsx)("button",{type:"button",onClick:()=>
1{if(!Be)return;const e=(0,v.D0)(Be.call_id,{sourceUrl:ea.current,mimeType:(0,v.Wg)(ea.current||"")});(0,k.qS)(qe,e)},className:"text-xs font-semibold text-accent hover:underline",children:"Download recording"})]}):(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:Me?"\u2026":"No recording available yet. Try again after the call ends."})]}),(0,T.jsxs)("section",{children:[(0,T.jsx)("h4",{className:"text-sm font-bold text-gray-900 dark:text-white mb-2",children:"AI summary"}),Ke.trim()?(0,T.jsx)("div",{className:"rounded-lg border border-gray-200 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/40 px-3 py-2 text-sm text-gray-800 dark:text-gray-200 whitespace-pre-wrap",children:Ke}):(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:Me?"\u2026":"No AI summary yet (include_ai_summary unavailable or still processing)."})]}),(0,T.jsxs)("section",{children:[(0,T.jsxs)("div",{className:"flex items-center justify-between gap-2 mb-2",children:[(0,T.jsx)("h4",{className:"text-sm font-bold text-gray-900 dark:text-white",children:"Transcript"}),(0,T.jsx)("button",{type:"button",onClick:()=>ma(Be),disabled:Me,className:"text-xs font-semibold text-accent hover:underline disabled:opacity-50",children:"Refresh"})]}),0===Ue.length&&!Me&&(0,T.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"No transcript is available yet. Try refreshing after the call ends."}),(0,T.jsx)("div",{className:"space-y-3 rounded-lg border border-gray-200 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/40 p-3 min-h-[120px]",children:Ue.map((e,a)=>(0,T.jsx)("div",{className:"flex "+("agent"===e.speaker?"justify-end":"justify-start"),children:(0,T.jsxs)("div",{className:"max-w-[92%] rounded-lg px-3 py-2 text-sm "+("agent"===e.speaker?"bg-accent/15 text-gray-900 dark:text-gray-100 border border-accent/25":"bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 border border-gray-200 dark:border-gray-700"),children:[(0,T.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400 mb-0.5",children:"agent"===e.speaker?"Assistant":"Client"}),(0,T.jsx)("p",{className:"whitespace-pre-wrap break-words",children:e.text}),e.at&&(0,T.jsx)("p",{className:"text-[10px] text-gray-400 mt-1",children:e.at})]})},`${e.speaker}-${a}-${e.text.slice(0,24)}`))})]})]})]})]}),ce&&(0,T.jsxs)("div",{className:"fixed bottom-4 right-4 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg shadow-md px-4 py-3",children:[(0,T.jsx)("div",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Campaign"}),(0,T.jsx)("div",{className:"text-sm font-semibold text-gray-900 dark:text-gray-100",children:ce}),(0,T.jsxs)("div",{className:"mt-1 text-xs",children:[(0,T.jsx)("span",{className:"text-gray-600 dark:text-gray-300",children:"Status: "}),(0,T.jsx)("span",{className:"font-medium text-accent",children:String((null===oe||void 0===oe?void 0:oe.status)||"checking\u2026")})]}),(0,T.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,T.jsx)("button",{onClick:async()=>{try{const e=await u.getCampaignStatus(ce);me(e)}catch{}},className:"px-3 py-1.5 rounded-md bg-gray-100 dark:bg-gray-800 text-xs text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-700",children:"Refresh"}),(0,T.jsx)("button",{onClick:()=>{de(null),me(null),je.current&&(clearInterval(je.current),je.current=null)},className:"px-3 py-1.5 rounded-md bg-gray-100 dark:bg-gray-800 text-xs text-gray-800 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-700",children:"Dismiss"})]})]}),(0,T.jsx)(c.A,{isOpen:ue,onClose:()=>ge(!1),title:pe?`Campaign results. ${pe}`:"Campaign results",children:(0,T.jsx)("div",{className:"max-h-[60vh] overflow-auto p-1",children:(0,T.jsx)($,{data:be,loading:he})})}),(0,T.jsx)(U,{isOpen:S,onClose:()=>_(!1),busy:le,campaignName:A,onCampaignNameChange:L,assistant:R,onAssistantChange:B,agents:D,fromNumber:Z,onFromNumberChange:W,agentNumbers:Re,numbersLoading:Fe,csvFile:se,onCsvFileChange:ne,targetNumber:F,onTargetNumberChange:I,sendTiming:X,onSendTimingChange:J,scheduleDate:Y,onScheduleDateChange:G,scheduleTime:ee,onScheduleTimeChange:ae,timezone:te,onTimezoneChange:re,onDownloadTemplate:()=>{const e=new Blob(["phone_number\n+1234567890\n+1987654321\n"],{type:"text/csv;charset=utf-8;"}),a=URL.createObjectURL(e),t=document.createElement("a");t.href=a,t.download="campaign_targets_template.csv",document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(a)},onSubmit:async e=>{if(null===e||void 0===e||e.preventDefault(),!A.trim())return void Je("Please enter a campaign name","warning");if(!R)return void Je("Please select an assistant","warning");if(!Z)return void Je("Select a \u201cFrom Number\u201d connected to the agent","warning");const a=R;ie(!0);try{let e=[];se&&(e=await(t=se,new Promise(e=>{const a=new FileReader;a.onload=()=>{try{var t;const r=String(a.result||"").split(/\r?\n/).map(e=>
1e.trim()).filter(Boolean),s=(null===(t=r[0])||void 0===t?void 0:t.toLowerCase().includes("phone"))?r.slice(1):r,n=[];s.forEach(e=>{var a;const t=null===(a=e.split(",")[0])||void 0===a?void 0:a.trim();t&&n.push(t)}),e(n)}catch{e([])}},a.onerror=()=>e([]),a.readAsText(t)}))),F&&(e=Array.from(new Set([F,...e])));const r=e.map(e=>({to_number:e,from_number:Z})),s="later"===X?((e,a)=>{if(e&&a)try{const t=new Date(`${e} ${a}`);if(!isNaN(t.getTime()))return t.toISOString();const r=new Date(`${e}T${a}`);return isNaN(r.getTime())?void 0:r.toISOString()}catch{return}})(Y,ee):void 0,n={agent_id:R,name:A.trim(),targets:r,schedule_at:s},l=await u.createCampaign(n),i=(null===l||void 0===l?void 0:l.campaign_id)||(null===l||void 0===l?void 0:l.id);i&&(de(String(i)),me({status:"queued"})),Je("Campaign created","success"),P(),ve(a),m(e=>{const t=new URLSearchParams(e);return t.set("agentId",a),t},{replace:!0}),_e(),_(!1),L(""),I(""),B(a),J("now"),G(""),ae(""),re(""),ne(null)}catch(e){Je(`Failed to create campaign: ${(null===e||void 0===e?void 0:e.message)||"error"}`,"error")}finally{ie(!1)}var t}})]})}}}]);
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.