@bravophone/webphone 0.2.1 → 0.3.0
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 +74 -11
- package/dist/bravophone.mjs +167 -161
- package/dist/bravophone.umd.js +4 -4
- package/host/popup.js +1 -1
- package/package.json +4 -2
package/dist/bravophone.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(W,
|
|
1
|
+
(function(W,U){typeof exports=="object"&&typeof module!="undefined"?module.exports=U():typeof define=="function"&&define.amd?define(U):(W=typeof globalThis!="undefined"?globalThis:W||self,W.Bravophone=U())})(this,function(){"use strict";const W='stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"',U=`<svg viewBox="0 0 24 24" fill="none" ${W} aria-hidden="true">
|
|
2
2
|
<path class="bp-i-body" d="M15.6 12.8a11 11 0 0 1-4.4-4.4l1-1a1.6 1.6 0 0 0 .3-1.7c-.2-.7-.4-1.4-.5-2.2A1.6 1.6 0 0 0 10.4 2H7.9a1.6 1.6 0 0 0-1.6 1.8 15.8 15.8 0 0 0 2.4 6.9 15.6 15.6 0 0 0 4.8 4.8 15.8 15.8 0 0 0 6.9 2.4 1.6 1.6 0 0 0 1.7-1.6v-2.5a1.6 1.6 0 0 0-1.4-1.6c-.8-.1-1.5-.3-2.2-.5a1.6 1.6 0 0 0-1.7.4z"/>
|
|
3
3
|
<path class="bp-i-wave bp-i-wave-1" d="M14.5 6.2a4 4 0 0 1 3.3 3.3"/>
|
|
4
4
|
<path class="bp-i-wave bp-i-wave-2" d="M14.1 2.6a7.6 7.6 0 0 1 7.3 7.3"/>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<circle cx="2.6" cy="2.6" r="1.35"/><circle cx="7.4" cy="2.6" r="1.35"/>
|
|
21
21
|
<circle cx="2.6" cy="8" r="1.35"/><circle cx="7.4" cy="8" r="1.35"/>
|
|
22
22
|
<circle cx="2.6" cy="13.4" r="1.35"/><circle cx="7.4" cy="13.4" r="1.35"/>
|
|
23
|
-
</svg>`,G={"phone-waves":
|
|
23
|
+
</svg>`,G={"phone-waves":U,waveform:xe,headset:we,"chat-phone":ye},te="phone-waves",ke=`
|
|
24
24
|
:host { all: initial; }
|
|
25
25
|
* { box-sizing: border-box; }
|
|
26
26
|
|
|
@@ -354,7 +354,7 @@
|
|
|
354
354
|
.bp-launcher-icon { transition: none; }
|
|
355
355
|
}
|
|
356
356
|
|
|
357
|
-
`,se="bravophone:widget:geometry",Y=28,J=32;function Me(e){try{const a=localStorage.getItem(se);if(!a)return{...e};const i=JSON.parse(a);return i.dock?{...e,...i,...
|
|
357
|
+
`,se="bravophone:widget:geometry",Y=28,J=32;function Me(e){try{const a=localStorage.getItem(se);if(!a)return{...e};const i=JSON.parse(a);return i.dock?{...e,...i,...N(i.dock,i)}:{...e,...i}}catch(a){return{...e}}}function V(e){try{localStorage.setItem(se,JSON.stringify(e))}catch(a){}}function de(e){return{minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:Math.max(e.minWidth,Math.min(e.maxWidth,window.innerWidth)),maxHeight:Math.max(e.minHeight,Math.min(e.maxHeight,window.innerHeight))}}function R(e){const a=Math.max(0,window.innerWidth-e.width),i=Math.max(0,window.innerHeight-40);return{...e,x:Math.min(Math.max(0,e.x),a),y:Math.min(Math.max(0,e.y),i)}}function N(e,a){const i=window.innerWidth,o=window.innerHeight,n=Math.round(i/2),d=Math.round(o/2),u=Math.min(a.width,i);switch(e){case"left":return{x:0,y:0,width:u,height:o};case"right":return{x:i-u,y:0,width:u,height:o};case"left-half":return{x:0,y:0,width:n,height:o};case"right-half":return{x:i-n,y:0,width:n,height:o};case"top":return{x:a.x,y:0,width:u,height:d};case"bottom":return{x:a.x,y:o-d,width:u,height:d};case"top-half":return{x:0,y:0,width:i,height:d};case"bottom-half":return{x:0,y:o-d,width:i,height:d};case"max":return{x:0,y:0,width:i,height:o};default:return{x:a.x,y:a.y,width:a.width,height:a.height}}}function Le(e,a,i){const o=window.innerWidth,n=window.innerHeight,d=e<=Y,u=e>=o-Y,f=a<=Y,t=a>=n-Y;return(f||t)&&d?"left-half":(f||t)&&u?"right-half":f?i||"max":t?"bottom-half":d?"left":u?"right":null}function ze({root:e,handle:a,handles:i,preview:o,geometry:n,limits:d,topDock:u,onChange:f}){let t={...n},g=null,p="",c=null,l=null,w=null,y=null;const z=()=>{e.style.left=`${t.x}px`,e.style.top=`${t.y}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.classList.toggle("bp-docked",!!t.dock),f==null||f(t)},B=r=>{if(o){if(!r){o.hidden=!0;return}o.hidden=!1,o.style.left=`${r.x}px`,o.style.top=`${r.y}px`,o.style.width=`${r.width}px`,o.style.height=`${r.height}px`}},I=(r,b)=>{const h=de(d);let{x:v,y:S,width:E,height:H}=c;p.includes("e")&&(E=c.width+r),p.includes("w")&&(E=c.width-r),p.includes("s")&&(H=c.height+b),p.includes("n")&&(H=c.height-b),E=Math.min(h.maxWidth,Math.max(h.minWidth,E)),H=Math.min(h.maxHeight,Math.max(h.minHeight,H)),p.includes("w")&&(v=c.x+(c.width-E)),p.includes("n")&&(S=c.y+(c.height-H)),p.includes("e")&&Math.abs(v+E-window.innerWidth)<=J&&(E=window.innerWidth-v),p.includes("w")&&Math.abs(v)<=J&&(E+=v,v=0),p.includes("s")&&Math.abs(S+H-window.innerHeight)<=J&&(H=window.innerHeight-S),p.includes("n")&&Math.abs(S)<=J&&(H+=S,S=0),t={...t,x:v,y:S,width:E,height:H,dock:null},z()},_=(r,b,h,v)=>{if(t.dock){const S=y||{width:d.width,height:d.height},E=l.x/Math.max(1,t.width);t={...t,...S,dock:null},l={x:Math.round(S.width*E),y:Math.min(l.y,32)},c={...c,x:h-l.x,y:v-l.y,px:c.px+r,py:c.py+b},r=0,b=0}t=R({...t,x:c.x+r,y:c.y+b}),z(),w=Le(h,v,u),B(w?N(w,t):null)},K=()=>{w&&(y=y||{width:t.width,height:t.height},t={...t,...N(w,t),dock:w},z())},Z=(r,b)=>h=>{h.button===0&&(r==="drag"&&h.target.closest(".bp-btn")||(g=r,p=b||"",c={px:h.clientX,py:h.clientY,...t},l={x:h.clientX-t.x,y:h.clientY-t.y},t.dock||(y={width:t.width,height:t.height}),e.classList.add(r==="drag"?"bp-dragging":"bp-resizing"),h.currentTarget.setPointerCapture(h.pointerId),h.preventDefault()))},j=r=>{if(!g||!c)return;const b=r.clientX-c.px,h=r.clientY-c.py;g==="drag"?_(b,h,r.clientX,r.clientY):I(b,h)},A=r=>{if(g){e.classList.remove("bp-dragging","bp-resizing"),B(null),g==="drag"&&K(),g=null,p="",c=null,w=null;try{r.currentTarget.releasePointerCapture(r.pointerId)}catch(b){}V(t)}};a.addEventListener("pointerdown",Z("drag")),a.addEventListener("pointermove",j),a.addEventListener("pointerup",A),a.addEventListener("pointercancel",A),(i||[]).forEach(({el:r,dir:b})=>{r.addEventListener("pointerdown",Z("resize",b)),r.addEventListener("pointermove",j),r.addEventListener("pointerup",A),r.addEventListener("pointercancel",A)});const q=()=>{t=t.dock?{...t,...N(t.dock,t)}:R(t),z()};window.addEventListener("resize",q);const Q={start(r){var b,h;g="drag",c={px:r.x,py:r.y,...t},l={x:(b=r.cx)!=null?b:t.width/2,y:(h=r.cy)!=null?h:20},t.dock||(y={width:t.width,height:t.height}),e.classList.add("bp-dragging")},move(r){if(g!=="drag"||!c)return;const b=r.x-c.px,h=r.y-c.py;_(b,h,c.x+b+l.x,c.y+h+l.y)},end(){g==="drag"&&(e.classList.remove("bp-dragging"),B(null),K(),g=null,c=null,w=null,V(t))}};return z(),{external:Q,get geometry(){return{...t}},set(r){const b=de(d),h={...t,...r,dock:null};h.width=Math.min(b.maxWidth,Math.max(b.minWidth,h.width)),h.height=Math.min(b.maxHeight,Math.max(b.minHeight,h.height)),t=R(h),z(),V(t)},dock(r){if(!r||r==="float"){const b=y||{width:d.width,height:d.height};t=R({...t,...b,dock:null})}else t.dock||(y={width:t.width,height:t.height}),t={...t,...N(r,t),dock:r};z(),V(t)},destroy(){window.removeEventListener("resize",q)}}}const ce="bravophone/v1";function Se({frame:e,origin:a,onEvent:i}){const o=new Map;let n=0,d=!1;const u=[],f=g=>{var c;if(g.origin!==a||g.source!==e.contentWindow)return;const p=g.data;if(!(!p||p.protocol!==ce)){if(p.type==="ready"){for(d=!0;u.length;)u.shift()();i==null||i("ready",(c=p.payload)!=null?c:{});return}if(p.type==="reply"){const l=o.get(p.id);if(!l)return;o.delete(p.id),clearTimeout(l.timer),p.error?l.reject(new Error(p.error)):l.resolve(p.payload);return}p.type==="event"&&(i==null||i(p.name,p.payload))}};window.addEventListener("message",f);function t(g,p,{timeout:c=15e3}={}){return new Promise((l,w)=>{const y=`${Date.now()}-${++n}`,z=()=>{var I;const B=setTimeout(()=>{o.delete(y),w(new Error(`Bravophone: timeout no comando "${g}"`))},c);o.set(y,{resolve:l,reject:w,timer:B}),(I=e.contentWindow)==null||I.postMessage({protocol:ce,type:"command",id:y,command:g,payload:p},a)};d?z():u.push(z)})}return{call:t,get ready(){return d},destroy(){window.removeEventListener("message",f),o.forEach(({reject:g,timer:p})=>{clearTimeout(p),g(new Error("Bravophone: widget destruído"))}),o.clear()}}}const pe="bravophone:launcher",Ee=4,ae=8;function He(e){try{const a=localStorage.getItem(pe);return a?{...e,...JSON.parse(a)}:{...e}}catch(a){return{...e}}}function ne(e){try{localStorage.setItem(pe,JSON.stringify(e))}catch(a){}}function P(e,a){const i=Math.max(ae,window.innerHeight-a-ae);return Math.min(Math.max(ae,e),i)}function Te({el:e,side:a,y:i,onOpen:o}){let n={side:a,y:P(i,e.offsetHeight||48)},d=null,u=!1;const f=()=>{e.dataset.side=n.side,e.style.top=`${n.y}px`,e.style.right=n.side==="right"?"0px":"auto",e.style.left=n.side==="left"?"0px":"auto"},t=l=>{l.button===0&&(d={py:l.clientY,y:n.y},u=!1,e.setPointerCapture(l.pointerId))},g=l=>{if(!d)return;const w=l.clientY-d.py;!u&&Math.abs(w)<Ee||(u||(u=!0,e.classList.add("bp-launcher-dragging")),n.y=P(d.y+w,e.offsetHeight),f())},p=l=>{if(!d)return;const w=u;d=null,u=!1,e.classList.remove("bp-launcher-dragging");try{e.releasePointerCapture(l.pointerId)}catch(y){}w?ne(n):o==null||o()};e.addEventListener("pointerdown",t),e.addEventListener("pointermove",g),e.addEventListener("pointerup",p),e.addEventListener("pointercancel",p),e.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o==null||o())});const c=()=>{n.y=P(n.y,e.offsetHeight),f()};return window.addEventListener("resize",c),f(),{get state(){return{...n}},setSide(l){n.side=l,f(),ne(n)},moveTo(l){n.y=P(l,e.offsetHeight),f(),ne(n)},destroy(){window.removeEventListener("resize",c)}}}const Ie="https://cdn.jsdelivr.net/npm";function $e(e,a="@bravophone/webphone"){return`${Ie}/${a}@${e}/host/`}function Oe({version:e,parentOrigin:a,token:i,base:o}){const n=o||$e(e),d=JSON.stringify({parentOrigin:a,token:i||null}).replace(/</g,"\\u003c");return`<!doctype html>
|
|
358
358
|
<html lang="pt-BR">
|
|
359
359
|
<head>
|
|
360
360
|
<meta charset="UTF-8">
|
|
@@ -396,4 +396,4 @@
|
|
|
396
396
|
<noscript><strong>O webphone precisa de JavaScript habilitado.</strong></noscript>
|
|
397
397
|
<div id="app"></div>
|
|
398
398
|
</body>
|
|
399
|
-
</html>`}const he={width:380,height:640,minWidth:320,minHeight:420,maxWidth:1600,maxHeight:1400,margin:24};function x(e,a={},i=[]){const o=document.createElement(e);for(const[n,d]of Object.entries(a))n==="class"?o.className=d:n==="text"?o.textContent=d:d!=null&&o.setAttribute(n,d);return i.forEach(n=>o.appendChild(n)),o}function Ce(e){const{hostUrl:a,token:i,position:o="bottom-right",open:n=!1,launcher:d=!0,title:u="BRAVOPHONE",frame:f="bar",dockTop:t="max",launcherSide:g="right",launcherIcon:p=te,mode:c="
|
|
399
|
+
</html>`}const he={width:380,height:640,minWidth:320,minHeight:420,maxWidth:1600,maxHeight:1400,margin:24};function x(e,a={},i=[]){const o=document.createElement(e);for(const[n,d]of Object.entries(a))n==="class"?o.className=d:n==="text"?o.textContent=d:d!=null&&o.setAttribute(n,d);return i.forEach(n=>o.appendChild(n)),o}function Ce(e){const{hostUrl:a,token:i,position:o="bottom-right",open:n=!1,launcher:d=!0,title:u="BRAVOPHONE",frame:f="bar",dockTop:t="max",launcherSide:g="right",launcherIcon:p=te,mode:c="srcdoc",hostBase:l,version:w,emit:y}=e,z=c==="srcdoc",B=z?window.location.origin:new URL(a).origin,I=x("div",{"data-bravophone":"root"});I.style.cssText="all:initial;position:static";const _=I.attachShadow({mode:"open"});_.appendChild(x("style",{text:ke}));const K=(()=>{var fe;const{width:s,height:L,margin:C}=he,F=window.innerWidth-s-C,ge=window.innerHeight-L-C,me={"bottom-right":{x:F,y:ge},"bottom-left":{x:C,y:ge},"top-right":{x:F,y:C},"top-left":{x:C,y:C}};return R({...(fe=me[o])!=null?fe:me["bottom-right"],width:s,height:L})})(),Z=R(Me(K)),j=x("span",{class:"bp-status","data-state":"connecting"}),A=x("button",{class:"bp-btn bp-btn-min",title:"Minimizar",text:"—"}),q=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),Q=x("div",{class:"bp-header"},[j,x("span",{class:"bp-title",text:u}),A,q]),r=x("iframe",{class:"bp-frame",allow:"microphone; autoplay; clipboard-write; speaker-selection",title:"Webphone BRAVOPHONE"});z?r.setAttribute("srcdoc",Oe({version:w,parentOrigin:B,token:i,base:l})):r.setAttribute("src",We(new URL(a),{token:i,embed:"1",parent:location.origin}));const h=["n","s","w","e","nw","ne","sw","se"].map(s=>({el:x("div",{class:`bp-h bp-h-${s}`}),dir:s})),v=x("div",{class:"bp-preview"});v.hidden=!0;const S=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),E=x("div",{class:"bp-overlay"},[S]),H=x("div",{class:"bp-body"},[r,E]),M=x("div",{class:"bp-root"},[Q,H,...h.map(s=>s.el)]);f!=="bar"&&M.classList.add("bp-chromeless"),M.hidden=!n;const ie=x("span",{class:"bp-launcher-icon"});ie.innerHTML=G[p]||G[te];const le=x("span",{class:"bp-launcher-grip","aria-hidden":"true"});le.innerHTML=ve;const T=x("div",{class:"bp-launcher",role:"button",tabindex:"0",title:"Abrir webphone","aria-label":"Abrir webphone"},[le,ie,x("span",{class:"bp-badge"})]);T.dataset.state="connecting",T.hidden=!d,_.append(v,M,T),document.body.appendChild(I);const be=He({side:g,y:Math.round(window.innerHeight/2-24)}),ue=Te({el:T,side:be.side,y:P(be.y,48),onOpen:()=>O.reveal()}),$=ze({root:M,handle:Q,handles:h,preview:v,geometry:Z,limits:he,topDock:t,onChange:s=>y("resize",{width:s.width,height:s.height,dock:s.dock||null})}),re=Se({frame:r,origin:B,onEvent:(s,L)=>{var C;if(s==="ready"&&(j.dataset.state="ready",T.dataset.state="ready",i&&re.call("auth",{token:i}).catch(()=>{})),s==="state"){const F=(C=L==null?void 0:L.state)!=null?C:"ready";j.dataset.state=F,T.dataset.state=F}if(s==="call:incoming"&&(O.show(),T.dataset.badge="1",T.dataset.state="ringing"),s==="call:answered"&&(T.dataset.state="incall"),s==="call:ended"&&(delete T.dataset.badge,T.dataset.state="ready"),s==="drag:start"){$.external.start(L);return}if(s==="drag:move"){$.external.move(L);return}if(s==="drag:end"){$.external.end();return}y(s,L)}});let ee=!1,oe=null;const O={el:I,bridge:re,show(){M.hidden=!1,y("open")},hide(){M.hidden=!0,y("close")},toggle(){M.hidden?O.show():O.hide()},reveal(){if(M.hidden){O.show();return}const s=$.geometry;(s.x+s.width<40||s.x>window.innerWidth-40||s.y>window.innerHeight-40)&&$.set({x:Math.round((window.innerWidth-s.width)/2),y:Math.round((window.innerHeight-s.height)/2)}),M.classList.remove("bp-attention"),M.offsetWidth,M.classList.add("bp-attention"),clearTimeout(oe),oe=setTimeout(()=>M.classList.remove("bp-attention"),1800),y("reveal")},get isOpen(){return!M.hidden},minimize(s){if(f!=="bar"){O.hide();return}ee=s!=null?s:!ee,M.classList.toggle("bp-minimized",ee),A.textContent=ee?"▢":"—"},move(s,L){$.set({x:s,y:L})},resize(s,L){$.set({width:s,height:L})},dock(s){$.dock(s)},setLauncherSide(s){ue.setSide(s)},setLauncherIcon(s){ie.innerHTML=G[s]||G[te]},get geometry(){return $.geometry},destroy(){clearTimeout(oe),re.destroy(),$.destroy(),ue.destroy(),v.remove(),I.remove()}};return q.addEventListener("click",()=>O.hide()),A.addEventListener("click",()=>O.minimize()),S.addEventListener("click",()=>O.hide()),O}function We(e,a){const i=new URL(e.href);for(const[o,n]of Object.entries(a))n!=null&&n!==""&&i.searchParams.set(o,n);return a.token&&(i.searchParams.delete("token"),i.hash=`token=${encodeURIComponent(a.token)}`),i.href}const Be="";let k=null;const D=new Map;function Ae(e,a){var i,o;(i=D.get(e))==null||i.forEach(n=>{try{n(a)}catch(d){console.error("[Bravophone] listener falhou:",d)}}),(o=D.get("*"))==null||o.forEach(n=>{try{n({event:e,payload:a})}catch(d){console.error("[Bravophone] listener falhou:",d)}})}function m(){if(!k)throw new Error("Bravophone: chame Bravophone.init() antes.");return k}const X={init(e={}){if(k)return k;if(typeof window=="undefined"||!document.body)throw new Error("Bravophone: init() precisa rodar no browser, após o <body> existir.");if(location.protocol!=="https:"&&location.hostname!=="localhost"&&console.warn("[Bravophone] Contexto inseguro: o microfone exige HTTPS ou localhost."),e.mode==="hosted"&&!e.hostUrl)throw new Error("Bravophone: mode 'hosted' exige hostUrl. Use mode 'srcdoc' (padrão) para carregar o webphone do CDN sem depender de um host próprio.");return k=Ce({hostUrl:Be,version:X.version,...e,emit:Ae}),k},show(){m().show()},hide(){m().hide()},toggle(){m().toggle()},reveal(){m().reveal()},minimize(e){m().minimize(e)},move(e,a){m().move(e,a)},resize(e,a){m().resize(e,a)},dock(e){m().dock(e)},setLauncherSide(e){m().setLauncherSide(e)},setLauncherIcon(e){m().setLauncherIcon(e)},get isOpen(){return k?k.isOpen:!1},get geometry(){return k?k.geometry:null},call(e,a){return m().bridge.call("call",{number:e,meta:a})},hangup(){return m().bridge.call("hangup")},answer(){return m().bridge.call("answer")},mute(){return m().bridge.call("mute")},hold(){return m().bridge.call("hold")},sendDTMF(e){return m().bridge.call("dtmf",{tone:e})},transfer(e){return m().bridge.call("transfer",{to:e})},getStatus(){return m().bridge.call("status")},setAuth(e){return m().bridge.call("auth",{token:e})},logout(){return m().bridge.call("logout")},on(e,a){return D.has(e)||D.set(e,new Set),D.get(e).add(a),()=>X.off(e,a)},off(e,a){var i;(i=D.get(e))==null||i.delete(a)},destroy(){k==null||k.destroy(),k=null,D.clear()},version:"0.3.0"};return typeof window!="undefined"&&(window.Bravophone=X),X});
|