@tbisoftware/phone 1.0.12 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -108
- package/dist/components/phone.d.ts +3 -0
- package/dist/components/phone.d.ts.map +1 -0
- package/dist/context/PhoneContext.d.ts +23 -0
- package/dist/context/PhoneContext.d.ts.map +1 -0
- package/dist/core/PhoneManager.d.ts +94 -0
- package/dist/core/PhoneManager.d.ts.map +1 -0
- package/dist/core/index.cjs +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/usePhoneManager.d.ts +69 -0
- package/dist/hooks/usePhoneManager.d.ts.map +1 -0
- package/dist/index-Br8w8pI3.cjs +68 -0
- package/dist/index-TymkBND5.js +8237 -0
- package/dist/index.cjs +1 -68
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -8616
- package/dist/react/Phone.d.ts +3 -0
- package/dist/react/Phone.d.ts.map +1 -0
- package/dist/react/PhoneContext.d.ts +23 -0
- package/dist/react/PhoneContext.d.ts.map +1 -0
- package/dist/react/index.cjs +1 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +9 -0
- package/dist/react/usePhoneManager.d.ts +67 -0
- package/dist/react/usePhoneManager.d.ts.map +1 -0
- package/dist/types/index.d.ts +56 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/usePhoneManager-OZM1GaNS.js +536 -0
- package/dist/usePhoneManager-uj2opBKT.cjs +1 -0
- package/dist/utils/cn.d.ts +5 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/formatDuration.d.ts +5 -0
- package/dist/utils/formatDuration.d.ts.map +1 -0
- package/dist/vue/index.cjs +1 -0
- package/dist/vue/index.d.ts +8 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +706 -0
- package/dist/vue/usePhone.d.ts +59 -0
- package/dist/vue/usePhone.d.ts.map +1 -0
- package/dist/vue/usePhoneManager.d.ts +72 -0
- package/dist/vue/usePhoneManager.d.ts.map +1 -0
- package/package.json +34 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),k=require("../index-Br8w8pI3.cjs"),q={key:0,class:"flex gap-2 items-center"},W=["placeholder"],G=["disabled","title"],Q={key:0,class:"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin"},X={key:1,class:"w-4 h-4",viewBox:"0 0 24 24",fill:"currentColor"},Y={key:1,class:"flex flex-col items-center gap-3 py-6"},Z={class:"text-center"},ee={class:"text-base font-semibold"},te={class:"text-sm text-gray-500"},ne={key:2,class:"flex flex-col items-center gap-4 py-6"},oe={class:"text-center space-y-1"},le={class:"text-xl font-bold"},ae={class:"text-2xl font-mono text-green-600 tabular-nums"},se={key:3,class:"flex flex-col items-center gap-3 py-6"},re={key:0,d:"M6.5 5.5 12 11l7-7-1-1-6 6-4.5-4.5H11V3H5v6h1.5V5.5zm17.21 11.17C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z"},ce={key:1,d:"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.956.956 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"},ie={class:"text-center"},de={class:"text-base font-semibold"},ue={key:0,class:"fixed inset-0 z-50 flex"},ve={class:"fixed right-0 top-0 h-full w-full max-w-md bg-white shadow-xl",style:{"background-color":"white"}},me={class:"flex flex-col h-full"},fe={class:"flex items-center justify-between p-4 border-b"},ge={class:"text-lg font-semibold"},pe={class:"text-sm text-gray-500"},he={class:"flex-1 overflow-y-auto p-4"},ye={key:0,class:"text-center py-12 text-gray-500"},Ce={key:1,class:"space-y-2"},Ee={key:2,d:"M6.5 5.5 12 11l7-7-1-1-6 6-4.5-4.5H11V3H5v6h1.5V5.5zm17.21 11.17C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z"},xe={class:"flex-1 min-w-0"},we={class:"font-medium text-sm truncate"},Se={class:"flex items-center gap-2 text-xs text-gray-500"},ke={class:"font-mono tabular-nums"},be=["onClick"],F=e.defineComponent({__name:"Phone",props:{config:{},className:{default:""},labels:{default:()=>({})},onCallStart:{},onCallEnd:{},onStatusChange:{}},emits:["callStart","callEnd","statusChange"],setup(v,{emit:B}){const g=v,p=B;let i=null,m=null;function y(o){return`${o.websocketUrl}|${o.sipUri}|${o.authorizationUser}`}function d(o){const t=y(o);if(i&&m===t)return i;if(i&&m!==t){try{i.ua.stop()}catch{}i=null}m=t;const x={sockets:[new k.JsSIP.WebSocketInterface(o.websocketUrl)],uri:o.sipUri,password:o.password,registrar_server:o.registrarServer,display_name:o.displayName,authorization_user:o.authorizationUser,connection_recovery_min_interval:2,connection_recovery_max_interval:30},N=new k.JsSIP.UA(x),j=document.createElement("audio");j.autoplay=!0;const z={ua:N,audio:j,isStarted:!1,listeners:new Set};return N.on("connecting",()=>{z.listeners.forEach(w=>w.onConnecting?.())}),N.on("connected",()=>{z.listeners.forEach(w=>w.onConnected?.())}),N.on("disconnected",()=>{z.listeners.forEach(w=>w.onDisconnected?.())}),N.on("registered",()=>{z.listeners.forEach(w=>w.onRegistered?.())}),N.on("unregistered",()=>{z.listeners.forEach(w=>w.onUnregistered?.())}),N.on("registrationFailed",w=>{z.listeners.forEach(M=>M.onRegistrationFailed?.(w?.cause))}),N.on("newRTCSession",w=>{const M=w.session;M.direction==="outgoing"&&(z.listeners.forEach(U=>U.onNewSession?.(M)),M.connection&&(M.connection.addEventListener("addstream",U=>{if(!U.streams?.length)return;const I=document.createElement("audio");I.srcObject=U.streams[0],I.play()}),M.connection.addEventListener("track",U=>{const I=document.createElement("audio");I.srcObject=U.streams[0],I.play()})))}),i=z,z}const l=e.ref("disconnected"),r=e.ref(""),c=e.ref([]),C=e.ref(0),u=e.ref(!1),h=e.ref("connecting"),E=e.ref(!1);let a=null,S=null,V=null,b=null,_=null;const n=e.computed(()=>({...k.defaultLabels,...g.labels})),H=e.computed(()=>{switch(l.value){case"progress":return{text:`${n.value.calling}...`,color:"text-yellow-500",icon:"ring"};case"confirmed":return{text:`${n.value.inCall} - ${k.formatDuration(C.value)}`,color:"text-green-500",icon:"inTalk"};case"failed":return{text:n.value.callEnded,color:"text-red-500",icon:"missed"};case"ended":return{text:n.value.callEnded,color:"text-gray-500",icon:"hangup"};default:return{text:n.value.inactive,color:"text-gray-300",icon:"phone"}}});function D(o,t,s){const x={id:Date.now().toString(),number:o,timestamp:Date.now(),duration:t,status:s};c.value=[x,...c.value].slice(0,50),localStorage.setItem("tbi-phone-call-history",JSON.stringify(c.value))}function f(){S&&(S.terminate(),S=null)}function R(o){if(!o.trim()||!a)return;if(!u.value){console.warn("Phone is not ready yet. Please wait for registration.");return}r.value=o,g.onCallStart?.(o),p("callStart",o);const s={eventHandlers:{progress:()=>{l.value="progress",g.onStatusChange?.("progress"),p("statusChange","progress")},failed:x=>{console.error("Call failed:",x?.cause),l.value="failed",g.onStatusChange?.("failed"),p("statusChange","failed"),D(o,0,"failed"),g.onCallEnd?.(o,0,"failed"),p("callEnd",o,0,"failed"),S=null,setTimeout(()=>{l.value="disconnected",g.onStatusChange?.("disconnected"),p("statusChange","disconnected")},3e3)},ended:()=>{l.value="ended",g.onStatusChange?.("ended"),p("statusChange","ended");const x=V?Math.floor((Date.now()-V)/1e3):0;D(o,x,"completed"),g.onCallEnd?.(o,x,"completed"),p("callEnd",o,x,"completed"),S=null,b&&(clearInterval(b),b=null),setTimeout(()=>{l.value="disconnected",g.onStatusChange?.("disconnected"),p("statusChange","disconnected"),V=null,C.value=0},2e3)},confirmed:()=>{l.value="confirmed",g.onStatusChange?.("confirmed"),p("statusChange","confirmed"),V=Date.now(),b=setInterval(()=>{V&&(C.value=Math.floor((Date.now()-V)/1e3))},1e3)}},mediaConstraints:{audio:!0,video:!1}};l.value="progress",g.onStatusChange?.("progress"),p("statusChange","progress");try{S=a.ua.call(o,s)}catch(x){console.error("Failed to start call:",x),l.value="failed",g.onStatusChange?.("failed"),p("statusChange","failed"),D(o,0,"failed"),setTimeout(()=>{l.value="disconnected",g.onStatusChange?.("disconnected"),p("statusChange","disconnected")},3e3)}}function T(o){o.key==="Enter"&&R(r.value)}function O(o){r.value=o.number,E.value=!1,R(o.number)}function A(o){switch(o){case"completed":return"bg-green-100";case"failed":return"bg-red-100";case"missed":return"bg-yellow-100"}}function K(o){switch(o){case"completed":return"text-green-600";case"failed":return"text-red-600";case"missed":return"text-yellow-600"}}function J(o){return new Date(o).toLocaleString("es-ES",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})}return e.onMounted(()=>{a=d(g.config),a.ua.isRegistered()?(u.value=!0,h.value="connected"):a.ua.isConnected()&&(h.value="connected"),_={onConnecting:()=>{h.value="connecting"},onConnected:()=>{h.value="connected"},onDisconnected:()=>{h.value="disconnected",u.value=!1},onRegistered:()=>{u.value=!0,h.value="connected"},onUnregistered:()=>{u.value=!1},onRegistrationFailed:s=>{console.error("Registration failed:",s),u.value=!1,h.value="failed"},onNewSession:s=>{S=s}},a.listeners.add(_),a.isStarted||(a.ua.start(),a.isStarted=!0);const o=localStorage.getItem("tbi-phone-call-history");if(o)try{c.value=JSON.parse(o)}catch(s){console.error("Error loading call history",s)}const t=s=>{const N=s.detail.number;l.value==="disconnected"&&R(N)};window.addEventListener("StartCallEvent",t)}),e.onUnmounted(()=>{b&&clearInterval(b),a&&_&&a.listeners.delete(_)}),(o,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(k.cn)("tbi-phone w-full max-w-md mx-auto bg-white rounded-2xl shadow-lg border border-gray-200 p-2",v.className))},[l.value==="disconnected"?(e.openBlock(),e.createElementBlock("div",q,[e.createElementVNode("button",{onClick:t[0]||(t[0]=s=>E.value=!0),class:"h-8 w-8 flex items-center justify-center rounded-xl border border-gray-200 hover:bg-gray-50 transition-colors",type:"button"},[...t[5]||(t[5]=[e.createElementVNode("svg",{class:"w-4 h-4",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M13 3a9 9 0 0 0-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42A8.954 8.954 0 0 0 13 21a9 9 0 0 0 0-18zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"})],-1)])]),e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":t[1]||(t[1]=s=>r.value=s),onKeydown:T,placeholder:n.value.placeholder,class:"flex-1 w-full h-8 px-3 rounded-xl border border-gray-200 text-sm focus:outline-none focus:ring-2 focus:ring-green-500 focus:border-transparent"},null,40,W),[[e.vModelText,r.value]]),e.createElementVNode("button",{onClick:t[2]||(t[2]=s=>R(r.value)),disabled:r.value.length<9||!u.value,class:"h-8 w-8 flex items-center justify-center rounded-xl bg-green-500 hover:bg-green-600 disabled:bg-gray-300 disabled:cursor-not-allowed text-white transition-colors",type:"button",title:u.value?"Call":"Connecting..."},[h.value==="connecting"?(e.openBlock(),e.createElementBlock("div",Q)):(e.openBlock(),e.createElementBlock("svg",X,[...t[6]||(t[6]=[e.createElementVNode("path",{d:"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"},null,-1)])]))],8,G)])):e.createCommentVNode("",!0),l.value==="progress"?(e.openBlock(),e.createElementBlock("div",Y,[t[8]||(t[8]=e.createElementVNode("div",{class:"relative"},[e.createElementVNode("svg",{class:"w-12 h-12 text-yellow-500 animate-pulse",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M15.05 5A7 7 0 0 1 19 8.95M15.05 1A11 11 0 0 1 23 8.94m-1 7.98v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"})]),e.createElementVNode("div",{class:"absolute inset-0 rounded-full border-4 border-yellow-500/30 animate-ping"})],-1)),e.createElementVNode("div",Z,[e.createElementVNode("p",ee,e.toDisplayString(n.value.calling)+" "+e.toDisplayString(r.value),1),e.createElementVNode("p",te,e.toDisplayString(n.value.waitingResponse),1)]),e.createElementVNode("button",{onClick:f,class:"flex items-center gap-2 px-6 py-2 rounded-full bg-red-500 hover:bg-red-600 text-white text-sm font-medium transition-colors",type:"button"},[t[7]||(t[7]=e.createElementVNode("svg",{class:"w-4 h-4",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.956.956 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(n.value.cancel),1)])])):e.createCommentVNode("",!0),l.value==="confirmed"?(e.openBlock(),e.createElementBlock("div",ne,[t[10]||(t[10]=e.createElementVNode("div",{class:"relative"},[e.createElementVNode("svg",{class:"w-12 h-12 text-green-500",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.12-.74-.03-1.02.24l-2.2 2.2c-2.83-1.45-5.15-3.76-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 12h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7zm-4 0h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z"})]),e.createElementVNode("div",{class:"absolute inset-0 rounded-full bg-green-500/20 animate-pulse"})],-1)),e.createElementVNode("div",oe,[e.createElementVNode("p",le,e.toDisplayString(r.value),1),e.createElementVNode("p",ae,e.toDisplayString(e.unref(k.formatDuration)(C.value)),1)]),e.createElementVNode("button",{onClick:f,class:"flex items-center gap-2 px-6 py-2 rounded-full bg-red-500 hover:bg-red-600 text-white text-sm font-medium transition-colors",type:"button"},[t[9]||(t[9]=e.createElementVNode("svg",{class:"w-4 h-4",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.956.956 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(n.value.hangUp),1)])])):e.createCommentVNode("",!0),l.value==="failed"||l.value==="ended"?(e.openBlock(),e.createElementBlock("div",se,[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(e.unref(k.cn)("w-12 h-12",l.value==="failed"?"text-red-500":"text-gray-500")),viewBox:"0 0 24 24",fill:"currentColor"},[l.value==="failed"?(e.openBlock(),e.createElementBlock("path",re)):(e.openBlock(),e.createElementBlock("path",ce))],2)),e.createElementVNode("div",ie,[e.createElementVNode("p",de,e.toDisplayString(H.value.text),1)])])):e.createCommentVNode("",!0),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[E.value?(e.openBlock(),e.createElementBlock("div",ue,[e.createElementVNode("div",{class:"fixed inset-0 bg-black/50",onClick:t[3]||(t[3]=s=>E.value=!1)}),e.createElementVNode("div",ve,[e.createElementVNode("div",me,[e.createElementVNode("div",fe,[e.createElementVNode("div",null,[e.createElementVNode("h2",ge,e.toDisplayString(n.value.callHistory),1),e.createElementVNode("p",pe,e.toDisplayString(c.value.length===0?n.value.noCallsRegistered:`${c.value.length} ${n.value.callsRegistered}`),1)]),e.createElementVNode("button",{onClick:t[4]||(t[4]=s=>E.value=!1),class:"h-8 w-8 flex items-center justify-center rounded-lg hover:bg-gray-100 transition-colors",type:"button"},[...t[11]||(t[11]=[e.createElementVNode("svg",{class:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)])])]),e.createElementVNode("div",he,[c.value.length===0?(e.openBlock(),e.createElementBlock("div",ye,[t[12]||(t[12]=e.createElementVNode("svg",{class:"w-12 h-12 mx-auto mb-2 opacity-50",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.956.956 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"})],-1)),e.createElementVNode("p",null,e.toDisplayString(n.value.noCalls),1)])):(e.openBlock(),e.createElementBlock("div",Ce,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(s,x)=>(e.openBlock(),e.createElementBlock("div",{key:s.id,class:"flex items-center gap-3 p-3 rounded-lg hover:bg-gray-50 transition-colors duration-200",style:e.normalizeStyle({animationDelay:`${x*30}ms`})},[e.createElementVNode("div",{class:e.normalizeClass(e.unref(k.cn)("w-9 h-9 rounded-full flex items-center justify-center shrink-0",A(s.status)))},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(e.unref(k.cn)("w-4 h-4",K(s.status))),viewBox:"0 0 24 24",fill:"currentColor"},[s.status==="completed"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[t[13]||(t[13]=e.createElementVNode("path",{d:"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"},null,-1)),t[14]||(t[14]=e.createElementVNode("path",{d:"M16 3l-5 5-2-2-1.5 1.5L11 11l6.5-6.5z"},null,-1))],64)):s.status==="failed"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[t[15]||(t[15]=e.createElementVNode("path",{d:"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"},null,-1)),t[16]||(t[16]=e.createElementVNode("path",{d:"M19 6.41L17.59 5 15 7.59 12.41 5 11 6.41 13.59 9 11 11.59 12.41 13 15 10.41 17.59 13 19 11.59 16.41 9z"},null,-1))],64)):(e.openBlock(),e.createElementBlock("path",Ee))],2))],2),e.createElementVNode("div",xe,[e.createElementVNode("p",we,e.toDisplayString(s.number),1),e.createElementVNode("div",Se,[e.createElementVNode("span",null,e.toDisplayString(J(s.timestamp)),1),s.duration>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[t[17]||(t[17]=e.createElementVNode("span",null,"•",-1)),e.createElementVNode("span",ke,e.toDisplayString(e.unref(k.formatDuration)(s.duration)),1)],64)):e.createCommentVNode("",!0)])]),e.createElementVNode("button",{onClick:N=>O(s),class:"h-8 w-8 flex items-center justify-center shrink-0 rounded-lg hover:bg-gray-100 transition-colors",type:"button"},[...t[18]||(t[18]=[e.createElementVNode("svg",{class:"w-4 h-4",viewBox:"0 0 24 24",fill:"currentColor"},[e.createElementVNode("path",{d:"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"})],-1)])],8,be)],4))),128))]))])])])])):e.createCommentVNode("",!0)]))],2))}}),$=Symbol("Phone");let P=null,L=null;function Ne(v){return`${v.websocketUrl}|${v.sipUri}|${v.authorizationUser}`}function Ve(v){const B=Ne(v);if(P&&L===B)return P;if(P&&L!==B){try{P.ua.stop()}catch{}P=null}L=B;const p={sockets:[new k.JsSIP.WebSocketInterface(v.websocketUrl)],uri:v.sipUri,password:v.password,registrar_server:v.registrarServer,display_name:v.displayName,authorization_user:v.authorizationUser,connection_recovery_min_interval:2,connection_recovery_max_interval:30},i=new k.JsSIP.UA(p),m=document.createElement("audio");m.autoplay=!0;const y={ua:i,audio:m,isStarted:!1,listeners:new Set};return i.on("connecting",()=>{y.listeners.forEach(d=>d.onConnecting?.())}),i.on("connected",()=>{y.listeners.forEach(d=>d.onConnected?.())}),i.on("disconnected",()=>{y.listeners.forEach(d=>d.onDisconnected?.())}),i.on("registered",()=>{y.listeners.forEach(d=>d.onRegistered?.())}),i.on("unregistered",()=>{y.listeners.forEach(d=>d.onUnregistered?.())}),i.on("registrationFailed",d=>{y.listeners.forEach(l=>l.onRegistrationFailed?.(d?.cause))}),i.on("newRTCSession",d=>{const l=d.session;l.direction==="outgoing"&&(y.listeners.forEach(r=>r.onNewSession?.(l)),l.connection&&(l.connection.addEventListener("addstream",r=>{if(!r.streams?.length)return;const c=document.createElement("audio");c.srcObject=r.streams[0],c.play()}),l.connection.addEventListener("track",r=>{const c=document.createElement("audio");c.srcObject=r.streams[0],c.play()})))}),P=y,y}function Be(v){const{config:B,onCallStart:g,onCallEnd:p,onStatusChange:i}=v,m=e.ref("disconnected"),y=e.ref(""),d=e.ref([]),l=e.ref(0),r=e.ref(!1),c=e.ref("connecting");let C=null,u=null,h=null,E=null;const a=n=>{y.value=n},S=(n,H,D)=>{const f={id:Date.now().toString(),number:n,timestamp:Date.now(),duration:H,status:D};d.value=[f,...d.value].slice(0,50),localStorage.setItem("tbi-phone-call-history",JSON.stringify(d.value))},V=()=>{u&&(u.terminate(),u=null)},b=n=>{if(!n.trim()||!C)return;if(!r.value){console.warn("Phone is not ready yet. Please wait for registration.");return}y.value=n,g?.(n);const D={eventHandlers:{progress:()=>{m.value="progress",i?.("progress")},failed:f=>{console.error("Call failed:",f?.cause),m.value="failed",i?.("failed"),S(n,0,"failed"),p?.(n,0,"failed"),u=null,setTimeout(()=>{m.value="disconnected",i?.("disconnected")},3e3)},ended:()=>{m.value="ended",i?.("ended");const f=h?Math.floor((Date.now()-h)/1e3):0;S(n,f,"completed"),p?.(n,f,"completed"),u=null,E&&(clearInterval(E),E=null),setTimeout(()=>{m.value="disconnected",i?.("disconnected"),h=null,l.value=0},2e3)},confirmed:()=>{m.value="confirmed",i?.("confirmed"),h=Date.now(),E=setInterval(()=>{h&&(l.value=Math.floor((Date.now()-h)/1e3))},1e3)}},mediaConstraints:{audio:!0,video:!1}};m.value="progress",i?.("progress");try{u=C.ua.call(n,D)}catch(f){console.error("Failed to start call:",f),m.value="failed",i?.("failed"),S(n,0,"failed"),setTimeout(()=>{m.value="disconnected",i?.("disconnected")},3e3)}};e.onMounted(()=>{C=Ve(B),C.ua.isRegistered()?(r.value=!0,c.value="connected"):C.ua.isConnected()&&(c.value="connected");const n={onConnecting:()=>{c.value="connecting"},onConnected:()=>{c.value="connected"},onDisconnected:()=>{c.value="disconnected",r.value=!1},onRegistered:()=>{r.value=!0,c.value="connected"},onUnregistered:()=>{r.value=!1},onRegistrationFailed:f=>{console.error("Registration failed:",f),r.value=!1,c.value="failed"},onNewSession:f=>{u=f}};C.listeners.add(n),C.isStarted||(C.ua.start(),C.isStarted=!0);const H=localStorage.getItem("tbi-phone-call-history");if(H)try{d.value=JSON.parse(H)}catch(f){console.error("Error loading call history",f)}const D=f=>{const T=f.detail.number;m.value==="disconnected"&&b(T)};window.addEventListener("StartCallEvent",D)}),e.onUnmounted(()=>{E&&clearInterval(E)});const _={status:e.readonly(m),callNumber:y,setCallNumber:a,callHistory:e.readonly(d),currentCallDuration:e.readonly(l),startCall:b,endCall:V,isReady:e.readonly(r),connectionStatus:e.readonly(c)};return e.provide($,_),_}function _e(){const v=e.inject($);if(!v)throw new Error("usePhone must be used within a component that has called usePhoneProvider");return v}function De(v,B={}){const{onCallStart:g,onCallEnd:p,onStatusChange:i,onConnectionChange:m,persistHistory:y=!0,historyKey:d="tbi-phone-call-history"}=B,l=e.ref("disconnected"),r=e.ref(""),c=e.ref([]),C=e.ref(0),u=e.ref(!1),h=e.ref("connecting"),E=e.ref(null);let a=null;e.onMounted(()=>{a=new k.PhoneManager(v,{onStatusChange:n=>{l.value=n,i?.(n)},onConnectionChange:n=>{h.value=n,a&&(u.value=a.state.isReady),m?.(n)},onCallStart:g,onCallEnd:p,onDurationUpdate:n=>{C.value=n},onHistoryUpdate:n=>{c.value=n},onRegistered:()=>{u.value=!0},onUnregistered:()=>{u.value=!1}},{persistHistory:y,historyKey:d}),a.initialize(),l.value=a.state.status,r.value=a.state.callNumber,c.value=a.state.callHistory,u.value=a.state.isReady,h.value=a.state.connectionStatus,E.value=a.ua}),e.onUnmounted(()=>{a&&(a.destroy(),a=null)});const S=n=>{r.value=n,a?.setCallNumber(n)},V=n=>{a?.startCall(n)},b=()=>{a?.endCall()},_=()=>{a?.clearHistory(),c.value=[]};return{status:e.readonly(l),callNumber:r,setCallNumber:S,callHistory:e.readonly(c),clearCallHistory:_,currentCallDuration:e.readonly(C),startCall:V,endCall:b,isReady:e.readonly(u),connectionStatus:e.readonly(h),ua:E}}exports.Phone=F;exports.PhoneKey=$;exports.default=F;exports.usePhone=_e;exports.usePhoneManager=De;exports.usePhoneProvider=Be;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Phone from './Phone.vue';
|
|
2
|
+
export { Phone };
|
|
3
|
+
export { usePhoneProvider, usePhone, PhoneKey } from './usePhone';
|
|
4
|
+
export type { PhoneContextValue, UsePhoneProviderOptions } from './usePhone';
|
|
5
|
+
export { usePhoneManager } from './usePhoneManager';
|
|
6
|
+
export type { UsePhoneManagerOptions, UsePhoneManagerReturn, ConnectionStatus } from './usePhoneManager';
|
|
7
|
+
export default Phone;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,CAAC;AACjB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAClE,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEzG,eAAe,KAAK,CAAC"}
|